diff options
Diffstat (limited to 'src/jogl/classes/com/sun/opengl/impl/glsl/GLSLArrayHandler.java')
-rw-r--r-- | src/jogl/classes/com/sun/opengl/impl/glsl/GLSLArrayHandler.java | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/jogl/classes/com/sun/opengl/impl/glsl/GLSLArrayHandler.java b/src/jogl/classes/com/sun/opengl/impl/glsl/GLSLArrayHandler.java new file mode 100644 index 000000000..30c4a0190 --- /dev/null +++ b/src/jogl/classes/com/sun/opengl/impl/glsl/GLSLArrayHandler.java @@ -0,0 +1,62 @@ + +package com.sun.opengl.impl.glsl; + +import com.sun.opengl.impl.*; + +import javax.media.opengl.*; +import javax.media.opengl.sub.*; +import com.sun.opengl.util.*; +import com.sun.opengl.util.glsl.ShaderState; +import java.nio.*; + +public class GLSLArrayHandler implements GLArrayHandler { + private GLArrayDataEditable ad; + + public GLSLArrayHandler(GLArrayDataEditable ad) { + this.ad = ad; + } + + protected final void passVertexAttribPointer(GL2ES2 gl, ShaderState st) { + st.glVertexAttribPointer(gl, ad); + } + + public void enableBuffer(GL gl, boolean enable) { + if(!gl.isGL2ES2()) { + throw new GLException("GLSLArrayHandler expects a GL2ES2 implementation"); + } + GL2ES2 glsl = gl.getGL2ES2(); + ShaderState st = ShaderState.getCurrent(); + if(null==st) { + throw new GLException("No ShaderState current"); + } + + if(enable) { + st.glEnableVertexAttribArray(glsl, ad.getName()); + + Buffer buffer = ad.getBuffer(); + + if(ad.isVBO()) { + // always bind and refresh the VBO mgr, + // in case more than one gl*Pointer objects are in use + glsl.glBindBuffer(GL.GL_ARRAY_BUFFER, ad.getVBOName()); + if(!ad.isBufferWritten()) { + if(null!=buffer) { + glsl.glBufferData(GL.GL_ARRAY_BUFFER, buffer.limit() * ad.getComponentSize(), buffer, ad.getBufferUsage()); + } + ad.setBufferWritten(true); + } + passVertexAttribPointer(glsl, st); + } else if(null!=buffer) { + passVertexAttribPointer(glsl, st); + ad.setBufferWritten(true); + } + } else { + if(ad.isVBO()) { + glsl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0); + } + st.glDisableVertexAttribArray(glsl, ad.getName()); + } + } + +} + |