final FloatBufferData normalCoords, final FloatBufferData colorCoords,
final List<FloatBufferData> textureCoords) {
final GL gl = GLContext.getCurrentGL();
final RenderContext context = ContextManager.getCurrentContext();
final RendererRecord rendRecord = context.getRendererRecord();
final ContextCapabilities caps = context.getCapabilities();
final int lengthBytes = getTotalInterleavedSize(context, vertexCoords, normalCoords, colorCoords, textureCoords);
int currLengthBytes = 0;
if (interleaved.getBufferLimit() > 0) {
interleaved.getBuffer().rewind();
currLengthBytes = Math.round(interleaved.getBuffer().get());
}
if (lengthBytes != currLengthBytes || interleaved.getVBOID(context.getGlContextRep()) == 0
|| interleaved.isNeedsRefresh()) {
initializeInterleavedVBO(context, interleaved, vertexCoords, normalCoords, colorCoords, textureCoords,
lengthBytes);
}
final int vboID = interleaved.getVBOID(context.getGlContextRep());
JoglRendererUtil.setBoundVBO(rendRecord, vboID);
int offsetBytes = 0;
if (normalCoords != null) {
updateVBO(normalCoords, rendRecord, vboID, offsetBytes);
if (gl.isGL2ES1()) {
gl.getGL2ES1().glNormalPointer(GL.GL_FLOAT, 0, offsetBytes);
}
if (gl.isGL2GL3()) {
gl.getGL2GL3().glEnableClientState(GLPointerFunc.GL_NORMAL_ARRAY);
}
offsetBytes += normalCoords.getBufferLimit() * 4;
} else {
if (gl.isGL2GL3()) {
gl.getGL2GL3().glDisableClientState(GLPointerFunc.GL_NORMAL_ARRAY);
}
}
if (colorCoords != null) {
updateVBO(colorCoords, rendRecord, vboID, offsetBytes);
if (gl.isGL2ES1()) {
gl.getGL2ES1().glColorPointer(colorCoords.getValuesPerTuple(), GL.GL_FLOAT, 0, offsetBytes);
}
if (gl.isGL2GL3()) {
gl.getGL2GL3().glEnableClientState(GLPointerFunc.GL_COLOR_ARRAY);
}
offsetBytes += colorCoords.getBufferLimit() * 4;
} else {
if (gl.isGL2GL3()) {
gl.getGL2GL3().glDisableClientState(GLPointerFunc.GL_COLOR_ARRAY);
}
}
if (textureCoords != null) {
final TextureState ts = (TextureState) context.getCurrentState(RenderState.StateType.Texture);
int enabledTextures = rendRecord.getEnabledTextures();
final boolean valid = rendRecord.isTexturesValid();
boolean exists, wasOn;
if (ts != null) {
final int max = caps.isMultitextureSupported() ? Math.min(caps.getNumberOfFragmentTexCoordUnits(),
TextureState.MAX_TEXTURES) : 1;
for (int i = 0; i < max; i++) {
wasOn = (enabledTextures & (2 << i)) != 0;
exists = textureCoords != null && i < textureCoords.size() && textureCoords.get(i) != null
&& i <= ts.getMaxTextureIndexUsed();
if (!exists) {
if (valid && !wasOn) {
continue;
} else {
checkAndSetTextureArrayUnit(i, gl, rendRecord, caps);
// disable bit in tracking int
enabledTextures &= ~(2 << i);
// disable state
if (gl.isGL2GL3()) {
gl.getGL2GL3().glDisableClientState(GLPointerFunc.GL_TEXTURE_COORD_ARRAY);
}
continue;
}
} else {
checkAndSetTextureArrayUnit(i, gl, rendRecord, caps);
// grab a vboID and make sure it exists and is up to date.
final FloatBufferData textureBufferData = textureCoords.get(i);
updateVBO(textureBufferData, rendRecord, vboID, offsetBytes);
if (!valid || !wasOn) {
// enable bit in tracking int
enabledTextures |= (2 << i);
// enable state
if (gl.isGL2GL3()) {
gl.getGL2GL3().glEnableClientState(GLPointerFunc.GL_TEXTURE_COORD_ARRAY);
}
}
// send data
if (gl.isGL2ES1()) {
gl.getGL2ES1().glTexCoordPointer(textureBufferData.getValuesPerTuple(), GL.GL_FLOAT, 0,
offsetBytes);
}
offsetBytes += textureBufferData.getBufferLimit() * 4;
}
}
}
rendRecord.setEnabledTextures(enabledTextures);
rendRecord.setTexturesValid(true);
}
if (vertexCoords != null) {
updateVBO(vertexCoords, rendRecord, vboID, offsetBytes);
if (gl.isGL2ES1()) {