Hello,
When editing scenes, specially complex scenes, you often miss information like spatials position to make sure you are doing the right thing. Although you can easily set the positions with the setLocalTranslation, visual editing is always easier than textually. Please post some feedback whether you like this or not, or if something should be changed to get this effect.
Note that this is the first part for a serious of improvements on the visual editing of the SDK. I plan adding features like regions in scenes, and support for loading/adding objects that are not j3o objects in the scenes, and allow them to have their attributes saved for runtime.
[patch]Index: jme3-core/src/com/jme3/gde/core/scene/controller/AbstractCameraController.java
===================================================================
— jme3-core/src/com/jme3/gde/core/scene/controller/AbstractCameraController.java (revision 9945)
+++ jme3-core/src/com/jme3/gde/core/scene/controller/AbstractCameraController.java (working copy)
@@ -27,6 +27,8 @@
import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
+import com.jme3.font.BitmapFont;
+import com.jme3.font.BitmapText;
import com.jme3.gde.core.Installer;
import com.jme3.gde.core.scene.SceneApplication;
import com.jme3.gde.core.scene.controller.toolbars.CameraToolbar;
@@ -85,6 +87,9 @@
protected boolean checkReleaseLeft = false;
protected boolean checkReleaseRight = false;
protected boolean shiftModifier = false;
- protected BitmapText mousePositionText;
- protected Vector3f coordinates = new Vector3f();
- protected String coordinatesText = "Coordinates: ";
public AbstractCameraController(Camera cam, InputManager inputManager) {
this.cam = cam;
@@ -112,11 +117,35 @@
}
inputManager.addRawInputListener(me);
inputManager.addListener(me, "MouseAxisX", "MouseAxisY", "MouseAxisX-", "MouseAxisY-", "MouseWheel", "MouseWheel-", "MouseButtonLeft", "MouseButtonMiddle", "MouseButtonRight");
-
if (mousePositionText != null && mousePositionText.getParent() == null)<br />
-
SceneApplication.getApplication().getGuiNode().attachChild(mousePositionText);<br />
return null;
}
-
});<br />
- }
+
- /**
-
* Call this to active the display of coordinates text on the screen. Call {@link #setCoordinates(com.jme3.math.Vector3f) } to update the coordinates.<br />
-
*/<br />
- protected void activateCoordinatesText() {
-
BitmapFont font = SceneApplication.getApplication().getAssetManager().loadFont("Interface/Fonts/Default.fnt");<br />
+
-
mousePositionText = new BitmapText(font, false);<br />
-
mousePositionText.setSize(font.getCharSet().getRenderedSize());<br />
-
mousePositionText.setLocalTranslation(0, mousePositionText.getLineHeight(), 0);<br />
-
mousePositionText.setText(coordinatesText);<br />
-
SceneApplication.getApplication().enqueue(new Callable<Object>() {<br />
-
public Object call() throws Exception {<br />
-
SceneApplication.getApplication().getGuiNode().attachChild(mousePositionText);<br />
-
return null;<br />
-
}<br />
});
}
- public void setCoordinates(Vector3f coordinates) {
-
this.coordinates = coordinates;<br />
- }
+
private void addAdditionnalToolbar() {
SceneViewerTopComponent svtc = SceneViewerTopComponent.findInstance();
if (svtc != null) {
@@ -145,6 +174,8 @@
public Object call() throws Exception {
inputManager.removeRawInputListener(me);
inputManager.removeListener(me);
-
if (mousePositionText != null)<br />
-
mousePositionText.removeFromParent();<br />
return null;
}
});
@@ -473,6 +504,8 @@
@Override
public void update(float f) {
-
if (mousePositionText != null && coordinates != null)<br />
-
mousePositionText.setText(coordinatesText + coordinates);<br />
if (moved) {
// moved, check for drags
if (checkReleaseL || checkReleaseR || checkReleaseM) {
Index: jme3-scenecomposer/src/com/jme3/gde/scenecomposer/ComposerCameraController.java
===================================================================
— jme3-scenecomposer/src/com/jme3/gde/scenecomposer/ComposerCameraController.java (revision 9945)
+++ jme3-scenecomposer/src/com/jme3/gde/scenecomposer/ComposerCameraController.java (working copy)
@@ -24,11 +24,15 @@
*/
package com.jme3.gde.scenecomposer;
+import com.jme3.collision.CollisionResult;
+import com.jme3.collision.CollisionResults;
import com.jme3.gde.core.scene.SceneApplication;
import com.jme3.gde.core.scene.controller.AbstractCameraController;
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
import com.jme3.input.KeyInput;
import com.jme3.input.event.KeyInputEvent;
+import com.jme3.input.event.MouseMotionEvent;
+import com.jme3.math.Ray;
import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera;
@@ -49,6 +53,7 @@
super(cam, SceneApplication.getApplication().getInputManager());
this.jmeRootNode = rootNode;
this.rootNode = rootNode.getLookup().lookup(Node.class);
-
activateCoordinatesText();<br />
}
private boolean isEditButtonEnabled() {
@@ -84,6 +89,36 @@
}
@Override
- public void onMouseMotionEvent(MouseMotionEvent mme) {
-
super.onMouseMotionEvent(mme); //To change body of generated methods, choose Tools | Templates.<br />
+
-
Vector3f point = get3DPoint();<br />
-
if (point != null)<br />
-
setCoordinates(point);<br />
- }
+
+
+
-
protected Vector3f get3DPoint() {<br />
-
CollisionResults results = new CollisionResults();<br />
-
Ray ray = new Ray();<br />
-
Vector3f pos = cam.getWorldCoordinates(new Vector2f(mouseX, mouseY), 0).clone();<br />
-
Vector3f dir = cam.getWorldCoordinates(new Vector2f(mouseX, mouseY), 0.3f).clone();<br />
-
dir.subtractLocal(pos).normalizeLocal();<br />
-
ray.setOrigin(pos);<br />
-
ray.setDirection(dir);<br />
-
rootNode.collideWith(ray, results);<br />
-
if (results == null) {<br />
-
return null;<br />
-
}<br />
-
final CollisionResult result = results.getClosestCollision();<br />
-
if (result == null) {<br />
-
return null;<br />
-
}<br />
-
return result.getContactPoint();<br />
- }
+
-
@Override
public void checkClick(int button, boolean pressed) {
if (button == 0) {
if (isEditButtonEnabled() && !forceCameraControls) {
Index: jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java
===================================================================
— jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java (revision 9945)
+++ jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainCameraController.java (working copy)
@@ -65,6 +65,8 @@
public TerrainCameraController(Camera cam) {
super(cam, SceneApplication.getApplication().getInputManager());
app = SceneApplication.getApplication();
-
activateCoordinatesText();<br />
-
coordinatesText = "Marker position: ";<br />
}
public void setToolController(TerrainToolController toolController) {
@@ -89,6 +91,7 @@
Vector3f pos = getTerrainCollisionPoint();
if (pos != null) {
toolController.doMoveEditTool(pos);
-
setCoordinates(toolController.getMarkerLocation());<br />
}
}
@@ -196,7 +199,7 @@
final CollisionResult result = results.getClosestCollision();
if (result == null) {
return null;
-
}<br />
-
}<br />
return result.getContactPoint();
}
[/patch]