Check culling on the instanced geometries. (#1315)

master
Ali-RS 5 years ago committed by GitHub
parent 7c01019f0c
commit 0c6f240222
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 28
      jme3-core/src/main/java/com/jme3/scene/instancing/InstancedGeometry.java

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

Loading…
Cancel
Save