Class ShearWarpRenderer
- java.lang.Object
-
- gov.nih.mipav.view.renderer.J3D.volumeview.Renderer
-
- gov.nih.mipav.view.renderer.J3D.volumeview.ShearWarpRenderer
-
- Direct Known Subclasses:
ShearWarpColor,ShearWarpIntensity
public abstract class ShearWarpRenderer extends Renderer
The base class renderer to support shear-warp rendering. See the document ShearWarpRendering.pdf for a detailed description of the renderer architecture.
-
-
Field Summary
Fields Modifier and Type Field Description protected short[][][][]m_aaaasEncodeencoding of voxels based on transparent runs.protected short[][][]m_aaasVolumeEncodeDOCUMENT ME!protected float[][]m_aafBoxDOCUMENT ME!protected float[][]m_aafMDOCUMENT ME!protected int[][]m_aaiIndexpermutations that just store voxel indices.protected short[][]m_aasSliceEncodeDOCUMENT ME!protected float[]m_afADOCUMENT ME!protected float[]m_afBDOCUMENT ME!protected float[]m_afOffsetfor resampling a slice.protected float[]m_afShearfor resampling a slice.protected int[]m_aiBoundParallel viewing model.protected int[]m_aiClipMaxfor clipping.protected int[]m_aiClipMinfor clipping.protected int[]m_aiCurrentIDOCUMENT ME!protected int[]m_aiInterCintermediate image indicating that the number of times each pixels is processed.protected int[]m_aiSliceBoundDOCUMENT ME!protected int[]m_aiSliceMaxDOCUMENT ME!protected int[]m_aiSliceMinDOCUMENT ME!protected short[]m_asSkipsupport for skipping opaque intermediate pixels.protected booleanm_bDoEncodeSkipflag set by derived class that uses encoding and skipping.protected floatm_fInv255DOCUMENT ME!protected intm_iI0Temporary quantities used in the inner loop of resampleSingle().protected intm_iInterBoundintermediate 2D image supporting quantities.protected intm_iInterBoundM1intermediate 2D image supporting quantities.protected intm_iInterIndexTemporary quantities used in the inner loop of resampleSingle().protected intm_iInterOffsetDOCUMENT ME!protected intm_iInterQuantityintermediate 2D image supporting quantities.protected intm_iPermutethe current permutation of the voxel indices (0, 1, or 2).protected intm_iPixelTemporary quantities used in the inner loop of resampleSingle().protected intm_iQuantityParallel viewing model.protected intm_iSIndexTemporary quantities used in the inner loop of resampleSingle().protected intm_iSliceDOCUMENT ME!protected intm_iSliceQuantityDOCUMENT ME!protected javax.vecmath.Point3fm_kP00To avoid memory reallocations.protected javax.vecmath.Point3fm_kP01DOCUMENT ME!protected javax.vecmath.Point3fm_kP10DOCUMENT ME!protected javax.vecmath.Point3fm_kP11DOCUMENT ME!protected javax.vecmath.Point3fm_kPositionDOCUMENT ME!-
Fields inherited from class gov.nih.mipav.view.renderer.J3D.volumeview.Renderer
m_aiRImage, m_akAxis, m_akNormal, m_bParallel, m_bReloadInput, m_fAngle, m_fExtreme, m_fFMult, m_fGamma, m_fNear, m_fRScaleX, m_fRScaleY, m_fXTrn, m_fYTrn, m_fZoom, m_iMaxBound, m_iMinBound, m_iRBound, m_iXBound, m_iXBoundM1, m_iXBoundM2, m_iXYProduct, m_iXYZProduct, m_iYBound, m_iYBoundM1, m_iYBoundM2, m_iZBound, m_iZBoundM1, m_iZBoundM2, m_kBackgroundColor, m_kEyeModel, m_kEyeWorld, m_kImage, m_kLightSet, m_kMaterial, m_kRotate
-
-
Constructor Summary
Constructors Constructor Description ShearWarpRenderer(ModelImage kImage, int iRBound, int[] aiRImage)Create a renderer.
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected voidbeforeResampleAll(int k0, int k1, int k2)This is a callback to be executed before resampleAll is executed.protected voidbeforeResampleSingle()This is a callback to be executed before resampleSingle is executed.voidcomposite(int iDS)The top level rendering call.protected voidcomputeEncode(int k0, int k1, int k2, byte[] acChannel)Calculate the encoding table for the specified permutation.protected voidcomputePositions(int i0, int i1, int i2)Compute the vertex positions for the four voxels in the current slice to be bilinearly interpolated.voiddisposeLocal()Disposes of image memory and associated objects.protected voidfinalize()Calls disposeLocal of this class to ensure this class nulls the references to global class variables so that memory will be recovered.protected static bytefromFloat(float fValue)Convert a 32-bit float to a 'byte' that represents an unsigned 8-bit integer (uint8).protected static bytefromInt(int iValue)Convert a 32-bit integer (int32) to a 'byte' that represents an unsigned 8-bit integer (uint8).javax.vecmath.Vector3fgetAxis(int i)Read the current axis at index i.voidgetAxis(int i, javax.vecmath.Vector3f kAxis)Read the current axis at index i.protected voidinitializeEncodeSkip(byte[] acChannel)Calculate the encoding of the specified channel.protected abstract voidmapIntermediateToFinal()Map the intermediate images to the final color image.protected voidresampleAll(int iDS)Resample all the slices for the current permuted volume data.protected voidresampleSingle()Resample a single slice of the permuted volume data.voidrotateBy(javax.vecmath.AxisAngle4f kAxisAngle)Rotate the oriented bounding box of the 3D image about the specified axis with the specified angle.voidrotateFrameBy(javax.media.j3d.Transform3D transform)Rotate the oriented bounding box of the 3D image about the specified axis with the specified angle.voidsetAxis(int i, javax.vecmath.Vector3f kAxis)Change an axis of the oriented bounding box of the 3D image.voidsetParallel(boolean bParallel)Change the camera model.voidsetXBoundNeg(float value)Setup the X Negative clipping plane position.voidsetXBoundPos(float value)Setup the X positive clipping plane position.voidsetYBoundNeg(float value)Setup the Y Negative clipping plane position.voidsetYBoundPos(float value)Setup the Y positive clipping plane position.voidsetZBoundNeg(float value)Setup the Z negative clipping plane position.voidsetZBoundPos(float value)Setup the Z positive clipping plane position.protected booleanskipToNonopaque(int i1, short[] asIndex)An array is maintained that keeps track of opaque intermediate pixels during the resampling phase.protected static floattoFloat(byte cValue)Convert a 'byte' that represents an unsigned 8-bit integer (uint8) to a 32-bit float.protected static inttoInt(byte cValue)Convert a 'byte' that represents an unsigned 8-bit integer (uint8) to a signed 32-bit integer (int32).protected voidupdateSkip()After the compositing step in resampleSingle, the intensity (for gray scale) or alpha value (for color) might become its maximum value.-
Methods inherited from class gov.nih.mipav.view.renderer.J3D.volumeview.Renderer
computeIntegralNormalizationFactor, convertWorldToModel, getAngle, getBackgroundColor, getExtreme, getEyeDist, getEyePoint, getGamma, getMaxBound, getMinBound, getNear, getParallel, getXBound, getXTranslate, getYBound, getYTranslate, getZBound, getZoom, hasInputData, hasNormals, orthonormalize, reloadInputData, reloadInputData, setAngle, setBackgroundColor, setExtreme, setEyeDist, setGamma, setLighting, setMaterialShininess, setNear, setNearAndAngle, setNormals, setXTranslate, setYTranslate, setZoom, traceInit, usesNormals
-
-
-
-
Field Detail
-
m_aaaasEncode
protected short[][][][] m_aaaasEncode
encoding of voxels based on transparent runs.
-
m_aaasVolumeEncode
protected short[][][] m_aaasVolumeEncode
DOCUMENT ME!
-
m_aafBox
protected float[][] m_aafBox
DOCUMENT ME!
-
m_aafM
protected float[][] m_aafM
DOCUMENT ME!
-
m_aaiIndex
protected int[][] m_aaiIndex
permutations that just store voxel indices.
-
m_aasSliceEncode
protected short[][] m_aasSliceEncode
DOCUMENT ME!
-
m_afA
protected float[] m_afA
DOCUMENT ME!
-
m_afB
protected float[] m_afB
DOCUMENT ME!
-
m_afShear
protected float[] m_afShear
for resampling a slice.
-
m_afOffset
protected float[] m_afOffset
for resampling a slice.
-
m_aiBound
protected int[] m_aiBound
Parallel viewing model. Camera direction is always (0,0,1). The volume image and bounding box axes, center at origin, columns are direction, up, right. The matrix m_aafM[][] is for inverse warping.
-
m_iQuantity
protected int m_iQuantity
Parallel viewing model. Camera direction is always (0,0,1). The volume image and bounding box axes, center at origin, columns are direction, up, right. The matrix m_aafM[][] is for inverse warping.
-
m_aiClipMin
protected int[] m_aiClipMin
for clipping.
-
m_aiClipMax
protected int[] m_aiClipMax
for clipping.
-
m_aiCurrentI
protected int[] m_aiCurrentI
DOCUMENT ME!
-
m_aiInterC
protected int[] m_aiInterC
intermediate image indicating that the number of times each pixels is processed.
-
m_aiSliceBound
protected int[] m_aiSliceBound
DOCUMENT ME!
-
m_aiSliceMin
protected int[] m_aiSliceMin
DOCUMENT ME!
-
m_aiSliceMax
protected int[] m_aiSliceMax
DOCUMENT ME!
-
m_asSkip
protected short[] m_asSkip
support for skipping opaque intermediate pixels.
-
m_bDoEncodeSkip
protected boolean m_bDoEncodeSkip
flag set by derived class that uses encoding and skipping.
-
m_fInv255
protected float m_fInv255
DOCUMENT ME!
-
m_iI0
protected int m_iI0
Temporary quantities used in the inner loop of resampleSingle(). These exist since Java does not allow you to pass references to variables to allow more than one to change on return from a function call.
-
m_iSIndex
protected int m_iSIndex
Temporary quantities used in the inner loop of resampleSingle(). These exist since Java does not allow you to pass references to variables to allow more than one to change on return from a function call.
-
m_iInterIndex
protected int m_iInterIndex
Temporary quantities used in the inner loop of resampleSingle(). These exist since Java does not allow you to pass references to variables to allow more than one to change on return from a function call.
-
m_iPixel
protected int m_iPixel
Temporary quantities used in the inner loop of resampleSingle(). These exist since Java does not allow you to pass references to variables to allow more than one to change on return from a function call.
-
m_iInterBound
protected int m_iInterBound
intermediate 2D image supporting quantities.
-
m_iInterBoundM1
protected int m_iInterBoundM1
intermediate 2D image supporting quantities.
-
m_iInterQuantity
protected int m_iInterQuantity
intermediate 2D image supporting quantities.
-
m_iInterOffset
protected int m_iInterOffset
DOCUMENT ME!
-
m_iPermute
protected int m_iPermute
the current permutation of the voxel indices (0, 1, or 2).
-
m_iSliceQuantity
protected int m_iSliceQuantity
DOCUMENT ME!
-
m_iSlice
protected int m_iSlice
DOCUMENT ME!
-
m_kP00
protected javax.vecmath.Point3f m_kP00
To avoid memory reallocations. These are used in the bilinearly interpolation of a 2x2 block of voxels in the current slice. The Pij are vertex positions. The MatColorij are the material colors of the voxels. The Cij are the final dynamically lit colors of the voxels.
-
m_kP01
protected javax.vecmath.Point3f m_kP01
DOCUMENT ME!
-
m_kP10
protected javax.vecmath.Point3f m_kP10
DOCUMENT ME!
-
m_kP11
protected javax.vecmath.Point3f m_kP11
DOCUMENT ME!
-
m_kPosition
protected javax.vecmath.Point3f m_kPosition
DOCUMENT ME!
-
-
Constructor Detail
-
ShearWarpRenderer
public ShearWarpRenderer(ModelImage kImage, int iRBound, int[] aiRImage)
Create a renderer.- Parameters:
kImage- the 3D imageiRBound- the dimension of the square 2D renderer imageaiRImage- The rendered image data stored in row-major order. Each integer pixel represents an RGB color in the formatB | (G << 8) | (R << 16).
-
-
Method Detail
-
composite
public void composite(int iDS)
The top level rendering call. This function calls beforeResampleAll, resampleAll, and mapIntermediateToFinal, all virtual functions that are implemented in derived classes.- Parameters:
iDS- The number of slices to increment during the resampling phase. The value should be one or larger. If one, all slices of the volume data are resampled. If two, only every other slice is resampled. An input larger than one is used to allow fast rendering during rotation of the volume data. Once the rotation terminates, a composite with input of one should be called.
-
disposeLocal
public void disposeLocal()
Disposes of image memory and associated objects.- Overrides:
disposeLocalin classRenderer
-
getAxis
public javax.vecmath.Vector3f getAxis(int i)
Read the current axis at index i.
-
getAxis
public void getAxis(int i, javax.vecmath.Vector3f kAxis)Read the current axis at index i.- Parameters:
i- the axis index (0, 1, or 2)kAxis- the new axis vector at index i
-
rotateBy
public void rotateBy(javax.vecmath.AxisAngle4f kAxisAngle)
Rotate the oriented bounding box of the 3D image about the specified axis with the specified angle.
-
rotateFrameBy
public void rotateFrameBy(javax.media.j3d.Transform3D transform)
Rotate the oriented bounding box of the 3D image about the specified axis with the specified angle.- Specified by:
rotateFrameByin classRenderer- Parameters:
transform- The transform and its matrix by which to rotate the image.
-
setAxis
public void setAxis(int i, javax.vecmath.Vector3f kAxis)Change an axis of the oriented bounding box of the 3D image.- Parameters:
i- the axis index (0, 1, or 2)kAxis- the new axis vector at index i
-
setParallel
public void setParallel(boolean bParallel)
Change the camera model.- Overrides:
setParallelin classRenderer- Parameters:
bParallel- true for a parallel camera, false for a perspective camera
-
setXBoundNeg
public void setXBoundNeg(float value)
Setup the X Negative clipping plane position.- Specified by:
setXBoundNegin classRenderer- Parameters:
value- position of the X negative clip slider.
-
setXBoundPos
public void setXBoundPos(float value)
Setup the X positive clipping plane position.- Specified by:
setXBoundPosin classRenderer- Parameters:
value- position of the X positive clip slider.
-
setYBoundNeg
public void setYBoundNeg(float value)
Setup the Y Negative clipping plane position.- Specified by:
setYBoundNegin classRenderer- Parameters:
value- position of the Y negative clip slider.
-
setYBoundPos
public void setYBoundPos(float value)
Setup the Y positive clipping plane position.- Specified by:
setYBoundPosin classRenderer- Parameters:
value- positin of the Y positve clip slider.
-
setZBoundNeg
public void setZBoundNeg(float value)
Setup the Z negative clipping plane position.- Specified by:
setZBoundNegin classRenderer- Parameters:
value- position of the Z negative clip slider.
-
setZBoundPos
public void setZBoundPos(float value)
Setup the Z positive clipping plane position.- Specified by:
setZBoundPosin classRenderer- Parameters:
value- position of the Z positive clip slider.
-
mapIntermediateToFinal
protected abstract void mapIntermediateToFinal()
Map the intermediate images to the final color image. This is a stub for derived classes. This function must be implemented in at least one class in a derivation chain in order for that class to be considered non-abstract.
-
fromFloat
protected static final byte fromFloat(float fValue)
Convert a 32-bit float to a 'byte' that represents an unsigned 8-bit integer (uint8). This is provided to allow 'byte' to represent a color in [0,255], the latter range not supported by Java since it has no unsigned integer types.- Parameters:
fValue- a float value in [0.0f,256.0f)- Returns:
- the corresponding uint8 value
-
fromInt
protected static final byte fromInt(int iValue)
Convert a 32-bit integer (int32) to a 'byte' that represents an unsigned 8-bit integer (uint8). This is provided to allow 'byte' to represent a color in [0,255], the latter range not supported by Java since it has no unsigned integer types.- Parameters:
iValue- an int32 value- Returns:
- the corresponding uint8 value
-
toFloat
protected static final float toFloat(byte cValue)
Convert a 'byte' that represents an unsigned 8-bit integer (uint8) to a 32-bit float. This is provided to allow 'byte' to represent a color in [0,255], the latter range not supported by Java since it has no unsigned integer types.- Parameters:
cValue- a uint8 value- Returns:
- the corresponding float value in [0.0f,255.0f]
-
toInt
protected static final int toInt(byte cValue)
Convert a 'byte' that represents an unsigned 8-bit integer (uint8) to a signed 32-bit integer (int32). This is provided to allow 'byte' to represent a color in [0,255], the latter range not supported by Java since it has no unsigned integer types.- Parameters:
cValue- a uint8 value- Returns:
- the corresponding int32 value
-
beforeResampleAll
protected void beforeResampleAll(int k0, int k1, int k2)This is a callback to be executed before resampleAll is executed. The idea is to initialize the necessary parameters needed for the shear warp resampling of the volume data. The actual shear parameters are computed based on the orientation of the bounding box of the volume data. The permuted slice bounds, index set, and encoding table are selected based on the input permutation. The skip array is initialized to zero since before rendering, all intermediate pixels are transparent. Derived classes may provide additional initializations as needed.Each one of the indices is a permutation; either one of (0,1,2), (1,2,0), (2,0,1).
- Parameters:
k0- Index tom_aiBound, a value of 0, 1 or 2.k1- Index tom_aiBound, a value of 0, 1 or 2.k2- Index tom_aiBound, a value of 0, 1 or 2.
-
beforeResampleSingle
protected void beforeResampleSingle()
This is a callback to be executed before resampleSingle is executed. The bilinear interpolation coefficients are computed here and vary with the single, active slice. The offset into the intermediate image is also computed since this also varies with the active slice. If encoding of transparent data has occurred in the renderer constructor, then the current slice of the encoding table is initialized for use by resampleSingle.
-
computeEncode
protected void computeEncode(int k0, int k1, int k2, byte[] acChannel)Calculate the encoding table for the specified permutation. See the comments for initializeEncodeSkip. Because bilinear interpolation is used, 2x2 blocks of voxels in the current slice must be analyzed for transparency. The 2x2 block is tagged as non-transparent if and only if at least one of the voxels is non-transparent.Each one of the indices is a permutation; either one of (0,1,2), (1,2,0), (2,0,1).
- Parameters:
k0- Index tom_aiBound, a value of 0, 1 or 2.k1- Index tom_aiBound, a value of 0, 1 or 2.k2- Index tom_aiBound, a value of 0, 1 or 2.acChannel- The blue channel for intensity renderers or the alpha channel for color renderers.
-
computePositions
protected final void computePositions(int i0, int i1, int i2)Compute the vertex positions for the four voxels in the current slice to be bilinearly interpolated.- Parameters:
i0- the current permuted indices of the upper left voxel in the 2x2 block of voxels in the slicei1- DOCUMENT ME!i2- DOCUMENT ME!
-
finalize
protected void finalize() throws java.lang.ThrowableCalls disposeLocal of this class to ensure this class nulls the references to global class variables so that memory will be recovered.
-
initializeEncodeSkip
protected void initializeEncodeSkip(byte[] acChannel)
Calculate the encoding of the specified channel. The tables calculated by this function is used to skip transparent voxels during the resampling phase. This leads to a significant performance improvement for data sets that have a relatively large number of transparent voxels. Each table corresponds to one of the three permutations of the image indices. The active permutation is determined by the composite function based on the orientation of the bounding box of the volume data.- Parameters:
acChannel- the blue channel for intensity renderers or the alpha channel for color renderers
-
resampleAll
protected void resampleAll(int iDS)
Resample all the slices for the current permuted volume data. This is a stub for derived classes. This function must be implemented by at least one class in a derivation chain in order for that class to be considered non-abstract.- Parameters:
iDS- The number of slices to increment during the resampling phase. The value should be one or larger. If one, all slices of the volume data are resampled. If two, only every other slice is resampled. An input larger than one is used to allow fast rendering during rotation of the volume data. Once the rotation terminates, a composite with input of one should be called.
-
resampleSingle
protected void resampleSingle()
Resample a single slice of the permuted volume data. This is a stub for derived classes. This function must be implemented in at least one class in a derivation chain in order for that class to be considered non-abstract.
-
skipToNonopaque
protected boolean skipToNonopaque(int i1, short[] asIndex)An array is maintained that keeps track of opaque intermediate pixels during the resampling phase. Whenever pixels become opaque, they can be skipped if revisited later in the resampling. As runs of pixels become opaque on a scan line, skipping the run can greatly increase the speed of rendering. This function is called in resampleSingle by all the renderer classes taking advantage of opacity skipping.- Parameters:
i1- the current slice index of the current permuted index setasIndex- the skip array for the current scan line of the slice- Returns:
- The return value is 'true' if and only if there is another nonopaque pixel to be processed. If 'true', then m_iI0, m_iInterIndex, and m_iPixel contain values that are needed for later calculations in resampleSingle. The variable m_iInterIndex stores the offset into the intermediate and skip arrays for the current nonopaque pixel. The variable m_iPixel stores the offset into the volume data for the current nonopaque voxel. The variable m_iI0 is one of the indices for the volume data and is only needed in the MjLightingRenderer class for computing the voxel position from the permuted indices.
-
updateSkip
protected void updateSkip()
After the compositing step in resampleSingle, the intensity (for gray scale) or alpha value (for color) might become its maximum value. In this case, the intermediate pixel is opaque. The skip array must be updated so that this pixel is skipped if revisited later.
-
-