Kaynağa Gözat

Bugfixes across the codebase, fixed numerous memory leaks, SceneEntityInstances can now load assets into a resource pool explicitly, which can then be unloaded to remove all traces of loaded resources for an entity instance

Ivan Safrin 10 yıl önce
ebeveyn
işleme
37a40fefe1

+ 2 - 0
Core/Contents/Include/PolyCamera.h

@@ -97,6 +97,8 @@ namespace Polycode {
 			* @param orthoSizeY Height of the orthographic frustum (defaults to 1.0)				
 			*/			
 			void setOrthoMode(bool mode);
+        
+            void handleEvent(Event *event);
 
             /**
              * Sets the orthographic size of the camera.

+ 4 - 2
Core/Contents/Include/PolyGLRenderer.h

@@ -109,13 +109,15 @@ namespace Polycode {
 		
 		Cubemap *createCubemap(Texture *t0, Texture *t1, Texture *t2, Texture *t3, Texture *t4, Texture *t5);
 		Texture *createTexture(unsigned int width, unsigned int height, char *textureData, bool clamp, bool createMipmaps, int type = Image::IMAGE_RGBA);
-		void destroyTexture(Texture *texture);		
+		void destroyTexture(Texture *texture);
+        void destroyVertexBuffer(VertexBuffer *buffer);
+
 		Texture *createFramebufferTexture(unsigned int width, unsigned int height);
 		void createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height, bool floatingPointBuffer);
 		
 		void enableAlphaTest(bool val);
 		
-		void createVertexBufferForMesh(Mesh *mesh);
+		VertexBuffer *createVertexBufferForMesh(Mesh *mesh);
 		void drawVertexBuffer(VertexBuffer *buffer, bool enableColorBuffer);						
 		void bindFrameBufferTexture(Texture *texture);
 		void bindFrameBufferTextureDepth(Texture *texture);		

+ 0 - 19
Core/Contents/Include/PolyMaterialManager.h

@@ -48,8 +48,6 @@ namespace Polycode {
 		public:
 			MaterialManager();
 			~MaterialManager();
-			
-			void Update(int elapsed);
 
 			/**
 			* Creates a new framebuffer texture.
@@ -59,17 +57,10 @@ namespace Polycode {
 			Texture *createNewTexture(int width, int height, bool clamp=false, bool createMipmaps = true, int type=Image::IMAGE_RGBA);
 			Texture *createTextureFromImage(Image *image, bool clamp=false, bool createMipmaps = true);
 			Texture *createTextureFromFile(const String& fileName, bool clamp=false, bool createMipmaps = true, ResourcePool *resourcePool = NULL);
-			void deleteTexture(Texture *texture);
-		
-			void reloadTextures();
 			
-			void reloadProgramsAndTextures();
-			void reloadPrograms();		
-		
 			void addShaderModule(PolycodeShaderModule *module);		
 		
 			//SceneRenderTexture *createRenderTexture(Scene *targetScene, Camera *targetCamera, int renderWidth,int renderHeight);
-			Texture *getTextureByResourcePath(const String& resourcePath) const;
 			
 			ShaderProgram *createProgramFromFile(String programPath);
 			
@@ -91,12 +82,6 @@ namespace Polycode {
 			std::vector<Material*> loadMaterialsFromFile(ResourcePool *resourcePool, const String &fileName);
 			std::vector<Shader*> loadShadersFromFile(ResourcePool *resourcePool, String fileName);
 			std::vector<Cubemap*> loadCubemapsFromFile(String fileName);
-						
-			void addMaterial(Material *material);
-			void addShader(Shader *shader);
-		
-			unsigned int getNumShaders();
-			Shader *getShaderByIndex(unsigned int index);
 		
 			bool premultiplyAlphaOnLoad;
 			bool clampDefault;
@@ -104,10 +89,6 @@ namespace Polycode {
 			bool keepTextureData;
 			
 		private:
-			std::vector<Texture*> textures;
-			std::vector<Material*> materials;
-			std::vector<Shader*> shaders;
-		
 			std::vector <PolycodeShaderModule*> shaderModules;
 	};
 };

+ 0 - 23
Core/Contents/Include/PolyMesh.h

@@ -248,20 +248,6 @@ namespace Polycode {
         
             Vector2 getVertexTexCoordAtIndex(unsigned int index);
         
-        
-			/**
-			* Sets the vertex buffer for the mesh.
-			* @param buffer New vertex buffer for mesh.
-			*/			
-			void setVertexBuffer(VertexBuffer *buffer);
-			
-			/**
-			* Returns the vertex buffer for the mesh.
-			* @return The vertex buffer for this mesh.
-			*/
-			VertexBuffer *getVertexBuffer();
-        
-        
             Mesh *Copy() const;
 			
 			/**
@@ -306,12 +292,6 @@ namespace Polycode {
 			* Calculates the mesh bounding box.
 			*/
 			Vector3 calculateBBox();
-
-			/**
-			* Checks if the mesh has a vertex buffer.
-			* @param True if the mesh has a vertex buffer, false if not.
-			*/		
-			bool hasVertexBuffer() { return meshHasVertexBuffer; }
 	
 			/**
 			* Quad based mesh.
@@ -404,9 +384,6 @@ namespace Polycode {
 
             void writeVertexBlock(VertexDataArray *array, OSFILE *outFile);
             void writeIndexBlock(IndexDataArray *array, OSFILE *outFile);
-        
-            VertexBuffer *vertexBuffer;
-            bool meshHasVertexBuffer;
             int meshType;
 
 	};

+ 3 - 1
Core/Contents/Include/PolyObject.h

@@ -39,7 +39,9 @@ namespace Polycode {
 		* Default constructor
 		*/
         ObjectEntry();
-				
+
+        ~ObjectEntry();
+        
 		/**
 		* Type of entry. Possible values are (FLOAT_ENTRY, INT_ENTRY, BOOL_ENTRY, ARRAY_ENTRY, STRING_ENTRY, CONTAINER_ENTRY).
 		*/

+ 3 - 1
Core/Contents/Include/PolyRenderer.h

@@ -99,6 +99,8 @@ namespace Polycode {
 		virtual Cubemap *createCubemap(Texture *t0, Texture *t1, Texture *t2, Texture *t3, Texture *t4, Texture *t5) = 0;		
 		virtual Texture *createTexture(unsigned int width, unsigned int height, char *textureData, bool clamp, bool createMipmaps, int type=Image::IMAGE_RGBA) = 0;
 		virtual void destroyTexture(Texture *texture) = 0;
+        virtual void destroyVertexBuffer(VertexBuffer *buffer) = 0;
+
 		virtual void createRenderTextures(Texture **colorBuffer, Texture **depthBuffer, int width, int height, bool floatingPointBuffer) = 0;
 		
 		virtual Texture *createFramebufferTexture(unsigned int width, unsigned int height) = 0;
@@ -166,7 +168,7 @@ namespace Polycode {
 		
 		virtual void setDepthFunction(int depthFunction) = 0;
 				
-		virtual void createVertexBufferForMesh(Mesh *mesh) = 0;
+		virtual VertexBuffer *createVertexBufferForMesh(Mesh *mesh) = 0;
 		virtual void drawVertexBuffer(VertexBuffer *buffer, bool enableColorBuffer) = 0;
 		
 		virtual void enableDepthTest(bool val) = 0;

+ 2 - 1
Core/Contents/Include/PolySceneEntityInstance.h

@@ -42,7 +42,7 @@ class SceneEntityInstanceResourceEntry;
 class SceneEntityInstance : public Entity {
 	public:
     
-        SceneEntityInstance(Scene *parentScene, const String& fileName);
+        SceneEntityInstance(Scene *parentScene, const String& fileName, ResourcePool *loadIntoPool = NULL);
 		explicit SceneEntityInstance(Scene *parentScene);
 		
 		static SceneEntityInstance *BlankSceneEntityInstance(Scene *parentScene);
@@ -90,6 +90,7 @@ class SceneEntityInstance : public Entity {
     
         void rebuildResourceLinks();
     
+        ResourcePool *loadIntoPool;
         ResourcePool *topLevelResourcePool;
         std::vector<ResourcePool*> resourcePools;
         Scene *parentScene;

+ 3 - 0
Core/Contents/Include/PolySceneMesh.h

@@ -23,6 +23,7 @@ THE SOFTWARE.
 #pragma once
 #include "PolyGlobals.h"
 #include "PolyEntity.h"
+#include "PolyMesh.h"
 #include "PolyShader.h"
 #include "PolyRenderDataArray.h"
 
@@ -247,6 +248,8 @@ namespace Polycode {
 		protected:
 		
 			bool useVertexBuffer;
+            VertexBuffer *vertexBuffer;
+        
 			Mesh *mesh;
 			Texture *texture;
 			Material *material;

+ 3 - 1
Core/Contents/Source/PolyBezierCurve.cpp

@@ -56,7 +56,9 @@ void BezierCurve::clearControlPoints() {
 }
 
 BezierCurve::~BezierCurve() {
-
+    for(int i=0; i < controlPoints.size(); i++) {
+        delete controlPoints[i];
+    }
 }
 
 void BezierCurve::addControlPoint(Number p1x, Number p1y, Number p1z, Number p2x, Number p2y, Number p2z, Number p3x, Number p3y, Number p3z) {

+ 16 - 1
Core/Contents/Source/PolyCamera.cpp

@@ -50,9 +50,14 @@ Camera::Camera(Scene *parentScene) : Entity() {
     orthoSizeX = 1.0;
 	orthoSizeY = 1.0;
     useGlobalFramebuffer = false;
+    
+    Services()->getCore()->addEventListener(this, Core::EVENT_CORE_RESIZE);
 }
 
-Camera::~Camera() {	
+Camera::~Camera() {
+    
+    Services()->getCore()->removeAllHandlersForListener(this);
+    
 	for(int i=0; i < localShaderOptions.size(); i++) {
 		delete localShaderOptions[i];
 	}
@@ -61,6 +66,16 @@ Camera::~Camera() {
 	delete zBufferSceneTexture;
 }
 
+void Camera::handleEvent(Event *event) {
+    if(hasFilterShader()) {
+
+        delete originalSceneTexture;
+        delete zBufferSceneTexture;
+        
+        CoreServices::getInstance()->getRenderer()->createRenderTextures(&originalSceneTexture, &zBufferSceneTexture, Services()->getCore()->getXRes(), Services()->getCore()->getYRes(), filterShaderMaterial->fp16RenderTargets);
+    }
+}
+
 void Camera::setUseGlobalFramebuffer(bool val) {
     useGlobalFramebuffer = val;
 }

+ 1 - 1
Core/Contents/Source/PolyCocoaCore.mm

@@ -232,7 +232,6 @@ void CocoaCore::_setVideoMode(int xRes, int yRes, bool fullScreen, bool vSync, i
 	renderer->setAnisotropyAmount(anisotropyLevel);
 	dispatchEvent(new Event(), EVENT_CORE_RESIZE);	
 
-	[[glView window] setContentSize: NSMakeSize(xRes, yRes)];
 		
 	if(fullScreen) {	
 		if(monitorIndex > -1) {
@@ -272,6 +271,7 @@ void CocoaCore::_setVideoMode(int xRes, int yRes, bool fullScreen, bool vSync, i
 	}
     
 	renderer->Resize(xRes, yRes);
+    [[glView window] setContentSize: NSMakeSize(xRes, yRes)];            
 
 	if(aaLevel > 0) {
 		glEnable( GL_MULTISAMPLE_ARB );

+ 0 - 1
Core/Contents/Source/PolyCoreServices.cpp

@@ -199,7 +199,6 @@ void CoreServices::Update(int elapsed) {
 	resourceManager->Update(elapsed);
 	timerManager->Update();	
 	tweenManager->Update(elapsed);	
-	materialManager->Update(elapsed);		
 	sceneManager->Update();
     soundManager->Update();
 }

+ 3 - 4
Core/Contents/Source/PolyFontGlyphSheet.cpp

@@ -24,6 +24,7 @@
 #include "PolyFontGlyphSheet.h"
 #include "OSBasics.h"
 #include "PolyLogger.h"
+#include "PolyRenderer.h"
 #include "PolyImage.h"
 #include "PolyTexture.h"
 #include "PolyCoreServices.h"
@@ -42,8 +43,7 @@ FontGlyphSheet::FontGlyphSheet(Font* font, int size, FontTextureGlyphMode mode)
 }
 
 FontGlyphSheet::~FontGlyphSheet() {
-	if (texture)
-		CoreServices::getInstance()->getMaterialManager()->deleteTexture(texture);
+  Services()->getRenderer()->destroyTexture(texture);
 }
 
 struct GlyphData {
@@ -265,8 +265,7 @@ void FontGlyphSheet::buildGlyphs(std::set<wchar_t> characters) {
 	}
 
 	MaterialManager *materialManager = CoreServices::getInstance()->getMaterialManager();
-	if(texture)
-		materialManager->deleteTexture(texture);
+    Services()->getRenderer()->destroyTexture(texture);
 
 	texture = materialManager->createTextureFromImage(glyphsImage, true, materialManager->mipmapsDefault);
 	delete glyphsImage;

+ 11 - 8
Core/Contents/Source/PolyGLRenderer.cpp

@@ -385,9 +385,9 @@ void OpenGLRenderer::setPointSize(Number pointSize) {
 	glPointSize(pointSize);
 }
 
-void OpenGLRenderer::createVertexBufferForMesh(Mesh *mesh) {
+VertexBuffer *OpenGLRenderer::createVertexBufferForMesh(Mesh *mesh) {
 	OpenGLVertexBuffer *buffer = new OpenGLVertexBuffer(mesh);
-	mesh->setVertexBuffer(buffer);
+    return buffer;
 }
 
 void OpenGLRenderer::drawVertexBuffer(VertexBuffer *buffer, bool enableColorBuffer) {
@@ -787,6 +787,11 @@ Texture *OpenGLRenderer::createTexture(unsigned int width, unsigned int height,
 	return newTexture;
 }
 
+void OpenGLRenderer::destroyVertexBuffer(VertexBuffer *buffer) {
+    OpenGLVertexBuffer *glBuffer = (OpenGLVertexBuffer*)buffer;
+    delete glBuffer;
+}
+
 void OpenGLRenderer::destroyTexture(Texture *texture) {
 	OpenGLTexture *glTex = (OpenGLTexture*)texture;
 	delete glTex;
@@ -989,25 +994,23 @@ void OpenGLRenderer::drawScreenQuad(Number qx, Number qy) {
 	glPushMatrix();
 	glMatrixMode(GL_MODELVIEW);
 	glPushMatrix();
-	setProjectionOrtho();
+	setProjectionOrtho(2.0, 2.0, -1.0, 1.0, true);
 	
-	Number xscale = qx/((Number)viewportWidth) * 2.0f;
-	Number yscale = qy/((Number)viewportHeight) * 2.0f;	
 
 	glBegin(GL_QUADS);
 		glColor4f(1.0f,1.0f,1.0f,1.0f);
 
 		glTexCoord2f(0.0f, 1.0f);
-		glVertex2f(-1, -1+(1.0f*yscale));
+		glVertex2f(-1, 1.0);
 
 		glTexCoord2f(0.0f, 0.0f);
 		glVertex2f(-1.0f, -1.0f);
 
 		glTexCoord2f(1.0f, 0.0f);
-		glVertex2f(-1+(1.0f*xscale), -1.0f);
+		glVertex2f(1.0, -1.0f);
 
 		glTexCoord2f(1.0f, 1.0f);
-		glVertex2f(-1+(1.0f*xscale), -1+(1.0f*yscale));
+		glVertex2f(1.0, 1.0);
 	glEnd();
 
 	glMatrixMode(GL_PROJECTION);

+ 1 - 0
Core/Contents/Source/PolyGLTexture.cpp

@@ -129,6 +129,7 @@ void OpenGLTexture::setTextureData(char *data) {
 }
 
 OpenGLTexture::~OpenGLTexture() {
+    
 	glDeleteTextures(1, &textureID);
 	if(frameBufferID != FRAMEBUFFER_NULL) {
 		glDeleteFramebuffersEXT(1, &frameBufferID);

+ 22 - 15
Core/Contents/Source/PolyMaterial.cpp

@@ -37,12 +37,14 @@ Material::Material(const String& name) : Resource(Resource::RESOURCE_MATERIAL) {
 	blendingMode = Renderer::BLEND_MODE_NORMAL;
 	screenMaterial = false;
     wireframe = false;
+    
+    Services()->getCore()->addEventListener(this, Core::EVENT_CORE_RESIZE);
 }
 
 Material::~Material() {
 	
 	Logger::log("deleting material (%s)\n", name.c_str());
-	
+    Services()->getCore()->removeAllHandlersForListener(this);
 	clearShaders();
 }
 
@@ -111,7 +113,7 @@ void Material::recreateRenderTarget(ShaderRenderTarget *renderTarget) {
 		textureWidth = (int)renderTarget->width;
 		textureHeight = (int)renderTarget->height;		
 	}
-	
+    
 	CoreServices::getInstance()->getRenderer()->createRenderTextures(&newTexture, NULL, textureWidth, textureHeight, fp16RenderTargets);
 	newTexture->setResourceName(renderTarget->id);
 	
@@ -135,19 +137,24 @@ void Material::recreateRenderTarget(ShaderRenderTarget *renderTarget) {
 }
 
 void Material::handleEvent(Event *event) {
-	//Fix the bindings when we detect a reload
-	for (int i = 0; i < materialShaders.size(); i++) {
-		Shader* shader = materialShaders[i];
-		ShaderBinding* shaderBinding = shaderBindings[i];
-		CoreServices::getInstance()->getRenderer()->setRendererShaderParams(shader, shaderBinding);
-
-		for(int i=0; i < shader->expectedParams.size(); i++) {
-			if(!shaderBinding->getLocalParamByName(shader->expectedParams[i].name)) {
-				shaderBinding->addParam(shader->expectedParams[i].type, shader->expectedParams[i].name);
-			}
-		}
-	}
-	dispatchEvent(new Event(), Event::RESOURCE_RELOAD_EVENT);	
+    
+    if(event->getDispatcher() == Services()->getCore()) {
+        recreateRenderTargets();
+    } else {
+        //Fix the bindings when we detect a reload
+        for (int i = 0; i < materialShaders.size(); i++) {
+            Shader* shader = materialShaders[i];
+            ShaderBinding* shaderBinding = shaderBindings[i];
+            CoreServices::getInstance()->getRenderer()->setRendererShaderParams(shader, shaderBinding);
+
+            for(int i=0; i < shader->expectedParams.size(); i++) {
+                if(!shaderBinding->getLocalParamByName(shader->expectedParams[i].name)) {
+                    shaderBinding->addParam(shader->expectedParams[i].type, shader->expectedParams[i].name);
+                }
+            }
+        }
+        dispatchEvent(new Event(), Event::RESOURCE_RELOAD_EVENT);
+    }
 }
 
 void Material::removeShader(int shaderIndex) {

+ 2 - 77
Core/Contents/Source/PolyMaterialManager.cpp

@@ -42,43 +42,6 @@ MaterialManager::MaterialManager() {
 }
 
 MaterialManager::~MaterialManager() {
-	
-}
-
-void MaterialManager::Update(int elapsed) {
-	for(int i=0;i < textures.size(); i++) {
-		textures[i]->updateScroll(elapsed);
-	}
-}
-
-Texture *MaterialManager::getTextureByResourcePath(const String& resourcePath) const {
-	for(int i=0;i < textures.size(); i++) {
-		if(textures[i]->getResourcePath() == resourcePath)
-			return textures[i];
-	}
-	return NULL;
-}
-
-void MaterialManager::deleteTexture(Texture *texture) {
-	for(int i=0;i < textures.size(); i++) {
-		if(textures[i] == texture) {
-			textures.erase(textures.begin()+i);
-			CoreServices::getInstance()->getRenderer()->destroyTexture(texture);
-			return;
-		}
-	}
-}
-
-void MaterialManager::reloadPrograms() {
-	for(int m=0; m < shaderModules.size(); m++) {
-		PolycodeShaderModule *shaderModule = shaderModules[m];
-		shaderModule->reloadPrograms();
-	}
-	vector<Resource *> shaders = CoreServices::getInstance()->getResourceManager()->getResources(Resource::RESOURCE_SHADER);
-	for(int s = 0; s < shaders.size(); s++) {
-		Shader *shader = (Shader *)shaders[s];
-		shader->reload();
-	}
 }
 
 void MaterialManager::loadMaterialLibraryIntoPool(ResourcePool *pool, const String &materialFile) {
@@ -87,7 +50,6 @@ void MaterialManager::loadMaterialLibraryIntoPool(ResourcePool *pool, const Stri
 
     for(int s=0; s < shaders.size(); s++) {
         pool->addResource(shaders[s]);
-        addShader(shaders[s]);
     }
     
     std::vector<Cubemap*> cubemaps = loadCubemapsFromFile(materialFile);
@@ -100,7 +62,6 @@ void MaterialManager::loadMaterialLibraryIntoPool(ResourcePool *pool, const Stri
     for(int m=0; m < materials.size(); m++) {
         materials[m]->setResourceName(materials[m]->getName());
         pool->addResource(materials[m]);
-        addMaterial(materials[m]);
     }
 }
 
@@ -128,17 +89,13 @@ void MaterialManager::addShaderModule(PolycodeShaderModule *module) {
 #define DEFAULT_TEXTURE "default/default.png"
 
 Texture *MaterialManager::createTextureFromFile(const String& fileName, bool clamp, bool createMipmaps, ResourcePool *resourcePool) {
-	if(fileName.size() == 0) {
-		Logger::log("empty texture filename, using default texture.\n");
-		return getTextureByResourcePath(DEFAULT_TEXTURE);
-	}
     
     if(!resourcePool) {
         resourcePool = CoreServices::getInstance()->getResourceManager()->getGlobalPool();
     }
 
 	Texture *newTexture;
-	newTexture = getTextureByResourcePath(fileName);
+    newTexture = (Texture*) resourcePool->getResourceByPath(fileName);
 	if(newTexture) {
 		return newTexture;
 	}
@@ -153,7 +110,7 @@ Texture *MaterialManager::createTextureFromFile(const String& fileName, bool cla
         resourcePool->addResource(newTexture);
 	} else {
 		Logger::log("Error loading image (\"%s\"), using default texture.\n", fileName.c_str());		
-		newTexture = getTextureByResourcePath(DEFAULT_TEXTURE);
+		newTexture = (Texture*) CoreServices::getInstance()->getResourceManager()->getGlobalPool()->getResourceByPath(DEFAULT_TEXTURE);
 	}
 		
 	delete image;
@@ -176,7 +133,6 @@ Texture *MaterialManager::createNewTexture(int width, int height, bool clamp, bo
 
 Texture *MaterialManager::createTexture(int width, int height, char *imageData, bool clamp, bool createMipmaps, int type) {
 	Texture *newTexture = CoreServices::getInstance()->getRenderer()->createTexture(width, height, imageData,clamp, createMipmaps, type);
-	textures.push_back(newTexture);
     if(!keepTextureData) {
         free(newTexture->textureData);
         newTexture->textureData = NULL;
@@ -194,29 +150,6 @@ Texture *MaterialManager::createTextureFromImage(Image *image, bool clamp, bool
 	return newTexture; 
 }
 
-void MaterialManager::reloadProgramsAndTextures() {
-	reloadTextures();
-	reloadPrograms();
-}
-
-void MaterialManager::reloadTextures() {
-	for(int i=0; i < textures.size(); i++) {
-		Texture *texture = textures[i];
-		texture->recreateFromImageData();
-	}
-}
-
-unsigned int MaterialManager::getNumShaders() {
-	return shaders.size();
-}
-
-Shader *MaterialManager::getShaderByIndex(unsigned int index) {
-	if(index < shaders.size())
-		return shaders[index];
-	else
-		return NULL;
-}
-
 Shader *MaterialManager::createShader(ResourcePool *resourcePool, String shaderType, String name, String vpName, String fpName, bool screenShader) {
 	Shader *retShader = NULL;
 	
@@ -325,14 +258,6 @@ Cubemap *MaterialManager::cubemapFromXMLNode(TiXmlNode *node) {
 	return newCubemap;
 }
 
-void MaterialManager::addMaterial(Material *material) {
-	materials.push_back(material);
-}
-
-void MaterialManager::addShader(Shader *shader) {
-	shaders.push_back(shader);
-}
-
 std::vector<Shader*> MaterialManager::loadShadersFromFile(ResourcePool *resourcePool, String fileName) {
 	std::vector<Shader*> retVector;
 	

+ 1 - 22
Core/Contents/Source/PolyMesh.cpp

@@ -24,6 +24,7 @@ THE SOFTWARE.
 
 #include "PolyMesh.h"
 #include "PolyLogger.h"
+#include "PolyRenderer.h"
 #include "OSBasics.h"
 
 using std::min;
@@ -46,8 +47,6 @@ indexArray(RenderDataArray::INDEX_DATA_ARRAY)
 
     indexedMesh = false;
     meshType = TRI_MESH;
-    meshHasVertexBuffer = false;
-    vertexBuffer = NULL;
     loadMesh(fileName);
     useVertexColors = false;
 }
@@ -65,8 +64,6 @@ indexArray(RenderDataArray::INDEX_DATA_ARRAY)
 {
 
     this->meshType = meshType;
-    meshHasVertexBuffer = false;		
-    vertexBuffer = NULL;
     useVertexColors = false;
     indexedMesh = false;
 }
@@ -80,10 +77,6 @@ Mesh::~Mesh() {
 }
 
 void Mesh::clearMesh() {
-    if(vertexBuffer)
-        delete vertexBuffer;
-    vertexBuffer = NULL;
-    
     vertexPositionArray.data.clear();
     vertexColorArray.data.clear();
     vertexNormalArray.data.clear();
@@ -93,23 +86,9 @@ void Mesh::clearMesh() {
     indexArray.data.clear();
     vertexBoneWeightArray.data.clear();
     vertexBoneIndexArray.data.clear();
-    
-    meshHasVertexBuffer = false;
-}
-
-VertexBuffer *Mesh::getVertexBuffer() {
-    return vertexBuffer;
 }
 
 
-void Mesh::setVertexBuffer(VertexBuffer *buffer) {    
-    if(vertexBuffer) {
-        delete vertexBuffer;
-    }
-    vertexBuffer = buffer;
-    meshHasVertexBuffer = true;
-}
-
 Number Mesh::getRadius() {
     Number hRad = 0;
     Number len;

+ 6 - 0
Core/Contents/Source/PolyObject.cpp

@@ -37,6 +37,12 @@ intVal(0)
     
 }
 
+ObjectEntry::~ObjectEntry() {
+    for(int i=0; i < children.size(); i++) {
+        delete children[i];
+    }
+}
+
 void ObjectEntry::Clear() {
 	for(int i=0; i < children.size(); i++) {
 		children[i]->Clear();

+ 26 - 6
Core/Contents/Source/PolyResourceManager.cpp

@@ -23,6 +23,7 @@
 #include "PolyResourceManager.h"
 #include "PolyCoreServices.h"
 #include "PolyCubemap.h"
+#include "PolyRenderer.h"
 #include "PolyMaterialManager.h"
 #include "PolyModule.h"
 #include "PolyFontManager.h"
@@ -58,21 +59,41 @@ ResourcePool::~ResourcePool() {
     for(int i=0; i < resources.size(); i++)	{
         if(resources[i]->getResourceType() == Resource::RESOURCE_MATERIAL) {
             delete resources[i];
+            resources[i] = NULL;
         }
     }
     
     for(int i=0; i < resources.size(); i++)	{
-        if(resources[i]->getResourceType() == Resource::RESOURCE_SHADER) {
-            delete resources[i];
+        if(resources[i]) {
+            if(resources[i]->getResourceType() == Resource::RESOURCE_SHADER) {
+                delete resources[i];
+                resources[i] = NULL;
+            }
         }
     }
     
     for(int i=0; i < resources.size(); i++)	{
-        if(resources[i]->getResourceType() == Resource::RESOURCE_PROGRAM) {
-            delete resources[i];
+        if(resources[i]) {
+            if(resources[i]->getResourceType() == Resource::RESOURCE_PROGRAM) {
+                delete resources[i];
+                resources[i] = NULL;
+            }
         }
     }
     
+    for(int i=0; i < resources.size(); i++)	{
+        if(resources[i]) {
+            if(resources[i]->getResourceType() == Resource::RESOURCE_TEXTURE) {
+                Services()->getRenderer()->destroyTexture((Texture*)resources[i]);
+                resources[i] = NULL;
+            }
+        }
+    }
+    
+    for(int i=0; i < resources.size(); i++)	{
+        delete resources[i];
+    }
+    
     resources.clear();
 }
 
@@ -222,7 +243,6 @@ void ResourceManager::parseShadersIntoPool(ResourcePool *pool, const String& dir
 				
 				for(int s=0; s < shaders.size(); s++) {
 					pool->addResource(shaders[s]);
-					materialManager->addShader(shaders[s]);
 				}
 			}
 		} else {
@@ -281,7 +301,6 @@ void ResourceManager::parseMaterialsIntoPool(ResourcePool *pool, const String& d
 				for(int m=0; m < materials.size(); m++) {
 					materials[m]->setResourceName(materials[m]->getName());
 					pool->addResource(materials[m]);
-					materialManager->addMaterial(materials[m]);
 				}
 			}
 		} else {
@@ -428,3 +447,4 @@ std::vector<Resource*> ResourceManager::getResources(int resourceType) {
     
 	return result;
 }
+

+ 5 - 5
Core/Contents/Source/PolySceneEntityInstance.cpp

@@ -54,7 +54,7 @@ SceneEntityInstance *SceneEntityInstance::BlankSceneEntityInstance(Scene *parent
 	return new SceneEntityInstance(parentScene);
 }
 
-SceneEntityInstance::SceneEntityInstance(Scene *parentScene, const String& fileName) : Entity() {
+SceneEntityInstance::SceneEntityInstance(Scene *parentScene, const String& fileName, ResourcePool *loadIntoPool) : Entity(), loadIntoPool(loadIntoPool) {
     createNewLayer("default");
     this->parentScene = parentScene;
 	resourceEntry = new SceneEntityInstanceResourceEntry(this);
@@ -98,7 +98,7 @@ SceneEntityInstanceResourceEntry *SceneEntityInstance::getResourceEntry() {
 Entity *SceneEntityInstance::Clone(bool deepClone, bool ignoreEditorOnly) const {
 	SceneEntityInstance *newEntity;
 	if(cloneUsingReload) {
-		newEntity = new SceneEntityInstance(parentScene, fileName);
+		newEntity = new SceneEntityInstance(parentScene, fileName, loadIntoPool);
 	} else {
 		newEntity = new SceneEntityInstance(parentScene);
 	}
@@ -209,7 +209,7 @@ void SceneEntityInstance::applySceneMesh(ObjectEntry *entry, SceneMesh *sceneMes
                                                 sceneMesh->getLocalShaderOptions()->addCubemap(nameEntry->stringVal, cubemap);
                                             }
                                         } else {
-                                            sceneMesh->getLocalShaderOptions()->addTexture(nameEntry->stringVal, CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(textureEntry->stringVal));
+                                            sceneMesh->getLocalShaderOptions()->addTexture(nameEntry->stringVal, CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(textureEntry->stringVal, Services()->getMaterialManager()->clampDefault, Services()->getMaterialManager()->mipmapsDefault, loadIntoPool));
                                         }
                                     }
                                 }
@@ -294,7 +294,7 @@ Entity *SceneEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry, Entit
         if(entityType->stringVal == "SceneEntityInstance") {
             ObjectEntry *instanceEntry = (*entry)["SceneEntityInstance"];
             String filePath = (*instanceEntry)["filePath"]->stringVal;
-            SceneEntityInstance *instance = new SceneEntityInstance(parentScene, filePath);
+            SceneEntityInstance *instance = new SceneEntityInstance(parentScene, filePath, loadIntoPool);
             entity = instance;
          } else if(entityType->stringVal == "SceneCurve") {
 			ObjectEntry *curveEntry = (*entry)["SceneCurve"];
@@ -348,7 +348,7 @@ Entity *SceneEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry, Entit
 			String text = (*labelEntry)["text"]->stringVal;
 			String font = (*labelEntry)["font"]->stringVal;
 			int size = (*labelEntry)["size"]->intVal;
-            Number actualHeight = (*labelEntry)["actualHeight"]->intVal;
+            Number actualHeight = (*labelEntry)["actualHeight"]->NumberVal;
 			int aaMode = (*labelEntry)["aaMode"]->intVal;
             
 			SceneLabel *label = new SceneLabel(text, size, font, aaMode, actualHeight);

+ 2 - 2
Core/Contents/Source/PolySceneLabel.cpp

@@ -100,9 +100,9 @@ Number SceneLabel::getLabelActualHeight() {
 void SceneLabel::updateFromLabel() {
 
 	MaterialManager *materialManager = CoreServices::getInstance()->getMaterialManager();
-	if(texture)
-		materialManager->deleteTexture(texture);
 
+    Services()->getRenderer()->destroyTexture(texture);
+    
 	if(SceneLabel::createMipmapsForLabels) {
 		texture = materialManager->createTextureFromImage(label, materialManager->clampDefault, materialManager->mipmapsDefault);	
 	} else {

+ 1 - 3
Core/Contents/Source/PolySceneLight.cpp

@@ -71,9 +71,7 @@ int SceneLight::getLightImportance() const {
 
 void SceneLight::enableShadows(bool val, unsigned int resolution) {
 	if(val) {
-        if(zBufferTexture) {
-            CoreServices::getInstance()->getMaterialManager()->deleteTexture(zBufferTexture);
-        }
+        delete zBufferTexture;
         CoreServices::getInstance()->getRenderer()->createRenderTextures(NULL, &zBufferTexture, resolution, resolution, false);
 		if(!spotCamera) {
 			spotCamera = new Camera(parentScene);

+ 17 - 6
Core/Contents/Source/PolySceneMesh.cpp

@@ -56,6 +56,7 @@ SceneMesh::SceneMesh(const String& fileName) : Entity(), texture(NULL), material
 	useGeometryHitDetection = false;
     forceMaterial = false;
     backfaceCulled = true;
+    vertexBuffer = NULL;
 	alphaTest = false;
     sendBoneMatricesToMaterial = false;
 }
@@ -73,6 +74,7 @@ SceneMesh::SceneMesh(Mesh *mesh) : Entity(), texture(NULL), material(NULL), skel
 	overlayWireframe = false;	
 	useGeometryHitDetection = false;
     forceMaterial = false;
+    vertexBuffer = NULL;
     backfaceCulled = true;
 	alphaTest = false;
     sendBoneMatricesToMaterial = false;
@@ -90,6 +92,7 @@ SceneMesh::SceneMesh(int meshType) : texture(NULL), material(NULL), skeleton(NUL
 	useGeometryHitDetection = false;
     forceMaterial = false;
     backfaceCulled = true;
+    vertexBuffer = NULL;
 	alphaTest = false;
     sendBoneMatricesToMaterial = false;
 }
@@ -106,6 +109,10 @@ SceneMesh::~SceneMesh() {
 	if(ownsMesh)
 		delete mesh;	
 	delete localShaderOptions;
+    
+    if(useVertexBuffer) {
+        CoreServices::getInstance()->getRenderer()->destroyVertexBuffer(vertexBuffer);
+    }
 }
 
 Entity *SceneMesh::Clone(bool deepClone, bool ignoreEditorOnly) const {
@@ -321,8 +328,13 @@ void SceneMesh::renderMeshLocally() {
 
 void SceneMesh::cacheToVertexBuffer(bool cache) {
 
-	if(cache && !mesh->hasVertexBuffer()) {
-		CoreServices::getInstance()->getRenderer()->createVertexBufferForMesh(mesh);
+    if(useVertexBuffer) {
+        CoreServices::getInstance()->getRenderer()->destroyVertexBuffer(vertexBuffer);
+        vertexBuffer = NULL;
+    }
+    
+	if(cache) {
+		vertexBuffer = CoreServices::getInstance()->getRenderer()->createVertexBufferForMesh(mesh);
 	}
 	useVertexBuffer = cache;
 }
@@ -401,9 +413,8 @@ void SceneMesh::Render() {
     }
     
 	if(useVertexBuffer) {
-        VertexBuffer *vb = mesh->getVertexBuffer();
-        if(vb){
-            renderer->drawVertexBuffer(vb, mesh->useVertexColors);
+        if(vertexBuffer){
+            renderer->drawVertexBuffer(vertexBuffer, mesh->useVertexColors);
         }
 	} else {
 		renderMeshLocally();
@@ -422,7 +433,7 @@ void SceneMesh::Render() {
 		renderer->setVertexColor(wireFrameColor.r, wireFrameColor.g, wireFrameColor.b, wireFrameColor.a);
 		
 		if(useVertexBuffer) {
-			renderer->drawVertexBuffer(mesh->getVertexBuffer(), mesh->useVertexColors);
+			renderer->drawVertexBuffer(vertexBuffer, mesh->useVertexColors);
 		} else {
 			renderMeshLocally();
 		}

+ 4 - 0
Core/Contents/Source/PolySkeleton.cpp

@@ -52,6 +52,9 @@ Skeleton::Skeleton() {
 }
 
 Skeleton::~Skeleton() {
+    for(int i=0; i < animations.size(); i++) {
+        delete animations[i];
+    }
 }
 
 int Skeleton::getNumBones() const {
@@ -406,6 +409,7 @@ BoneTrack::~BoneTrack() {
 	delete LocX;
 	delete LocY;
 	delete LocZ;
+    delete quatCurve;
 }
 
 void BoneTrack::Reset() {

+ 2 - 0
Core/Contents/Source/PolySound.cpp

@@ -236,6 +236,8 @@ Number Sound::getPitch() {
 
 Sound::~Sound() {
     
+    Stop();
+    
 	alSourcei(soundSource, AL_BUFFER, 0);
     
 	alDeleteSources(1,&soundSource);

+ 1 - 0
Core/Contents/Source/PolyTexture.cpp

@@ -75,6 +75,7 @@ int Texture::getHeight() const {
 }
 
 Texture::~Texture(){
+    printf("DELETING TEXTURE: [%s][%s]\n", getResourceName().c_str(), getResourcePath().c_str());
 	free(textureData);
 }
 

+ 7 - 2
IDE/Contents/Source/PolycodeMaterialEditor.cpp

@@ -905,13 +905,16 @@ MaterialEditorPane::MaterialEditorPane() : UIElement() {
 void MaterialEditorPane::reloadShaders() {
 
 	shaderProp->comboEntry->clearItems();
-
+    //TODO: FIX TO USE GLOBAL RESOURCE POOL    
+/*
 	MaterialManager *materialManager = CoreServices::getInstance()->getMaterialManager();
 	for(int i=0; i < materialManager->getNumShaders(); i++) {
 		if(!materialManager->getShaderByIndex(i)->screenShader) {
 			shaderProp->comboEntry->addComboItem(materialManager->getShaderByIndex(i)->getName(), (void*)materialManager->getShaderByIndex(i));
 		}
 	}	
+ */
+    
 }
 
 void MaterialEditorPane::Resize(Number width, Number height) {
@@ -1507,7 +1510,9 @@ void PolycodeMaterialEditor::handleEvent(Event *event) {
 			if(newShader) {
 				materialBrowser->addShader(newShader)->setSelected();
 				shaders.push_back(newShader);
-				CoreServices::getInstance()->getMaterialManager()->addShader(newShader);
+                
+                //TODO: FIX TO USE GLOBAL RESOURCE POOL
+				//CoreServices::getInstance()->getMaterialManager()->addShader(newShader);
 				setHasChanges(true);	
 			} else {
 				printf("Error creating shader!\n");

+ 4 - 1
IDE/Contents/Source/PolycodeProps.cpp

@@ -1604,6 +1604,9 @@ ShaderPassProp::ShaderPassProp(Material *material, int shaderIndex) : PropProp("
 	
 	int index = 0;
 	MaterialManager *materialManager = CoreServices::getInstance()->getMaterialManager();
+    
+    //TODO: FIX TO USE GLOBAL RESOURCE POOL
+    /*
 	for(int i=0; i < materialManager->getNumShaders(); i++) {
 		if(materialManager->getShaderByIndex(i)->screenShader) {
 			shaderComboBox->addComboItem(materialManager->getShaderByIndex(i)->getName(), (void*)materialManager->getShaderByIndex(i));			
@@ -1613,7 +1616,7 @@ ShaderPassProp::ShaderPassProp(Material *material, int shaderIndex) : PropProp("
 			index++;
 		}
 	}	
-	
+	*/
 	
 	editButton = new UIButton("Options", 30);
 	editButton->addEventListener(this, UIEvent::CLICK_EVENT);