package org.osm2world.core.target.jogl;
import static javax.media.opengl.GL.GL_ARRAY_BUFFER;
import static javax.media.opengl.GL.GL_TRIANGLES;
import static javax.media.opengl.fixedfunc.GLPointerFunc.GL_TEXTURE_COORD_ARRAY;
import java.nio.Buffer;
import java.util.Collection;
import javax.media.opengl.GL2;
import org.osm2world.core.target.common.Primitive;
import org.osm2world.core.target.common.material.Material;
/**
* class that keeps a VBO id along with associated information for the fixed function OpenGL pipeline
*/
abstract class VBODataFixedFunction<BufferT extends Buffer> extends VBOData<BufferT> {
protected GL2 gl;
/**
* @see VBOData#VBOData(javax.media.opengl.GL, JOGLTextureManager, Material, Collection)
*/
public VBODataFixedFunction(GL2 gl, JOGLTextureManager textureManager, Material material, Collection<Primitive> primitives) {
super(gl, textureManager, material, primitives);
this.gl = gl;
}
@Override
public void render() {
for (int i = 0; i < JOGLTargetFixedFunction.MAX_TEXTURE_LAYERS; i++) {
gl.glClientActiveTexture(JOGLTargetFixedFunction.getGLTextureConstant(i));
if (i >= material.getNumTextureLayers()) {
gl.glDisableClientState(GL_TEXTURE_COORD_ARRAY);
} else {
gl.glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
}
gl.glClientActiveTexture(JOGLTargetFixedFunction.getGLTextureConstant(0));
JOGLTargetFixedFunction.setMaterial(gl, material, textureManager);
gl.glBindBuffer(GL_ARRAY_BUFFER, id[0]);
setPointerLayout();
gl.glDrawArrays(GL_TRIANGLES, 0, vertexCount);
}
private void setPointerLayout() {
int stride = valueTypeSize * JOGLRendererVBO.getValuesPerVertex(material);
int offset = 0;
for (int i = 0; i < material.getNumTextureLayers(); i++) {
gl.glClientActiveTexture(JOGLTargetFixedFunction.getGLTextureConstant(i));
gl.glEnableClientState(GL_TEXTURE_COORD_ARRAY);
gl.glActiveTexture(JOGLTargetFixedFunction.getGLTextureConstant(i));
gl.glTexCoordPointer(2, glValueType, stride, offset);
offset += 2 * valueTypeSize;
}
gl.glVertexPointer(3, glValueType, stride, offset + valueTypeSize() * 3);
gl.glNormalPointer(glValueType, stride, offset);
}
@Override
protected int getValuesPerVertex(Material material) {
return JOGLRendererVBO.getValuesPerVertex(material);
}
}