소스 검색

Added a simple resource pool subscription system, resource pools are now shared between entity editors and material editor, materials will update in entity editors when changed in the material editor

Ivan Safrin 11 년 전
부모
커밋
07b4f6c9c1

+ 6 - 0
Core/Contents/Include/PolyResourceManager.h

@@ -60,6 +60,9 @@ namespace Polycode {
 			bool reloadResourcesOnModify;
             bool dispatchChangeEvents;
         
+            int resourceSubscribers;
+            bool deleteOnUnsubscribe;
+        
         private:
         
             ResourcePool *fallbackPool;
@@ -114,6 +117,9 @@ namespace Polycode {
         
 			void removeResource(Resource *resource);
         
+            void subscribeToResourcePool(ResourcePool *pool);
+            void unsubscibeFromResourcePool(ResourcePool *pool);
+        
 			void Update(int elapsed);
 			void handleEvent(Event *event);
 		

+ 15 - 0
Core/Contents/Source/PolyResourceManager.cpp

@@ -45,6 +45,8 @@ ResourcePool::ResourcePool(const String &name, ResourcePool *fallbackPool) {
 	dispatchChangeEvents = false;
 	reloadResourcesOnModify = false;
 	ticksSinceCheck = 0;
+    resourceSubscribers = 0;
+    deleteOnUnsubscribe = false;
 }
 
 ResourcePool::~ResourcePool() {
@@ -381,11 +383,13 @@ void ResourceManager::addResourcePool(ResourcePool *pool) {
 }
 
 ResourcePool *ResourceManager::getResourcePoolByName(const String &name) {
+    printf("request resource pool [%s]\n", name.c_str());
     for(int i=0; i < pools.size(); i++) {
         if(pools[i]->getName() == name) {
             return pools[i];
         }
     }
+    printf("resource pool not found!\n");
     return NULL;
 }
 
@@ -398,6 +402,17 @@ void ResourceManager::removeResourcePool(ResourcePool *pool) {
     }
 }
 
+void ResourceManager::subscribeToResourcePool(ResourcePool *pool) {
+    pool->resourceSubscribers++;
+}
+
+void ResourceManager::unsubscibeFromResourcePool(ResourcePool *pool) {
+    pool->resourceSubscribers--;
+    if(pool->deleteOnUnsubscribe && pool->resourceSubscribers < 1) {
+        delete pool;
+    }
+}
+
 std::vector<Resource*> ResourceManager::getResources(int resourceType) {
 	std::vector<Resource*> result;
 

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

@@ -76,6 +76,9 @@ SceneEntityInstance::SceneEntityInstance(Scene *parentScene) : Entity() {
 SceneEntityInstance::~SceneEntityInstance() {	
 	CoreServices::getInstance()->getResourceManager()->removeResource(resourceEntry);
 	delete resourceEntry;
+    for(int i=0; i < resourcePools.size(); i++) {
+        CoreServices::getInstance()->getResourceManager()->unsubscibeFromResourcePool(resourcePools[i]);
+    }
 }
 
 void SceneEntityInstance::reloadEntityInstance() {
@@ -116,6 +119,7 @@ void SceneEntityInstance::linkResourcePool(ResourcePool *pool) {
     }
     pool->setFallbackPool(topLevelResourcePool);
     topLevelResourcePool = pool;
+    CoreServices::getInstance()->getResourceManager()->subscribeToResourcePool(pool);
     resourcePools.push_back(pool);
 }
 
@@ -148,6 +152,7 @@ void SceneEntityInstance::unlinkResourcePool(ResourcePool *pool) {
         if(resourcePools[i] == pool) {
             resourcePools.erase(resourcePools.begin() + i);
             rebuildResourceLinks();
+            CoreServices::getInstance()->getResourceManager()->unsubscibeFromResourcePool(pool);
             return;
         }
     }
@@ -552,6 +557,7 @@ bool SceneEntityInstance::loadFromFile(const String& fileName) {
                     ResourcePool *newPool = CoreServices::getInstance()->getResourceManager()->getResourcePoolByName(path->stringVal);
                     if(!newPool) {
                         newPool = new ResourcePool(path->stringVal,  CoreServices::getInstance()->getResourceManager()->getGlobalPool());
+                        newPool->deleteOnUnsubscribe = true;
                         CoreServices::getInstance()->getMaterialManager()->loadMaterialLibraryIntoPool(newPool, path->stringVal);
                         CoreServices::getInstance()->getResourceManager()->addResourcePool(newPool);
                     }

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

@@ -92,12 +92,6 @@ ShaderBinding::~ShaderBinding() {
 	for(int i=0; i < renderTargetBindings.size(); i++) {
 		delete renderTargetBindings[i];
 	}	
-	for(int i=0; i < inTargetBindings.size(); i++) {
-		delete inTargetBindings[i];
-	}	
-	for(int i=0; i < outTargetBindings.size(); i++) {
-		delete outTargetBindings[i];
-	}	
 }
 
 unsigned int ShaderBinding::getNumLocalParams() {

+ 40 - 39
IDE/Contents/Source/PolycodeMaterialEditor.cpp

@@ -1111,16 +1111,13 @@ void MaterialBrowser::Resize(Number width, Number height) {
 }
 
 PolycodeMaterialEditor::PolycodeMaterialEditor() : PolycodeEditor(true){
-    resourcePool = new ResourcePool("Local",     CoreServices::getInstance()->getResourceManager()->getGlobalPool());
-    resourcePool->reloadResourcesOnModify = true;
     
-    CoreServices::getInstance()->getResourceManager()->addResourcePool(resourcePool);
+    
 	selectedMaterialNode = NULL;
 }
 
 PolycodeMaterialEditor::~PolycodeMaterialEditor() {
-	delete resourcePool;
-    
+    CoreServices::getInstance()->getResourceManager()->unsubscibeFromResourcePool(resourcePool);
     
     mainWindow->setOwnsChildrenRecursive(true);
     delete mainWindow;
@@ -1130,6 +1127,19 @@ PolycodeMaterialEditor::~PolycodeMaterialEditor() {
 
 bool PolycodeMaterialEditor::openFile(OSFileEntry filePath) {
 	
+    String resourceName = filePath.fullPath.replace(parentProject->getRootFolder()+"/", "");
+    
+    resourcePool = CoreServices::getInstance()->getResourceManager()->getResourcePoolByName(resourceName);
+    
+    if(!resourcePool) {
+        resourcePool = new ResourcePool(resourceName,  CoreServices::getInstance()->getResourceManager()->getGlobalPool());
+        resourcePool->reloadResourcesOnModify = true;
+        resourcePool->deleteOnUnsubscribe = true;
+        CoreServices::getInstance()->getMaterialManager()->loadMaterialLibraryIntoPool(resourcePool, filePath.fullPath);
+        CoreServices::getInstance()->getResourceManager()->addResourcePool(resourcePool);
+    }
+    
+    CoreServices::getInstance()->getResourceManager()->subscribeToResourcePool(resourcePool);
 		
 	mainSizer = new UIHSizer(100,100,200,false);
 	addChild(mainSizer);	
@@ -1139,42 +1149,33 @@ bool PolycodeMaterialEditor::openFile(OSFileEntry filePath) {
 	
 	materialBrowser->addEventListener(this, Event::CHANGE_EVENT);
 	
-	
-	shaders = CoreServices::getInstance()->getMaterialManager()->loadShadersFromFile(resourcePool, filePath.fullPath);
-	for(int i=0; i < shaders.size(); i++) {
-		materialBrowser->addShader(shaders[i]);		
-		CoreServices::getInstance()->getMaterialManager()->addShader(shaders[i]);
-		resourcePool->addResource(shaders[i]);
-		shaders[i]->vp->reloadOnFileModify = true;
-		shaders[i]->fp->reloadOnFileModify = true;
-	}	
-
-	cubemaps = CoreServices::getInstance()->getMaterialManager()->loadCubemapsFromFile(filePath.fullPath);
-	for(int i=0; i < cubemaps.size(); i++) {
-		materialBrowser->addCubemap(cubemaps[i]);
-        resourcePool->addResource(cubemaps[i]);
-	}	
-
-	
-	std::vector<Material*> mats = CoreServices::getInstance()->getMaterialManager()->loadMaterialsFromFile(resourcePool, filePath.fullPath);
-	
-	materials.clear();
-	for(int i=0; i < mats.size(); i++) {
-		if(mats[i]->screenMaterial) {
-			postMaterials.push_back(mats[i]);
+    std::vector<Resource*> res = resourcePool->getResources(Resource::RESOURCE_SHADER);
+    for(int i=0; i < res.size(); i++) {
+        Shader *shader = (Shader*)res[i];
+		materialBrowser->addShader(shader);
+		shader->vp->reloadOnFileModify = true;
+		shader->fp->reloadOnFileModify = true;
+        shaders.push_back(shader);
+    }
+    
+    res = resourcePool->getResources(Resource::RESOURCE_CUBEMAP);
+    for(int i=0; i < res.size(); i++) {
+        Cubemap *cubemap = (Cubemap*)res[i];
+		materialBrowser->addCubemap(cubemap);
+        cubemaps.push_back(cubemap);
+    }
+    
+    res = resourcePool->getResources(Resource::RESOURCE_MATERIAL);
+    for(int i=0; i < res.size(); i++) {
+        Material *material = (Material*)res[i];
+		if(material->screenMaterial) {
+			postMaterials.push_back(material);
+            materialBrowser->addPostMaterial(material);
 		} else {
-			materials.push_back(mats[i]);		
+			materials.push_back(material);
+            materialBrowser->addMaterial(material);
 		}
-	}
-	
-	for(int i=0; i < materials.size(); i++) {
-		materialBrowser->addMaterial(materials[i]);
-        resourcePool->addResource(materials[i]);
-	}
-
-	for(int i=0; i < postMaterials.size(); i++) {
-		materialBrowser->addPostMaterial(postMaterials[i]);
-	}
+    }
 	
 	mainWindow = new MaterialMainWindow(resourcePool);
 	mainSizer->addLeftChild(mainWindow);

+ 9 - 2
IDE/Contents/Source/PolycodeProps.cpp

@@ -3438,8 +3438,15 @@ void LinkedMaterialsSheet::handleEvent(Event *event) {
         globalFrame->assetBrowser->removeAllHandlersForListener(this);
         globalFrame->hideModal();
         
-        ResourcePool *newPool = new ResourcePool(materialPath,  CoreServices::getInstance()->getResourceManager()->getGlobalPool());
-        CoreServices::getInstance()->getMaterialManager()->loadMaterialLibraryIntoPool(newPool, fullMaterialPath);
+        ResourcePool *newPool = CoreServices::getInstance()->getResourceManager()->getResourcePoolByName(materialPath);
+        
+        if(!newPool) {
+            newPool = new ResourcePool(materialPath,  CoreServices::getInstance()->getResourceManager()->getGlobalPool());
+            newPool->reloadResourcesOnModify = true;
+            newPool->deleteOnUnsubscribe = true;
+            CoreServices::getInstance()->getMaterialManager()->loadMaterialLibraryIntoPool(newPool, fullMaterialPath);
+            CoreServices::getInstance()->getResourceManager()->addResourcePool(newPool);
+        }
         
         instance->linkResourcePool(newPool);
          updateMaterials();