/*
* Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistribution of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
* EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
* NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
* USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
* ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
* CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
* REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
* INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or
* intended for use in the design, construction, operation or
* maintenance of any nuclear facility.
*
*/
package org.jdesktop.j3d.examples.jcanvas3d;
import java.awt.AWTEvent;
import java.awt.event.MouseEvent;
import org.jogamp.java3d.Transform3D;
import org.jogamp.java3d.exp.swing.JCanvas3D;
import org.jogamp.vecmath.Matrix3d;
import org.jogamp.vecmath.Point3d;
import org.jogamp.vecmath.Vector3d;
import org.jogamp.java3d.internal.J3dUtilsI18N;
import org.jogamp.java3d.utils.universe.ViewingPlatform;
/**
* Moves the View around a point of interest when the mouse is dragged with
* a mouse button pressed. Includes rotation, zoom, and translation
* actions. Zooming can also be obtained by using mouse wheel.
*
* This behavior must be added to the ViewingPlatform
* using the ViewingPlatform.setViewPlatformBehavior
method.
*
* The rotate action rotates the ViewPlatform around the point of interest
* when the mouse is moved with the main mouse button pressed. The
* rotation is in the direction of the mouse movement, with a default
* rotation of 0.01 radians for each pixel of mouse movement.
*
* The zoom action moves the ViewPlatform closer to or further from the
* point of interest when the mouse is moved with the middle mouse button
* pressed (or Alt-main mouse button on systems without a middle mouse button).
* The default zoom action is to translate the ViewPlatform 0.01 units for each
* pixel of mouse movement. Moving the mouse up moves the ViewPlatform closer,
* moving the mouse down moves the ViewPlatform further away.
*
* By default, the zoom action allows the ViewPlatform to move through
* the center of rotation to orbit at a negative radius.
* The STOP_ZOOM
constructor flag will stop the ViewPlatform at
* a minimum radius from the center. The default minimum radius is 0.0
* and can be set using the setMinRadius
method.
*
* The PROPORTIONAL_ZOOM
constructor flag changes the zoom action
* to move the ViewPlatform proportional to its distance from the center
* of rotation. For this mode, the default action is to move the ViewPlatform
* by 1% of its distance from the center of rotation for each pixel of
* mouse movement.
*
* The translate action translates the ViewPlatform when the mouse is moved
* with the right mouse button pressed (Shift-main mouse button on systems
* without a right mouse button). The translation is in the direction of the
* mouse movement, with a default translation of 0.01 units for each pixel
* of mouse movement.
*
* The sensitivity of the actions can be scaled using the
* set
ActionFactor()
methods which scale
* the default movement by the factor. The rotate and translate actions
* have separate factors for x and y.
*
* The actions can be reversed using the REVERSE_
ACTION
* constructor flags. The default action moves the ViewPlatform around the
* objects in the scene. The REVERSE_
ACTION flags can
* make the objects in the scene appear to be moving in the direction
* of the mouse movement.
*
* The actions can be disabled by either using the
* DISABLE_
ACTION constructor flags or the
* set
ActionEnable
methods.
*
* The default center of rotation is (0, 0, 0) and can be set using the
* setRotationCenter()
method.
*
* @since Java 3D 1.2.1
*/
public class OrbitBehaviorJCanvas3D extends ViewPlatformAWTBehaviorJCanvas3D {
private Transform3D longditudeTransform = new Transform3D();
private Transform3D latitudeTransform = new Transform3D();
private Transform3D rotateTransform = new Transform3D();
// needed for integrateTransforms but don't want to new every time
private Transform3D temp1 = new Transform3D();
private Transform3D temp2 = new Transform3D();
private Transform3D translation = new Transform3D();
private Vector3d transVector = new Vector3d();
private Vector3d distanceVector = new Vector3d();
private Vector3d centerVector = new Vector3d();
private Vector3d invertCenterVector = new Vector3d();
private double longditude = 0.0;
private double latitude = 0.0;
private double startDistanceFromCenter = 20.0;
private double distanceFromCenter = 20.0;
private Point3d rotationCenter = new Point3d();
private Matrix3d rotMatrix = new Matrix3d();
private Transform3D currentXfm = new Transform3D();
private int mouseX = 0;
private int mouseY = 0;
private double rotXFactor = 1.0;
private double rotYFactor = 1.0;
private double transXFactor = 1.0;
private double transYFactor = 1.0;
private double zoomFactor = 1.0;
private double xtrans = 0.0;
private double ytrans = 0.0;
private double ztrans = 0.0;
private boolean zoomEnabled = true;
private boolean rotateEnabled = true;
private boolean translateEnabled = true;
private boolean reverseRotate = false;
private boolean reverseTrans = false;
private boolean reverseZoom = false;
private boolean stopZoom = false;
private boolean proportionalZoom = false;
private double minRadius = 0.0;
private int leftButton = ROTATE;
private int rightButton = TRANSLATE;
private int middleButton = ZOOM;
// the factor to be applied to wheel zooming so that it does not
// look much different with mouse movement zooming.
// This is a totally subjective factor.
private float wheelZoomFactor = 50.0f;
/**
* Constructor flag to reverse the rotate behavior
*/
public static final int REVERSE_ROTATE = 0x010;
/**
* Constructor flag to reverse the translate behavior
*/
public static final int REVERSE_TRANSLATE = 0x020;
/**
* Constructor flag to reverse the zoom behavior
*/
public static final int REVERSE_ZOOM = 0x040;
/**
* Constructor flag to reverse all the behaviors
*/
public static final int REVERSE_ALL = (REVERSE_ROTATE | REVERSE_TRANSLATE |
REVERSE_ZOOM);
/**
* Constructor flag that indicates zoom should stop when it reaches
* the minimum orbit radius set by setMinRadius(). The minimus
* radius default is 0.0.
*/
public static final int STOP_ZOOM = 0x100;
/**
* Constructor flag to disable rotate
*/
public static final int DISABLE_ROTATE = 0x200;
/**
* Constructor flag to disable translate
*/
public static final int DISABLE_TRANSLATE = 0x400;
/**
* Constructor flag to disable zoom
*/
public static final int DISABLE_ZOOM = 0x800;
/**
* Constructor flag to use proportional zoom, which determines
* how much you zoom based on view's distance from the center of
* rotation. The percentage of distance that the viewer zooms
* is determined by the zoom factor.
*/
public static final int PROPORTIONAL_ZOOM = 0x1000;
/**
* Used to set the fuction for a mouse button to Rotate
*/
private static final int ROTATE = 0;
/**
* Used to set the function for a mouse button to Translate
*/
private static final int TRANSLATE = 1;
/**
* Used to set the function for a mouse button to Zoom
*/
private static final int ZOOM = 2;
private static final double NOMINAL_ZOOM_FACTOR = .01;
private static final double NOMINAL_PZOOM_FACTOR = 1.0;
private static final double NOMINAL_ROT_FACTOR = .01;
private static final double NOMINAL_TRANS_FACTOR = .01;
private double rotXMul = NOMINAL_ROT_FACTOR * rotXFactor;
private double rotYMul = NOMINAL_ROT_FACTOR * rotYFactor;
private double transXMul = NOMINAL_TRANS_FACTOR * transXFactor;
private double transYMul = NOMINAL_TRANS_FACTOR * transYFactor;
private double zoomMul = NOMINAL_ZOOM_FACTOR * zoomFactor;
/**
* Parameterless constructor for this behavior. This is intended for use
* by ConfiguredUniverse, which requires such a constructor for
* configurable behaviors. The Canvas3D used to listen for mouse and
* mouse motion events is obtained from the superclass
* setViewingPlatform() method.
* @since Java 3D 1.3
*/
public OrbitBehaviorJCanvas3D() {
super(MOUSE_LISTENER | MOUSE_MOTION_LISTENER | MOUSE_WHEEL_LISTENER);
}
/**
* Creates a new OrbitBehavior
*
* @param c The Canvas3D to add the behavior to
*/
public OrbitBehaviorJCanvas3D(JCanvas3D c) {
this(c, 0 );
}
/**
* Creates a new OrbitBehavior
*
* @param c The Canvas3D to add the behavior to
* @param flags The option flags
*/
public OrbitBehaviorJCanvas3D(JCanvas3D c, int flags) {
super(c, MOUSE_LISTENER | MOUSE_MOTION_LISTENER | MOUSE_WHEEL_LISTENER | flags );
if ((flags & DISABLE_ROTATE) != 0) rotateEnabled = false;
if ((flags & DISABLE_ZOOM) != 0) zoomEnabled = false;
if ((flags & DISABLE_TRANSLATE) != 0) translateEnabled = false;
if ((flags & REVERSE_TRANSLATE) != 0) reverseTrans = true;
if ((flags & REVERSE_ROTATE) != 0) reverseRotate = true;
if ((flags & REVERSE_ZOOM) != 0) reverseZoom = true;
if ((flags & STOP_ZOOM) != 0) stopZoom = true;
if ((flags & PROPORTIONAL_ZOOM) !=0) {
proportionalZoom = true;
zoomMul = NOMINAL_PZOOM_FACTOR * zoomFactor;
}
}
@Override
protected synchronized void processAWTEvents( final AWTEvent[] events ) {
motion = false;
for(int i=0; i
minRadius) {
distanceFromCenter -= (zoomMul*ychange*
distanceFromCenter/100.0);
}
else {
distanceFromCenter = minRadius;
}
}
else {
if ((distanceFromCenter +
(zoomMul*ychange*distanceFromCenter/100.0))
> minRadius) {
distanceFromCenter += (zoomMul*ychange*
distanceFromCenter/100.0);
}
else {
distanceFromCenter = minRadius;
}
}
}
else {
if (stopZoom) {
if (reverseZoom) {
if ((distanceFromCenter - ychange*zoomMul) > minRadius) {
distanceFromCenter -= ychange*zoomMul;
}
else {
distanceFromCenter = minRadius;
}
}
else {
if ((distanceFromCenter + ychange*zoomMul) > minRadius) {
distanceFromCenter += ychange * zoomMul;
}
else {
distanceFromCenter = minRadius;
}
}
}
else {
if (reverseZoom) {
distanceFromCenter -= ychange*zoomMul;
}
else {
distanceFromCenter += ychange*zoomMul;
}
}
}
}
/**
* Sets the ViewingPlatform for this behavior. This method is
* called by the ViewingPlatform.
* If a sub-calls overrides this method, it must call
* super.setViewingPlatform(vp).
* NOTE: Applications should not call this method.
*/
@Override
public void setViewingPlatform(ViewingPlatform vp) {
super.setViewingPlatform( vp );
if (vp!=null) {
resetView();
integrateTransforms();
}
}
/**
* Reset the orientation and distance of this behavior to the current
* values in the ViewPlatform Transform Group
*/
private void resetView() {
Vector3d centerToView = new Vector3d();
targetTG.getTransform( targetTransform );
targetTransform.get( rotMatrix, transVector );
centerToView.sub( transVector, rotationCenter );
distanceFromCenter = centerToView.length();
startDistanceFromCenter = distanceFromCenter;
targetTransform.get( rotMatrix );
rotateTransform.set( rotMatrix );
// compute the initial x/y/z offset
temp1.set(centerToView);
rotateTransform.invert();
rotateTransform.mul(temp1);
rotateTransform.get(centerToView);
xtrans = centerToView.x;
ytrans = centerToView.y;
ztrans = centerToView.z;
// reset rotMatrix
rotateTransform.set( rotMatrix );
}
@Override
protected synchronized void integrateTransforms() {
// Check if the transform has been changed by another
// behavior
targetTG.getTransform(currentXfm) ;
if (! targetTransform.equals(currentXfm))
resetView() ;
longditudeTransform.rotY( longditude );
latitudeTransform.rotX( latitude );
rotateTransform.mul(rotateTransform, latitudeTransform);
rotateTransform.mul(rotateTransform, longditudeTransform);
distanceVector.z = distanceFromCenter - startDistanceFromCenter;
temp1.set(distanceVector);
temp1.mul(rotateTransform, temp1);
// want to look at rotationCenter
transVector.x = rotationCenter.x + xtrans;
transVector.y = rotationCenter.y + ytrans;
transVector.z = rotationCenter.z + ztrans;
translation.set(transVector);
targetTransform.mul(temp1, translation);
// handle rotationCenter
temp1.set(centerVector);
temp1.mul(targetTransform);
invertCenterVector.x = -centerVector.x;
invertCenterVector.y = -centerVector.y;
invertCenterVector.z = -centerVector.z;
temp2.set(invertCenterVector);
targetTransform.mul(temp1, temp2);
targetTG.setTransform(targetTransform);
// reset yaw and pitch angles
longditude = 0.0;
latitude = 0.0;
}
/**
* Sets the center around which the View rotates.
* The default is (0,0,0).
* @param center The Point3d to set the center of rotation to
*/
public synchronized void setRotationCenter(Point3d center) {
Point3d centerDelta = new Point3d();
centerDelta.sub(centerVector, center);
Transform3D invRot = new Transform3D(rotateTransform);
invRot.invert();
invRot.transform(centerDelta);
xtrans += centerDelta.x;
ytrans += centerDelta.y;
ztrans += centerDelta.z;
rotationCenter.x = center.x;
rotationCenter.y = center.y;
rotationCenter.z = center.z;
centerVector.set(rotationCenter);
}
/**
* Property which sets the center around which the View rotates.
* Used by ConfiguredUniverse.
* @param center array of length 1 containing an instance of Point3d
* @since Java 3D 1.3
*/
public void RotationCenter(Object[] center) {
if (! (center.length == 1 && center[0] instanceof Point3d))
throw new IllegalArgumentException
("RotationCenter must be a single Point3d");
setRotationCenter((Point3d)center[0]);
}
/**
* Places the value of the center around which the View rotates
* into the Point3d.
* @param center The Point3d
*/
public void getRotationCenter(Point3d center) {
center.x = rotationCenter.x;
center.y = rotationCenter.y;
center.z = rotationCenter.z;
}
// TODO
// Need to add key factors for Rotate, Translate and Zoom
// Method calls should just update MAX_KEY_ANGLE, KEY_TRANSLATE and
// KEY_ZOOM
//
// Methods also need to correctly set sign of variables depending on
// the Reverse settings.
/**
* Sets the rotation x and y factors. The factors are used to determine
* how many radians to rotate the view for each pixel of mouse movement.
* The view is rotated factor * 0.01 radians for each pixel of mouse
* movement. The default factor is 1.0.
* @param xfactor The x movement multiplier
* @param yfactor The y movement multiplier
**/
public synchronized void setRotFactors(double xfactor, double yfactor) {
rotXFactor = xfactor;
rotYFactor = yfactor;
rotXMul = NOMINAL_ROT_FACTOR * xfactor;
rotYMul = NOMINAL_ROT_FACTOR * yfactor;
}
/**
* Property which sets the rotation x and y factors.
* Used by ConfiguredUniverse.
* @param factors array of length 2 containing instances of Double
* @since Java 3D 1.3
*/
public void RotFactors(Object[] factors) {
if (! (factors.length == 2 &&
factors[0] instanceof Double && factors[1] instanceof Double))
throw new IllegalArgumentException
("RotFactors must be two Doubles");
setRotFactors(((Double)factors[0]).doubleValue(),
((Double)factors[1]).doubleValue());
}
/**
* Sets the rotation x factor. The factors are used to determine
* how many radians to rotate the view for each pixel of mouse movement.
* The view is rotated factor * 0.01 radians for each pixel of mouse
* movement. The default factor is 1.0.
* @param xfactor The x movement multiplier
**/
public synchronized void setRotXFactor(double xfactor) {
rotXFactor = xfactor;
rotXMul = NOMINAL_ROT_FACTOR * xfactor;
}
/**
* Property which sets the rotation x factor.
* Used by ConfiguredUniverse.
* @param xFactor array of length 1 containing instance of Double
* @since Java 3D 1.3
*/
public void RotXFactor(Object[] xFactor) {
if (! (xFactor.length == 1 && xFactor[0] instanceof Double))
throw new IllegalArgumentException("RotXFactor must be a Double");
setRotXFactor(((Double)xFactor[0]).doubleValue());
}
/**
* Sets the rotation y factor. The factors are used to determine
* how many radians to rotate the view for each pixel of mouse movement.
* The view is rotated factor * 0.01 radians for each pixel of mouse
* movement. The default factor is 1.0.
* @param yfactor The y movement multiplier
**/
public synchronized void setRotYFactor(double yfactor) {
rotYFactor = yfactor;
rotYMul = NOMINAL_ROT_FACTOR * yfactor;
}
/**
* Property which sets the rotation y factor.
* Used by ConfiguredUniverse.
* @param yFactor array of length 1 containing instance of Double
* @since Java 3D 1.3
*/
public void RotYFactor(Object[] yFactor) {
if (! (yFactor.length == 1 && yFactor[0] instanceof Double))
throw new IllegalArgumentException("RotYFactor must be a Double");
setRotYFactor(((Double)yFactor[0]).doubleValue());
}
/**
* Sets the translation x and y factors. The factors are used to determine
* how many units to translate the view for each pixel of mouse movement.
* The view is translated factor * 0.01 units for each pixel of mouse
* movement. The default factor is 1.0.
* @param xfactor The x movement multiplier
* @param yfactor The y movement multiplier
**/
public synchronized void setTransFactors(double xfactor,
double yfactor) {
transXFactor = xfactor;
transYFactor = yfactor;
transXMul = NOMINAL_TRANS_FACTOR * xfactor;
transYMul = NOMINAL_TRANS_FACTOR * yfactor;
}
/**
* Property which sets the translation x and y factors.
* Used by ConfiguredUniverse.
* @param factors array of length 2 containing instances of Double
* @since Java 3D 1.3
*/
public void TransFactors(Object[] factors) {
if (! (factors.length == 2 &&
factors[0] instanceof Double && factors[1] instanceof Double))
throw new IllegalArgumentException
("TransFactors must be two Doubles");
setTransFactors(((Double)factors[0]).doubleValue(),
((Double)factors[1]).doubleValue());
}
/**
* Sets the translation x factor. The factors are used to determine
* how many units to translate the view for each pixel of mouse movement.
* The view is translated factor * 0.01 units for each pixel of mouse
* movement. The default factor is 1.0.
* @param xfactor The x movement multiplier
**/
public synchronized void setTransXFactor(double xfactor) {
transXFactor = xfactor;
transXMul = NOMINAL_TRANS_FACTOR * xfactor;
}
/**
* Property which sets the translation x factor.
* Used by ConfiguredUniverse.
* @param xFactor array of length 1 containing instance of Double
* @since Java 3D 1.3
*/
public void TransXFactor(Object[] xFactor) {
if (! (xFactor.length == 1 && xFactor[0] instanceof Double))
throw new IllegalArgumentException("TransXFactor must be a Double");
setTransXFactor(((Double)xFactor[0]).doubleValue());
}
/**
* Sets the translation y factor. The factors are used to determine
* how many units to translate the view for each pixel of mouse movement.
* The view is translated factor * 0.01 units for each pixel of mouse
* movement. The default factor is 1.0.
* @param yfactor The y movement multiplier
**/
public synchronized void setTransYFactor(double yfactor) {
transYFactor = yfactor;
transYMul = NOMINAL_TRANS_FACTOR * yfactor;
}
/**
* Property which sets the translation y factor.
* Used by ConfiguredUniverse.
* @param yFactor array of length 1 containing instance of Double
* @since Java 3D 1.3
*/
public void TransYFactor(Object[] yFactor) {
if (! (yFactor.length == 1 && yFactor[0] instanceof Double))
throw new IllegalArgumentException("TransYFactor must be a Double");
setTransYFactor(((Double)yFactor[0]).doubleValue());
}
/**
* Sets the zoom factor. The factor is used to determine how many
* units to zoom the view for each pixel of mouse movement.
* The view is zoomed factor * 0.01 units for each pixel of mouse
* movement. For proportional zoom, the view is zoomed factor * 1%
* of the distance from the center of rotation for each pixel of
* mouse movement. The default factor is 1.0.
* @param zfactor The movement multiplier
*/
public synchronized void setZoomFactor(double zfactor) {
zoomFactor = zfactor;
if (proportionalZoom) {
zoomMul = NOMINAL_PZOOM_FACTOR * zfactor;
}
else {
zoomMul = NOMINAL_ZOOM_FACTOR * zfactor;
}
}
/**
* Property which sets the zoom factor.
* Used by ConfiguredUniverse.
* @param zFactor array of length 1 containing instance of Double
* @since Java 3D 1.3
*/
public void ZoomFactor(Object[] zFactor) {
if (! (zFactor.length == 1 && zFactor[0] instanceof Double))
throw new IllegalArgumentException("ZoomFactor must be a Double");
setZoomFactor(((Double)zFactor[0]).doubleValue());
}
/**
* Returns the x rotation movement multiplier
* @return The movement multiplier for x rotation
*/
public double getRotXFactor() {
return rotXFactor;
}
/**
* Returns the y rotation movement multiplier
* @return The movement multiplier for y rotation
*/
public double getRotYFactor() {
return rotYFactor;
}
/**
* Returns the x translation movement multiplier
* @return The movement multiplier for x translation
*/
public double getTransXFactor() {
return transXFactor;
}
/**
* Returns the y translation movement multiplier
* @return The movement multiplier for y translation
*/
public double getTransYFactor() {
return transYFactor;
}
/**
* Returns the zoom movement multiplier
* @return The movement multiplier for zoom
*/
public double getZoomFactor() {
return zoomFactor;
}
/**
* Enables or disables rotation. The default is true.
* @param enabled true or false to enable or disable rotate
*/
public synchronized void setRotateEnable(boolean enabled) {
rotateEnabled = enabled;
}
/**
* Property which enables or disables rotation.
* Used by ConfiguredUniverse.
* @param enabled array of length 1 containing instance of Boolean
* @since Java 3D 1.3
*/
public void RotateEnable(Object[] enabled) {
if (! (enabled.length == 1 && enabled[0] instanceof Boolean))
throw new IllegalArgumentException("RotateEnable must be Boolean");
setRotateEnable(((Boolean)enabled[0]).booleanValue());
}
/**
* Enables or disables zoom. The default is true.
* @param enabled true or false to enable or disable zoom
*/
public synchronized void setZoomEnable(boolean enabled) {
zoomEnabled = enabled;
}
/**
* Property which enables or disables zoom.
* Used by ConfiguredUniverse.
* @param enabled array of length 1 containing instance of Boolean
* @since Java 3D 1.3
*/
public void ZoomEnable(Object[] enabled) {
if (! (enabled.length == 1 && enabled[0] instanceof Boolean))
throw new IllegalArgumentException("ZoomEnable must be Boolean");
setZoomEnable(((Boolean)enabled[0]).booleanValue());
}
/**
* Enables or disables translate. The default is true.
* @param enabled true or false to enable or disable translate
*/
public synchronized void setTranslateEnable(boolean enabled) {
translateEnabled = enabled;
}
/**
* Property which enables or disables translate.
* Used by ConfiguredUniverse.
* @param enabled array of length 1 containing instance of Boolean
* @since Java 3D 1.3
*/
public void TranslateEnable(Object[] enabled) {
if (! (enabled.length == 1 && enabled[0] instanceof Boolean))
throw new IllegalArgumentException
("TranslateEnable must be Boolean");
setTranslateEnable(((Boolean)enabled[0]).booleanValue());
}
/**
* Retrieves the state of rotate enabled
* @return the rotate enable state
*/
public boolean getRotateEnable() {
return rotateEnabled;
}
/**
* Retrieves the state of zoom enabled
* @return the zoom enable state
*/
public boolean getZoomEnable() {
return zoomEnabled;
}
/**
* Retrieves the state of translate enabled
* @return the translate enable state
*/
public boolean getTranslateEnable() {
return translateEnabled;
}
boolean rotate(MouseEvent evt) {
if (rotateEnabled) {
if ((leftButton == ROTATE) &&
(!evt.isAltDown() && !evt.isMetaDown())) {
return true;
}
if ((middleButton == ROTATE) &&
(evt.isAltDown() && !evt.isMetaDown())) {
return true;
}
if ((rightButton == ROTATE) &&
(!evt.isAltDown() && evt.isMetaDown())) {
return true;
}
}
return false;
}
boolean zoom(MouseEvent evt) {
if (zoomEnabled) {
if (evt instanceof java.awt.event.MouseWheelEvent) {
return true;
}
if ((leftButton == ZOOM) &&
(!evt.isAltDown() && !evt.isMetaDown())) {
return true;
}
if ((middleButton == ZOOM) &&
(evt.isAltDown() && !evt.isMetaDown())) {
return true;
}
if ((rightButton == ZOOM) &&
(!evt.isAltDown() && evt.isMetaDown())) {
return true;
}
}
return false;
}
boolean translate(MouseEvent evt) {
if (translateEnabled) {
if ((leftButton == TRANSLATE) &&
(!evt.isAltDown() && !evt.isMetaDown())) {
return true;
}
if ((middleButton == TRANSLATE) &&
(evt.isAltDown() && !evt.isMetaDown())) {
return true;
}
if ((rightButton == TRANSLATE) &&
(!evt.isAltDown() && evt.isMetaDown())) {
return true;
}
}
return false;
}
/**
* Sets the minimum radius for the OrbitBehavior. The zoom will
* stop at this distance from the center of rotation. The default
* is 0.0. The minimum will have no affect if the STOP_ZOOM constructor
* flag is not set.
* @param r the minimum radius
* @exception IllegalArgumentException if the radius is less than 0.0
*/
public synchronized void setMinRadius(double r) {
if (r < 0.0) {
throw new IllegalArgumentException(J3dUtilsI18N.getString("OrbitBehavior1"));
}
minRadius = r;
}
/**
* Property which sets the minimum radius for the OrbitBehavior.
* Used by ConfiguredUniverse.
* @param r array of length 1 containing instance of Double
* @since Java 3D 1.3
*/
public void MinRadius(Object[] r) {
if (! (r.length == 1 && r[0] instanceof Double))
throw new IllegalArgumentException("MinRadius must be a Double");
setMinRadius(((Double)r[0]).doubleValue());
}
/**
* Returns the minimum orbit radius. The zoom will stop at this distance
* from the center of rotation if the STOP_ZOOM constructor flag is set.
* @return the minimum radius
*/
public double getMinRadius() {
return minRadius;
}
/**
* Set reverse translate behavior. The default is false.
* @param state if true, reverse translate behavior
* @since Java 3D 1.3
*/
public void setReverseTranslate(boolean state) {
reverseTrans = state;
}
/**
* Property which sets reverse translate behavior.
* Used by ConfiguredUniverse.
* @param state array of length 1 containing instance of Boolean
* @since Java 3D 1.3
*/
public void ReverseTranslate(Object[] state) {
if (! (state.length == 1 && state[0] instanceof Boolean))
throw new IllegalArgumentException
("ReverseTranslate must be Boolean");
setReverseTranslate(((Boolean)state[0]).booleanValue());
}
/**
* Set reverse rotate behavior. The default is false.
* @param state if true, reverse rotate behavior
* @since Java 3D 1.3
*/
public void setReverseRotate(boolean state) {
reverseRotate = state;
}
/**
* Property which sets reverse rotate behavior.
* Used by ConfiguredUniverse.
* @param state array of length 1 containing instance of Boolean
* @since Java 3D 1.3
*/
public void ReverseRotate(Object[] state) {
if (! (state.length == 1 && state[0] instanceof Boolean))
throw new IllegalArgumentException("ReverseRotate must be Boolean");
setReverseRotate(((Boolean)state[0]).booleanValue());
}
/**
* Set reverse zoom behavior. The default is false.
* @param state if true, reverse zoom behavior
* @since Java 3D 1.3
*/
public void setReverseZoom(boolean state) {
reverseZoom = state;
}
/**
* Property which sets reverse zoom behavior.
* Used by ConfiguredUniverse.
* @param state array of length 1 containing instance of Boolean
* @since Java 3D 1.3
*/
public void ReverseZoom(Object[] state) {
if (! (state.length == 1 && state[0] instanceof Boolean))
throw new IllegalArgumentException("ReverseZoom must be Boolean");
setReverseZoom(((Boolean)state[0]).booleanValue());
}
/**
* Set proportional zoom behavior. The default is false.
* @param state if true, use proportional zoom behavior
* @since Java 3D 1.3
*/
public synchronized void setProportionalZoom(boolean state) {
proportionalZoom = state;
if (state) {
zoomMul = NOMINAL_PZOOM_FACTOR * zoomFactor;
}
else {
zoomMul = NOMINAL_ZOOM_FACTOR * zoomFactor;
}
}
/**
* Property which sets proportional zoom behavior.
* Used by ConfiguredUniverse.
* @param state array of length 1 containing instance of Boolean
* @since Java 3D 1.3
*/
public void ProportionalZoom(Object[] state) {
if (! (state.length == 1 && state[0] instanceof Boolean))
throw new IllegalArgumentException
("ProportionalZoom must be Boolean");
setProportionalZoom(((Boolean)state[0]).booleanValue());
}
}