I added support for occlusion queries to the renderer, can be used to implement hardware accelerated occlusion culling.
Index: src/core/com/jme3/system/NullRenderer.java
===================================================================
--- src/core/com/jme3/system/NullRenderer.java (Revision 6689)
+++ src/core/com/jme3/system/NullRenderer.java (Arbeitskopie)
@@ -47,6 +47,7 @@
import com.jme3.texture.Image;
import com.jme3.texture.Texture;
import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
import java.util.EnumSet;
public class NullRenderer implements Renderer {
@@ -140,4 +141,30 @@
public void setAlphaToCoverage(boolean value) {
}
+ @Override
+ public void generateQueries(IntBuffer queries){
+ }
+
+ @Override
+ public void beginOcclusionQuery(IntBuffer queries, int index){
+ }
+
+ @Override
+ public void endOcclusionQuery(){
+ }
+
+ @Override
+ public boolean queryResultAvaiable(IntBuffer query, int index){
+ return false;
+ }
+
+ @Override
+ public int queryResult(IntBuffer query, int index){
+ return 0;
+ }
+
+ @Override
+ public void destroyQueries(IntBuffer query){
+ }
+
}
Index: src/core/com/jme3/renderer/Renderer.java
===================================================================
--- src/core/com/jme3/renderer/Renderer.java (Revision 6689)
+++ src/core/com/jme3/renderer/Renderer.java (Arbeitskopie)
@@ -44,6 +44,7 @@
import com.jme3.texture.Image;
import com.jme3.texture.Texture;
import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
import java.util.EnumSet;
public interface Renderer {
@@ -207,4 +208,15 @@
*/
public void setAlphaToCoverage(boolean value);
+ public void generateQueries(IntBuffer queries);
+
+ public void beginOcclusionQuery(IntBuffer queries,int index);
+
+ public void endOcclusionQuery();
+
+ public boolean queryResultAvaiable(IntBuffer queries,int index);
+
+ public int queryResult(IntBuffer queries,int index);
+
+ public void destroyQueries(IntBuffer queries);
}
Index: src/jogl/com/jme3/renderer/jogl/JoglRenderer.java
===================================================================
--- src/jogl/com/jme3/renderer/jogl/JoglRenderer.java (Revision 6689)
+++ src/jogl/com/jme3/renderer/jogl/JoglRenderer.java (Arbeitskopie)
@@ -1111,4 +1111,39 @@
gl.glDisable(gl.GL_SAMPLE_ALPHA_TO_COVERAGE);
}
}
+
+ @Override
+ public void generateQueries(IntBuffer queries){
+ gl.glGenQueries(queries.capacity(), queries);
+ }
+
+ @Override
+ public void beginOcclusionQuery(IntBuffer queries, int index){
+ gl.glBeginQuery(GL.GL_SAMPLES_PASSED, queries.get(index));
+ }
+
+ @Override
+ public void endOcclusionQuery(){
+ gl.glEndQuery(GL.GL_SAMPLES_PASSED);
+ }
+
+ @Override
+ public boolean queryResultAvaiable(IntBuffer queries, int index){
+ IntBuffer QueryState = BufferUtils.createIntBuffer(1);
+ gl.glGetQueryObjectuiv(queries.get(index), GL.GL_QUERY_RESULT_AVAILABLE,
+ QueryState);
+ return QueryState.get(0) == GL.GL_TRUE;
+ }
+
+ @Override
+ public int queryResult(IntBuffer queries, int index){
+ IntBuffer samples = BufferUtils.createIntBuffer(1);
+ gl.glGetQueryObjectuiv(queries.get(index), GL.GL_QUERY_RESULT, samples);
+ return samples.get(0);
+ }
+
+ @Override
+ public void destroyQueries(IntBuffer queries){
+ gl.glDeleteQueries(queries.capacity(),queries);
+ }
}
Index: src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglRenderer.java
===================================================================
--- src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglRenderer.java (Revision 6689)
+++ src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglRenderer.java (Arbeitskopie)
@@ -2187,4 +2187,39 @@
glDisable(ARBMultisample.GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
}
}
+
+ @Override
+ public void beginOcclusionQuery(IntBuffer queries, int index){
+ glBeginQuery(GL_SAMPLES_PASSED, queries.get(index));
+ }
+
+ @Override
+ public void endOcclusionQuery(){
+ glEndQuery(GL_SAMPLES_PASSED);
+ }
+
+ @Override
+ public boolean queryResultAvaiable(IntBuffer queries, int index){
+ IntBuffer QueryState = BufferUtils.createIntBuffer(1);
+ glGetQueryObject(queries.get(index), GL_QUERY_RESULT_AVAILABLE,
+ QueryState);
+ return QueryState.get(0) == GL_TRUE;
+ }
+
+ @Override
+ public int queryResult(IntBuffer queries, int index){
+ IntBuffer samples = BufferUtils.createIntBuffer(1);
+ glGetQueryObject(queries.get(index), GL_QUERY_RESULT, samples);
+ return samples.get(0);
+ }
+
+ @Override
+ public void destroyQueries(IntBuffer queries){
+ glDeleteQueries(queries);
+ }
+
+ @Override
+ public void generateQueries(IntBuffer queries){
+ glGenQueries(queries);
+ }
}
Index: src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java
===================================================================
--- src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java (Revision 6689)
+++ src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java (Arbeitskopie)
@@ -858,4 +858,29 @@
public void deleteBuffer(VertexBuffer vb) {
}
+ @Override
+ public void generateQueries(IntBuffer queries){
+ }
+
+ @Override
+ public void beginOcclusionQuery(IntBuffer queries, int index){
+ }
+
+ @Override
+ public void endOcclusionQuery(){
+ }
+
+ @Override
+ public boolean queryResultAvaiable(IntBuffer query, int index){
+ return false;
+ }
+
+ @Override
+ public int queryResult(IntBuffer query, int index){
+ return 0;
+ }
+
+ @Override
+ public void destroyQueries(IntBuffer query){
+ }
}