package org.andengine.opengl.texture; import java.io.IOException; import org.andengine.opengl.texture.atlas.source.ITextureAtlasSource; import org.andengine.opengl.util.GLState; /** * (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 // =========================================================== public static final int HARDWARE_TEXTURE_ID_INVALID = -1; // =========================================================== // Fields // =========================================================== protected final TextureManager mTextureManager; protected final PixelFormat mPixelFormat; protected final TextureOptions mTextureOptions; protected int mHardwareTextureID = Texture.HARDWARE_TEXTURE_ID_INVALID; protected boolean mUpdateOnHardwareNeeded = false; protected 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 TextureManager pTextureManager, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final ITextureStateListener pTextureStateListener) throws IllegalArgumentException { this.mTextureManager = pTextureManager; this.mPixelFormat = pPixelFormat; this.mTextureOptions = pTextureOptions; this.mTextureStateListener = pTextureStateListener; } // =========================================================== // Getter & Setter // =========================================================== @Override public int getHardwareTextureID() { return this.mHardwareTextureID; } @Override public boolean isLoadedToHardware() { return this.mHardwareTextureID != Texture.HARDWARE_TEXTURE_ID_INVALID; } @Override public void setNotLoadedToHardware() { this.mHardwareTextureID = Texture.HARDWARE_TEXTURE_ID_INVALID; } @Override public boolean isUpdateOnHardwareNeeded() { return this.mUpdateOnHardwareNeeded; } @Override public void setUpdateOnHardwareNeeded(final boolean pUpdateOnHardwareNeeded) { this.mUpdateOnHardwareNeeded = pUpdateOnHardwareNeeded; } @Override public PixelFormat getPixelFormat() { return this.mPixelFormat; } @Override public TextureOptions getTextureOptions() { return this.mTextureOptions; } @Override public ITextureStateListener getTextureStateListener() { return this.mTextureStateListener; } @Override public void setTextureStateListener(final ITextureStateListener pTextureStateListener) { this.mTextureStateListener = pTextureStateListener; } @Override public boolean hasTextureStateListener() { return this.mTextureStateListener != null; } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== protected abstract void writeTextureToHardware(final GLState pGLState) throws IOException; @Override public void load() { this.mTextureManager.loadTexture(this); } @Override public void load(final GLState pGLState) throws IOException { this.mTextureManager.loadTexture(pGLState, this); } @Override public void unload() { this.mTextureManager.unloadTexture(this); } @Override public void unload(final GLState pGLState) { this.mTextureManager.unloadTexture(pGLState, this); } @Override public void loadToHardware(final GLState pGLState) throws IOException { this.mHardwareTextureID = pGLState.generateTexture(); pGLState.bindTexture(this.mHardwareTextureID); this.writeTextureToHardware(pGLState); this.mTextureOptions.apply(); this.mUpdateOnHardwareNeeded = false; if(this.mTextureStateListener != null) { this.mTextureStateListener.onLoadedToHardware(this); } } @Override public void unloadFromHardware(final GLState pGLState) { pGLState.deleteTexture(this.mHardwareTextureID); this.mHardwareTextureID = Texture.HARDWARE_TEXTURE_ID_INVALID; if(this.mTextureStateListener != null) { this.mTextureStateListener.onUnloadedFromHardware(this); } } @Override public void reloadToHardware(final GLState pGLState) throws IOException { this.unloadFromHardware(pGLState); this.loadToHardware(pGLState); } @Override public void bind(final GLState pGLState) { pGLState.bindTexture(this.mHardwareTextureID); } @Override public void bind(final GLState pGLState, final int pGLActiveTexture) { pGLState.activeTexture(pGLActiveTexture); pGLState.bindTexture(this.mHardwareTextureID); } // =========================================================== // Methods // =========================================================== // =========================================================== // Inner and Anonymous Classes // =========================================================== }