Check culling on the instanced geometries. (#1315)
This commit is contained in:
parent
7c01019f0c
commit
0c6f240222
@ -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…
x
Reference in New Issue
Block a user