Class Sculptor
- All Implemented Interfaces:
MouseListener,MouseMotionListener,EventListener
- Direct Known Subclasses:
TextureSculptor,VolumeSculptor
The user draws an outline on the screen, and defines the cut-away or sculpture region. If the user chooses to apply the sculpture region to the volume, the voxels defined by an extruded volume of the cut-away region are removed. This is done by projecting the voxels in the volume into screen space and determining which voxels fall inside the sculpture region. Voxels that are inside the sculpture region are set to the minimum voxel value, which is rendered as transparent. The user may also undo volume sculpturing, returning the volume data to its original values.
Drawing the Sculpt Region on the Screen
The VolumeSculptor class implements both MouseListener and MouseMotionListener interfaces. Drawing is done through the mousePressed, mouseReleased, and mouseDragged functions.
When sculpting is enabled, the viewing transformations (rotation, scale, translation) are disabled, so the left mouse button can be used for drawing on the screen instead of rotating the volume. Second, the view canvas is captured and stored. When the left mouse button is pressed, the VolumeSculptor class captures and stores all subsequent mouse positions, and draws them directly into the canvas image, connecting the mouse positions by drawing 2D lines on the image. On a mouseReleased event the outline is closed by connecting the first and last recorded mouse positions and the outline region is filled in. The line drawing and polygon filling functions are implemented as 2D scan-conversion algorithms and are drawn directly by the VolumeSculptor onto the canvas image. This implementation allows concave and self-intersecting outlines.
Multiple outlines may be drawn on the canvas image before applying the sculpt regions to the volume. Because the sculpt regions are in image space, to apply the sculpt region to the volume, it is simply necessary to project the volume voxels onto the canvas image. Voxels that project onto blue pixels in the canvas image are removed, and voxels that project to non-masked pixels are unaltered.
Removing Sculpted Voxels
The process of applying the sculpt region to the volume data and removing the voxels that fall inside the sculpt region is broken down into three steps. First, the ModelImage data is retrieved and the center and spacing of the data is determined. Second, the viewing transformations are calculated. Third, the voxels are mapped into screen space and the location of the voxel is compared to the corresponding pixel. If the voxel maps to a pixel inside the sculpt region its value is set to the minimum voxel value.
- Author:
- Alexandra Bokinsky, Ph.D. Under contract from Magic Software.
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected doubleDOCUMENT ME!protected doubleDOCUMENT ME!protected doubleDOCUMENT ME!protected doubleDOCUMENT ME!protected doubleDOCUMENT ME!protected doubleDOCUMENT ME!protected doubleDOCUMENT ME!protected doubleDOCUMENT ME!private intShape of the drawing rectangle.protected floatDOCUMENT ME!protected floatMin and Max image intensity and color values:.static intDOCUMENT ME!protected int[]Backup of the data for undo:.protected int[]DOCUMENT ME!protected int[]Mouse positions in x,y for drawing the sculpt region:.protected int[]DOCUMENT ME!protected booleanm_bMousePressed is set to true when the mousePressed callback is activated and the left mouse button is down.protected booleanDOCUMENT ME!protected booleanm_bSculptEnabled is turned on when the user presses the "Draw Sculpt Outline" button.protected intThe sculpt region color.protected intDOCUMENT ME!protected intDOCUMENT ME!protected intDOCUMENT ME!protected intDOCUMENT ME!protected intDOCUMENT ME!protected intDOCUMENT ME!protected intThe original canvas size.protected intPrevious and first mouse positions:.protected intDOCUMENT ME!protected intDOCUMENT ME!protected intSize of the m_kSculptImage, when it is captured.protected intDOCUMENT ME!protected intThe min and max x,y mouse values:.protected intDOCUMENT ME!protected intDOCUMENT ME!protected javax.media.j3d.Canvas3DCanvas3D reference for drawing :.protected JProgressBarGreen Progress bar at the top right hand corner of the ViewJFrameVolumeView window.protected BufferedImageDOCUMENT ME!protected BufferedImagem_kSculptImage is a screen shot of the canvas image.protected BufferedImageDOCUMENT ME!static intDOCUMENT ME! -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionabstract booleanapplySculpt: abstract function, implementation depends on whether the instance is VolumeTextureSculptor or VolumeSculptor.protected voidbackupImage(ModelImage kImageA, ModelImage kImageB) Called by the TextureSculptor or VolumeSculptor objects.protected voidbackupImage(ModelImage kImageA, ModelImage kImageB, int iIndex) Called by the TextureSculptor or VolumeSculptor objects.protected intblendColor(int iImageColor, int iBlendColor) blendColor: blends two colors in ARGB format from the BufferedImage class, using an alpha value of 0.5.protected voidcalculateMinMaxValues(ModelImage kImageA, ModelImage kImageB) Called by the TextureSculptor or VolumeSculptor objects.voidclearSculpt: called by ViewJFrameVolumeView when the user presses the "Clear Ouline" button, clearing the sculpt outline from the canvas image.voiddisposeLocal(boolean flag) Sets all variables to null, disposes, and garbage collects.protected voidDraw rectangle shape object.voidenableSculpt(boolean bEnabled) enableSculpt: called by the ViewJFrameVolumeView object when the Draw Sculpt button is pressed.protected voidfill(int[][] aaiCrossingPoints, int[] aiNumCrossings) fill: fill the sculpt outline drawn by the user.protected voidfinalize()Calls disposeLocal.booleanDOCUMENT ME!protected booleanGrab the canvas image, and copy into the m_kSculptImage data members.voidinitVolumeSculptor(int iSculptWidth, int iSculptHeight) Initialize the Mouse events, store the progress bar, and get the original canvas widths.voidinvertSculpt: called by ViewJFrameVolumeView when the user presses the "Invert Sculpt Region" button, inverting the sculpt region.protected voidline(int iX0, int iY0, int iX1, int iY1) This function draws a 2D line on the canvas image -- ontop of the currently rendered image.voidmouseClicked(MouseEvent kEvent) One of the overrides necessary to be a MouseListener.voidmouseDragged(MouseEvent kEvent) Invoked when the mouse is dragged while a button is held down.voidmouseEntered(MouseEvent kEvent) One of the overrides necessary to be a MouseListener.voidmouseExited(MouseEvent kEvent) Invoked when the mouse leaves a component.voidmouseMoved(MouseEvent kEvent) One of the overrides necessary to be a MouseMotionListener.voidmousePressed(MouseEvent kEvent) Invoked when a mouse button is pressed.voidmouseReleased(MouseEvent kEvent) Invoked when a mouse button is released.protected voidoutlineRegion(int[][] aaiCrossingPoints, int[] aiNumCrossings) This function computes the set of spans indicated by column crossings for the sculpt outline drawn by the user, by doing a polygon scan conversion in gridded space.protected voidprocessMouseReleased(int iX, int iY) Called when the left mouse button is released, indicating that the sculpt outline is complete, or when the outline is being drawn and the mouse is fragged outside the canvas area.protected voidsculptImage(ModelImage kImageA, ModelImage kImageB, int iIndex) Called by the TextureSculptor or VolumeSculptor objects.voidsetDrawingShape(int shape) Set the shape of the drawing sculptor.protected voidsortCrossingPoints(int[] aiList, int iNumElements) Sorts the edge crossing points in place.abstract voidundoSculpt: abstract function, implementation depends on whether the instance is VolumeTextureSculptor or VolumeSculptor.protected voidundoSculpt(ModelImage kImageA, ModelImage kImageB) Called by the TextureSculptor or VolumeSculptor objects.abstract voidupdate()DOCUMENT ME!
-
Field Details
-
LINES
public static int LINESDOCUMENT ME! -
RECTANGLE
public static int RECTANGLEDOCUMENT ME! -
dAMinAlpha
protected double dAMinAlphaDOCUMENT ME! -
dAMinBlue
protected double dAMinBlueDOCUMENT ME! -
dAMinGreen
protected double dAMinGreenDOCUMENT ME! -
dAMinRed
protected double dAMinRedDOCUMENT ME! -
dBMinAlpha
protected double dBMinAlphaDOCUMENT ME! -
dBMinBlue
protected double dBMinBlueDOCUMENT ME! -
dBMinGreen
protected double dBMinGreenDOCUMENT ME! -
dBMinRed
protected double dBMinRedDOCUMENT ME! -
fImageBMin
protected float fImageBMinDOCUMENT ME! -
fImageMin
protected float fImageMinMin and Max image intensity and color values:. -
m_aiImageA_backup
protected int[] m_aiImageA_backupBackup of the data for undo:. -
m_aiImageB_backup
protected int[] m_aiImageB_backupDOCUMENT ME! -
m_aiXPoints
protected int[] m_aiXPointsMouse positions in x,y for drawing the sculpt region:. -
m_aiYPoints
protected int[] m_aiYPointsDOCUMENT ME! -
m_bMousePressed
protected boolean m_bMousePressedm_bMousePressed is set to true when the mousePressed callback is activated and the left mouse button is down. -
m_bSculptDrawn
protected boolean m_bSculptDrawnDOCUMENT ME! -
m_bSculptEnabled
protected boolean m_bSculptEnabledm_bSculptEnabled is turned on when the user presses the "Draw Sculpt Outline" button. -
m_iColorSculpt
protected int m_iColorSculptThe sculpt region color. -
m_iFirstX
protected int m_iFirstXDOCUMENT ME! -
m_iFirstY
protected int m_iFirstYDOCUMENT ME! -
m_iLastX
protected int m_iLastXDOCUMENT ME! -
m_iLastY
protected int m_iLastYDOCUMENT ME! -
m_iNumberPoints
protected int m_iNumberPointsDOCUMENT ME! -
m_iOriginalHeight
protected int m_iOriginalHeightDOCUMENT ME! -
m_iOriginalWidth
protected int m_iOriginalWidthThe original canvas size. This is used if the ViewJFrameVolumeView window is resized by the user. -
m_iPreviousX
protected int m_iPreviousXPrevious and first mouse positions:. -
m_iPreviousY
protected int m_iPreviousYDOCUMENT ME! -
m_iSculptImageHeight
protected int m_iSculptImageHeightDOCUMENT ME! -
m_iSculptImageWidth
protected int m_iSculptImageWidthSize of the m_kSculptImage, when it is captured. -
m_iXMax
protected int m_iXMaxDOCUMENT ME! -
m_iXMin
protected int m_iXMinThe min and max x,y mouse values:. -
m_iYMax
protected int m_iYMaxDOCUMENT ME! -
m_iYMin
protected int m_iYMinDOCUMENT ME! -
m_kCanvas3D
protected javax.media.j3d.Canvas3D m_kCanvas3DCanvas3D reference for drawing :. -
m_kProgress
Green Progress bar at the top right hand corner of the ViewJFrameVolumeView window. -
m_kSavedImage
DOCUMENT ME! -
m_kSculptImage
m_kSculptImage is a screen shot of the canvas image. The sculpt region is drawn directly into m_kSculptImage. The outline is filled by alpha-blending the Sculpt region color with the m_kSculptImage backgound image. m_kSculptImageOpaque is filled with solid color, but not displayed, it is used to test whether voxels are inside the sculpt region. -
m_kSculptImageOpaque
DOCUMENT ME! -
drawShape
private int drawShapeShape of the drawing rectangle.
-
-
Constructor Details
-
Sculptor
public Sculptor()
-
-
Method Details
-
applySculpt
public abstract boolean applySculpt()applySculpt: abstract function, implementation depends on whether the instance is VolumeTextureSculptor or VolumeSculptor.- Returns:
- DOCUMENT ME!
-
undoSculpt
public abstract void undoSculpt()undoSculpt: abstract function, implementation depends on whether the instance is VolumeTextureSculptor or VolumeSculptor. -
update
public abstract void update()DOCUMENT ME! -
clearSculpt
public void clearSculpt()clearSculpt: called by ViewJFrameVolumeView when the user presses the "Clear Ouline" button, clearing the sculpt outline from the canvas image. The function disables sculpting and reactivates the mouse events for the m_kVolumeRenderer. -
disposeLocal
public void disposeLocal(boolean flag) Sets all variables to null, disposes, and garbage collects.- Parameters:
flag- DOCUMENT ME!
-
enableSculpt
public void enableSculpt(boolean bEnabled) enableSculpt: called by the ViewJFrameVolumeView object when the Draw Sculpt button is pressed. This function deactivates the m_kVolumeRenderer's mouse response, so the mouse can be used to draw the sculpt outline. It also allocates and initializes the m_iSculptImage buffer for drawing.- Parameters:
bEnabled- DOCUMENT ME!
-
getEnable
public boolean getEnable()DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
initVolumeSculptor
public void initVolumeSculptor(int iSculptWidth, int iSculptHeight) Initialize the Mouse events, store the progress bar, and get the original canvas widths. Disable sculpting and drawing with the mouse. Note - this function should be called once per instance only, as it sets up the MouseMotionListener and MouseListener.- Parameters:
iSculptWidth- DOCUMENT ME!iSculptHeight- DOCUMENT ME!
-
invertSculpt
public void invertSculpt()invertSculpt: called by ViewJFrameVolumeView when the user presses the "Invert Sculpt Region" button, inverting the sculpt region. -
mouseClicked
One of the overrides necessary to be a MouseListener. This function is invoked when a button has been pressed and released.- Specified by:
mouseClickedin interfaceMouseListener- Parameters:
kEvent- the mouse event generated by a mouse clicked
-
mouseDragged
Invoked when the mouse is dragged while a button is held down. If this occurs while sculpting is enabled, then the mouse positions are stored and the sculpt outline is drawn on the canvas, using the previously recorded mouse position and the current mouse position as the start and end points of a 2D line on the canvas.- Specified by:
mouseDraggedin interfaceMouseMotionListener- Parameters:
kEvent- the mouse event generated by a mouse drag
-
mouseEntered
One of the overrides necessary to be a MouseListener. Invoked when the mouse enters a component.- Specified by:
mouseEnteredin interfaceMouseListener- Parameters:
kEvent- the mouse event generated by a mouse entered
-
mouseExited
Invoked when the mouse leaves a component. This function captures the mouseExited event when the button is pressed and the sculpt outline is being drawn, so that the outline is contained within the bounds of the canvas.- Specified by:
mouseExitedin interfaceMouseListener- Parameters:
kEvent- the mouse event generated by a mouse exit
-
mouseMoved
One of the overrides necessary to be a MouseMotionListener. Invoked when the mouse is moved, but no buttons are pressed.- Specified by:
mouseMovedin interfaceMouseMotionListener- Parameters:
kEvent- the event generated by a mouse movement
-
mousePressed
Invoked when a mouse button is pressed. When the left mouse button is pressed, and sculpting is enabled, then the user is beginning to outline the sculpt region. This function initializes the outline drawing, and stores the first point(x,y) so the outline can be closed on mouseReleased. The first and following mouse positions are drawn in outline form using current and previously (last recorded) positions as the start and end points of a 2D line on the canvas.- Specified by:
mousePressedin interfaceMouseListener- Parameters:
kEvent- the mouse event generated by a mouse press
-
mouseReleased
Invoked when a mouse button is released. If this happens while drawing the sculpt outline, the mouse release indicates that the outline is complete. The function closes the outline by connecting the first and last points, and then calls processMouseReleased(), which fills the outline.- Specified by:
mouseReleasedin interfaceMouseListener- Parameters:
kEvent- the mouse event generated by a mouse release
-
setDrawingShape
public void setDrawingShape(int shape) Set the shape of the drawing sculptor.- Parameters:
shape- 0 for LINES, 1 for RECTANGLE
-
backupImage
Called by the TextureSculptor or VolumeSculptor objects. The function stores the original volume data back to the original values in the m_aiImage_backup data members.- Parameters:
kImageA- DOCUMENT ME!kImageB- DOCUMENT ME!
-
backupImage
Called by the TextureSculptor or VolumeSculptor objects. The function stores the original volume data back to the original values in the m_aiImage_backup data members.- Parameters:
kImageA- DOCUMENT ME!kImageB- DOCUMENT ME!iIndex- DOCUMENT ME!
-
blendColor
protected int blendColor(int iImageColor, int iBlendColor) blendColor: blends two colors in ARGB format from the BufferedImage class, using an alpha value of 0.5.- Parameters:
iImageColor- DOCUMENT ME!iBlendColor- DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
calculateMinMaxValues
Called by the TextureSculptor or VolumeSculptor objects. The function calculates the mimumum and maximum intensity and color values in the images.- Parameters:
kImageA- DOCUMENT ME!kImageB- DOCUMENT ME!
-
drawRectangleArea
protected void drawRectangleArea()Draw rectangle shape object. -
fill
protected void fill(int[][] aaiCrossingPoints, int[] aiNumCrossings) fill: fill the sculpt outline drawn by the user. Pixels are determined to be inside or outside the sculpt region based on the parameters, aaiCrossingPoints and aiNumCrossings, using a scan-conversion algorithm that traverses each row and column of the bounding box of the sculpt region coloring inside points as it goes.- Parameters:
aaiCrossingPoints- DOCUMENT ME!aiNumCrossings- DOCUMENT ME!
-
finalize
Calls disposeLocal. -
getFrameBuffer
protected boolean getFrameBuffer()Grab the canvas image, and copy into the m_kSculptImage data members.- Returns:
- DOCUMENT ME!
-
line
protected void line(int iX0, int iY0, int iX1, int iY1) This function draws a 2D line on the canvas image -- ontop of the currently rendered image. To implement the line drawing I use the midpoint line algorithm, in Foley and van Dam, originally Bresenham's algorithm. The first part of the function sets up the step sizes for x and y depending on what type of line is being drawn. The second part loops over the line, drawing pixels into the canvas image.- Parameters:
iX0- DOCUMENT ME!iY0- DOCUMENT ME!iX1- DOCUMENT ME!iY1- DOCUMENT ME!
-
outlineRegion
protected void outlineRegion(int[][] aaiCrossingPoints, int[] aiNumCrossings) This function computes the set of spans indicated by column crossings for the sculpt outline drawn by the user, by doing a polygon scan conversion in gridded space. The outline must be closed with last point = first point.- Parameters:
aaiCrossingPoints- DOCUMENT ME!aiNumCrossings- DOCUMENT ME!
-
processMouseReleased
protected void processMouseReleased(int iX, int iY) Called when the left mouse button is released, indicating that the sculpt outline is complete, or when the outline is being drawn and the mouse is fragged outside the canvas area. The function closes the outline, using the first and last recorded mouse positions. It then fills the outline, by blending the fill color with the background data on the canvas. Filling is done as a 2D polygon scan conversion so that any closed loop, including concave and self-intersecting loops, can be processed accurately.- Parameters:
iX- int, the x position of the mouse recorded when the mouse button was released.iY- int, the y position of the mouse recorded when the mouse button was released.
-
sculptImage
Called by the TextureSculptor or VolumeSculptor objects. The function sculpts the original volume data by setting the value at input iIndex to the mimimum values calculated in CalculateMinMaxValues.- Parameters:
kImageA- DOCUMENT ME!kImageB- DOCUMENT ME!iIndex- DOCUMENT ME!
-
sortCrossingPoints
protected void sortCrossingPoints(int[] aiList, int iNumElements) Sorts the edge crossing points in place.- Parameters:
aiList- DOCUMENT ME!iNumElements- DOCUMENT ME!
-
undoSculpt
Called by the TextureSculptor or VolumeSculptor objects. The function resets the volume data back to the original values, using the data stored in the m_aiImage_backup data members.- Parameters:
kImageA- DOCUMENT ME!kImageB- DOCUMENT ME!
-