And the patch for jme2
Index: ConnectionPoint.java
===================================================================
--- ConnectionPoint.java (revision 4046)
+++ ConnectionPoint.java (working copy)
@@ -34,10 +34,11 @@
if(target == null) {
return;
}
- if (((lockedMode & Spatial.LOCKED_TRANSFORMS) == 0)) {
+ if ((((lockedMode & LOCKED_TRANSFORMS) == 0)) || ((dirtyLocks & LOCKED_TRANSFORMS) != 0)) {
worldScale.set(parent.getWorldScale()).multLocal(target.getWorldScale());
parent.getWorldRotation().mult(target.getWorldRotation(), worldRotation);
worldTranslation = parent.localToWorld( target.getWorldTranslation(), worldTranslation );
+ dirtyLocks &= (~LOCKED_TRANSFORMS);
}
}
Index: Geometry.java
===================================================================
--- Geometry.java (revision 4046)
+++ Geometry.java (working copy)
@@ -532,6 +532,16 @@
*/
@Override
public void draw(Renderer r) {
+ if ((this.lockedMode & LOCKED_MESH_DATA) != 0)
+ {
+ if ((this.dirtyLocks & LOCKED_MESH_DATA) != 0)
+ {
+ //refresh the display list
+ this.unlockMeshes(r);
+ this.lockMeshes(r);
+ dirtyLocks &= (~LOCKED_MESH_DATA);
+ }
+ }
}
/**
Index: Node.java
===================================================================
--- Node.java (revision 4046)
+++ Node.java (working copy)
@@ -399,7 +399,8 @@
@Override
public void updateWorldVectors(boolean recurse) {
- if (((lockedMode & Spatial.LOCKED_TRANSFORMS) == 0)) {
+ if ((((lockedMode & LOCKED_TRANSFORMS) == 0)) || ((dirtyLocks & LOCKED_TRANSFORMS) != 0)) {
+
updateWorldScale();
updateWorldRotation();
updateWorldTranslation();
@@ -409,6 +410,7 @@
children.get(i).updateWorldVectors(true);
}
}
+ dirtyLocks &= (~LOCKED_TRANSFORMS);
}
}
@@ -560,8 +562,10 @@
*/
@Override
public void updateWorldBound() {
- if ((lockedMode & Spatial.LOCKED_BOUNDS) != 0) return;
+ if (((lockedMode & LOCKED_BOUNDS) != 0) && ((dirtyLocks & LOCKED_BOUNDS) == 0)) return;
+
if (children == null) {
+ dirtyLocks &= (~LOCKED_BOUNDS);
return;
}
BoundingVolume worldBound = null;
@@ -581,6 +585,7 @@
}
}
this.worldBound = worldBound;
+ dirtyLocks &= (~LOCKED_BOUNDS);
}
@Override
Index: Spatial.java
===================================================================
--- Spatial.java (revision 4046)
+++ Spatial.java (working copy)
@@ -188,8 +188,42 @@
public static final int LOCKED_TRANSFORMS = 4;
public static final int LOCKED_SHADOWS = 8;
public static final int LOCKED_BRANCH = 16;
+ public static final int LOCKED_ALL = LOCKED_BRANCH | LOCKED_SHADOWS | LOCKED_TRANSFORMS | LOCKED_MESH_DATA | LOCKED_BOUNDS;
+
/**
+ * This entire branch of the scene graph has its locks dirtied so that it can be
+ * updated/rendered (it will ignore locks).
+ * @param locksToDirty A bit flag containing each lock to dirty
+ */
+ public void refreshBranch(int locksToDirty)
+ {
+ refreshBranchToRoot(locksToDirty);
+ refreshBranchToLeaves(locksToDirty);
+ }
+
+ public void refreshBranch()
+ {
+ refreshBranch(LOCKED_ALL);
+ }
+
+ /**
+ * Refresh upward in this scene graph to the root node
+ */
+ protected void refreshBranchToRoot(int locksToDirty)
+ {
+ this.dirtyLocks |= locksToDirty;
+
+ }
+
+ /**
+ * Refresh downward in the scene graph to each leaf of element
+ */
+ protected void refreshBranchToLeaves(int locksToDirty)
+ {
+ this.dirtyLocks |= locksToDirty;
+ }
+ /**
* A flag indicating how normals should be treated by the renderer.
*/
protected NormalsMode normalsMode = NormalsMode.Inherit;
@@ -216,8 +250,15 @@
* locked against certain changes.
*/
protected int lockedMode = LOCKED_NONE;
-
+
/**
+ * The locks belonging to this scene element that should be temporarily ignored,
+ * because they need to be updated (just once). The locks indicated in this field will be
+ * removed (from dirtyLocks) once they have been updated.
+ */
+ protected int dirtyLocks = LOCKED_NONE;
+
+ /**
* Flag signaling how lights are combined for this node. By default set to
* INHERIT.
*/
@@ -511,15 +552,18 @@
* true if this node started the update process.
*/
public void updateGeometricState(float time, boolean initiator) {
- if ((lockedMode & Spatial.LOCKED_BRANCH) != 0)
- return;
+ if (((lockedMode & LOCKED_BRANCH) != 0) && ((dirtyLocks & LOCKED_BRANCH) == 0) )
+ return;
+
updateWorldData(time);
- if ((lockedMode & Spatial.LOCKED_BOUNDS) == 0) {
+ if (((lockedMode & LOCKED_BOUNDS) == 0) || ((dirtyLocks & LOCKED_BOUNDS) != 0)) {
updateWorldBound();
if (initiator) {
propagateBoundToRoot();
}
+ dirtyLocks &= (~LOCKED_BOUNDS);
}
+ dirtyLocks &= (~LOCKED_BRANCH);
}
/**
@@ -567,10 +611,12 @@
* updating geometric state.
*/
public void updateWorldVectors(boolean recurse) {
- if (((lockedMode & Spatial.LOCKED_TRANSFORMS) == 0)) {
+ if ((((lockedMode & LOCKED_TRANSFORMS) == 0)) || ((dirtyLocks & LOCKED_TRANSFORMS) != 0)) {
+
updateWorldScale();
updateWorldRotation();
updateWorldTranslation();
+ dirtyLocks &= (~LOCKED_TRANSFORMS);
}
}
@@ -1414,14 +1460,44 @@
* Spatial.
*/
public void setLocks(int locks) {
- if ((lockedMode & Spatial.LOCKED_BOUNDS) != 0)
- lockBounds();
- if ((lockedMode & Spatial.LOCKED_MESH_DATA) != 0)
- lockMeshes();
- if ((lockedMode & Spatial.LOCKED_SHADOWS) != 0)
- lockShadows();
- if ((lockedMode & Spatial.LOCKED_TRANSFORMS) != 0)
- lockTransforms();
+
+ if ((lockedMode & LOCKED_BOUNDS) != (locks & LOCKED_BOUNDS))
+ {
+ if ((locks & LOCKED_BOUNDS) != 0)
+ lockBounds();
+ else
+ unlockBounds();
+ }
+ if ((lockedMode & LOCKED_TRANSFORMS) != (locks & LOCKED_TRANSFORMS))
+ {
+ if ((locks & LOCKED_TRANSFORMS) != 0)
+ lockTransforms();
+ else
+ unlockTransforms();
+ }
+
+ if ((lockedMode & LOCKED_MESH_DATA) != (locks & LOCKED_MESH_DATA))
+ {
+ if ((locks & LOCKED_MESH_DATA) != 0)
+ lockMeshes();
+ else
+ unlockMeshes();
+ }
+
+ if ((lockedMode & LOCKED_SHADOWS) != (locks & LOCKED_SHADOWS))
+ {
+ if ((locks & LOCKED_SHADOWS) != 0)
+ lockShadows();
+ else
+ unlockShadows();
+ }
+ if ((lockedMode & LOCKED_BRANCH) != (locks & LOCKED_BRANCH))
+ {
+ if ((locks & LOCKED_BRANCH) != 0)
+ lockBranch();
+ else
+ unlockBranch();
+ }
}
/**
@@ -1433,14 +1509,44 @@
* is set.
*/
public void setLocks(int locks, Renderer r) {
- if ((lockedMode & Spatial.LOCKED_BOUNDS) != 0)
- lockBounds();
- if ((lockedMode & Spatial.LOCKED_MESH_DATA) != 0)
- lockMeshes(r);
- if ((lockedMode & Spatial.LOCKED_SHADOWS) != 0)
- lockShadows();
- if ((lockedMode & Spatial.LOCKED_TRANSFORMS) != 0)
- lockTransforms();
+
+ if ((lockedMode & LOCKED_BOUNDS) != (locks & LOCKED_BOUNDS))
+ {
+ if ((locks & LOCKED_BOUNDS) != 0)
+ lockBounds();
+ else
+ unlockBounds();
+ }
+ if ((lockedMode & LOCKED_TRANSFORMS) != (locks & LOCKED_TRANSFORMS))
+ {
+ if ((locks & LOCKED_TRANSFORMS) != 0)
+ lockTransforms();
+ else
+ unlockTransforms();
+ }
+
+ if ((lockedMode & LOCKED_MESH_DATA) != (locks & LOCKED_MESH_DATA))
+ {
+ if ((locks & LOCKED_MESH_DATA) != 0)
+ lockMeshes(r);
+ else
+ unlockMeshes(r);
+ }
+
+ if ((lockedMode & LOCKED_SHADOWS) != (locks & LOCKED_SHADOWS))
+ {
+ if ((locks & LOCKED_SHADOWS) != 0)
+ lockShadows();
+ else
+ unlockShadows();
+ }
+ if ((lockedMode & LOCKED_BRANCH) != (locks & LOCKED_BRANCH))
+ {
+ if ((locks & LOCKED_BRANCH) != 0)
+ lockBranch();
+ else
+ unlockBranch();
+ }
}
/**
Please note that although I've done my best to translate the changes from jme1 to jme2, I dont currently use jme2, so I may have made some small mistakes.