package org.anddev.andengine.opengl.texture.region; import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.opengles.GL11; import org.anddev.andengine.opengl.buffer.BufferObjectManager; import org.anddev.andengine.opengl.texture.ITexture; import org.anddev.andengine.opengl.texture.region.buffer.TextureRegionBuffer; import org.anddev.andengine.opengl.util.GLHelper; import org.anddev.andengine.util.modifier.IModifier.DeepCopyNotSupportedException; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:29:59 - 08.03.2010 */ public abstract class BaseTextureRegion { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== protected final ITexture mTexture; protected final TextureRegionBuffer mTextureRegionBuffer; protected int mWidth; protected int mHeight; protected int mTexturePositionX; protected int mTexturePositionY; // =========================================================== // Constructors // =========================================================== public BaseTextureRegion(final ITexture pTexture, final int pTexturePositionX, final int pTexturePositionY, final int pWidth, final int pHeight) { this.mTexture = pTexture; this.mTexturePositionX = pTexturePositionX; this.mTexturePositionY = pTexturePositionY; this.mWidth = pWidth; this.mHeight = pHeight; this.mTextureRegionBuffer = new TextureRegionBuffer(this, GL11.GL_STATIC_DRAW, true); this.initTextureBuffer(); } protected void initTextureBuffer() { this.updateTextureRegionBuffer(); } protected abstract BaseTextureRegion deepCopy() throws DeepCopyNotSupportedException; // =========================================================== // Getter & Setter // =========================================================== public int getWidth() { return this.mWidth; } public int getHeight() { return this.mHeight; } public void setWidth(final int pWidth) { this.mWidth = pWidth; this.updateTextureRegionBuffer(); } public void setHeight(final int pHeight) { this.mHeight = pHeight; this.updateTextureRegionBuffer(); } public void setTexturePosition(final int pTexturePositionX, final int pTexturePositionY) { this.mTexturePositionX = pTexturePositionX; this.mTexturePositionY = pTexturePositionY; this.updateTextureRegionBuffer(); } public int getTexturePositionX() { return this.mTexturePositionX; } public int getTexturePositionY() { return this.mTexturePositionY; } public ITexture getTexture() { return this.mTexture; } public TextureRegionBuffer getTextureBuffer() { return this.mTextureRegionBuffer; } public boolean isFlippedHorizontal() { return this.mTextureRegionBuffer.isFlippedHorizontal(); } public void setFlippedHorizontal(final boolean pFlippedHorizontal) { this.mTextureRegionBuffer.setFlippedHorizontal(pFlippedHorizontal); } public boolean isFlippedVertical() { return this.mTextureRegionBuffer.isFlippedVertical(); } public void setFlippedVertical(final boolean pFlippedVertical) { this.mTextureRegionBuffer.setFlippedVertical(pFlippedVertical); } public boolean isTextureRegionBufferManaged() { return this.mTextureRegionBuffer.isManaged(); } /** * @param pVertexBufferManaged when passing <code>true</code> this {@link BaseTextureRegion} will make its {@link TextureRegionBuffer} unload itself from the active {@link BufferObjectManager}, when this {@link BaseTextureRegion} is finalized/garbage-collected.<b><u>WARNING:</u></b> When passing <code>false</code> one needs to take care of that by oneself! */ public void setTextureRegionBufferManaged(final boolean pTextureRegionBufferManaged) { this.mTextureRegionBuffer.setManaged(pTextureRegionBufferManaged); } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== public abstract float getTextureCoordinateX1(); public abstract float getTextureCoordinateY1(); public abstract float getTextureCoordinateX2(); public abstract float getTextureCoordinateY2(); // =========================================================== // Methods // =========================================================== protected void updateTextureRegionBuffer() { this.mTextureRegionBuffer.update(); } public void onApply(final GL10 pGL) { this.mTexture.bind(pGL); if(GLHelper.EXTENSIONS_VERTEXBUFFEROBJECTS) { final GL11 gl11 = (GL11)pGL; this.mTextureRegionBuffer.selectOnHardware(gl11); GLHelper.texCoordZeroPointer(gl11); } else { GLHelper.texCoordPointer(pGL, this.mTextureRegionBuffer.getFloatBuffer()); } } // =========================================================== // Inner and Anonymous Classes // =========================================================== }