package org.andengine.opengl.vbo;
import java.util.ArrayList;
import org.andengine.opengl.util.GLState;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 17:48:46 - 08.03.2010
*/
public class VertexBufferObjectManager {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private final ArrayList<IVertexBufferObject> mVertexBufferObjectsLoaded = new ArrayList<IVertexBufferObject>();
private final ArrayList<IVertexBufferObject> mVertexBufferObjectsToBeUnloaded = new ArrayList<IVertexBufferObject>();
// ===========================================================
// Constructors
// ===========================================================
// ===========================================================
// Getter & Setter
// ===========================================================
public synchronized int getHeapMemoryByteSize() {
int byteSize = 0;
final ArrayList<IVertexBufferObject> vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded;
for(int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) {
byteSize += vertexBufferObjectsLoaded.get(i).getHeapMemoryByteSize();
}
return byteSize;
}
public synchronized int getNativeHeapMemoryByteSize() {
int byteSize = 0;
final ArrayList<IVertexBufferObject> vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded;
for(int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) {
byteSize += vertexBufferObjectsLoaded.get(i).getNativeHeapMemoryByteSize();
}
return byteSize;
}
public synchronized int getGPUHeapMemoryByteSize() {
int byteSize = 0;
final ArrayList<IVertexBufferObject> vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded;
for(int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) {
byteSize += vertexBufferObjectsLoaded.get(i).getGPUMemoryByteSize();
}
return byteSize;
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
public void onCreate() {
}
public synchronized void onDestroy() {
final ArrayList<IVertexBufferObject> vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded;
for(int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) {
vertexBufferObjectsLoaded.get(i).setNotLoadedToHardware();
}
vertexBufferObjectsLoaded.clear();
}
public synchronized void onVertexBufferObjectLoaded(final IVertexBufferObject pVertexBufferObject) {
this.mVertexBufferObjectsLoaded.add(pVertexBufferObject);
}
public synchronized void onUnloadVertexBufferObject(final IVertexBufferObject pVertexBufferObject) {
if(this.mVertexBufferObjectsLoaded.remove(pVertexBufferObject)) {
this.mVertexBufferObjectsToBeUnloaded.add(pVertexBufferObject);
}
}
public synchronized void onReload() {
final ArrayList<IVertexBufferObject> vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded;
for(int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) {
vertexBufferObjectsLoaded.get(i).setNotLoadedToHardware();
}
vertexBufferObjectsLoaded.clear();
}
public synchronized void updateVertexBufferObjects(final GLState pGLState) {
final ArrayList<IVertexBufferObject> vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded;
final ArrayList<IVertexBufferObject> vertexBufferObjectsToBeUnloaded = this.mVertexBufferObjectsToBeUnloaded;
/* Unload pending VertexBufferObjects. */
for(int i = vertexBufferObjectsToBeUnloaded.size() - 1; i >= 0; i--){
final IVertexBufferObject vertexBufferObjectToBeUnloaded = vertexBufferObjectsToBeUnloaded.remove(i);
if(vertexBufferObjectToBeUnloaded.isLoadedToHardware()){
vertexBufferObjectToBeUnloaded.unloadFromHardware(pGLState);
}
vertexBufferObjectsLoaded.remove(vertexBufferObjectToBeUnloaded);
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}