package org.anddev.andengine.opengl.texture; import java.io.IOException; import javax.microedition.khronos.opengles.GL10; import org.anddev.andengine.opengl.texture.source.ITextureAtlasSource; import org.anddev.andengine.opengl.util.GLHelper; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:55:02 - 08.03.2010 */ public abstract class Texture implements ITexture { // =========================================================== // Constants // =========================================================== private static final int[] HARDWARETEXTUREID_FETCHER = new int[1]; // =========================================================== // Fields // =========================================================== protected final PixelFormat mPixelFormat; protected final TextureOptions mTextureOptions; protected int mHardwareTextureID = -1; protected boolean mLoadedToHardware; protected boolean mUpdateOnHardwareNeeded = false; protected final ITextureStateListener mTextureStateListener; // =========================================================== // Constructors // =========================================================== /** * @param pPixelFormat * @param pTextureOptions the (quality) settings of the Texture. * @param pTextureStateListener to be informed when this {@link Texture} is loaded, unloaded or a {@link ITextureAtlasSource} failed to load. */ public Texture(final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final ITextureStateListener pTextureStateListener) throws IllegalArgumentException { this.mPixelFormat = pPixelFormat; this.mTextureOptions = pTextureOptions; this.mTextureStateListener = pTextureStateListener; } // =========================================================== // Getter & Setter // =========================================================== @Override public int getHardwareTextureID() { return this.mHardwareTextureID; } @Override public boolean isLoadedToHardware() { return this.mLoadedToHardware; } @Override public void setLoadedToHardware(final boolean pLoadedToHardware) { this.mLoadedToHardware = pLoadedToHardware; } @Override public boolean isUpdateOnHardwareNeeded() { return this.mUpdateOnHardwareNeeded; } @Override public void setUpdateOnHardwareNeeded(final boolean pUpdateOnHardwareNeeded) { this.mUpdateOnHardwareNeeded = pUpdateOnHardwareNeeded; } public PixelFormat getPixelFormat() { return this.mPixelFormat; } @Override public TextureOptions getTextureOptions() { return this.mTextureOptions; } @Override public ITextureStateListener getTextureStateListener() { return this.mTextureStateListener; } @Override public boolean hasTextureStateListener() { return this.mTextureStateListener != null; } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== protected abstract void writeTextureToHardware(final GL10 pGL) throws IOException; @Override public void loadToHardware(final GL10 pGL) throws IOException { GLHelper.enableTextures(pGL); this.generateHardwareTextureID(pGL); this.bindTextureOnHardware(pGL); this.applyTextureOptions(pGL); this.writeTextureToHardware(pGL); this.mUpdateOnHardwareNeeded = false; this.mLoadedToHardware = true; if(this.mTextureStateListener != null) { this.mTextureStateListener.onLoadedToHardware(this); } } @Override public void unloadFromHardware(final GL10 pGL) { GLHelper.enableTextures(pGL); this.deleteTextureOnHardware(pGL); this.mHardwareTextureID = -1; this.mLoadedToHardware = false; if(this.mTextureStateListener != null) { this.mTextureStateListener.onUnloadedFromHardware(this); } } @Override public void reloadToHardware(final GL10 pGL) throws IOException { this.unloadFromHardware(pGL); this.loadToHardware(pGL); } @Override public void bind(final GL10 pGL) { GLHelper.bindTexture(pGL, this.mHardwareTextureID); } // =========================================================== // Methods // =========================================================== protected void applyTextureOptions(final GL10 pGL) { this.mTextureOptions.apply(pGL); } protected void bindTextureOnHardware(final GL10 pGL) { GLHelper.forceBindTexture(pGL, this.mHardwareTextureID); } protected void deleteTextureOnHardware(final GL10 pGL) { GLHelper.deleteTexture(pGL, this.mHardwareTextureID); } protected void generateHardwareTextureID(final GL10 pGL) { pGL.glGenTextures(1, Texture.HARDWARETEXTUREID_FETCHER, 0); this.mHardwareTextureID = Texture.HARDWARETEXTUREID_FETCHER[0]; } // =========================================================== // Inner and Anonymous Classes // =========================================================== public enum PixelFormat { // =========================================================== // Elements // =========================================================== UNDEFINED(-1, -1, -1), RGBA_4444(GL10.GL_RGBA, GL10.GL_UNSIGNED_SHORT_4_4_4_4, 16), RGBA_5551(GL10.GL_RGBA, GL10.GL_UNSIGNED_SHORT_5_5_5_1, 16), RGBA_8888(GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, 32), RGB_565(GL10.GL_RGB, GL10.GL_UNSIGNED_SHORT_5_6_5, 16), A_8(GL10.GL_ALPHA, GL10.GL_UNSIGNED_BYTE, 8), I_8(GL10.GL_LUMINANCE, GL10.GL_UNSIGNED_BYTE, 8), AI_88(GL10.GL_LUMINANCE_ALPHA, GL10.GL_UNSIGNED_BYTE, 16); // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== private final int mGLFormat; private final int mGLType; private final int mBitsPerPixel; // =========================================================== // Constructors // =========================================================== private PixelFormat(final int pGLFormat, final int pGLType, final int pBitsPerPixel) { this.mGLFormat = pGLFormat; this.mGLType = pGLType; this.mBitsPerPixel = pBitsPerPixel; } // =========================================================== // Getter & Setter // =========================================================== public int getGLFormat() { return this.mGLFormat; } public int getGLType() { return this.mGLType; } public int getBitsPerPixel() { return this.mBitsPerPixel; } // =========================================================== // Methods from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== // =========================================================== // Inner and Anonymous Classes // =========================================================== } }