Skip to content

Commit 07b4f6c

Browse files
committed
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
1 parent 110ca74 commit 07b4f6c

File tree

6 files changed

+76
-47
lines changed

6 files changed

+76
-47
lines changed

Core/Contents/Include/PolyResourceManager.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ namespace Polycode {
6060
bool reloadResourcesOnModify;
6161
bool dispatchChangeEvents;
6262

63+
int resourceSubscribers;
64+
bool deleteOnUnsubscribe;
65+
6366
private:
6467

6568
ResourcePool *fallbackPool;
@@ -114,6 +117,9 @@ namespace Polycode {
114117

115118
void removeResource(Resource *resource);
116119

120+
void subscribeToResourcePool(ResourcePool *pool);
121+
void unsubscibeFromResourcePool(ResourcePool *pool);
122+
117123
void Update(int elapsed);
118124
void handleEvent(Event *event);
119125

Core/Contents/Source/PolyResourceManager.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ ResourcePool::ResourcePool(const String &name, ResourcePool *fallbackPool) {
4545
dispatchChangeEvents = false;
4646
reloadResourcesOnModify = false;
4747
ticksSinceCheck = 0;
48+
resourceSubscribers = 0;
49+
deleteOnUnsubscribe = false;
4850
}
4951

5052
ResourcePool::~ResourcePool() {
@@ -381,11 +383,13 @@ void ResourceManager::addResourcePool(ResourcePool *pool) {
381383
}
382384

383385
ResourcePool *ResourceManager::getResourcePoolByName(const String &name) {
386+
printf("request resource pool [%s]\n", name.c_str());
384387
for(int i=0; i < pools.size(); i++) {
385388
if(pools[i]->getName() == name) {
386389
return pools[i];
387390
}
388391
}
392+
printf("resource pool not found!\n");
389393
return NULL;
390394
}
391395

@@ -398,6 +402,17 @@ void ResourceManager::removeResourcePool(ResourcePool *pool) {
398402
}
399403
}
400404

405+
void ResourceManager::subscribeToResourcePool(ResourcePool *pool) {
406+
pool->resourceSubscribers++;
407+
}
408+
409+
void ResourceManager::unsubscibeFromResourcePool(ResourcePool *pool) {
410+
pool->resourceSubscribers--;
411+
if(pool->deleteOnUnsubscribe && pool->resourceSubscribers < 1) {
412+
delete pool;
413+
}
414+
}
415+
401416
std::vector<Resource*> ResourceManager::getResources(int resourceType) {
402417
std::vector<Resource*> result;
403418

Core/Contents/Source/PolySceneEntityInstance.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ SceneEntityInstance::SceneEntityInstance(Scene *parentScene) : Entity() {
7676
SceneEntityInstance::~SceneEntityInstance() {
7777
CoreServices::getInstance()->getResourceManager()->removeResource(resourceEntry);
7878
delete resourceEntry;
79+
for(int i=0; i < resourcePools.size(); i++) {
80+
CoreServices::getInstance()->getResourceManager()->unsubscibeFromResourcePool(resourcePools[i]);
81+
}
7982
}
8083

8184
void SceneEntityInstance::reloadEntityInstance() {
@@ -116,6 +119,7 @@ void SceneEntityInstance::linkResourcePool(ResourcePool *pool) {
116119
}
117120
pool->setFallbackPool(topLevelResourcePool);
118121
topLevelResourcePool = pool;
122+
CoreServices::getInstance()->getResourceManager()->subscribeToResourcePool(pool);
119123
resourcePools.push_back(pool);
120124
}
121125

@@ -148,6 +152,7 @@ void SceneEntityInstance::unlinkResourcePool(ResourcePool *pool) {
148152
if(resourcePools[i] == pool) {
149153
resourcePools.erase(resourcePools.begin() + i);
150154
rebuildResourceLinks();
155+
CoreServices::getInstance()->getResourceManager()->unsubscibeFromResourcePool(pool);
151156
return;
152157
}
153158
}
@@ -552,6 +557,7 @@ bool SceneEntityInstance::loadFromFile(const String& fileName) {
552557
ResourcePool *newPool = CoreServices::getInstance()->getResourceManager()->getResourcePoolByName(path->stringVal);
553558
if(!newPool) {
554559
newPool = new ResourcePool(path->stringVal, CoreServices::getInstance()->getResourceManager()->getGlobalPool());
560+
newPool->deleteOnUnsubscribe = true;
555561
CoreServices::getInstance()->getMaterialManager()->loadMaterialLibraryIntoPool(newPool, path->stringVal);
556562
CoreServices::getInstance()->getResourceManager()->addResourcePool(newPool);
557563
}

Core/Contents/Source/PolyShader.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,6 @@ ShaderBinding::~ShaderBinding() {
9292
for(int i=0; i < renderTargetBindings.size(); i++) {
9393
delete renderTargetBindings[i];
9494
}
95-
for(int i=0; i < inTargetBindings.size(); i++) {
96-
delete inTargetBindings[i];
97-
}
98-
for(int i=0; i < outTargetBindings.size(); i++) {
99-
delete outTargetBindings[i];
100-
}
10195
}
10296

10397
unsigned int ShaderBinding::getNumLocalParams() {

IDE/Contents/Source/PolycodeMaterialEditor.cpp

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,16 +1111,13 @@ void MaterialBrowser::Resize(Number width, Number height) {
11111111
}
11121112

11131113
PolycodeMaterialEditor::PolycodeMaterialEditor() : PolycodeEditor(true){
1114-
resourcePool = new ResourcePool("Local", CoreServices::getInstance()->getResourceManager()->getGlobalPool());
1115-
resourcePool->reloadResourcesOnModify = true;
11161114

1117-
CoreServices::getInstance()->getResourceManager()->addResourcePool(resourcePool);
1115+
11181116
selectedMaterialNode = NULL;
11191117
}
11201118

11211119
PolycodeMaterialEditor::~PolycodeMaterialEditor() {
1122-
delete resourcePool;
1123-
1120+
CoreServices::getInstance()->getResourceManager()->unsubscibeFromResourcePool(resourcePool);
11241121

11251122
mainWindow->setOwnsChildrenRecursive(true);
11261123
delete mainWindow;
@@ -1130,6 +1127,19 @@ PolycodeMaterialEditor::~PolycodeMaterialEditor() {
11301127

11311128
bool PolycodeMaterialEditor::openFile(OSFileEntry filePath) {
11321129

1130+
String resourceName = filePath.fullPath.replace(parentProject->getRootFolder()+"/", "");
1131+
1132+
resourcePool = CoreServices::getInstance()->getResourceManager()->getResourcePoolByName(resourceName);
1133+
1134+
if(!resourcePool) {
1135+
resourcePool = new ResourcePool(resourceName, CoreServices::getInstance()->getResourceManager()->getGlobalPool());
1136+
resourcePool->reloadResourcesOnModify = true;
1137+
resourcePool->deleteOnUnsubscribe = true;
1138+
CoreServices::getInstance()->getMaterialManager()->loadMaterialLibraryIntoPool(resourcePool, filePath.fullPath);
1139+
CoreServices::getInstance()->getResourceManager()->addResourcePool(resourcePool);
1140+
}
1141+
1142+
CoreServices::getInstance()->getResourceManager()->subscribeToResourcePool(resourcePool);
11331143

11341144
mainSizer = new UIHSizer(100,100,200,false);
11351145
addChild(mainSizer);
@@ -1139,42 +1149,33 @@ bool PolycodeMaterialEditor::openFile(OSFileEntry filePath) {
11391149

11401150
materialBrowser->addEventListener(this, Event::CHANGE_EVENT);
11411151

1142-
1143-
shaders = CoreServices::getInstance()->getMaterialManager()->loadShadersFromFile(resourcePool, filePath.fullPath);
1144-
for(int i=0; i < shaders.size(); i++) {
1145-
materialBrowser->addShader(shaders[i]);
1146-
CoreServices::getInstance()->getMaterialManager()->addShader(shaders[i]);
1147-
resourcePool->addResource(shaders[i]);
1148-
shaders[i]->vp->reloadOnFileModify = true;
1149-
shaders[i]->fp->reloadOnFileModify = true;
1150-
}
1151-
1152-
cubemaps = CoreServices::getInstance()->getMaterialManager()->loadCubemapsFromFile(filePath.fullPath);
1153-
for(int i=0; i < cubemaps.size(); i++) {
1154-
materialBrowser->addCubemap(cubemaps[i]);
1155-
resourcePool->addResource(cubemaps[i]);
1156-
}
1157-
1158-
1159-
std::vector<Material*> mats = CoreServices::getInstance()->getMaterialManager()->loadMaterialsFromFile(resourcePool, filePath.fullPath);
1160-
1161-
materials.clear();
1162-
for(int i=0; i < mats.size(); i++) {
1163-
if(mats[i]->screenMaterial) {
1164-
postMaterials.push_back(mats[i]);
1152+
std::vector<Resource*> res = resourcePool->getResources(Resource::RESOURCE_SHADER);
1153+
for(int i=0; i < res.size(); i++) {
1154+
Shader *shader = (Shader*)res[i];
1155+
materialBrowser->addShader(shader);
1156+
shader->vp->reloadOnFileModify = true;
1157+
shader->fp->reloadOnFileModify = true;
1158+
shaders.push_back(shader);
1159+
}
1160+
1161+
res = resourcePool->getResources(Resource::RESOURCE_CUBEMAP);
1162+
for(int i=0; i < res.size(); i++) {
1163+
Cubemap *cubemap = (Cubemap*)res[i];
1164+
materialBrowser->addCubemap(cubemap);
1165+
cubemaps.push_back(cubemap);
1166+
}
1167+
1168+
res = resourcePool->getResources(Resource::RESOURCE_MATERIAL);
1169+
for(int i=0; i < res.size(); i++) {
1170+
Material *material = (Material*)res[i];
1171+
if(material->screenMaterial) {
1172+
postMaterials.push_back(material);
1173+
materialBrowser->addPostMaterial(material);
11651174
} else {
1166-
materials.push_back(mats[i]);
1175+
materials.push_back(material);
1176+
materialBrowser->addMaterial(material);
11671177
}
1168-
}
1169-
1170-
for(int i=0; i < materials.size(); i++) {
1171-
materialBrowser->addMaterial(materials[i]);
1172-
resourcePool->addResource(materials[i]);
1173-
}
1174-
1175-
for(int i=0; i < postMaterials.size(); i++) {
1176-
materialBrowser->addPostMaterial(postMaterials[i]);
1177-
}
1178+
}
11781179

11791180
mainWindow = new MaterialMainWindow(resourcePool);
11801181
mainSizer->addLeftChild(mainWindow);

IDE/Contents/Source/PolycodeProps.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3438,8 +3438,15 @@ void LinkedMaterialsSheet::handleEvent(Event *event) {
34383438
globalFrame->assetBrowser->removeAllHandlersForListener(this);
34393439
globalFrame->hideModal();
34403440

3441-
ResourcePool *newPool = new ResourcePool(materialPath, CoreServices::getInstance()->getResourceManager()->getGlobalPool());
3442-
CoreServices::getInstance()->getMaterialManager()->loadMaterialLibraryIntoPool(newPool, fullMaterialPath);
3441+
ResourcePool *newPool = CoreServices::getInstance()->getResourceManager()->getResourcePoolByName(materialPath);
3442+
3443+
if(!newPool) {
3444+
newPool = new ResourcePool(materialPath, CoreServices::getInstance()->getResourceManager()->getGlobalPool());
3445+
newPool->reloadResourcesOnModify = true;
3446+
newPool->deleteOnUnsubscribe = true;
3447+
CoreServices::getInstance()->getMaterialManager()->loadMaterialLibraryIntoPool(newPool, fullMaterialPath);
3448+
CoreServices::getInstance()->getResourceManager()->addResourcePool(newPool);
3449+
}
34433450

34443451
instance->linkResourcePool(newPool);
34453452
updateMaterials();

0 commit comments

Comments
 (0)