package org.anddev.andengine.opengl.texture.region.buffer; import static org.anddev.andengine.opengl.vertex.RectangleVertexBuffer.VERTICES_PER_RECTANGLE; import org.anddev.andengine.opengl.buffer.BufferObject; import org.anddev.andengine.opengl.texture.ITexture; import org.anddev.andengine.opengl.texture.region.BaseTextureRegion; import org.anddev.andengine.opengl.util.FastFloatBuffer; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 19:05:50 - 09.03.2010 */ public class TextureRegionBuffer extends BufferObject { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== protected final BaseTextureRegion mTextureRegion; private boolean mFlippedVertical; private boolean mFlippedHorizontal; // =========================================================== // Constructors // =========================================================== public TextureRegionBuffer(final BaseTextureRegion pBaseTextureRegion, final int pDrawType, final boolean pManaged) { super(2 * VERTICES_PER_RECTANGLE, pDrawType, pManaged); this.mTextureRegion = pBaseTextureRegion; } // =========================================================== // Getter & Setter // =========================================================== public BaseTextureRegion getTextureRegion() { return this.mTextureRegion; } public boolean isFlippedHorizontal() { return this.mFlippedHorizontal; } public void setFlippedHorizontal(final boolean pFlippedHorizontal) { if(this.mFlippedHorizontal != pFlippedHorizontal) { this.mFlippedHorizontal = pFlippedHorizontal; this.update(); } } public boolean isFlippedVertical() { return this.mFlippedVertical; } public void setFlippedVertical(final boolean pFlippedVertical) { if(this.mFlippedVertical != pFlippedVertical) { this.mFlippedVertical = pFlippedVertical; this.update(); } } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== public synchronized void update() { final BaseTextureRegion textureRegion = this.mTextureRegion; final int x1 = Float.floatToRawIntBits(textureRegion.getTextureCoordinateX1()); final int y1 = Float.floatToRawIntBits(textureRegion.getTextureCoordinateY1()); final int x2 = Float.floatToRawIntBits(textureRegion.getTextureCoordinateX2()); final int y2 = Float.floatToRawIntBits(textureRegion.getTextureCoordinateY2()); final int[] bufferData = this.mBufferData; if(this.mFlippedVertical) { if(this.mFlippedHorizontal) { bufferData[0] = x2; bufferData[1] = y2; bufferData[2] = x2; bufferData[3] = y1; bufferData[4] = x1; bufferData[5] = y2; bufferData[6] = x1; bufferData[7] = y1; } else { bufferData[0] = x1; bufferData[1] = y2; bufferData[2] = x1; bufferData[3] = y1; bufferData[4] = x2; bufferData[5] = y2; bufferData[6] = x2; bufferData[7] = y1; } } else { if(this.mFlippedHorizontal) { bufferData[0] = x2; bufferData[1] = y1; bufferData[2] = x2; bufferData[3] = y2; bufferData[4] = x1; bufferData[5] = y1; bufferData[6] = x1; bufferData[7] = y2; } else { bufferData[0] = x1; bufferData[1] = y1; bufferData[2] = x1; bufferData[3] = y2; bufferData[4] = x2; bufferData[5] = y1; bufferData[6] = x2; bufferData[7] = y2; } } final FastFloatBuffer buffer = this.mFloatBuffer; buffer.position(0); buffer.put(bufferData); buffer.position(0); super.setHardwareBufferNeedsUpdate(); } // =========================================================== // Inner and Anonymous Classes // =========================================================== }