@ -4,7 +4,6 @@
* /
package com.jme3.gde.scenecomposer ;
import com.jme3.asset.AssetManager ;
import com.jme3.bounding.BoundingBox ;
import com.jme3.bounding.BoundingVolume ;
@ -50,25 +49,29 @@ import org.openide.util.Lookup;
* /
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 Geometry quadXY , quadXZ , quadYZ ;
protected enum AxisMarkerPickType { axisOnly , planeOnly , axisAndPlane } ;
protected AxisMarkerPickType axisPickType ;
protected enum AxisMarkerPickType {
axisOnly , planeOnly , axisAndPlane
} ;
protected AxisMarkerPickType axisPickType ;
/ * *
* The tool was selected , start showing the marker .
@ -78,7 +81,7 @@ 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 ) ;
}
@ -93,46 +96,20 @@ public abstract class SceneEditTool {
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 ( ) ) ;
}
if ( toolController . getSelectionShape ( ) ! = null ) {
axisMarker . setLocalTranslation ( toolController . getSelectedSpatial ( ) . 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 ;
}
}
/ * *
* 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 ( ) {
@ -147,26 +124,18 @@ public abstract class SceneEditTool {
* 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 < Object > ( ) {
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 ;
}
} ) ;
@ -207,7 +176,6 @@ public abstract class SceneEditTool {
toolController . setNeedsSave ( true ) ;
}
/ * *
* Given the mouse coordinates , pick the geometry that is closest to the camera .
* @param jmeRootNode to pick from
@ -216,11 +184,12 @@ 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 )
if ( cr ! = null ) {
return cr . getGeometry ( ) ;
else
} else {
return null ;
}
}
/ * *
* Given the mouse coordinate , pick the world location where the mouse intersects
@ -233,14 +202,14 @@ public abstract class SceneEditTool {
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
@ -251,43 +220,44 @@ 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 ) ;
return QUAD_XY ;
} else if ( "quadXZ" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 1 , 0 , 1 ) ;
return QUAD_XZ ;
} else if ( "quadYZ" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 0 , 1 , 1 ) ;
}
return QUAD_YZ ;
}
else if ( pickType = = AxisMarkerPickType . axisOnly ) {
} else if ( pickType = = AxisMarkerPickType . axisOnly ) {
if ( "arrowX" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 1 , 0 , 0 ) ;
return ARROW_X ;
} else if ( "arrowY" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 0 , 1 , 0 ) ;
return ARROW_Y ;
} else if ( "arrowZ" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 0 , 1 , 0 ) ;
return ARROW_Z ;
}
} else if ( pickType = = AxisMarkerPickType . axisAndPlane ) {
if ( "arrowX" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 1 , 0 , 0 ) ;
return ARROW_X ;
} else if ( "arrowY" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 0 , 1 , 0 ) ;
return ARROW_Y ;
} else if ( "arrowZ" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 0 , 1 , 0 ) ;
return ARROW_Z ;
} else if ( "quadXY" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 1 , 1 , 0 ) ;
return QUAD_XY ;
} else if ( "quadXZ" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 1 , 0 , 1 ) ;
return QUAD_XZ ;
} else if ( "quadYZ" . equals ( cr . getGeometry ( ) . getName ( ) ) ) {
return new Vector3f ( 0 , 1 , 1 ) ;
return QUAD_YZ ;
}
}
return null ;
@ -313,22 +283,24 @@ 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
@ -389,109 +361,39 @@ public abstract class SceneEditTool {
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 void displayPlanes ( ) {
axisMarker . attachChild ( quadXY ) ;
axisMarker . attachChild ( quadXZ ) ;
axisMarker . attachChild ( quadYZ ) ;
}
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 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 ) ;
}
@ -502,7 +404,4 @@ public abstract class SceneEditTool {
public void setCamera ( Camera camera ) {
this . camera = camera ;
}
}