package org.anddev.andengine.opengl.vertex;
import org.anddev.andengine.opengl.util.FastFloatBuffer;
import org.anddev.andengine.util.Transformation;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 11:53:48 - 14.06.2011
*/
public class SpriteBatchVertexBuffer extends VertexBuffer {
// ===========================================================
// Constants
// ===========================================================
public static final int VERTICES_PER_RECTANGLE = 6;
private static final float[] VERTICES_TMP = new float[8];
private static final Transformation TRANSFORATION_TMP = new Transformation();
// ===========================================================
// Fields
// ===========================================================
protected int mIndex;
// ===========================================================
// Constructors
// ===========================================================
public SpriteBatchVertexBuffer(final int pCapacity, final int pDrawType, final boolean pManaged) {
super(pCapacity * 2 * VERTICES_PER_RECTANGLE, pDrawType, pManaged);
}
// ===========================================================
// Getter & Setter
// ===========================================================
public int getIndex() {
return this.mIndex;
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
public void setIndex(final int pIndex) {
this.mIndex = pIndex;
}
/**
* @param pX
* @param pY
* @param pWidth
* @param pHeight
* @param pRotation around the center (pWidth * 0.5f, pHeight * 0.5f)
*/
public void add(final float pX, final float pY, final float pWidth, final float pHeight, final float pRotation) {
final float widthHalf = pWidth * 0.5f;
final float heightHalf = pHeight * 0.5f;
TRANSFORATION_TMP.setToIdentity();
TRANSFORATION_TMP.postTranslate(-widthHalf, -heightHalf);
TRANSFORATION_TMP.postRotate(pRotation);
TRANSFORATION_TMP.postTranslate(widthHalf, heightHalf);
TRANSFORATION_TMP.postTranslate(pX, pY);
this.add(pWidth, pHeight, TRANSFORATION_TMP);
}
/**
* @param pX
* @param pY
* @param pWidth
* @param pHeight
* @param pRotation around the center (pWidth * 0.5f, pHeight * 0.5f)
* @param pScaleX around the center (pWidth * 0.5f, pHeight * 0.5f)
* @param pScaleY around the center (pWidth * 0.5f, pHeight * 0.5f)
*/
public void add(final float pX, final float pY, final float pWidth, final float pHeight, final float pScaleX, final float pScaleY) {
final float widthHalf = pWidth * 0.5f;
final float heightHalf = pHeight * 0.5f;
TRANSFORATION_TMP.setToIdentity();
TRANSFORATION_TMP.postTranslate(-widthHalf, -heightHalf);
TRANSFORATION_TMP.postScale(pScaleX, pScaleY);
TRANSFORATION_TMP.postTranslate(widthHalf, heightHalf);
TRANSFORATION_TMP.postTranslate(pX, pY);
this.add(pWidth, pHeight, TRANSFORATION_TMP);
}
/**
* @param pX
* @param pY
* @param pWidth
* @param pHeight
* @param pRotation around the center (pWidth * 0.5f, pHeight * 0.5f)
* @param pScaleX around the center (pWidth * 0.5f, pHeight * 0.5f)
* @param pScaleY around the center (pWidth * 0.5f, pHeight * 0.5f)
*/
public void add(final float pX, final float pY, final float pWidth, final float pHeight, final float pRotation, final float pScaleX, final float pScaleY) {
final float widthHalf = pWidth * 0.5f;
final float heightHalf = pHeight * 0.5f;
TRANSFORATION_TMP.setToIdentity();
TRANSFORATION_TMP.postTranslate(-widthHalf, -heightHalf);
TRANSFORATION_TMP.postScale(pScaleX, pScaleY);
TRANSFORATION_TMP.postRotate(pRotation);
TRANSFORATION_TMP.postTranslate(widthHalf, heightHalf);
TRANSFORATION_TMP.postTranslate(pX, pY);
this.add(pWidth, pHeight, TRANSFORATION_TMP);
}
/**
*
* @param pX
* @param pY
* @param pWidth
* @param pHeight
* @param pTransformation
*/
public void add(final float pWidth, final float pHeight, final Transformation pTransformation) {
VERTICES_TMP[0] = 0;
VERTICES_TMP[1] = 0;
VERTICES_TMP[2] = 0;
VERTICES_TMP[3] = pHeight;
VERTICES_TMP[4] = pWidth;
VERTICES_TMP[5] = 0;
VERTICES_TMP[6] = pWidth;
VERTICES_TMP[7] = pHeight;
pTransformation.transform(VERTICES_TMP);
this.addInner(VERTICES_TMP[0], VERTICES_TMP[1], VERTICES_TMP[2], VERTICES_TMP[3], VERTICES_TMP[4], VERTICES_TMP[5], VERTICES_TMP[6], VERTICES_TMP[7]);
}
public void add(final float pX, final float pY, final float pWidth, final float pHeight) {
this.addInner(pX, pY, pX + pWidth, pY + pHeight);
}
/**
* 1-+
* |X|
* +-2
*/
public void addInner(final float pX1, final float pY1, final float pX2, final float pY2) {
final int x1 = Float.floatToRawIntBits(pX1);
final int y1 = Float.floatToRawIntBits(pY1);
final int x2 = Float.floatToRawIntBits(pX2);
final int y2 = Float.floatToRawIntBits(pY2);
final int[] bufferData = this.mBufferData;
int index = this.mIndex;
bufferData[index++] = x1;
bufferData[index++] = y1;
bufferData[index++] = x1;
bufferData[index++] = y2;
bufferData[index++] = x2;
bufferData[index++] = y1;
bufferData[index++] = x2;
bufferData[index++] = y1;
bufferData[index++] = x1;
bufferData[index++] = y2;
bufferData[index++] = x2;
bufferData[index++] = y2;
this.mIndex = index;
}
/**
* 1-3
* |X|
* 2-4
*/
public void addInner(final float pX1, final float pY1, final float pX2, final float pY2, final float pX3, final float pY3, final float pX4, final float pY4) {
final int x1 = Float.floatToRawIntBits(pX1);
final int y1 = Float.floatToRawIntBits(pY1);
final int x2 = Float.floatToRawIntBits(pX2);
final int y2 = Float.floatToRawIntBits(pY2);
final int x3 = Float.floatToRawIntBits(pX3);
final int y3 = Float.floatToRawIntBits(pY3);
final int x4 = Float.floatToRawIntBits(pX4);
final int y4 = Float.floatToRawIntBits(pY4);
final int[] bufferData = this.mBufferData;
int index = this.mIndex;
bufferData[index++] = x1;
bufferData[index++] = y1;
bufferData[index++] = x2;
bufferData[index++] = y2;
bufferData[index++] = x3;
bufferData[index++] = y3;
bufferData[index++] = x3;
bufferData[index++] = y3;
bufferData[index++] = x2;
bufferData[index++] = y2;
bufferData[index++] = x4;
bufferData[index++] = y4;
this.mIndex = index;
}
public void submit() {
final FastFloatBuffer buffer = this.mFloatBuffer;
buffer.position(0);
buffer.put(this.mBufferData);
buffer.position(0);
super.setHardwareBufferNeedsUpdate();
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}