public abstract class

Texture

extends Object
implements ITexture
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
	// ===========================================================
}