diff --git a/jme3-blender/src/main/java/com/jme3/asset/BlenderKey.java b/jme3-blender/src/main/java/com/jme3/asset/BlenderKey.java index 555150ea23..ce133300af 100644 --- a/jme3-blender/src/main/java/com/jme3/asset/BlenderKey.java +++ b/jme3-blender/src/main/java/com/jme3/asset/BlenderKey.java @@ -967,11 +967,12 @@ public Spatial deepClone() { } @Override - public void depthFirstTraversal(SceneGraphVisitor visitor) { + public void depthFirstTraversal(SceneGraphVisitor visitor, boolean preOrder) { } @Override protected void breadthFirstTraversal(SceneGraphVisitor visitor, Queue queue) { } + } } diff --git a/jme3-core/src/main/java/com/jme3/scene/Geometry.java b/jme3-core/src/main/java/com/jme3/scene/Geometry.java index 50ca01912f..773671adb2 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Geometry.java +++ b/jme3-core/src/main/java/com/jme3/scene/Geometry.java @@ -447,7 +447,7 @@ public int collideWith(Collidable other, CollisionResults results) { } @Override - public void depthFirstTraversal(SceneGraphVisitor visitor) { + public void depthFirstTraversal(SceneGraphVisitor visitor, boolean preOrder) { visitor.visit(this); } diff --git a/jme3-core/src/main/java/com/jme3/scene/Node.java b/jme3-core/src/main/java/com/jme3/scene/Node.java index f22c5b4b0f..0c4340a4f3 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Node.java +++ b/jme3-core/src/main/java/com/jme3/scene/Node.java @@ -625,15 +625,23 @@ public void updateModelBound() { } } } - + @Override - public void depthFirstTraversal(SceneGraphVisitor visitor) { - for (Spatial child : children.getArray()) { - child.depthFirstTraversal(visitor); + public void depthFirstTraversal(SceneGraphVisitor visitor, boolean preOrder) { + if (preOrder) { + visitor.visit(this); + for (Spatial child : children.getArray()) { + child.depthFirstTraversal(visitor); + } + } else { + for (Spatial child : children.getArray()) { + child.depthFirstTraversal(visitor); + } + visitor.visit(this); } - visitor.visit(this); } + @Override protected void breadthFirstTraversal(SceneGraphVisitor visitor, Queue queue) { queue.addAll(children); diff --git a/jme3-core/src/main/java/com/jme3/scene/Spatial.java b/jme3-core/src/main/java/com/jme3/scene/Spatial.java index b6c61f81e5..aac4ddf24e 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Spatial.java +++ b/jme3-core/src/main/java/com/jme3/scene/Spatial.java @@ -1492,10 +1492,23 @@ public Matrix4f getLocalToWorldMatrix(Matrix4f store) { } /** - * Visit each scene graph element ordered by DFS + * Visit each scene graph element ordered by DFS, also called post order traversal. + * Delegates to {@link #depthFirstTraversal(com.jme3.scene.SceneGraphVisitor, boolean) } + * with {@code preOrder} set to {@code false}. * @param visitor */ - public abstract void depthFirstTraversal(SceneGraphVisitor visitor); + public void depthFirstTraversal(SceneGraphVisitor visitor) { + depthFirstTraversal(visitor, false); + } + + /** + * Visit each scene graph element using post order traversal if {@code preOrder} + * is {@code false} or using pre order traversal if {@code preOrder} is + * {@code true}. + * @param visitor the visitor to use + * @param preOrder {@code false} for post order, {@code true} for pre order + */ + public abstract void depthFirstTraversal(SceneGraphVisitor visitor, boolean preOrder); /** * Visit each scene graph element ordered by BFS