|
|
|
@ -40,6 +40,8 @@ import com.jme3.export.Savable; |
|
|
|
|
import com.jme3.math.Matrix3f; |
|
|
|
|
import com.jme3.math.Matrix4f; |
|
|
|
|
import com.jme3.math.Quaternion; |
|
|
|
|
import com.jme3.renderer.Camera; |
|
|
|
|
import com.jme3.renderer.Camera.FrustumIntersect; |
|
|
|
|
import com.jme3.scene.Geometry; |
|
|
|
|
import com.jme3.scene.Spatial; |
|
|
|
|
import com.jme3.scene.VertexBuffer; |
|
|
|
@ -63,6 +65,8 @@ public class InstancedGeometry extends Geometry { |
|
|
|
|
private Geometry[] geometries = new Geometry[1]; |
|
|
|
|
|
|
|
|
|
private int firstUnusedIndex = 0; |
|
|
|
|
private int numCulledGeometries = 0; |
|
|
|
|
private Camera cam; |
|
|
|
|
|
|
|
|
|
public InstancedGeometry() { |
|
|
|
|
super(); |
|
|
|
@ -208,7 +212,7 @@ public class InstancedGeometry extends Geometry { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public int getActualNumInstances() { |
|
|
|
|
return firstUnusedIndex; |
|
|
|
|
return firstUnusedIndex - numCulledGeometries; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void swap(int idx1, int idx2) { |
|
|
|
@ -250,6 +254,7 @@ public class InstancedGeometry extends Geometry { |
|
|
|
|
fb.limit(fb.capacity()); |
|
|
|
|
fb.position(0); |
|
|
|
|
|
|
|
|
|
numCulledGeometries = 0; |
|
|
|
|
TempVars vars = TempVars.get(); |
|
|
|
|
{ |
|
|
|
|
float[] temp = vars.matrixWrite; |
|
|
|
@ -271,6 +276,19 @@ public class InstancedGeometry extends Geometry { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (cam != null) { |
|
|
|
|
BoundingVolume bv = geom.getWorldBound(); |
|
|
|
|
int save = cam.getPlaneState(); |
|
|
|
|
cam.setPlaneState(0); |
|
|
|
|
FrustumIntersect intersect = cam.contains(bv); |
|
|
|
|
cam.setPlaneState(save); |
|
|
|
|
|
|
|
|
|
if (intersect == FrustumIntersect.Outside) { |
|
|
|
|
numCulledGeometries++; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Matrix4f worldMatrix = geom.getWorldMatrix(); |
|
|
|
|
updateInstance(worldMatrix, temp, 0, vars.tempMat3, vars.quat1); |
|
|
|
|
fb.put(temp); |
|
|
|
@ -280,7 +298,7 @@ public class InstancedGeometry extends Geometry { |
|
|
|
|
|
|
|
|
|
fb.flip(); |
|
|
|
|
|
|
|
|
|
if (fb.limit() / INSTANCE_SIZE != firstUnusedIndex) { |
|
|
|
|
if (fb.limit() / INSTANCE_SIZE != (firstUnusedIndex - numCulledGeometries)) { |
|
|
|
|
throw new AssertionError(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -368,6 +386,12 @@ public class InstancedGeometry extends Geometry { |
|
|
|
|
return allData.toArray(new VertexBuffer[allData.size()]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public boolean checkCulling(Camera cam) { |
|
|
|
|
this.cam = cam; |
|
|
|
|
return super.checkCulling(cam); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Called internally by com.jme3.util.clone.Cloner. Do not call directly. |
|
|
|
|
*/ |
|
|
|
|