Class Sculptor_WM
- All Implemented Interfaces:
MouseListener,MouseMotionListener,EventListener
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.
- Author:
- Alexandra Bokinsky, Ph.D. Under contract from GeometricTools, Inc.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate intShape of the drawing rectangle.static intFree-hand sculptingprotected int[]The sculpt region color.protected int[]Mouse positions in x,y for drawing the sculpt region:.protected int[]Mouse positions in x,y for drawing the sculpt region:.protected byte[]Backup imageprotected byte[]m_kSculptImage is a screen shot of the canvas image.private byte[]Texture data for ModelImage A in byteprivate byte[]Texture data for ModelImage B in byteprotected booleanm_bMousePressed is set to true when the mousePressed callback is activated and the left mouse button is down.protected booleanTrue when a sculpt region has been drawn.protected booleanm_bSculptEnabled is turned on when the user presses the "Draw Sculpt Outline" button.protected intFirst x mouse positionprotected intFirst y mouse positionprotected intLast x mouse positionprotected intLast y mouse positionprotected intNumber of points in the free-hand line.protected intPrevious and first mouse positions:.protected intPrevious and first mouse positions:.protected intsculpt image heightprotected intsculpt image widthprotected intThe min and max x,y mouse valuesprotected intThe min and max x,y mouse valuesprotected intThe min and max x,y mouse valuesprotected intThe min and max x,y mouse valuesprotected com.jogamp.opengl.awt.GLCanvasCanvas reference for drawing :.private ModelImageModelImage Aprivate ModelImageModelImage Bprivate ModelImageBackup of ModelImage Aprivate ModelImageBackup of ModelImage Bprivate WildMagic.LibFoundation.Mathematics.Matrix4fWorld-view-project matrix for applying the sculpt to the volume.static intrectangle sculpt -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionbooleanapplySculpt(int iTSlice) Apply the sculpt region to the volume data.private voidbackupData(ModelImage kImage, ModelImage kImageBackup, int iDataIndex) Backup ModelImage data.private voidBackup the sculpt image.voidClears the sculpt image.voidMemory cleanup.protected voidDraw rectangle shape object.voidenableSculpt(boolean bEnabled) Turn sculpt drawing on/off.protected voidfill(int[][] aaiCrossingPoints, int[] aiNumCrossings) fill: fill the sculpt outline drawn by the user.booleanReturn the sculpt enabled status.private booleangetSculpt(int iX, int iY) Get the sculpt on/off at the position.byte[]Return sculpt image for display.voidInitialize the Mouse listener.voidInverts the sculpt image.private voidinvertSculpt(int iX, int iY, int[] aiColors) Invert the sculpt image at the positionbooleanReturn true if the sculpt image has been drawn.protected voidline(int iX0, int iY0, int iX1, int iY1, int[] aiColors) This function draws a 2D line on the canvas image -- on top of the currently rendered image.voidmouseClicked(MouseEvent kEvent) voidmouseDragged(MouseEvent kEvent) Invoked when the mouse is dragged while a button is held down.voidmouseEntered(MouseEvent kEvent) voidmouseExited(MouseEvent kEvent) Invoked when the mouse leaves a component.voidmouseMoved(MouseEvent kEvent) 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 dragged outside the canvas area.booleansave(FileWriteOptions options, int filterType) Creates save dialog so that the image can be saved // This should be moved to imageModel.save();private voidsculptData(ModelImage kImage, int iDataIndex, int iTextureIndex, byte[] aucTextureImageData) Sculpt the ModelImage and Textures at the index.voidsetDrawingShape(int shape) Set the shape of the drawing sculptor.voidsetImage(ModelImage kImageA, ModelImage kImageB) Set the ModelImage dataprivate voidsetSculpt(int iX, int iY, int[] aiColors) Set the sculpt imagevoidsetSculptDrawn(boolean value) voidsetSculptImage(byte[] abImage) voidsetTextureImageDataA(byte[] data) Set the texture data byte[] for ModelImage AvoidsetTextureImageDataB(byte[] data) Set the texture data byte[] for ModelImage BvoidsetWVPMatrix(WildMagic.LibFoundation.Mathematics.Matrix4f kMatrix) Set the World-view-projection matrix from the renderer.protected voidsortCrossingPoints(int[] aiList, int iNumElements) Sorts the edge crossing points in place.voidundoSculpt(int iTSlice) Undo the sculpt.
-
Field Details
-
LINES
public static int LINESFree-hand sculpting -
RECTANGLE
public static int RECTANGLErectangle sculpt -
m_aiXPoints
protected int[] m_aiXPointsMouse positions in x,y for drawing the sculpt region:. -
m_aiYPoints
protected int[] m_aiYPointsMouse positions in x,y for drawing the sculpt region:. -
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_bSculptDrawnTrue when a sculpt region has been drawn. -
m_bSculptEnabled
protected boolean m_bSculptEnabledm_bSculptEnabled is turned on when the user presses the "Draw Sculpt Outline" button. -
m_aiColorSculpt
protected int[] m_aiColorSculptThe sculpt region color. -
m_iFirstX
protected int m_iFirstXFirst x mouse position -
m_iFirstY
protected int m_iFirstYFirst y mouse position -
m_iLastX
protected int m_iLastXLast x mouse position -
m_iLastY
protected int m_iLastYLast y mouse position -
m_iNumberPoints
protected int m_iNumberPointsNumber of points in the free-hand line. -
m_iPreviousX
protected int m_iPreviousXPrevious and first mouse positions:. -
m_iPreviousY
protected int m_iPreviousYPrevious and first mouse positions:. -
m_iSculptImageHeight
protected int m_iSculptImageHeightsculpt image height -
m_iSculptImageWidth
protected int m_iSculptImageWidthsculpt image width -
m_iXMax
protected int m_iXMaxThe min and max x,y mouse values -
m_iXMin
protected int m_iXMinThe min and max x,y mouse values -
m_iYMax
protected int m_iYMaxThe min and max x,y mouse values -
m_iYMin
protected int m_iYMinThe min and max x,y mouse values -
m_kCanvas
protected com.jogamp.opengl.awt.GLCanvas m_kCanvasCanvas reference for drawing :. -
m_aucSavedImage
protected byte[] m_aucSavedImageBackup image -
m_aucSculptImage
protected byte[] m_aucSculptImagem_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. -
drawShape
private int drawShapeShape of the drawing rectangle. -
m_kImageA
ModelImage A -
m_kImageBackupA
Backup of ModelImage A -
m_kImageB
ModelImage B -
m_kImageBackupB
Backup of ModelImage B -
m_kWVPMatrix
private WildMagic.LibFoundation.Mathematics.Matrix4f m_kWVPMatrixWorld-view-project matrix for applying the sculpt to the volume. -
m_aucTextureImageDataA
private byte[] m_aucTextureImageDataATexture data for ModelImage A in byte -
m_aucTextureImageDataB
private byte[] m_aucTextureImageDataBTexture data for ModelImage B in byte
-
-
Constructor Details
-
Sculptor_WM
public Sculptor_WM(com.jogamp.opengl.awt.GLCanvas kCanvas) Constructor.- Parameters:
kCanvas- the canvas to draw the sculpt image on.
-
-
Method Details
-
applySculpt
public boolean applySculpt(int iTSlice) Apply the sculpt region to the volume data.- Returns:
- true if the volume has changed, false indicates no change.
-
clearSculpt
public void clearSculpt()Clears the sculpt image. -
disposeLocal
public void disposeLocal()Memory cleanup. -
enableSculpt
public void enableSculpt(boolean bEnabled) Turn sculpt drawing on/off.- Parameters:
bEnabled- turns sculpting on/off.
-
getEnable
public boolean getEnable()Return the sculpt enabled status.- Returns:
- sculpt enabled status.
-
getSculptImage
public byte[] getSculptImage()Return sculpt image for display.- Returns:
- byte[] containing the sculpt image.
-
initVolumeSculptor
public void initVolumeSculptor()Initialize the Mouse listener. Note - this function should be called once per instance only, as it sets up the MouseMotionListener and MouseListener. -
invertSculpt
public void invertSculpt()Inverts the sculpt image. -
IsSculptDrawn
public boolean IsSculptDrawn()Return true if the sculpt image has been drawn.- Returns:
- true if the sculpt image has been drawn.
-
mouseClicked
- Specified by:
mouseClickedin interfaceMouseListener
-
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
- Specified by:
mouseEnteredin interfaceMouseListener
-
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
- Specified by:
mouseMovedin interfaceMouseMotionListener
-
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
-
save
Creates save dialog so that the image can be saved // This should be moved to imageModel.save();- Parameters:
options- File-write options.filterType- only used if >= 0- Returns:
- true on successful write, false otherwise.
-
setDrawingShape
public void setDrawingShape(int shape) Set the shape of the drawing sculptor.- Parameters:
shape- 0 for LINES, 1 for RECTANGLE
-
setImage
Set the ModelImage data- Parameters:
kImageA- ModelImage AkImageB- ModelImage B (or null)
-
setSculptDrawn
public void setSculptDrawn(boolean value) -
setSculptImage
public void setSculptImage(byte[] abImage) -
setTextureImageDataA
public void setTextureImageDataA(byte[] data) Set the texture data byte[] for ModelImage A- Parameters:
data- the texture data byte[] for ModelImage A
-
setTextureImageDataB
public void setTextureImageDataB(byte[] data) Set the texture data byte[] for ModelImage B- Parameters:
data- the texture data byte[] for ModelImage B
-
setWVPMatrix
public void setWVPMatrix(WildMagic.LibFoundation.Mathematics.Matrix4f kMatrix) Set the World-view-projection matrix from the renderer. Used to apply the sculpt image to the volume data.- Parameters:
kMatrix- World-view-projection matrix
-
undoSculpt
public void undoSculpt(int iTSlice) Undo the sculpt. -
backupData
Backup ModelImage data.- Parameters:
kImage- original ModelImagekImageBackup- backup of ModelImageiDataIndex- index of the position in the ModelImage to backup
-
backupSculptImage
private void backupSculptImage()Backup the sculpt image. -
getSculpt
private boolean getSculpt(int iX, int iY) Get the sculpt on/off at the position.- Parameters:
iX- x-positioniY- y-position- Returns:
- true if the position should be sculpted, false otherwise.
-
invertSculpt
private void invertSculpt(int iX, int iY, int[] aiColors) Invert the sculpt image at the position- Parameters:
iX- x-positioniY- y-positionaiColors- sculpt color.
-
sculptData
private void sculptData(ModelImage kImage, int iDataIndex, int iTextureIndex, byte[] aucTextureImageData) Sculpt the ModelImage and Textures at the index.- Parameters:
kImage- ModelImageiDataIndex- index to sculptaucTextureImageData- byte[] TextureafTextureImageData- float[] Texture
-
setSculpt
private void setSculpt(int iX, int iY, int[] aiColors) Set the sculpt image- Parameters:
iX- x-positioniY- y-positionaiColors- sculpt color
-
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!
-
line
protected void line(int iX0, int iY0, int iX1, int iY1, int[] aiColors) This function draws a 2D line on the canvas image -- on top 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- mouse x0iY0- mouse y0iX1- mouse x1iY1- mouse y1aiColors- line color.
-
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 dragged 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.
-
sortCrossingPoints
protected void sortCrossingPoints(int[] aiList, int iNumElements) Sorts the edge crossing points in place.- Parameters:
aiList- list of positionsiNumElements- number of positions.
-