com.jme3.scene
Class Node

java.lang.Object
  extended by com.jme3.scene.Spatial
      extended by com.jme3.scene.Node
All Implemented Interfaces:
CloneableSmartAsset, Collidable, Savable, java.lang.Cloneable
Direct Known Subclasses:
AssetLinkNode, AudioNode, BatchNode, BitmapText, CalculationBone, CameraNode, LightNode, SkeletonDebugger, StatsView, TerrainQuad

public class Node
extends Spatial
implements Savable

Node defines an internal node of a scene graph. The internal node maintains a collection of children and handles merging said children into a single bound to allow for very fast culling of multiple nodes. Node allows for any number of children to be attached.


Nested Class Summary
 
Nested classes/interfaces inherited from class com.jme3.scene.Spatial
Spatial.BatchHint, Spatial.CullHint
 
Field Summary
protected  SafeArrayList<Spatial> children
          This node's children.
 
Fields inherited from class com.jme3.scene.Spatial
batchHint, controls, cullHint, frustrumIntersects, key, localLights, localTransform, name, parent, queueBucket, queueDistance, refreshFlags, RF_BOUND, RF_LIGHTLIST, RF_TRANSFORM, shadowMode, userData, worldBound, worldLights, worldTransform
 
Constructor Summary
Node()
          Serialization only.
Node(java.lang.String name)
          Constructor instantiates a new Node with a default empty list for containing children.
 
Method Summary
 int attachChild(Spatial child)
          attachChild attaches a child to this node.
 int attachChildAt(Spatial child, int index)
          attachChildAt attaches a child to this node at an index.
protected  void breadthFirstTraversal(SceneGraphVisitor visitor, java.util.Queue<Spatial> queue)
           
 Node clone(boolean cloneMaterials)
           
 int collideWith(Collidable other, CollisionResults results)
          Check collision with another Collidable.
 Spatial deepClone()
           
 void depthFirstTraversal(SceneGraphVisitor visitor)
          Visit each scene graph element ordered by DFS
<T extends Spatial>
java.util.List<T>
descendantMatches(java.lang.Class<T> spatialSubclass)
          Convenience wrapper.
<T extends Spatial>
java.util.List<T>
descendantMatches(java.lang.Class<T> spatialSubclass, java.lang.String nameRegex)
          Returns flat list of Spatials implementing the specified class AND with name matching the specified pattern.
<T extends Spatial>
java.util.List<T>
descendantMatches(java.lang.String nameRegex)
          Convenience wrapper.
 void detachAllChildren()
          detachAllChildren removes all children attached to this node.
 int detachChild(Spatial child)
          detachChild removes a given child from the node's list.
 Spatial detachChildAt(int index)
          detachChildAt removes a child at a given index.
 int detachChildNamed(java.lang.String childName)
          detachChild removes a given child from the node's list.
 Spatial getChild(int i)
          getChild returns a child at a given index.
 Spatial getChild(java.lang.String name)
          getChild returns the first child found with exactly the given name (case sensitive.)
 int getChildIndex(Spatial sp)
          getChildIndex returns the index of the given spatial in this node's list of children.
 java.util.List<Spatial> getChildren()
          Returns all children to this node.
 int getQuantity()
          getQuantity returns the number of children this node maintains.
 int getTriangleCount()
          getTriangleCount returns the number of triangles contained in all sub-branches of this node that contain geometry.
 int getVertexCount()
          getVertexCount returns the number of vertices contained in all sub-branches of this node that contain geometry.
 boolean hasChild(Spatial spat)
          determines if the provided Spatial is contained in the children list of this node.
 void read(JmeImporter e)
           
protected  void setLightListRefresh()
           
 void setLodLevel(int lod)
          Sets the level of detail to use when rendering this Spatial, this call propagates to all geometries under this Spatial.
 void setMaterial(Material mat)
          Applies the given material to the Spatial, this will propagate the material down to the geometries in the scene graph.
 void setModelBound(BoundingVolume modelBound)
          setModelBound sets the bounding object for this Spatial.
protected  void setTransformRefresh()
          Indicate that the transform of this spatial has changed and that a refresh is required.
 void swapChildren(int index1, int index2)
          More efficient than e.g detaching and attaching as no updates are needed.
 void updateGeometricState()
          updateGeometricState updates the lightlist, computes the world transforms, and computes the world bounds for this Spatial.
 void updateLogicalState(float tpf)
          updateLogicalState calls the update() method for all controls attached to this Spatial.
 void updateModelBound()
          updateModelBound recalculates the bounding object for this Spatial.
protected  void updateWorldBound()
          Should be overridden by Node and Geometry.
 void write(JmeExporter e)
           
 
Methods inherited from class com.jme3.scene.Spatial
addControl, addLight, breadthFirstTraversal, center, checkCulling, clone, getBatchHint, getControl, getControl, getCullHint, getKey, getLastFrustumIntersection, getLocalBatchHint, getLocalCullHint, getLocalLightList, getLocalQueueBucket, getLocalRotation, getLocalScale, getLocalShadowMode, getLocalToWorldMatrix, getLocalTransform, getLocalTranslation, getName, getNumControls, getParent, getQueueBucket, getShadowMode, getUserData, getUserDataKeys, getWorldBound, getWorldLightList, getWorldRotation, getWorldScale, getWorldTransform, getWorldTranslation, hasAncestor, localToWorld, lookAt, matches, move, move, removeControl, removeControl, removeFromParent, removeLight, rotate, rotate, rotateUpTo, runControlRender, scale, scale, setBatchHint, setBoundRefresh, setCullHint, setKey, setLastFrustumIntersection, setLocalRotation, setLocalRotation, setLocalScale, setLocalScale, setLocalScale, setLocalTransform, setLocalTranslation, setLocalTranslation, setName, setParent, setQueueBucket, setShadowMode, setUserData, toString, updateWorldLightList, updateWorldTransforms, worldToLocal
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

children

protected SafeArrayList<Spatial> children
This node's children.

Constructor Detail

Node

public Node()
Serialization only. Do not use.


Node

public Node(java.lang.String name)
Constructor instantiates a new Node with a default empty list for containing children.

Parameters:
name - the name of the scene element. This is required for identification and comparision purposes.
Method Detail

getQuantity

public int getQuantity()
getQuantity returns the number of children this node maintains.

Returns:
the number of children this node maintains.

setTransformRefresh

protected void setTransformRefresh()
Description copied from class: Spatial
Indicate that the transform of this spatial has changed and that a refresh is required.

Overrides:
setTransformRefresh in class Spatial

setLightListRefresh

protected void setLightListRefresh()
Overrides:
setLightListRefresh in class Spatial

updateWorldBound

protected void updateWorldBound()
Description copied from class: Spatial
Should be overridden by Node and Geometry.

Overrides:
updateWorldBound in class Spatial

updateLogicalState

public void updateLogicalState(float tpf)
Description copied from class: Spatial
updateLogicalState calls the update() method for all controls attached to this Spatial.

Overrides:
updateLogicalState in class Spatial
Parameters:
tpf - Time per frame.
See Also:
Spatial.addControl(com.jme3.scene.control.Control)

updateGeometricState

public void updateGeometricState()
Description copied from class: Spatial
updateGeometricState updates the lightlist, computes the world transforms, and computes the world bounds for this Spatial. Calling this when the Spatial is attached to a node will cause undefined results. User code should only call this method on Spatials having no parent.

Overrides:
updateGeometricState in class Spatial
See Also:
Spatial.getWorldLightList(), Spatial.getWorldTransform(), Spatial.getWorldBound()

getTriangleCount

public int getTriangleCount()
getTriangleCount returns the number of triangles contained in all sub-branches of this node that contain geometry.

Specified by:
getTriangleCount in class Spatial
Returns:
the triangle count of this branch.

getVertexCount

public int getVertexCount()
getVertexCount returns the number of vertices contained in all sub-branches of this node that contain geometry.

Specified by:
getVertexCount in class Spatial
Returns:
the vertex count of this branch.

attachChild

public int attachChild(Spatial child)
attachChild attaches a child to this node. This node becomes the child's parent. The current number of children maintained is returned.
If the child already had a parent it is detached from that former parent.

Parameters:
child - the child to attach to this node.
Returns:
the number of children maintained by this node.
Throws:
java.lang.NullPointerException - If child is null.

attachChildAt

public int attachChildAt(Spatial child,
                         int index)
attachChildAt attaches a child to this node at an index. This node becomes the child's parent. The current number of children maintained is returned.
If the child already had a parent it is detached from that former parent.

Parameters:
child - the child to attach to this node.
Returns:
the number of children maintained by this node.
Throws:
java.lang.NullPointerException - if child is null.

detachChild

public int detachChild(Spatial child)
detachChild removes a given child from the node's list. This child will no longer be maintained.

Parameters:
child - the child to remove.
Returns:
the index the child was at. -1 if the child was not in the list.

detachChildNamed

public int detachChildNamed(java.lang.String childName)
detachChild removes a given child from the node's list. This child will no longe be maintained. Only the first child with a matching name is removed.

Parameters:
childName - the child to remove.
Returns:
the index the child was at. -1 if the child was not in the list.

detachChildAt

public Spatial detachChildAt(int index)
detachChildAt removes a child at a given index. That child is returned for saving purposes.

Parameters:
index - the index of the child to be removed.
Returns:
the child at the supplied index.

detachAllChildren

public void detachAllChildren()
detachAllChildren removes all children attached to this node.


getChildIndex

public int getChildIndex(Spatial sp)
getChildIndex returns the index of the given spatial in this node's list of children.

Parameters:
sp - The spatial to look up
Returns:
The index of the spatial in the node's children, or -1 if the spatial is not attached to this node

swapChildren

public void swapChildren(int index1,
                         int index2)
More efficient than e.g detaching and attaching as no updates are needed.

Parameters:
index1 - The index of the first child to swap
index2 - The index of the second child to swap

getChild

public Spatial getChild(int i)
getChild returns a child at a given index.

Parameters:
i - the index to retrieve the child from.
Returns:
the child at a specified index.

getChild

public Spatial getChild(java.lang.String name)
getChild returns the first child found with exactly the given name (case sensitive.)

Parameters:
name - the name of the child to retrieve. If null, we'll return null.
Returns:
the child if found, or null.

hasChild

public boolean hasChild(Spatial spat)
determines if the provided Spatial is contained in the children list of this node.

Parameters:
spat - the child object to look for.
Returns:
true if the object is contained, false otherwise.

getChildren

public java.util.List<Spatial> getChildren()
Returns all children to this node. Note that modifying that given list is not allowed.

Returns:
a list containing all children to this node

setMaterial

public void setMaterial(Material mat)
Description copied from class: Spatial
Applies the given material to the Spatial, this will propagate the material down to the geometries in the scene graph.

Overrides:
setMaterial in class Spatial
Parameters:
mat - The material to set.

setLodLevel

public void setLodLevel(int lod)
Description copied from class: Spatial
Sets the level of detail to use when rendering this Spatial, this call propagates to all geometries under this Spatial.

Overrides:
setLodLevel in class Spatial
Parameters:
lod - The lod level to set.

collideWith

public int collideWith(Collidable other,
                       CollisionResults results)
Description copied from interface: Collidable
Check collision with another Collidable.

Specified by:
collideWith in interface Collidable
Parameters:
other - The object to check collision against
results - Will contain the list of CollisionResults.
Returns:
how many collisions were found between this and other

descendantMatches

public <T extends Spatial> java.util.List<T> descendantMatches(java.lang.Class<T> spatialSubclass,
                                                               java.lang.String nameRegex)
Returns flat list of Spatials implementing the specified class AND with name matching the specified pattern.

Note that we are matching the pattern, therefore the pattern must match the entire pattern (i.e. it behaves as if it is sandwiched between "^" and "$"). You can set regex modes, like case insensitivity, by using the (?X) or (?X:Y) constructs.

By design, it is always safe to code loops like:

     for (Spatial spatial : node.descendantMatches(AClass.class, "regex"))
 

"Descendants" does not include self, per the definition of the word. To test for descendants AND self, you must do a node.matches(aClass, aRegex) + node.descendantMatches(aClass, aRegex).

Parameters:
spatialSubclass - Subclass which matching Spatials must implement. Null causes all Spatials to qualify.
nameRegex - Regular expression to match Spatial name against. Null causes all Names to qualify.
Returns:
Non-null, but possibly 0-element, list of matching Spatials (also Instances extending Spatials).
See Also:
Pattern, Spatial.matches(java.lang.Class, java.lang.String)

descendantMatches

public <T extends Spatial> java.util.List<T> descendantMatches(java.lang.Class<T> spatialSubclass)
Convenience wrapper.

See Also:
descendantMatches(java.lang.Class, java.lang.String)

descendantMatches

public <T extends Spatial> java.util.List<T> descendantMatches(java.lang.String nameRegex)
Convenience wrapper.

See Also:
descendantMatches(java.lang.Class, java.lang.String)

clone

public Node clone(boolean cloneMaterials)
Overrides:
clone in class Spatial
Returns:
A clone of this Spatial, the scene graph in its entirety is cloned and can be altered independently of the original scene graph. Note that meshes of geometries are not cloned explicitly, they are shared if static, or specially cloned if animated. All controls will be cloned using the Control.cloneForSpatial method on the clone.
See Also:
Mesh.cloneForAnim()

deepClone

public Spatial deepClone()
Specified by:
deepClone in class Spatial
Returns:
Similar to Spatial.clone() except will create a deep clone of all geometry's meshes, normally this method shouldn't be used instead use Spatial.clone()
See Also:
Spatial.clone()

write

public void write(JmeExporter e)
           throws java.io.IOException
Specified by:
write in interface Savable
Overrides:
write in class Spatial
Throws:
java.io.IOException

read

public void read(JmeImporter e)
          throws java.io.IOException
Specified by:
read in interface Savable
Overrides:
read in class Spatial
Throws:
java.io.IOException

setModelBound

public void setModelBound(BoundingVolume modelBound)
Description copied from class: Spatial
setModelBound sets the bounding object for this Spatial.

Specified by:
setModelBound in class Spatial
Parameters:
modelBound - the bounding object for this spatial.

updateModelBound

public void updateModelBound()
Description copied from class: Spatial
updateModelBound recalculates the bounding object for this Spatial.

Specified by:
updateModelBound in class Spatial

depthFirstTraversal

public void depthFirstTraversal(SceneGraphVisitor visitor)
Description copied from class: Spatial
Visit each scene graph element ordered by DFS

Specified by:
depthFirstTraversal in class Spatial

breadthFirstTraversal

protected void breadthFirstTraversal(SceneGraphVisitor visitor,
                                     java.util.Queue<Spatial> queue)
Specified by:
breadthFirstTraversal in class Spatial