package org.anddev.andengine.opengl.texture.atlas.buildable;
import java.io.IOException;
import java.util.ArrayList;
import javax.microedition.khronos.opengles.GL10;
import org.anddev.andengine.opengl.texture.TextureOptions;
import org.anddev.andengine.opengl.texture.atlas.ITextureAtlas;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BuildableBitmapTextureAtlas;
import org.anddev.andengine.opengl.texture.atlas.buildable.builder.ITextureBuilder;
import org.anddev.andengine.opengl.texture.atlas.buildable.builder.ITextureBuilder.TextureAtlasSourcePackingException;
import org.anddev.andengine.opengl.texture.source.ITextureAtlasSource;
import org.anddev.andengine.util.Callback;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 21:26:38 - 12.08.2010
*/
public class BuildableTextureAtlas<T extends ITextureAtlasSource, A extends ITextureAtlas<T>> implements ITextureAtlas<T> {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private final A mTextureAtlas;
private final ArrayList<TextureAtlasSourceWithWithLocationCallback<T>> mTextureAtlasSourcesToPlace = new ArrayList<TextureAtlasSourceWithWithLocationCallback<T>>();
// ===========================================================
// Constructors
// ===========================================================
public BuildableTextureAtlas(final A pTextureAtlas) {
this.mTextureAtlas = pTextureAtlas;
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
public int getWidth() {
return this.mTextureAtlas.getWidth();
}
@Override
public int getHeight() {
return this.mTextureAtlas.getHeight();
}
@Override
public int getHardwareTextureID() {
return this.mTextureAtlas.getHardwareTextureID();
}
@Override
public boolean isLoadedToHardware() {
return this.mTextureAtlas.isLoadedToHardware();
}
@Override
public void setLoadedToHardware(final boolean pLoadedToHardware) {
this.mTextureAtlas.setLoadedToHardware(pLoadedToHardware);
}
@Override
public boolean isUpdateOnHardwareNeeded() {
return this.mTextureAtlas.isUpdateOnHardwareNeeded();
}
@Override
public void setUpdateOnHardwareNeeded(final boolean pUpdateOnHardwareNeeded) {
this.mTextureAtlas.setUpdateOnHardwareNeeded(pUpdateOnHardwareNeeded);
}
@Override
public void loadToHardware(final GL10 pGL) throws IOException {
this.mTextureAtlas.loadToHardware(pGL);
}
@Override
public void unloadFromHardware(final GL10 pGL) {
this.mTextureAtlas.unloadFromHardware(pGL);
}
@Override
public void reloadToHardware(final GL10 pGL) throws IOException {
this.mTextureAtlas.reloadToHardware(pGL);
}
@Override
public void bind(final GL10 pGL) {
this.mTextureAtlas.bind(pGL);
}
@Override
public TextureOptions getTextureOptions() {
return this.mTextureAtlas.getTextureOptions();
}
/**
* Most likely this is not the method you'd want to be using, as the {@link ITextureAtlasSource} won't get packed through this.
* @deprecated Use {@link BuildableTextureAtlas#addTextureAtlasSource(ITextureAtlasSource)} instead.
*/
@Deprecated
@Override
public void addTextureAtlasSource(final T pTextureAtlasSource, final int pTexturePositionX, final int pTexturePositionY) {
this.mTextureAtlas.addTextureAtlasSource(pTextureAtlasSource, pTexturePositionX, pTexturePositionY);
}
@Override
public void removeTextureAtlasSource(final T pTextureAtlasSource, final int pTexturePositionX, final int pTexturePositionY) {
this.mTextureAtlas.removeTextureAtlasSource(pTextureAtlasSource, pTexturePositionX, pTexturePositionY);
}
@Override
public void clearTextureAtlasSources() {
this.mTextureAtlas.clearTextureAtlasSources();
this.mTextureAtlasSourcesToPlace.clear();
}
@Override
public boolean hasTextureStateListener() {
return this.mTextureAtlas.hasTextureStateListener();
}
@Override
public ITextureAtlasStateListener<T> getTextureStateListener() {
return this.mTextureAtlas.getTextureStateListener();
}
// ===========================================================
// Methods
// ===========================================================
/**
* When all {@link ITextureAtlasSource}MAGIC_CONSTANT are added you have to call {@link BuildableBitmapTextureAtlas#build(ITextureBuilder)}.
* @param pTextureAtlasSource to be added.
* @param pTextureRegion
*/
public void addTextureAtlasSource(final T pTextureAtlasSource, final Callback<T> pCallback) {
this.mTextureAtlasSourcesToPlace.add(new TextureAtlasSourceWithWithLocationCallback<T>(pTextureAtlasSource, pCallback));
}
/**
* Removes a {@link ITextureAtlasSource} before {@link BuildableBitmapTextureAtlas#build(ITextureBuilder)} is called.
* @param pBitmapTextureAtlasSource to be removed.
*/
public void removeTextureAtlasSource(final ITextureAtlasSource pTextureAtlasSource) {
final ArrayList<TextureAtlasSourceWithWithLocationCallback<T>> textureSources = this.mTextureAtlasSourcesToPlace;
for(int i = textureSources.size() - 1; i >= 0; i--) {
final TextureAtlasSourceWithWithLocationCallback<T> textureSource = textureSources.get(i);
if(textureSource.mTextureAtlasSource == pTextureAtlasSource) {
textureSources.remove(i);
this.mTextureAtlas.setUpdateOnHardwareNeeded(true);
return;
}
}
}
/**
* May draw over already added {@link ITextureAtlasSource}MAGIC_CONSTANT.
*
* @param pTextureAtlasSourcePackingAlgorithm the {@link ITextureBuilder} to use for packing the {@link ITextureAtlasSource} in this {@link BuildableBitmapTextureAtlas}.
* @throws TextureAtlasSourcePackingException i.e. when the {@link ITextureAtlasSource}MAGIC_CONSTANT didn't fit into this {@link BuildableBitmapTextureAtlas}.
*/
public void build(final ITextureBuilder<T, A> pTextureAtlasSourcePackingAlgorithm) throws TextureAtlasSourcePackingException {
pTextureAtlasSourcePackingAlgorithm.pack(this.mTextureAtlas, this.mTextureAtlasSourcesToPlace);
this.mTextureAtlasSourcesToPlace.clear();
this.mTextureAtlas.setUpdateOnHardwareNeeded(true);
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
public static class TextureAtlasSourceWithWithLocationCallback<T extends ITextureAtlasSource> {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private final T mTextureAtlasSource;
private final Callback<T> mCallback;
// ===========================================================
// Constructors
// ===========================================================
public TextureAtlasSourceWithWithLocationCallback(final T pTextureAtlasSource, final Callback<T> pCallback) {
this.mTextureAtlasSource = pTextureAtlasSource;
this.mCallback = pCallback;
}
// ===========================================================
// Getter & Setter
// ===========================================================
public Callback<T> getCallback() {
return this.mCallback;
}
public T getTextureAtlasSource() {
return this.mTextureAtlasSource;
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}
}