Преглед изворни кода

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 година
родитељ
комит
37a40fefe1
29 измењених фајлова са 152 додато и 202 уклоњено
  1. 2 0
      Core/Contents/Include/PolyCamera.h
  2. 4 2
      Core/Contents/Include/PolyGLRenderer.h
  3. 0 19
      Core/Contents/Include/PolyMaterialManager.h
  4. 0 23
      Core/Contents/Include/PolyMesh.h
  5. 3 1
      Core/Contents/Include/PolyObject.h
  6. 3 1
      Core/Contents/Include/PolyRenderer.h
  7. 2 1
      Core/Contents/Include/PolySceneEntityInstance.h
  8. 3 0
      Core/Contents/Include/PolySceneMesh.h
  9. 3 1
      Core/Contents/Source/PolyBezierCurve.cpp
  10. 16 1
      Core/Contents/Source/PolyCamera.cpp
  11. 1 1
      Core/Contents/Source/PolyCocoaCore.mm
  12. 0 1
      Core/Contents/Source/PolyCoreServices.cpp
  13. 3 4
      Core/Contents/Source/PolyFontGlyphSheet.cpp
  14. 11 8
      Core/Contents/Source/PolyGLRenderer.cpp
  15. 1 0
      Core/Contents/Source/PolyGLTexture.cpp
  16. 22 15
      Core/Contents/Source/PolyMaterial.cpp
  17. 2 77
      Core/Contents/Source/PolyMaterialManager.cpp
  18. 1 22
      Core/Contents/Source/PolyMesh.cpp
  19. 6 0
      Core/Contents/Source/PolyObject.cpp
  20. 26 6
      Core/Contents/Source/PolyResourceManager.cpp
  21. 5 5
      Core/Contents/Source/PolySceneEntityInstance.cpp
  22. 2 2
      Core/Contents/Source/PolySceneLabel.cpp
  23. 1 3
      Core/Contents/Source/PolySceneLight.cpp
  24. 17 6
      Core/Contents/Source/PolySceneMesh.cpp
  25. 4 0
      Core/Contents/Source/PolySkeleton.cpp
  26. 2 0
      Core/Contents/Source/PolySound.cpp
  27. 1 0
      Core/Contents/Source/PolyTexture.cpp
  28. 7 2
      IDE/Contents/Source/PolycodeMaterialEditor.cpp
  29. 4 1
      IDE/Contents/Source/PolycodeProps.cpp

+ 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);