From da55beac3d81ef1f93f30d9bddc7a65f6bbb52c2 Mon Sep 17 00:00:00 2001 From: "rem..om" Date: Wed, 10 Aug 2011 10:25:18 +0000 Subject: [PATCH] sdk : - Removed grey selection. Select tool now use the blue selection managed by the toolController. - Changed move plane gizmo to only appear when the move tool is activated - Optimized moveTool to not instanciate new vectors on every frame. - Changed particle emitter selection shape to bounding box git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7995 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../SceneComposerToolController.java | 65 ++-- .../SceneComposerTopComponent.form | 1 + .../SceneComposerTopComponent.java | 3 + .../jme3/gde/scenecomposer/SceneEditTool.java | 367 +++++++----------- .../gde/scenecomposer/tools/MoveTool.java | 26 +- .../gde/scenecomposer/tools/SelectTool.java | 8 +- 6 files changed, 196 insertions(+), 274 deletions(-) diff --git a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerToolController.java b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerToolController.java index c17001042..88af21492 100644 --- a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerToolController.java +++ b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerToolController.java @@ -9,7 +9,6 @@ import com.jme3.gde.core.scene.SceneApplication; import com.jme3.gde.core.scene.controller.SceneToolController; import com.jme3.gde.core.sceneexplorer.nodes.JmeNode; import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; import com.jme3.renderer.Camera; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; @@ -27,10 +26,9 @@ public class SceneComposerToolController extends SceneToolController { private SceneEditTool editTool; private SceneEditorController editorController; private ComposerCameraController cameraController; - private Camera overlayCam; private ViewPort overlayView; private Node onTopToolsNode; - + public SceneComposerToolController(Node toolsNode, AssetManager manager, JmeNode rootNode) { super(toolsNode, manager); this.rootNode = rootNode; @@ -46,14 +44,14 @@ public class SceneComposerToolController extends SceneToolController { public void setCameraController(ComposerCameraController cameraController) { this.cameraController = cameraController; - + // a node in a viewport that will always render on top onTopToolsNode = new Node("OverlayNode"); overlayView = SceneApplication.getApplication().getRenderManager().createMainView("Overlay", this.cameraController.getCamera()); overlayView.setClearFlags(false, true, false); - overlayView.attachScene( onTopToolsNode ); + overlayView.attachScene(onTopToolsNode); } - + @Override public void cleanup() { super.cleanup(); @@ -62,7 +60,7 @@ public class SceneComposerToolController extends SceneToolController { editorController = null; onTopToolsNode.detachAllChildren(); } - + @Override public void update(float tpf) { super.update(tpf); @@ -70,30 +68,32 @@ public class SceneComposerToolController extends SceneToolController { onTopToolsNode.updateLogicalState(tpf); onTopToolsNode.updateGeometricState(); } - if (editTool != null) - editTool.updateToolsTransformation(selected); - + if (editTool != null) { + editTool.updateToolsTransformation(); + } + } - + @Override public void render(RenderManager rm) { super.render(rm); } - + public boolean isEditToolEnabled() { return editTool != null; } - + /** * If the current tool overrides camera zoom/pan controls */ public boolean isOverrideCameraControl() { - if (editTool != null) + if (editTool != null) { return editTool.isOverrideCameraControl(); - else + } else { return false; + } } - + /** * Scene composer edit tool activated. Pass in null to remove tools. * @@ -101,77 +101,80 @@ public class SceneComposerToolController extends SceneToolController { */ public void showEditTool(final SceneEditTool sceneEditTool) { SceneApplication.getApplication().enqueue(new Callable() { + public Object call() throws Exception { doEnableEditTool(sceneEditTool); return null; } }); } - + private void doEnableEditTool(SceneEditTool sceneEditTool) { - if (editTool != null) + if (editTool != null) { editTool.hideMarker(); + } editTool = sceneEditTool; editTool.activate(manager, toolsNode, onTopToolsNode, selected, this); } - + public void selectedSpatialTransformed() { if (editTool != null) { SceneApplication.getApplication().enqueue(new Callable() { + public Object call() throws Exception { - editTool.updateToolsTransformation(selected); + editTool.updateToolsTransformation(); return null; } }); } } - + public void setSelected(Spatial selected) { this.selected = selected; } - + public void setNeedsSave(boolean needsSave) { editorController.setNeedsSave(needsSave); } - + /** * Primary button activated, send command to the tool * for appropriate action. */ public void doEditToolActivatedPrimary(Vector2f mouseLoc, boolean pressed, Camera camera) { - if (editTool != null){ + if (editTool != null) { editTool.setCamera(camera); editTool.actionPrimary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject()); } } - + /** * Secondary button activated, send command to the tool * for appropriate action. */ public void doEditToolActivatedSecondary(Vector2f mouseLoc, boolean pressed, Camera camera) { - if (editTool != null){ + if (editTool != null) { editTool.setCamera(camera); editTool.actionSecondary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject()); } } - + public void doEditToolMoved(Vector2f mouseLoc, Camera camera) { - if (editTool != null){ + if (editTool != null) { editTool.setCamera(camera); editTool.mouseMoved(mouseLoc); } } - + public void doEditToolDraggedPrimary(Vector2f mouseLoc, boolean pressed, Camera camera) { if (editTool != null) { editTool.setCamera(camera); editTool.draggedPrimary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject()); } } - + public void doEditToolDraggedSecondary(Vector2f mouseLoc, boolean pressed, Camera camera) { - if (editTool != null){ + if (editTool != null) { editTool.setCamera(camera); editTool.draggedSecondary(mouseLoc, pressed, rootNode, editorController.getCurrentDataObject()); } diff --git a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.form b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.form index 87fd247ba..6f9553333 100644 --- a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.form +++ b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.form @@ -321,6 +321,7 @@ + diff --git a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.java b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.java index c0d9710c5..8f140a357 100644 --- a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.java +++ b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneComposerTopComponent.java @@ -263,6 +263,7 @@ public final class SceneComposerTopComponent extends TopComponent implements Sce org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(SceneComposerTopComponent.class, "SceneComposerTopComponent.jLabel3.text")); // NOI18N jToolBar1.add(jLabel3); + showSelectionToggleButton.setSelected(true); org.openide.awt.Mnemonics.setLocalizedText(showSelectionToggleButton, org.openide.util.NbBundle.getMessage(SceneComposerTopComponent.class, "SceneComposerTopComponent.showSelectionToggleButton.text")); // NOI18N showSelectionToggleButton.setToolTipText(org.openide.util.NbBundle.getMessage(SceneComposerTopComponent.class, "SceneComposerTopComponent.showSelectionToggleButton.toolTipText")); // NOI18N showSelectionToggleButton.setFocusable(false); @@ -956,6 +957,7 @@ private void emitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FI toolController.cleanup(); } toolController = new SceneComposerToolController(currentRequest.getToolNode(), currentRequest.getManager(), request.getJmeNode()); + camController = new ComposerCameraController(SceneApplication.getApplication().getCamera(), request.getJmeNode()); toolController.setEditorController(editorController); camController.setToolController(toolController); @@ -965,6 +967,7 @@ private void emitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FI toolController.setCameraController(camController); SelectTool tool = new SelectTool(); toolController.showEditTool(tool); + toolController.setShowSelection(true); }/* else { SceneApplication.getApplication().removeSceneListener(this); currentRequest = null; diff --git a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneEditTool.java b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneEditTool.java index 8281527f8..77c79195b 100644 --- a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneEditTool.java +++ b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/SceneEditTool.java @@ -4,7 +4,6 @@ */ package com.jme3.gde.scenecomposer; - import com.jme3.asset.AssetManager; import com.jme3.bounding.BoundingBox; import com.jme3.bounding.BoundingVolume; @@ -49,27 +48,31 @@ import org.openide.util.Lookup; * @author Brent Owens */ public abstract class SceneEditTool { - + + protected static Vector3f ARROW_X = new Vector3f(1, 0, 0); + protected static Vector3f ARROW_Y = new Vector3f(0, 1, 0); + protected static Vector3f ARROW_Z = new Vector3f(0, 0, 1); + protected static Vector3f QUAD_XY = new Vector3f(1, 1, 0); + protected static Vector3f QUAD_XZ = new Vector3f(1, 0, 1); + protected static Vector3f QUAD_YZ = new Vector3f(0, 1, 1); protected SceneComposerToolController toolController; protected AssetManager manager; protected Camera camera; private boolean overrideCameraControl = false; // if true, you cannot pan/zoom unless you hold SHIFT - // the key to load the tool hint text from the resource bundle protected String toolHintTextKey = "SceneComposerTopComponent.toolHint.default"; // not used yet - - protected Spatial selectedSpatial; - protected Spatial selectionShape; protected Node toolNode; protected Node onTopToolNode; - protected Node axisMarker; protected Material redMat, blueMat, greenMat, yellowMat, cyanMat, magentaMat, orangeMat; - - protected enum AxisMarkerPickType {axisOnly, planeOnly, axisAndPlane}; + protected Geometry quadXY, quadXZ, quadYZ; + + protected enum AxisMarkerPickType { + + axisOnly, planeOnly, axisAndPlane + }; protected AxisMarkerPickType axisPickType; - - + /** * The tool was selected, start showing the marker. * @param manager @@ -78,61 +81,35 @@ public abstract class SceneEditTool { public void activate(AssetManager manager, Node toolNode, Node onTopToolNode, Spatial selectedSpatial, SceneComposerToolController toolController) { this.manager = manager; this.toolController = toolController; - this.selectedSpatial = selectedSpatial; + //this.selectedSpatial = selectedSpatial; addMarker(toolNode, onTopToolNode); } - + protected void addMarker(Node toolNode, Node onTopToolNode) { this.toolNode = toolNode; this.onTopToolNode = onTopToolNode; - + if (axisMarker == null) { axisMarker = createAxisMarker(); } axisMarker.removeFromParent(); this.onTopToolNode.attachChild(axisMarker); setDefaultAxisMarkerColors(); - - // create and add the selection shape - if (selectionShape != null) - selectionShape.removeFromParent(); - - selectionShape = createSelectionShape(toolNode, selectedSpatial); - - if (selectionShape != null) { - setDefaultSelectionShapeColors(); - this.toolNode.attachChild(selectionShape); - axisMarker.setLocalTranslation(selectedSpatial.getWorldTranslation()); - selectionShape.setLocalTranslation(selectedSpatial.getWorldTranslation()); - } - - } - - protected void replaceSelectionShape(Spatial spatial) { - if (spatial != null) { - if (selectionShape != null) - selectionShape.removeFromParent(); - selectedSpatial = spatial; - toolController.setSelected(spatial); - selectionShape = createSelectionShape(toolNode, selectedSpatial); - setDefaultSelectionShapeColors(); - toolNode.attachChild(selectionShape); - } - else { - if (selectionShape != null) - selectionShape.removeFromParent(); - selectionShape = null; + + + if (toolController.getSelectionShape() != null) { + axisMarker.setLocalTranslation(toolController.getSelectedSpatial().getWorldTranslation()); } + } - + /** * Remove the marker from it's parent (the tools node) */ public void hideMarker() { - if (axisMarker != null) + if (axisMarker != null) { axisMarker.removeFromParent(); - if (selectionShape != null) - selectionShape.removeFromParent(); + } } public boolean isOverrideCameraControl() { @@ -142,46 +119,38 @@ public abstract class SceneEditTool { public void setOverrideCameraControl(boolean overrideCameraControl) { this.overrideCameraControl = overrideCameraControl; } - + /** * Called when the selected spatial has been modified * outside of the tool. */ - public void updateToolsTransformation(final Spatial spatial) { - - if (selectionShape == null) - return; - - // has anything changed? - if (!selectionShape.getLocalTranslation().equals(spatial.getWorldTranslation()) && - !selectionShape.getLocalRotation().equals(spatial.getWorldRotation()) && - !selectionShape.getLocalScale().equals(spatial.getWorldScale())) - return; - - // something has updated, so update the tools - selectionShape.setLocalTranslation(spatial.getWorldTranslation()); - selectionShape.setLocalRotation(spatial.getWorldRotation()); - selectionShape.setLocalScale(selectedSpatial.getWorldScale()); - + public void updateToolsTransformation() { + SceneApplication.getApplication().enqueue(new Callable() { + public Object call() throws Exception { - axisMarker.setLocalTranslation(spatial.getWorldTranslation()); - axisMarker.setLocalRotation(selectedSpatial.getWorldRotation()); + if (toolController.getSelectedSpatial() != null) { + axisMarker.setLocalTranslation(toolController.getSelectedSpatial().getWorldTranslation()); + axisMarker.setLocalRotation(toolController.getSelectedSpatial().getWorldRotation()); + } else { + axisMarker.setLocalTranslation(Vector3f.ZERO); + axisMarker.setLocalRotation(Quaternion.IDENTITY); + } return null; } }); } - + /** * The primary action for the tool gets activated */ public abstract void actionPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject); - + /** * The secondary action for the tool gets activated */ public abstract void actionSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject dataObject); - + /** * Called when the mouse is moved but not dragged (ie no buttons are pressed) */ @@ -191,13 +160,13 @@ public abstract class SceneEditTool { * Called when the mouse is moved while the primary button is down */ public abstract void draggedPrimary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject); - + /** * Called when the mouse is moved while the secondary button is down */ public abstract void draggedSecondary(Vector2f screenCoord, boolean pressed, JmeNode rootNode, DataObject currentDataObject); - /** + /** * Call when an action is performed that requires the scene to be saved * and an undo can be performed * @param undoer your implementation, probably with a begin and end state for undoing @@ -206,8 +175,7 @@ public abstract class SceneEditTool { Lookup.getDefault().lookup(SceneUndoRedoManager.class).addEdit(this, undoer); toolController.setNeedsSave(true); } - - + /** * Given the mouse coordinates, pick the geometry that is closest to the camera. * @param jmeRootNode to pick from @@ -215,13 +183,14 @@ public abstract class SceneEditTool { */ protected Spatial pickWorldSpatial(Camera cam, Vector2f mouseLoc, JmeNode jmeRootNode) { Node rootNode = jmeRootNode.getLookup().lookup(Node.class); - CollisionResult cr = pick(cam, mouseLoc, rootNode); - if (cr != null) + CollisionResult cr = pick(cam, mouseLoc, rootNode); + if (cr != null) { return cr.getGeometry(); - else + } else { return null; + } } - + /** * Given the mouse coordinate, pick the world location where the mouse intersects * a geometry. @@ -232,16 +201,16 @@ public abstract class SceneEditTool { Node rootNode = jmeRootNode.getLookup().lookup(Node.class); return pickWorldLocation(cam, mouseLoc, rootNode); } - - + protected Vector3f pickWorldLocation(Camera cam, Vector2f mouseLoc, Node rootNode) { CollisionResult cr = pick(cam, mouseLoc, rootNode); - if (cr != null) + if (cr != null) { return cr.getContactPoint(); - else + } else { return null; + } } - + /** * Pick a part of the axis marker. The result is a Vector3f that represents * what part of the axis was selected. @@ -251,48 +220,49 @@ public abstract class SceneEditTool { * @return null if it did not intersect the marker */ protected Vector3f pickAxisMarker(Camera cam, Vector2f mouseLoc, AxisMarkerPickType pickType) { - if (axisMarker == null) + if (axisMarker == null) { return null; - + } + CollisionResult cr = pick(cam, mouseLoc, axisMarker); - if (cr == null || cr.getGeometry() == null) + if (cr == null || cr.getGeometry() == null) { return null; - + } + if (pickType == AxisMarkerPickType.planeOnly) { - if ("quadXY".equals(cr.getGeometry().getName()) ) { - return new Vector3f(1,1,0); - } else if ("quadXZ".equals(cr.getGeometry().getName()) ) { - return new Vector3f(1,0,1); - } else if ("quadYZ".equals(cr.getGeometry().getName()) ) { - return new Vector3f(0,1,1); + if ("quadXY".equals(cr.getGeometry().getName())) { + return QUAD_XY; + } else if ("quadXZ".equals(cr.getGeometry().getName())) { + return QUAD_XZ; + } else if ("quadYZ".equals(cr.getGeometry().getName())) { + return QUAD_YZ; } - } - else if (pickType == AxisMarkerPickType.axisOnly) { - if ("arrowX".equals(cr.getGeometry().getName()) ) { - return new Vector3f(1,0,0); - } else if ("arrowY".equals(cr.getGeometry().getName()) ) { - return new Vector3f(0,1,0); - } else if ("arrowZ".equals(cr.getGeometry().getName()) ) { - return new Vector3f(0,1,0); + } else if (pickType == AxisMarkerPickType.axisOnly) { + if ("arrowX".equals(cr.getGeometry().getName())) { + return ARROW_X; + } else if ("arrowY".equals(cr.getGeometry().getName())) { + return ARROW_Y; + } else if ("arrowZ".equals(cr.getGeometry().getName())) { + return ARROW_Z; } } else if (pickType == AxisMarkerPickType.axisAndPlane) { - if ("arrowX".equals(cr.getGeometry().getName()) ) { - return new Vector3f(1,0,0); - } else if ("arrowY".equals(cr.getGeometry().getName()) ) { - return new Vector3f(0,1,0); - } else if ("arrowZ".equals(cr.getGeometry().getName()) ) { - return new Vector3f(0,1,0); - } else if ("quadXY".equals(cr.getGeometry().getName()) ) { - return new Vector3f(1,1,0); - } else if ("quadXZ".equals(cr.getGeometry().getName()) ) { - return new Vector3f(1,0,1); - } else if ("quadYZ".equals(cr.getGeometry().getName()) ) { - return new Vector3f(0,1,1); + if ("arrowX".equals(cr.getGeometry().getName())) { + return ARROW_X; + } else if ("arrowY".equals(cr.getGeometry().getName())) { + return ARROW_Y; + } else if ("arrowZ".equals(cr.getGeometry().getName())) { + return ARROW_Z; + } else if ("quadXY".equals(cr.getGeometry().getName())) { + return QUAD_XY; + } else if ("quadXZ".equals(cr.getGeometry().getName())) { + return QUAD_XZ; + } else if ("quadYZ".equals(cr.getGeometry().getName())) { + return QUAD_YZ; } } return null; } - + private CollisionResult pick(Camera cam, Vector2f mouseLoc, Node node) { CollisionResults results = new CollisionResults(); Ray ray = new Ray(); @@ -305,7 +275,7 @@ public abstract class SceneEditTool { CollisionResult result = results.getClosestCollision(); return result; } - + /** * Show what axis or plane the mouse is currently over and will affect. * @param axisMarkerPickType @@ -313,34 +283,36 @@ public abstract class SceneEditTool { protected void highlightAxisMarker(Camera camera, Vector2f screenCoord, AxisMarkerPickType axisMarkerPickType) { setDefaultAxisMarkerColors(); Vector3f picked = pickAxisMarker(camera, screenCoord, axisPickType); - if (picked == null) + if (picked == null) { return; - - if (picked.equals(new Vector3f(1,0,0))) + } + + if (picked == ARROW_X) { axisMarker.getChild("arrowX").setMaterial(orangeMat); - else if (picked.equals(new Vector3f(0,1,0))) + } else if (picked == ARROW_Y) { axisMarker.getChild("arrowY").setMaterial(orangeMat); - else if (picked.equals(new Vector3f(0,0,1))) + } else if (picked == ARROW_Z) { axisMarker.getChild("arrowZ").setMaterial(orangeMat); - else if (picked.equals(new Vector3f(1,1,0))) + } else if (picked == QUAD_XY) { axisMarker.getChild("quadXY").setMaterial(orangeMat); - else if (picked.equals(new Vector3f(1,0,1))) + } else if (picked == QUAD_XZ) { axisMarker.getChild("quadXZ").setMaterial(orangeMat); - else if (picked.equals(new Vector3f(0,1,1))) + } else if (picked == QUAD_YZ) { axisMarker.getChild("quadYZ").setMaterial(orangeMat); + } } - + /** * Create the axis marker that is selectable */ protected Node createAxisMarker() { float size = 2; float arrowSize = size; - float planeSize = size*0.7f; - - Quaternion YAW090 = new Quaternion().fromAngleAxis(-FastMath.PI/2, new Vector3f(0,1,0)); - Quaternion PITCH090 = new Quaternion().fromAngleAxis(FastMath.PI/2, new Vector3f(1,0,0)); - + float planeSize = size * 0.7f; + + Quaternion YAW090 = new Quaternion().fromAngleAxis(-FastMath.PI / 2, new Vector3f(0, 1, 0)); + Quaternion PITCH090 = new Quaternion().fromAngleAxis(FastMath.PI / 2, new Vector3f(1, 0, 0)); + redMat = new Material(manager, "Common/MatDefs/Misc/Unshaded.j3md"); redMat.getAdditionalRenderState().setWireframe(true); redMat.setColor("Color", ColorRGBA.Red); @@ -371,130 +343,60 @@ public abstract class SceneEditTool { magentaMat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); magentaMat.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Off); //magentaMat.getAdditionalRenderState().setDepthTest(false); - + orangeMat = new Material(manager, "Common/MatDefs/Misc/Unshaded.j3md"); orangeMat.getAdditionalRenderState().setWireframe(false); - orangeMat.setColor("Color", new ColorRGBA(251f/255f, 130f/255f, 0f, 0.4f)); + orangeMat.setColor("Color", new ColorRGBA(251f / 255f, 130f / 255f, 0f, 0.4f)); orangeMat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); orangeMat.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Off); - + Node axis = new Node(); - + // create arrows - Geometry arrowX = new Geometry("arrowX", new Arrow(new Vector3f(arrowSize,0,0))); - Geometry arrowY = new Geometry("arrowY", new Arrow(new Vector3f(0,arrowSize,0))); - Geometry arrowZ = new Geometry("arrowZ", new Arrow(new Vector3f(0,0,arrowSize))); + Geometry arrowX = new Geometry("arrowX", new Arrow(new Vector3f(arrowSize, 0, 0))); + Geometry arrowY = new Geometry("arrowY", new Arrow(new Vector3f(0, arrowSize, 0))); + Geometry arrowZ = new Geometry("arrowZ", new Arrow(new Vector3f(0, 0, arrowSize))); axis.attachChild(arrowX); axis.attachChild(arrowY); axis.attachChild(arrowZ); - + // create planes - Geometry quadXY = new Geometry("quadXY", new Quad(planeSize, planeSize) ); - Geometry quadXZ = new Geometry("quadXZ", new Quad(planeSize, planeSize) ); + quadXY = new Geometry("quadXY", new Quad(planeSize, planeSize)); + quadXZ = new Geometry("quadXZ", new Quad(planeSize, planeSize)); quadXZ.setLocalRotation(PITCH090); - Geometry quadYZ = new Geometry("quadYZ", new Quad(planeSize, planeSize) ); + quadYZ = new Geometry("quadYZ", new Quad(planeSize, planeSize)); quadYZ.setLocalRotation(YAW090); - axis.attachChild(quadXY); - axis.attachChild(quadXZ); - axis.attachChild(quadYZ); - +// axis.attachChild(quadXY); +// axis.attachChild(quadXZ); +// axis.attachChild(quadYZ); + axis.setModelBound(new BoundingBox()); return axis; } - - protected void setDefaultAxisMarkerColors() { - axisMarker.getChild("arrowX").setMaterial(redMat); - axisMarker.getChild("arrowY").setMaterial(blueMat); - axisMarker.getChild("arrowZ").setMaterial(greenMat); - axisMarker.getChild("quadXY").setMaterial(yellowMat); - axisMarker.getChild("quadXZ").setMaterial(magentaMat); - axisMarker.getChild("quadYZ").setMaterial(cyanMat); - } - - protected void setDefaultSelectionShapeColors() { - if (selectionShape != null) { - Material mat = new Material(SceneApplication.getApplication().getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); - mat.getAdditionalRenderState().setWireframe(true); - mat.setColor("Color", new ColorRGBA(0.8f,0.8f,0.8f,0.3f)); - mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); - selectionShape.setMaterial(mat); - } - } - protected Spatial createSelectionShape(Node toolNode, Spatial spat) { - if (spat == null) - return null; - if (selectionShape != null) { - selectionShape.removeFromParent(); - selectionShape = null; - } - if (spat instanceof Geometry) { - return getGeometrySelection(toolNode, (Geometry) spat); - } else if (spat.getControl(PhysicsControl.class) != null) { - return getPhysicsSelection(toolNode, spat); - } else { - return getBoxSelection(toolNode, spat); - } - } - - protected Geometry getGeometrySelection(Node toolNode, Geometry geom) { - Mesh mesh = geom.getMesh(); - if (mesh == null) { - return null; - } - Geometry selectionGeometry = new Geometry("selection_geometry_sceneviewer", mesh); - selectionGeometry.setLocalTransform(geom.getWorldTransform()); - toolNode.attachChild(selectionGeometry); - return selectionGeometry; + protected void displayPlanes() { + axisMarker.attachChild(quadXY); + axisMarker.attachChild(quadXZ); + axisMarker.attachChild(quadYZ); } - protected Geometry getBoxSelection(Node toolNode, Spatial geom) { - BoundingVolume bound = geom.getWorldBound(); - if (bound instanceof BoundingBox) { - BoundingBox bbox = (BoundingBox) bound; - Vector3f extent = new Vector3f(); - bbox.getExtent(extent); - WireBox wireBox=new WireBox(); - wireBox.fromBoundingBox(bbox); - Geometry selectionGeometry = new Geometry("selection_geometry_sceneviewer", wireBox); - selectionGeometry.setLocalTransform(geom.getWorldTransform()); - toolNode.attachChild(selectionGeometry); - return selectionGeometry; - } - return null; - } + protected void hidePlanes() { + quadXY.removeFromParent(); + quadXZ.removeFromParent(); + quadYZ.removeFromParent(); - protected Spatial getPhysicsSelection(Node toolNode, Spatial geom) { - PhysicsCollisionObject control = geom.getControl(RigidBodyControl.class); - if (control == null) { - control = geom.getControl(VehicleControl.class); - } - if (control == null) { - control = geom.getControl(GhostControl.class); - } - if (control == null) { - control = geom.getControl(CharacterControl.class); - } - if (control == null) { - return null; - } - Spatial selectionGeometry = DebugShapeFactory.getDebugShape(control.getCollisionShape()); - if (selectionGeometry != null) { - selectionGeometry.setLocalTransform(geom.getWorldTransform()); - toolNode.attachChild(selectionGeometry); - return selectionGeometry; - } - return null; } - protected void detachSelectionShape() { - if (selectionShape != null) { - selectionShape.removeFromParent(); - selectionShape = null; - } + protected void setDefaultAxisMarkerColors() { + axisMarker.getChild("arrowX").setMaterial(redMat); + axisMarker.getChild("arrowY").setMaterial(blueMat); + axisMarker.getChild("arrowZ").setMaterial(greenMat); + quadXY.setMaterial(yellowMat); + quadXZ.setMaterial(magentaMat); + quadYZ.setMaterial(cyanMat); } - - + + public Camera getCamera() { return camera; } @@ -502,7 +404,4 @@ public abstract class SceneEditTool { public void setCamera(Camera camera) { this.camera = camera; } - - - } diff --git a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/MoveTool.java b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/MoveTool.java index c897d0aeb..b1abba274 100644 --- a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/MoveTool.java +++ b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/MoveTool.java @@ -4,8 +4,10 @@ */ package com.jme3.gde.scenecomposer.tools; +import com.jme3.asset.AssetManager; import com.jme3.gde.core.sceneexplorer.nodes.JmeNode; import com.jme3.gde.core.undoredo.AbstractUndoableSceneEdit; +import com.jme3.gde.scenecomposer.SceneComposerToolController; import com.jme3.gde.scenecomposer.SceneEditTool; import com.jme3.material.Material; import com.jme3.math.FastMath; @@ -42,7 +44,7 @@ public class MoveTool extends SceneEditTool { public MoveTool() { - axisPickType = AxisMarkerPickType.planeOnly; + axisPickType = AxisMarkerPickType.axisAndPlane; setOverrideCameraControl(true); float size = 1000; @@ -50,8 +52,18 @@ public class MoveTool extends SceneEditTool { g.setLocalTranslation(-size/2, -size/2, 0); plane = new Node(); plane.attachChild(g); + + } + @Override + public void activate(AssetManager manager, Node toolNode, Node onTopToolNode, Spatial selectedSpatial, SceneComposerToolController toolController) { + super.activate(manager, toolNode, onTopToolNode, selectedSpatial, toolController); + displayPlanes(); + } + + + @Override @@ -61,7 +73,7 @@ public class MoveTool extends SceneEditTool { pickedPlane = null; // mouse released, reset selection offset = null; if (wasDragging) { - actionPerformed(new MoveUndo(selectedSpatial, startLoc, lastLoc)); + actionPerformed(new MoveUndo(toolController.getSelectedSpatial(), startLoc, lastLoc)); wasDragging = false; } } @@ -90,19 +102,19 @@ public class MoveTool extends SceneEditTool { pickedPlane = null; // mouse released, reset selection offset = null; if (wasDragging) { - actionPerformed(new MoveUndo(selectedSpatial, startLoc, lastLoc)); + actionPerformed(new MoveUndo(toolController.getSelectedSpatial(), startLoc, lastLoc)); wasDragging = false; } return; } - if (selectedSpatial == null) + if (toolController.getSelectedSpatial() == null) return; if (pickedPlane == null) { pickedPlane = pickAxisMarker(camera, screenCoord, axisPickType); if (pickedPlane == null) return; - startLoc = selectedSpatial.getLocalTranslation().clone(); + startLoc = toolController.getSelectedSpatial().getLocalTranslation().clone(); if (pickedPlane.equals(new Vector3f(1,1,0))) plane.setLocalRotation(XY); @@ -122,8 +134,8 @@ public class MoveTool extends SceneEditTool { Vector3f newPos = planeHit.subtract(offset); lastLoc = newPos; - selectedSpatial.setLocalTranslation(newPos); - updateToolsTransformation(selectedSpatial); + toolController.getSelectedSpatial().setLocalTranslation(newPos); + updateToolsTransformation(); wasDragging = true; } diff --git a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/SelectTool.java b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/SelectTool.java index d4aa1bbbe..68f06e876 100644 --- a/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/SelectTool.java +++ b/sdk/jme3-scenecomposer/src/com/jme3/gde/scenecomposer/tools/SelectTool.java @@ -5,6 +5,7 @@ package com.jme3.gde.scenecomposer.tools; import com.jme3.gde.core.scene.SceneApplication; +import com.jme3.gde.core.sceneexplorer.SceneExplorerTopComponent; import com.jme3.gde.core.sceneexplorer.nodes.JmeNode; import com.jme3.gde.scenecomposer.SceneEditTool; import com.jme3.math.Vector2f; @@ -31,16 +32,19 @@ public class SelectTool extends SceneEditTool { public void run() { if (result != null) { +// System.out.println(rootNode.getChild(result).getName()); +// SceneExplorerTopComponent.findInstance().setActivatedNodes(new org.openide.nodes.Node[]{rootNode.getChild(result)}); SceneApplication.getApplication().setCurrentFileNode(rootNode.getChild(result)); + } else { + // SceneExplorerTopComponent.findInstance().setActivatedNodes(new org.openide.nodes.Node[]{rootNode}); SceneApplication.getApplication().setCurrentFileNode(rootNode); } } }); if (result != null) { - replaceSelectionShape(result); - updateToolsTransformation(selectedSpatial); + updateToolsTransformation(); } }