Skip to content

Commit

Permalink
Add updateVolume method; add simple usage help
Browse files Browse the repository at this point in the history
  • Loading branch information
kephale authored and ctrueden committed May 3, 2018
1 parent 5f0d1f2 commit 6eca517
Showing 1 changed file with 138 additions and 29 deletions.
167 changes: 138 additions & 29 deletions src/main/java/sc/iview/SciView.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@
import org.scijava.log.LogService;
import org.scijava.menu.MenuService;
import org.scijava.plugin.Parameter;

import org.scijava.ui.UIService;
import org.scijava.ui.behaviour.Behaviour;
import org.scijava.ui.behaviour.BehaviourMap;
import org.scijava.ui.behaviour.ClickBehaviour;

import sc.iview.javafx.JavaFXMenuCreator;
Expand Down Expand Up @@ -143,7 +147,7 @@ public class SciView extends SceneryBase {
SceneryPanel imagePanel = null;

public SciView( Context context ) {
super( "SciView", 800, 600, true );
super( "SciView (press U for usage help)", 800, 600, true );
context.inject( this );
}

Expand Down Expand Up @@ -279,8 +283,8 @@ class toggleCameraControl implements ClickBehaviour {
String currentMode = "arcball";

@Override
public void click(int x, int y) {
if (currentMode.startsWith("fps")) {
public void click( int x, int y ) {
if( currentMode.startsWith( "fps" ) ) {
enableArcBallControl();

currentMode = "arcball";
Expand All @@ -290,7 +294,35 @@ public void click(int x, int y) {
currentMode = "fps";
}

log.info("Switched to " + currentMode + " control");
log.info( "Switched to " + currentMode + " control" );
}
}

class showHelpDisplay implements ClickBehaviour {

@Override
public void click(int x, int y) {
String helpString = "SciView help:\n\n";
// HACK: hard-coded, but no accessor for getAllBindings in scenery
helpString += "U - this menu\n";
helpString += "W/S - forward/backward\n";
helpString += "A/D - left/right\n";
helpString += "space/shift + space - up/down\n";
helpString += "X - toggle between FPS and arcball camera control\n";
helpString += " FPS camera control allows free movement in all directions\n";
helpString += " Arcball camera control allows for mouse-only rotation about an object's center\n";
helpString += "Q - debug view\n";
helpString += "P - take a screenshot\n";
helpString += "shift + P - record a video\n";
helpString += "shift + V - toggle virtual reality mode\n";
helpString += "F - toggle fullscreen\n";
helpString += "K - increase exposure\n";
helpString += "L - decrease exposure\n";
helpString += "shift + K - increase gamma\n";
helpString += "shift + L - decrease gamma\n";
// HACK: Make the console pop via stderr.
// Later, we will use a nicer dialog box or some such.
log.warn( helpString );
}
}

Expand All @@ -308,11 +340,14 @@ public void inputSetup() {
enableArcBallControl();
//enableFPSControl();

getInputHandler().addBehaviour("toggle_control_mode", new toggleCameraControl() );
getInputHandler().addKeyBinding("toggle_control_mode", "X" );
getInputHandler().addBehaviour( "toggle_control_mode", new toggleCameraControl() );
getInputHandler().addKeyBinding( "toggle_control_mode", "X" );

//setupCameraModeSwitching( "X" );

getInputHandler().addBehaviour( "show_help", new showHelpDisplay() );
getInputHandler().addKeyBinding( "show_help", "U" );

initialized = true;
}

Expand All @@ -325,46 +360,60 @@ public void enableArcBallControl() {
}

Supplier<Camera> cameraSupplier = () -> getScene().findObserver();
targetArcball = new ArcballCameraControl( "mouse_control", cameraSupplier,
getRenderer().getWindow().getWidth(),
getRenderer().getWindow().getHeight(), target );
targetArcball = new ArcballCameraControl( "mouse_control", cameraSupplier, getRenderer().getWindow().getWidth(),
getRenderer().getWindow().getHeight(), target );
targetArcball.setMaximumDistance( Float.MAX_VALUE );
targetArcball.setMouseSpeedMultiplier( 0.25f );
targetArcball.setScrollSpeedMultiplier( 0.05f );
targetArcball.setDistance( getCamera().getPosition().minus(target).magnitude() );
targetArcball.setDistance( getCamera().getPosition().minus( target ).magnitude() );

getInputHandler().addBehaviour( "mouse_control", targetArcball );
getInputHandler().addBehaviour( "scroll_arcball", targetArcball );
getInputHandler().addKeyBinding( "scroll_arcball", "scroll" );

getInputHandler().removeBehaviour("move_forward" );
getInputHandler().removeBehaviour("move_back" );
getInputHandler().removeBehaviour("move_left" );
getInputHandler().removeBehaviour("move_right" );
getInputHandler().removeBehaviour("move_up" );
getInputHandler().removeBehaviour("move_down" );
getInputHandler().removeBehaviour( "move_forward" );
getInputHandler().removeBehaviour( "move_back" );
getInputHandler().removeBehaviour( "move_left" );
getInputHandler().removeBehaviour( "move_right" );
getInputHandler().removeBehaviour( "move_up" );
getInputHandler().removeBehaviour( "move_down" );
}

public void enableFPSControl() {
Supplier<Camera> cameraSupplier = () -> getScene().findObserver();
fpsControl = new FPSCameraControl( "mouse_control", cameraSupplier,
getRenderer().getWindow().getWidth(),
getRenderer().getWindow().getHeight() );
fpsControl = new FPSCameraControl( "mouse_control", cameraSupplier, getRenderer().getWindow().getWidth(),
getRenderer().getWindow().getHeight() );

getInputHandler().addBehaviour( "mouse_control", fpsControl );
getInputHandler().removeKeyBinding( "scroll_arcball" );
getInputHandler().removeBehaviour( "scroll_arcball" );

float defaultSpeed = 3.0f;

getInputHandler().addBehaviour("move_forward_scroll", new MovementCommand("move_forward", "forward", () -> getScene().findObserver(), defaultSpeed ) );
getInputHandler().addBehaviour("move_forward", new MovementCommand("move_forward", "forward", () -> getScene().findObserver(), defaultSpeed ) );
getInputHandler().addBehaviour("move_back", new MovementCommand("move_back", "back", () -> getScene().findObserver(), defaultSpeed ) );
getInputHandler().addBehaviour("move_left", new MovementCommand("move_left", "left", () -> getScene().findObserver(), defaultSpeed ) );
getInputHandler().addBehaviour("move_right", new MovementCommand("move_right", "right", () -> getScene().findObserver(), defaultSpeed ) );
getInputHandler().addBehaviour("move_up", new MovementCommand("move_up", "up", () -> getScene().findObserver(), defaultSpeed ) );
getInputHandler().addBehaviour("move_down", new MovementCommand("move_down", "down", () -> getScene().findObserver(), defaultSpeed ) );

getInputHandler().addBehaviour( "move_forward_scroll", new MovementCommand( "move_forward", "forward",
() -> getScene().findObserver(),
defaultSpeed ) );
getInputHandler().addBehaviour( "move_forward", new MovementCommand( "move_forward", "forward",
() -> getScene().findObserver(),
defaultSpeed ) );
getInputHandler().addBehaviour( "move_back", new MovementCommand( "move_back", "back",
() -> getScene().findObserver(),
defaultSpeed ) );
getInputHandler().addBehaviour( "move_left", new MovementCommand( "move_left", "left",
() -> getScene().findObserver(),
defaultSpeed ) );
getInputHandler().addBehaviour( "move_right", new MovementCommand( "move_right", "right",
() -> getScene().findObserver(),
defaultSpeed ) );
getInputHandler().addBehaviour( "move_up", new MovementCommand( "move_up", "up",
() -> getScene().findObserver(),
defaultSpeed ) );
getInputHandler().addBehaviour( "move_down", new MovementCommand( "move_down", "down",
() -> getScene().findObserver(),
defaultSpeed ) );

// getInputHandler().addKeyBinding( "move_up", "C" );
// getInputHandler().addKeyBinding( "move_down", "Z" );
getInputHandler().addKeyBinding( "move_forward_scroll", "scroll" );
}

Expand Down Expand Up @@ -760,7 +809,7 @@ public void addChild( Node node ) {

public graphics.scenery.Node addVolume( Dataset image ) {
float[] voxelDims = new float[image.numDimensions()];
for (int d=0; d<voxelDims.length; d++) {
for( int d = 0; d < voxelDims.length; d++ ) {
voxelDims[d] = ( float ) image.axis( d ).averageScale( 0, 1 );
}
return addVolume( image, voxelDims );
Expand All @@ -780,7 +829,7 @@ public <T extends RealType<T>> graphics.scenery.Node addVolume( IterableInterval
image.dimensions( dimensions );

@SuppressWarnings("unchecked")
Class<T> voxelType = (Class<T>) image.firstElement().getClass();
Class<T> voxelType = ( Class<T> ) image.firstElement().getClass();
int bytesPerVoxel = image.firstElement().getBitsPerPixel() / 8;
float minVal = Float.MIN_VALUE, maxVal = Float.MAX_VALUE;
NativeTypeEnum nType = null;
Expand Down Expand Up @@ -833,4 +882,64 @@ public <T extends RealType<T>> graphics.scenery.Node addVolume( IterableInterval
return v;
}

public <T extends RealType<T>> graphics.scenery.Node updateVolume( IterableInterval<T> image, String name,
float[] voxelDimensions, Volume v ) {
log.warn( "Add Volume" );

long dimensions[] = new long[3];
image.dimensions( dimensions );

@SuppressWarnings("unchecked")
Class<T> voxelType = ( Class<T> ) image.firstElement().getClass();
int bytesPerVoxel = image.firstElement().getBitsPerPixel() / 8;
float minVal = Float.MIN_VALUE, maxVal = Float.MAX_VALUE;
NativeTypeEnum nType = null;

if( voxelType == UnsignedByteType.class ) {
minVal = 0;
maxVal = 255;
nType = NativeTypeEnum.UnsignedByte;
} else if( voxelType == UnsignedShortType.class ) {
minVal = 0;
maxVal = 65535;
nType = NativeTypeEnum.UnsignedShort;
} else if( voxelType == FloatType.class ) {
minVal = 0;
maxVal = 1;
nType = NativeTypeEnum.Float;
} else {
log.debug( "Type: " + voxelType +
" cannot be displayed as a volume. Convert to UnsignedByteType, UnsignedShortType, or FloatType." );
return null;
}

// Make and populate a ByteBuffer with the content of the Dataset
ByteBuffer byteBuffer = ByteBuffer.allocateDirect( ( int ) ( bytesPerVoxel * dimensions[0] * dimensions[1] *
dimensions[2] ) );
Cursor<T> cursor = image.cursor();

while( cursor.hasNext() ) {
cursor.fwd();
if( voxelType == UnsignedByteType.class ) {
byteBuffer.put( ( byte ) ( ( ( UnsignedByteType ) cursor.get() ).get() & 0xff ) );
} else if( voxelType == UnsignedShortType.class ) {
byteBuffer.putShort( ( short ) Math.abs( ( ( UnsignedShortType ) cursor.get() ).getShort() ) );
} else if( voxelType == FloatType.class ) {
byteBuffer.putFloat( ( ( FloatType ) cursor.get() ).get() );
}
}
byteBuffer.flip();

v.readFromBuffer( name, byteBuffer, dimensions[0], dimensions[1], dimensions[2], voxelDimensions[0],
voxelDimensions[1], voxelDimensions[2], nType, bytesPerVoxel );
v.setDirty( true );
v.setNeedsUpdate( true );
v.setNeedsUpdateWorld( true );

v.setTrangemin( minVal );
v.setTrangemax( maxVal );

return v;
}

}

0 comments on commit 6eca517

Please sign in to comment.