Various applications need their own conditions for tree traversal.
If spatial provides visitor interface, we don’t have to worry about Spatial/Node being messy.
I suggest Visitor interface and breadthFirstTraversal, depthFirstTraversal method().
Please rename it if it is ugly.
[patch]
Index: src/core/com/jme3/scene/Spatial.java
===================================================================
— src/core/com/jme3/scene/Spatial.java (revision 6397)
+++ src/core/com/jme3/scene/Spatial.java (working copy)
@@ -55,10 +55,7 @@
import com.jme3.scene.control.Control;
import com.jme3.util.TempVars;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
+import java.util.*;
import java.util.logging.Logger;
@@ -1383,5 +1380,19 @@
return store;
}
- public abstract void depthFirstTraversal(Visitor visitor);
+
- public void breadthFirstTraversal(Visitor visitor) {
-
Queue<Spatial> queue = new LinkedList<Spatial>();<br />
-
queue.add(this);<br />
+
-
while (!queue.isEmpty()) {<br />
-
Spatial s = queue.poll();<br />
-
visitor.visit(s);<br />
-
s.breadthFirstTraversal(visitor, queue);<br />
-
}<br />
- }
+
- protected abstract void breadthFirstTraversal(Visitor visitor, Queue<Spatial> queue);
}
Index: src/core/com/jme3/scene/Node.java
===================================================================
— src/core/com/jme3/scene/Node.java (revision 6397)
+++ src/core/com/jme3/scene/Node.java (working copy)
@@ -42,6 +42,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Queue;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -629,5 +630,18 @@
}
}
}
+
-
@Override
- public void depthFirstTraversal(Visitor visitor) {
-
for(int i = 0, max = children.size(); i < max; i++) {<br />
-
children.get(i).depthFirstTraversal(visitor);<br />
-
}<br />
-
visitor.visit(this);<br />
- }
+
-
@Override
- protected void breadthFirstTraversal(Visitor visitor, Queue<Spatial> queue) {
-
queue.addAll(children);<br />
- }
}
Index: src/core/com/jme3/scene/Visitor.java
===================================================================
— src/core/com/jme3/scene/Visitor.java (revision 0)
+++ src/core/com/jme3/scene/Visitor.java (revision 0)
@@ -0,0 +1,5 @@
+package com.jme3.scene;
+
+public interface Visitor {
- public void visit(Spatial spatial);
+}
Index: src/core/com/jme3/scene/Geometry.java
===================================================================
— src/core/com/jme3/scene/Geometry.java (revision 6397)
+++ src/core/com/jme3/scene/Geometry.java (working copy)
@@ -44,6 +44,8 @@
import com.jme3.scene.VertexBuffer.Type;
import com.jme3.util.TempVars;
import java.io.IOException;
+import java.util.LinkedList;
+import java.util.Queue;
public class Geometry extends Spatial {
@@ -249,6 +251,14 @@
}
return 0;
}
+
-
@Override
- public void depthFirstTraversal(Visitor visitor) {
-
visitor.visit(this);<br />
- }
+
- protected void breadthFirstTraversal(Visitor visitor, Queue<Spatial> queue) {
- }
/**
- This version of clone is a shallow clone, in other words, the
Index: src/test/com/jme3/scene/TestTraversal.java
===================================================================
— src/test/com/jme3/scene/TestTraversal.java (revision 0)
+++ src/test/com/jme3/scene/TestTraversal.java (revision 0)
@@ -0,0 +1,33 @@
+package com.jme3.scene;
+
+public class TestTraversal {
- public static void main(String[] args) {
-
Node root = new Node("root");<br />
-
Node a = new Node("a");<br />
-
Node b = new Node("b");<br />
-
Spatial aa = new Geometry("aa");<br />
-
Spatial ab = new Geometry("ab");<br />
-
Spatial ba = new Geometry("ba");<br />
-
Spatial bb = new Geometry("bb");<br />
+
-
root.attachChild(a);<br />
-
root.attachChild(b);<br />
-
a.attachChild(aa);<br />
-
a.attachChild(ab);<br />
-
b.attachChild(ba);<br />
-
b.attachChild(bb);<br />
+
-
Visitor v = new Visitor() {<br />
+
-
@Override<br />
-
public void visit(Spatial searchScope) {<br />
-
System.out.println(searchScope.getName());<br />
-
}<br />
-
};<br />
+
-
System.out.println("DFS");<br />
-
root.depthFirstTraversal(v);<br />
-
System.out.println("BFS");<br />
-
root.breadthFirstTraversal(v);<br />
- }
+}
[/patch]