package org.anddev.andengine.opengl.texture.atlas; import java.util.ArrayList; import org.anddev.andengine.opengl.texture.Texture; import org.anddev.andengine.opengl.texture.TextureOptions; import org.anddev.andengine.opengl.texture.source.ITextureAtlasSource; import org.anddev.andengine.util.MathUtils; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:22:55 - 14.07.2011 */ public abstract class TextureAtlas<T extends ITextureAtlasSource> extends Texture implements ITextureAtlas<T> { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== protected final int mWidth; protected final int mHeight; protected final ArrayList<T> mTextureAtlasSources = new ArrayList<T>(); // =========================================================== // Constructors // =========================================================== public TextureAtlas(final int pWidth, final int pHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final ITextureAtlasStateListener<T> pTextureAtlasStateListener) { super(pPixelFormat, pTextureOptions, pTextureAtlasStateListener); if(!MathUtils.isPowerOfTwo(pWidth) || !MathUtils.isPowerOfTwo(pHeight)) { // TODO GLHelper.EXTENSIONS_NON_POWER_OF_TWO throw new IllegalArgumentException("pWidth and pHeight must be a power of 2!"); } this.mWidth = pWidth; this.mHeight = pHeight; } // =========================================================== // Getter & Setter // =========================================================== @Override public int getWidth() { return this.mWidth; } @Override public int getHeight() { return this.mHeight; } @SuppressWarnings("unchecked") @Override public ITextureAtlasStateListener<T> getTextureStateListener() { return (ITextureAtlasStateListener<T>) super.getTextureStateListener(); } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override public void addTextureAtlasSource(final T pTextureAtlasSource, final int pTexturePositionX, final int pTexturePositionY) throws IllegalArgumentException { this.checkTextureAtlasSourcePosition(pTextureAtlasSource, pTexturePositionX, pTexturePositionY); pTextureAtlasSource.setTexturePositionX(pTexturePositionX); pTextureAtlasSource.setTexturePositionY(pTexturePositionY); this.mTextureAtlasSources.add(pTextureAtlasSource); this.mUpdateOnHardwareNeeded = true; } @Override public void removeTextureAtlasSource(final T pTextureAtlasSource, final int pTexturePositionX, final int pTexturePositionY) { final ArrayList<T> textureSources = this.mTextureAtlasSources; for(int i = textureSources.size() - 1; i >= 0; i--) { final T textureSource = textureSources.get(i); if(textureSource == pTextureAtlasSource && textureSource.getTexturePositionX() == pTexturePositionX && textureSource.getTexturePositionY() == pTexturePositionY) { textureSources.remove(i); this.mUpdateOnHardwareNeeded = true; return; } } } @Override public void clearTextureAtlasSources() { this.mTextureAtlasSources.clear(); this.mUpdateOnHardwareNeeded = true; } // =========================================================== // Methods // =========================================================== private void checkTextureAtlasSourcePosition(final T pTextureAtlasSource, final int pTexturePositionX, final int pTexturePositionY) throws IllegalArgumentException { if(pTexturePositionX < 0) { throw new IllegalArgumentException("Illegal negative pTexturePositionX supplied: '" + pTexturePositionX + "'"); } else if(pTexturePositionY < 0) { throw new IllegalArgumentException("Illegal negative pTexturePositionY supplied: '" + pTexturePositionY + "'"); } else if(pTexturePositionX + pTextureAtlasSource.getWidth() > this.getWidth() || pTexturePositionY + pTextureAtlasSource.getHeight() > this.getHeight()) { throw new IllegalArgumentException("Supplied pTextureAtlasSource must not exceed bounds of Texture."); } } // =========================================================== // Inner and Anonymous Classes // =========================================================== }