From db46414350bd4c5bd6691543f977e3b79d4fa059 Mon Sep 17 00:00:00 2001 From: "Edward Z. Yang" Date: Sun, 19 Oct 2008 05:17:08 -0400 Subject: [PATCH] Add selection highlighting support; disable cube. Signed-off-by: Edward Z. Yang --- .../mit/ezyang/gravity/GravitySimulatorView.java | 58 +++++++++++++++------- src/edu/mit/ezyang/gravity/j3d/EditableGroup.java | 6 ++- .../mit/ezyang/gravity/j3d/PickSelectBehavior.java | 52 +++++++++++++++++++ .../mit/ezyang/gravity/j3d/PickSelectCallback.java | 16 ++++++ 4 files changed, 113 insertions(+), 19 deletions(-) create mode 100644 src/edu/mit/ezyang/gravity/j3d/PickSelectBehavior.java create mode 100644 src/edu/mit/ezyang/gravity/j3d/PickSelectCallback.java diff --git a/src/edu/mit/ezyang/gravity/GravitySimulatorView.java b/src/edu/mit/ezyang/gravity/GravitySimulatorView.java index 210397e..9998b80 100644 --- a/src/edu/mit/ezyang/gravity/GravitySimulatorView.java +++ b/src/edu/mit/ezyang/gravity/GravitySimulatorView.java @@ -25,7 +25,7 @@ import javax.vecmath.*; * interaction. * @author Edward Z. Yang */ -public class GravitySimulatorView extends FrameView { +public class GravitySimulatorView extends FrameView implements PickSelectCallback { /** * BranchGroup that objects in the universe should be inserted in. This @@ -53,6 +53,16 @@ public class GravitySimulatorView extends FrameView { */ protected Canvas3D canvas; + /** + * Node currently selected in the Canvas3D interface. + */ + protected Primitive selectedPrimitive; + + /** + * Old material that selectedNode previously was. + */ + protected Material selectedPrimitiveOldMaterial; + public GravitySimulatorView(SingleFrameApplication app) { super(app); @@ -96,13 +106,24 @@ public class GravitySimulatorView extends FrameView { // Initialize environment with some objects processCommand("add sphere"); - processCommand("add cube at 0,2,0"); - processCommand("add cube at 0,-2,0"); - processCommand("add cube at 2,0,0"); - processCommand("add cube at -2,0,0"); + processCommand("add sphere at 0,2,0"); + processCommand("add sphere at 0,-2,0"); + processCommand("add sphere at 2,0,0"); + processCommand("add sphere at -2,0,0"); } + public void notifyPick(Primitive primitive) { + if (selectedPrimitive != null && selectedPrimitiveOldMaterial != null) { + selectedPrimitive.getAppearance().setMaterial(selectedPrimitiveOldMaterial); + } + selectedPrimitive = primitive; + Material material = selectedPrimitive.getAppearance().getMaterial(); + selectedPrimitiveOldMaterial = (Material) material.cloneNodeComponent(true); + selectedPrimitiveOldMaterial.setCapability(Material.ALLOW_COMPONENT_WRITE); + material.setEmissiveColor(0.5f, 0.5f, 0.5f); + } + /** Processes a command from the command line box, modifying Universe. * @param command Command line to execute. */ @@ -146,27 +167,28 @@ public class GravitySimulatorView extends FrameView { } } // generate the actual primitive - Node object; + Primitive primitive; if (parts[1].equals("sphere")) { - Sphere sphere = new Sphere(scale); - sphere.getAppearance().getMaterial().setAmbientColor(.8f,.2f,.2f); - object = sphere; - } else if (parts[1].equals("cube")) { - object = new ColorCube(scale); + primitive = new Sphere(scale); } else if (parts[1].equals("cone")) { - object = new Cone(scale * 1f, scale * 2f); + primitive = new Cone(scale * 1f, scale * 2f); } else if (parts[1].equals("cylinder")) { - object = new Cylinder(scale * 1f, scale * 2f); + primitive = new Cylinder(scale * 1f, scale * 2f); } else { send("Unknown primitive: " + parts[1]); return; } - object.setCapability(Node.ENABLE_PICK_REPORTING); - object.setCapability(Node.ALLOW_BOUNDS_READ); - object.setCapability(Node.ALLOW_BOUNDS_WRITE); + primitive.getAppearance().getMaterial().setAmbientColor(.8f,.2f,.2f); + primitive.setCapability(Primitive.ENABLE_APPEARANCE_MODIFY); + primitive.getAppearance().setCapability(Appearance.ALLOW_MATERIAL_WRITE); + primitive.getAppearance().getMaterial().setCapability(Material.ALLOW_COMPONENT_WRITE); + + primitive.setCapability(Node.ENABLE_PICK_REPORTING); + primitive.setCapability(Node.ALLOW_BOUNDS_READ); + primitive.setCapability(Node.ALLOW_BOUNDS_WRITE); - EditableGroup group = new EditableGroup(canvas, globalRotateGroup, location); - group.addTransformChild(object); + EditableGroup group = new EditableGroup(canvas, globalRotateGroup, location, this); + group.addTransformChild(primitive); universeRoot.addChild(group); } else if (parts[0].equals("view")) { diff --git a/src/edu/mit/ezyang/gravity/j3d/EditableGroup.java b/src/edu/mit/ezyang/gravity/j3d/EditableGroup.java index b6c7118..5c2e5cc 100644 --- a/src/edu/mit/ezyang/gravity/j3d/EditableGroup.java +++ b/src/edu/mit/ezyang/gravity/j3d/EditableGroup.java @@ -26,7 +26,7 @@ public class EditableGroup extends BranchGroup { private TransformGroup transformGroup; - public EditableGroup(Canvas3D canvas, TransformGroup rotateGroup, Vector3f location) { + public EditableGroup(Canvas3D canvas, TransformGroup rotateGroup, Vector3f location, PickSelectCallback callback) { setCapability(BranchGroup.ALLOW_DETACH); Bounds bounds = new BoundingSphere(new Point3d(0f, 0f, 0f), 1000f); @@ -40,6 +40,10 @@ public class EditableGroup extends BranchGroup { zoom.setRotateTransformGroup(rotateGroup); addChild(zoom); + PickSelectBehavior select = new PickSelectBehavior(this, canvas, bounds); + select.setupCallback(callback); + addChild(select); + transformGroup = new TransformGroup(); transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); diff --git a/src/edu/mit/ezyang/gravity/j3d/PickSelectBehavior.java b/src/edu/mit/ezyang/gravity/j3d/PickSelectBehavior.java new file mode 100644 index 0000000..ab866f4 --- /dev/null +++ b/src/edu/mit/ezyang/gravity/j3d/PickSelectBehavior.java @@ -0,0 +1,52 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package edu.mit.ezyang.gravity.j3d; + +import com.sun.j3d.utils.behaviors.mouse.MouseBehaviorCallback; +import com.sun.j3d.utils.geometry.Primitive; +import com.sun.j3d.utils.picking.PickResult; +import com.sun.j3d.utils.picking.behaviors.PickMouseBehavior; +import java.awt.event.MouseEvent; +import javax.media.j3d.Bounds; +import javax.media.j3d.BranchGroup; +import javax.media.j3d.Canvas3D; +import javax.media.j3d.Transform3D; + +/** + * + * @author Edward Z. Yang + */ +public class PickSelectBehavior extends PickMouseBehavior implements MouseBehaviorCallback { + protected PickSelectCallback callback; + public PickSelectBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds) { + super(canvas, root, bounds); + setSchedulingBounds(bounds); + } + public void setupCallback(PickSelectCallback callback) { + this.callback = callback; + } + public void updateScene(int xpos, int ypos) { + Primitive primitive = null; + if (mevent.getButton() == MouseEvent.BUTTON1) { + pickCanvas.setShapeLocation(xpos, ypos); + PickResult pr = pickCanvas.pickClosest(); + if ((pr != null) && + ((primitive = (Primitive) pr.getNode(PickResult.PRIMITIVE)) != null) && + (primitive.getCapability(Primitive.ENABLE_APPEARANCE_MODIFY ))) { + if (callback != null) { + callback.notifyPick(primitive); + } + } + } + } + + /** + * Callback method from MouseTranslate + * This is used when the Picking callback is enabled + */ + public void transformChanged(int type, Transform3D transform) { + } +} diff --git a/src/edu/mit/ezyang/gravity/j3d/PickSelectCallback.java b/src/edu/mit/ezyang/gravity/j3d/PickSelectCallback.java new file mode 100644 index 0000000..7b3becb --- /dev/null +++ b/src/edu/mit/ezyang/gravity/j3d/PickSelectCallback.java @@ -0,0 +1,16 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package edu.mit.ezyang.gravity.j3d; + +import com.sun.j3d.utils.geometry.Primitive; + +/** + * + * @author Edward Z. Yang + */ +public interface PickSelectCallback { + public void notifyPick(Primitive node); +} -- 2.11.4.GIT