package org.anddev.andengine.opengl.buffer; import java.util.ArrayList; import java.util.HashSet; import javax.microedition.khronos.opengles.GL11; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:48:46 - 08.03.2010 */ public class BufferObjectManager { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== private static final HashSet<BufferObject> mBufferObjectsManaged = new HashSet<BufferObject>(); private static final ArrayList<BufferObject> mBufferObjectsLoaded = new ArrayList<BufferObject>(); private static final ArrayList<BufferObject> mBufferObjectsToBeLoaded = new ArrayList<BufferObject>(); private static final ArrayList<BufferObject> mBufferObjectsToBeUnloaded = new ArrayList<BufferObject>(); private static BufferObjectManager mActiveInstance = null; // =========================================================== // Constructors // =========================================================== public static BufferObjectManager getActiveInstance() { return BufferObjectManager.mActiveInstance; } public static void setActiveInstance(final BufferObjectManager pActiveInstance) { BufferObjectManager.mActiveInstance = pActiveInstance; } // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== public synchronized void clear() { BufferObjectManager.mBufferObjectsToBeLoaded.clear(); BufferObjectManager.mBufferObjectsLoaded.clear(); BufferObjectManager.mBufferObjectsManaged.clear(); } public synchronized void loadBufferObject(final BufferObject pBufferObject) { if(pBufferObject == null) { return; } if(BufferObjectManager.mBufferObjectsManaged.contains(pBufferObject)) { /* Just make sure it doesn't get deleted. */ BufferObjectManager.mBufferObjectsToBeUnloaded.remove(pBufferObject); } else { BufferObjectManager.mBufferObjectsManaged.add(pBufferObject); BufferObjectManager.mBufferObjectsToBeLoaded.add(pBufferObject); } } public synchronized void unloadBufferObject(final BufferObject pBufferObject) { if(pBufferObject == null) { return; } if(BufferObjectManager.mBufferObjectsManaged.contains(pBufferObject)) { if(BufferObjectManager.mBufferObjectsLoaded.contains(pBufferObject)) { BufferObjectManager.mBufferObjectsToBeUnloaded.add(pBufferObject); } else if(BufferObjectManager.mBufferObjectsToBeLoaded.remove(pBufferObject)) { BufferObjectManager.mBufferObjectsManaged.remove(pBufferObject); } } } public void loadBufferObjects(final BufferObject... pBufferObjects) { for(int i = pBufferObjects.length - 1; i >= 0; i--) { this.loadBufferObject(pBufferObjects[i]); } } public void unloadBufferObjects(final BufferObject... pBufferObjects) { for(int i = pBufferObjects.length - 1; i >= 0; i--) { this.unloadBufferObject(pBufferObjects[i]); } } public synchronized void reloadBufferObjects() { final ArrayList<BufferObject> loadedBufferObjects = BufferObjectManager.mBufferObjectsLoaded; for(int i = loadedBufferObjects.size() - 1; i >= 0; i--) { loadedBufferObjects.get(i).setLoadedToHardware(false); } BufferObjectManager.mBufferObjectsToBeLoaded.addAll(loadedBufferObjects); loadedBufferObjects.clear(); } public synchronized void updateBufferObjects(final GL11 pGL11) { final HashSet<BufferObject> bufferObjectsManaged = BufferObjectManager.mBufferObjectsManaged; final ArrayList<BufferObject> bufferObjectsLoaded = BufferObjectManager.mBufferObjectsLoaded; final ArrayList<BufferObject> bufferObjectsToBeLoaded = BufferObjectManager.mBufferObjectsToBeLoaded; final ArrayList<BufferObject> bufferObjectsToBeUnloaded = BufferObjectManager.mBufferObjectsToBeUnloaded; /* First load pending BufferObjects. */ final int bufferObjectToBeLoadedCount = bufferObjectsToBeLoaded.size(); if(bufferObjectToBeLoadedCount > 0) { for(int i = bufferObjectToBeLoadedCount - 1; i >= 0; i--) { final BufferObject bufferObjectToBeLoaded = bufferObjectsToBeLoaded.get(i); if(!bufferObjectToBeLoaded.isLoadedToHardware()) { bufferObjectToBeLoaded.loadToHardware(pGL11); bufferObjectToBeLoaded.setHardwareBufferNeedsUpdate(); } bufferObjectsLoaded.add(bufferObjectToBeLoaded); } bufferObjectsToBeLoaded.clear(); } /* Then unload pending BufferObjects. */ final int bufferObjectsToBeUnloadedCount = bufferObjectsToBeUnloaded.size(); if(bufferObjectsToBeUnloadedCount > 0){ for(int i = bufferObjectsToBeUnloadedCount - 1; i >= 0; i--){ final BufferObject bufferObjectToBeUnloaded = bufferObjectsToBeUnloaded.remove(i); if(bufferObjectToBeUnloaded.isLoadedToHardware()){ bufferObjectToBeUnloaded.unloadFromHardware(pGL11); } bufferObjectsLoaded.remove(bufferObjectToBeUnloaded); bufferObjectsManaged.remove(bufferObjectToBeUnloaded); } } } // =========================================================== // Inner and Anonymous Classes // =========================================================== }