java.lang.Object
gov.nih.mipav.view.renderer.J3D.volumeview.Sculptor
All Implemented Interfaces:
MouseListener, MouseMotionListener, EventListener
Direct Known Subclasses:
TextureSculptor, VolumeSculptor

public abstract class Sculptor extends Object implements MouseMotionListener, MouseListener
Volume Sculpturing allows the user to draw a region on the screen in the volume render view, and to remove the parts of the volume covered by that region. The user outlines a region by holding the left mouse button down and drawing directly on the screen. Volume Sculpturing works in both the Raycast and Shearwarp volume render views through the VolumeSculptor.java implementation and on the VolumeTexture render views through the TextureSculptor.java implemetation.

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:
  • ViewJFrameVolumeView
  • invalid reference
    RayCastVolumeRenderer
  • invalid reference
    ShearWarpVolumeRenderer
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected double
    DOCUMENT ME!
    protected double
    DOCUMENT ME!
    protected double
    DOCUMENT ME!
    protected double
    DOCUMENT ME!
    protected double
    DOCUMENT ME!
    protected double
    DOCUMENT ME!
    protected double
    DOCUMENT ME!
    protected double
    DOCUMENT ME!
    private int
    Shape of the drawing rectangle.
    protected float
    DOCUMENT ME!
    protected float
    Min and Max image intensity and color values:.
    static int
    DOCUMENT 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 boolean
    m_bMousePressed is set to true when the mousePressed callback is activated and the left mouse button is down.
    protected boolean
    DOCUMENT ME!
    protected boolean
    m_bSculptEnabled is turned on when the user presses the "Draw Sculpt Outline" button.
    protected int
    The sculpt region color.
    protected int
    DOCUMENT ME!
    protected int
    DOCUMENT ME!
    protected int
    DOCUMENT ME!
    protected int
    DOCUMENT ME!
    protected int
    DOCUMENT ME!
    protected int
    DOCUMENT ME!
    protected int
    The original canvas size.
    protected int
    Previous and first mouse positions:.
    protected int
    DOCUMENT ME!
    protected int
    DOCUMENT ME!
    protected int
    Size of the m_kSculptImage, when it is captured.
    protected int
    DOCUMENT ME!
    protected int
    The min and max x,y mouse values:.
    protected int
    DOCUMENT ME!
    protected int
    DOCUMENT ME!
    protected javax.media.j3d.Canvas3D
    Canvas3D reference for drawing :.
    protected JProgressBar
    Green Progress bar at the top right hand corner of the ViewJFrameVolumeView window.
    protected BufferedImage
    DOCUMENT ME!
    protected BufferedImage
    m_kSculptImage is a screen shot of the canvas image.
    protected BufferedImage
    DOCUMENT ME!
    static int
    DOCUMENT ME!
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    abstract boolean
    applySculpt: abstract function, implementation depends on whether the instance is VolumeTextureSculptor or VolumeSculptor.
    protected void
    backupImage(ModelImage kImageA, ModelImage kImageB)
    Called by the TextureSculptor or VolumeSculptor objects.
    protected void
    backupImage(ModelImage kImageA, ModelImage kImageB, int iIndex)
    Called by the TextureSculptor or VolumeSculptor objects.
    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.
    protected void
    Called by the TextureSculptor or VolumeSculptor objects.
    void
    clearSculpt: called by ViewJFrameVolumeView when the user presses the "Clear Ouline" button, clearing the sculpt outline from the canvas image.
    void
    disposeLocal(boolean flag)
    Sets all variables to null, disposes, and garbage collects.
    protected void
    Draw rectangle shape object.
    void
    enableSculpt(boolean bEnabled)
    enableSculpt: called by the ViewJFrameVolumeView object when the Draw Sculpt button is pressed.
    protected void
    fill(int[][] aaiCrossingPoints, int[] aiNumCrossings)
    fill: fill the sculpt outline drawn by the user.
    protected void
    Calls disposeLocal.
    boolean
    DOCUMENT ME!
    protected boolean
    Grab the canvas image, and copy into the m_kSculptImage data members.
    void
    initVolumeSculptor(int iSculptWidth, int iSculptHeight)
    Initialize the Mouse events, store the progress bar, and get the original canvas widths.
    void
    invertSculpt: called by ViewJFrameVolumeView when the user presses the "Invert Sculpt Region" button, inverting the sculpt region.
    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.
    void
    One of the overrides necessary to be a MouseListener.
    void
    Invoked when the mouse is dragged while a button is held down.
    void
    One of the overrides necessary to be a MouseListener.
    void
    Invoked when the mouse leaves a component.
    void
    One of the overrides necessary to be a MouseMotionListener.
    void
    Invoked when a mouse button is pressed.
    void
    Invoked when a mouse button is released.
    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.
    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.
    protected void
    sculptImage(ModelImage kImageA, ModelImage kImageB, int iIndex)
    Called by the TextureSculptor or VolumeSculptor objects.
    void
    setDrawingShape(int shape)
    Set the shape of the drawing sculptor.
    protected void
    sortCrossingPoints(int[] aiList, int iNumElements)
    Sorts the edge crossing points in place.
    abstract void
    undoSculpt: abstract function, implementation depends on whether the instance is VolumeTextureSculptor or VolumeSculptor.
    protected void
    undoSculpt(ModelImage kImageA, ModelImage kImageB)
    Called by the TextureSculptor or VolumeSculptor objects.
    abstract void
    DOCUMENT ME!

    Methods inherited from class java.lang.Object

    clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • LINES

      public static int LINES
      DOCUMENT ME!
    • RECTANGLE

      public static int RECTANGLE
      DOCUMENT ME!
    • dAMinAlpha

      protected double dAMinAlpha
      DOCUMENT ME!
    • dAMinBlue

      protected double dAMinBlue
      DOCUMENT ME!
    • dAMinGreen

      protected double dAMinGreen
      DOCUMENT ME!
    • dAMinRed

      protected double dAMinRed
      DOCUMENT ME!
    • dBMinAlpha

      protected double dBMinAlpha
      DOCUMENT ME!
    • dBMinBlue

      protected double dBMinBlue
      DOCUMENT ME!
    • dBMinGreen

      protected double dBMinGreen
      DOCUMENT ME!
    • dBMinRed

      protected double dBMinRed
      DOCUMENT ME!
    • fImageBMin

      protected float fImageBMin
      DOCUMENT ME!
    • fImageMin

      protected float fImageMin
      Min and Max image intensity and color values:.
    • m_aiImageA_backup

      protected int[] m_aiImageA_backup
      Backup of the data for undo:.
    • m_aiImageB_backup

      protected int[] m_aiImageB_backup
      DOCUMENT ME!
    • m_aiXPoints

      protected int[] m_aiXPoints
      Mouse positions in x,y for drawing the sculpt region:.
    • m_aiYPoints

      protected int[] m_aiYPoints
      DOCUMENT ME!
    • m_bMousePressed

      protected boolean m_bMousePressed
      m_bMousePressed is set to true when the mousePressed callback is activated and the left mouse button is down.
    • m_bSculptDrawn

      protected boolean m_bSculptDrawn
      DOCUMENT ME!
    • m_bSculptEnabled

      protected boolean m_bSculptEnabled
      m_bSculptEnabled is turned on when the user presses the "Draw Sculpt Outline" button.
    • m_iColorSculpt

      protected int m_iColorSculpt
      The sculpt region color.
    • m_iFirstX

      protected int m_iFirstX
      DOCUMENT ME!
    • m_iFirstY

      protected int m_iFirstY
      DOCUMENT ME!
    • m_iLastX

      protected int m_iLastX
      DOCUMENT ME!
    • m_iLastY

      protected int m_iLastY
      DOCUMENT ME!
    • m_iNumberPoints

      protected int m_iNumberPoints
      DOCUMENT ME!
    • m_iOriginalHeight

      protected int m_iOriginalHeight
      DOCUMENT ME!
    • m_iOriginalWidth

      protected int m_iOriginalWidth
      The original canvas size. This is used if the ViewJFrameVolumeView window is resized by the user.
    • m_iPreviousX

      protected int m_iPreviousX
      Previous and first mouse positions:.
    • m_iPreviousY

      protected int m_iPreviousY
      DOCUMENT ME!
    • m_iSculptImageHeight

      protected int m_iSculptImageHeight
      DOCUMENT ME!
    • m_iSculptImageWidth

      protected int m_iSculptImageWidth
      Size of the m_kSculptImage, when it is captured.
    • m_iXMax

      protected int m_iXMax
      DOCUMENT ME!
    • m_iXMin

      protected int m_iXMin
      The min and max x,y mouse values:.
    • m_iYMax

      protected int m_iYMax
      DOCUMENT ME!
    • m_iYMin

      protected int m_iYMin
      DOCUMENT ME!
    • m_kCanvas3D

      protected javax.media.j3d.Canvas3D m_kCanvas3D
      Canvas3D reference for drawing :.
    • m_kProgress

      protected JProgressBar m_kProgress
      Green Progress bar at the top right hand corner of the ViewJFrameVolumeView window.
    • m_kSavedImage

      protected BufferedImage m_kSavedImage
      DOCUMENT ME!
    • m_kSculptImage

      protected BufferedImage 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

      protected BufferedImage m_kSculptImageOpaque
      DOCUMENT ME!
    • drawShape

      private int drawShape
      Shape 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

      public void mouseClicked(MouseEvent kEvent)
      One of the overrides necessary to be a MouseListener. This function is invoked when a button has been pressed and released.
      Specified by:
      mouseClicked in interface MouseListener
      Parameters:
      kEvent - the mouse event generated by a mouse clicked
    • mouseDragged

      public void mouseDragged(MouseEvent kEvent)
      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:
      mouseDragged in interface MouseMotionListener
      Parameters:
      kEvent - the mouse event generated by a mouse drag
    • mouseEntered

      public void mouseEntered(MouseEvent kEvent)
      One of the overrides necessary to be a MouseListener. Invoked when the mouse enters a component.
      Specified by:
      mouseEntered in interface MouseListener
      Parameters:
      kEvent - the mouse event generated by a mouse entered
    • mouseExited

      public void mouseExited(MouseEvent kEvent)
      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:
      mouseExited in interface MouseListener
      Parameters:
      kEvent - the mouse event generated by a mouse exit
    • mouseMoved

      public void mouseMoved(MouseEvent kEvent)
      One of the overrides necessary to be a MouseMotionListener. Invoked when the mouse is moved, but no buttons are pressed.
      Specified by:
      mouseMoved in interface MouseMotionListener
      Parameters:
      kEvent - the event generated by a mouse movement
    • mousePressed

      public void mousePressed(MouseEvent kEvent)
      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:
      mousePressed in interface MouseListener
      Parameters:
      kEvent - the mouse event generated by a mouse press
    • mouseReleased

      public void mouseReleased(MouseEvent kEvent)
      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:
      mouseReleased in interface MouseListener
      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

      protected void backupImage(ModelImage kImageA, ModelImage kImageB)
      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

      protected void backupImage(ModelImage kImageA, ModelImage kImageB, int iIndex)
      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

      protected void calculateMinMaxValues(ModelImage kImageA, ModelImage kImageB)
      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

      protected void finalize() throws Throwable
      Calls disposeLocal.
      Overrides:
      finalize in class Object
      Throws:
      Throwable - DOCUMENT ME!
    • 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

      protected void sculptImage(ModelImage kImageA, ModelImage kImageB, int iIndex)
      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

      protected void undoSculpt(ModelImage kImageA, ModelImage kImageB)
      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!