Skip to content

Commit 1c45ac6

Browse files
committed
made Spatial iterable
1 parent ef41a34 commit 1c45ac6

File tree

3 files changed

+107
-2
lines changed

3 files changed

+107
-2
lines changed

jme3-core/src/main/java/com/jme3/scene/Geometry.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.jme3.util.clone.IdentityCloneFunction;
5050
import com.jme3.vulkan.material.NewMaterial;
5151
import com.jme3.vulkan.mesh.NewMesh;
52+
import com.jme3.vulkan.scene.NotSpatial;
5253

5354
import java.io.IOException;
5455
import java.util.Queue;
@@ -781,4 +782,10 @@ public void read(JmeImporter im) throws IOException {
781782
}
782783
}
783784
}
785+
786+
@Override
787+
protected void findNextIteration(GraphIterator iterator) {
788+
iterator.moveUp();
789+
}
790+
784791
}

jme3-core/src/main/java/com/jme3/scene/Node.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import com.jme3.material.Material;
4141
import com.jme3.util.SafeArrayList;
4242
import com.jme3.util.clone.Cloner;
43+
import com.jme3.vulkan.material.NewMaterial;
44+
4345
import java.io.IOException;
4446
import java.util.ArrayList;
4547
import java.util.List;
@@ -561,7 +563,7 @@ public List<Spatial> getChildren() {
561563
}
562564

563565
@Override
564-
public void setMaterial(Material mat) {
566+
public void setMaterial(NewMaterial mat) {
565567
for (int i = 0; i < children.size(); i++) {
566568
children.get(i).setMaterial(mat);
567569
}
@@ -813,4 +815,15 @@ public void depthFirstTraversal(SceneGraphVisitor visitor, DFSMode mode) {
813815
protected void breadthFirstTraversal(SceneGraphVisitor visitor, Queue<Spatial> queue) {
814816
queue.addAll(children);
815817
}
818+
819+
@Override
820+
protected void findNextIteration(GraphIterator iterator) {
821+
int i = iterator.advanceIndex();
822+
if (i >= children.size()) {
823+
iterator.moveUp();
824+
} else {
825+
iterator.moveDown(children.get(i));
826+
}
827+
}
828+
816829
}

jme3-core/src/main/java/com/jme3/scene/Spatial.java

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.jme3.util.clone.IdentityCloneFunction;
5656
import com.jme3.util.clone.JmeCloneable;
5757
import com.jme3.vulkan.material.NewMaterial;
58+
import com.jme3.vulkan.scene.NotSpatial;
5859

5960
import java.io.IOException;
6061
import java.util.*;
@@ -70,7 +71,7 @@
7071
* @author Joshua Slack
7172
* @version $Revision: 4075 $, $Data$
7273
*/
73-
public abstract class Spatial implements Savable, Cloneable, Collidable,
74+
public abstract class Spatial implements Iterable<Spatial>, Savable, Cloneable, Collidable,
7475
CloneableSmartAsset, JmeCloneable, HasLocalTransform {
7576
private static final Logger logger = Logger.getLogger(Spatial.class.getName());
7677

@@ -1876,4 +1877,88 @@ public void breadthFirstTraversal(SceneGraphVisitor visitor) {
18761877
}
18771878

18781879
protected abstract void breadthFirstTraversal(SceneGraphVisitor visitor, Queue<Spatial> queue);
1880+
1881+
protected abstract void findNextIteration(GraphIterator iterator);
1882+
1883+
@Override
1884+
public Iterator<Spatial> iterator() {
1885+
return new GraphIterator(this);
1886+
}
1887+
1888+
public static class GraphIterator implements Iterator<Spatial> {
1889+
1890+
private final Stack<Integer> childIndices = new Stack<>();
1891+
private Spatial current;
1892+
private int currentIndex = 0;
1893+
private int iteration = -1;
1894+
1895+
public GraphIterator(Spatial start) {
1896+
current = Objects.requireNonNull(start);
1897+
}
1898+
1899+
@Override
1900+
public boolean hasNext() {
1901+
return current != null;
1902+
}
1903+
1904+
@Override
1905+
public Spatial next() {
1906+
if (++iteration > 0) {
1907+
current.findNextIteration(this);
1908+
}
1909+
return current;
1910+
}
1911+
1912+
@Override
1913+
public void remove() {
1914+
if (current.getParent() != null) {
1915+
current.removeFromParent();
1916+
moveUp();
1917+
currentIndex--;
1918+
}
1919+
}
1920+
1921+
protected void moveUp() {
1922+
if (!childIndices.isEmpty()) {
1923+
current = current.getParent();
1924+
currentIndex = childIndices.pop();
1925+
if (current != null) {
1926+
current.findNextIteration(this);
1927+
}
1928+
} else {
1929+
current = null;
1930+
}
1931+
}
1932+
1933+
protected void moveDown(Spatial node) {
1934+
if (node.getParent() != current) {
1935+
throw new IllegalArgumentException("Next node must be a child of the current node.");
1936+
}
1937+
current = node;
1938+
childIndices.push(currentIndex);
1939+
currentIndex = 0;
1940+
}
1941+
1942+
protected int advanceIndex() {
1943+
return currentIndex++;
1944+
}
1945+
1946+
protected int getCurrentIndex() {
1947+
return currentIndex;
1948+
}
1949+
1950+
public void skipChildren() {
1951+
moveUp();
1952+
}
1953+
1954+
public int getDepth() {
1955+
return childIndices.size();
1956+
}
1957+
1958+
public int getIteration() {
1959+
return iteration;
1960+
}
1961+
1962+
}
1963+
18791964
}

0 commit comments

Comments
 (0)