package org.andengine.opengl.texture;
import java.nio.FloatBuffer;
import org.andengine.entity.sprite.UncoloredSprite;
import org.andengine.opengl.shader.PositionTextureCoordinatesShaderProgram;
import org.andengine.opengl.shader.constants.ShaderProgramConstants;
import org.andengine.opengl.util.GLState;
import org.andengine.opengl.vbo.DrawType;
import org.andengine.opengl.vbo.VertexBufferObject;
import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes;
import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder;
import android.opengl.GLES20;
/**
* (c) Zynga 2012
*
* @author Nicolas Gramlich <ngramlich@zynga.com>
* @since 15:11:05 - 15.05.2012
*/
public class TextureWarmUpVertexBufferObject extends VertexBufferObject {
// ===========================================================
// Constants
// ===========================================================
public static final int VERTEX_INDEX_X = 0;
public static final int VERTEX_INDEX_Y = UncoloredSprite.VERTEX_INDEX_X + 1;
public static final int TEXTURECOORDINATES_INDEX_U = UncoloredSprite.VERTEX_INDEX_Y + 1;
public static final int TEXTURECOORDINATES_INDEX_V = UncoloredSprite.TEXTURECOORDINATES_INDEX_U + 1;
public static final int VERTEX_SIZE = 2 + 2;
public static final int VERTICES_PER_VERTEXBUFFEROBJECT_SIZE = 3;
public static final int VERTEXBUFFEROBJECT_SIZE = TextureWarmUpVertexBufferObject.VERTEX_SIZE * TextureWarmUpVertexBufferObject.VERTICES_PER_VERTEXBUFFEROBJECT_SIZE;
public static final VertexBufferObjectAttributes VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT = new VertexBufferObjectAttributesBuilder(2)
.add(ShaderProgramConstants.ATTRIBUTE_POSITION_LOCATION, ShaderProgramConstants.ATTRIBUTE_POSITION, 2, GLES20.GL_FLOAT, false)
.add(ShaderProgramConstants.ATTRIBUTE_TEXTURECOORDINATES_LOCATION, ShaderProgramConstants.ATTRIBUTE_TEXTURECOORDINATES, 2, GLES20.GL_FLOAT, false)
.build();
// ===========================================================
// Fields
// ===========================================================
protected final FloatBuffer mFloatBuffer;
// ===========================================================
// Constructors
// ===========================================================
public TextureWarmUpVertexBufferObject() {
super(null, VERTEXBUFFEROBJECT_SIZE, DrawType.STATIC, true, TextureWarmUpVertexBufferObject.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT);
this.mFloatBuffer = this.mByteBuffer.asFloatBuffer();
this.mFloatBuffer.put(0 * VERTEX_SIZE + VERTEX_INDEX_X, 0);
this.mFloatBuffer.put(0 * VERTEX_SIZE + VERTEX_INDEX_Y, 0);
this.mFloatBuffer.put(0 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_U, 0);
this.mFloatBuffer.put(0 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_V, 0);
this.mFloatBuffer.put(1 * VERTEX_SIZE + VERTEX_INDEX_X, 1);
this.mFloatBuffer.put(1 * VERTEX_SIZE + VERTEX_INDEX_Y, 0);
this.mFloatBuffer.put(1 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_U, 1);
this.mFloatBuffer.put(1 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_V, 0);
this.mFloatBuffer.put(2 * VERTEX_SIZE + VERTEX_INDEX_X, 0);
this.mFloatBuffer.put(2 * VERTEX_SIZE + VERTEX_INDEX_Y, 1);
this.mFloatBuffer.put(2 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_U, 0);
this.mFloatBuffer.put(2 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_V, 1);
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
public int getHeapMemoryByteSize() {
return 0;
}
@Override
public int getNativeHeapMemoryByteSize() {
return this.getByteCapacity();
}
@Override
protected void onBufferData() {
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, this.mByteBuffer.limit(), this.mByteBuffer, this.mUsage);
}
public void warmup(final GLState pGLState, final ITexture pTexture) {
pTexture.bind(pGLState);
this.bind(pGLState, PositionTextureCoordinatesShaderProgram.getInstance());
pGLState.pushModelViewGLMatrix();
{
/* Far far away and really small. */
pGLState.loadModelViewGLMatrixIdentity();
pGLState.translateModelViewGLMatrixf(1000000, 1000000, 0);
pGLState.scaleModelViewGLMatrixf(0.0001f, 0.0001f, 0);
this.draw(GLES20.GL_TRIANGLES, VERTICES_PER_VERTEXBUFFEROBJECT_SIZE);
}
pGLState.popModelViewGLMatrix();
this.unbind(pGLState, PositionTextureCoordinatesShaderProgram.getInstance());
}
// ===========================================================
// Methods
// ===========================================================
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}