Improved prefab loading a bit.

This commit is contained in:
2024-12-05 19:27:37 -06:00
parent 223bbed232
commit a4774e6189
10 changed files with 113 additions and 71 deletions

View File

@@ -32,5 +32,8 @@ namespace Dawn {
);
~LoaderForSceneItems();
friend class SceneLoader;
friend class PrefabLoader;
};
}

View File

@@ -10,6 +10,7 @@
#include "asset/loader/TextureLoader.hpp"
#include "scene/Scene.hpp"
#include "component/SceneComponentRegistry.hpp"
#include "util/JSON.hpp"
using namespace Dawn;
@@ -35,6 +36,7 @@ void PrefabLoader::updateSync() {
assertNotNull(this->jsonLoader, "JSON Loader is NULL?");
if(!this->jsonLoader->loaded) return;
this->state = PrefabLoaderState::LOADING_DEPENDENCIES;
this->ctx->data = this->jsonLoader->data;
this->setupDependencies();
break;
@@ -62,37 +64,6 @@ std::string PrefabLoader::getAssetType() const {
return PrefabLoader::ASSET_TYPE;
}
void PrefabLoader::stagePrefab(std::shared_ptr<SceneItem> item) {
assertTrue(this->loaded, "Prefab not loaded");
// Force-set new context values
ctx->data = this->jsonLoader->data;
// Load the scene item.
item->load(ctx);
auto &itemData = this->jsonLoader->data;
if(itemData.contains("components")) {
for(auto &cmpItem : itemData["components"].items()) {
auto &cmpName = cmpItem.key();
auto &cmpData = cmpItem.value();
assertTrue(
cmpData.contains("type"),
"Component missing type in %s",
cmpName.c_str()
);
auto cmpType = cmpData["type"].get<std::string>();
auto cmp = SceneComponentRegistry::createComponent(
cmpType, item
);
ctx->data = cmpData;
ctx->components[cmpName] = cmp;
cmp->load(ctx);
}
}
}
PrefabLoader::~PrefabLoader() {
}

View File

@@ -34,13 +34,6 @@ namespace Dawn {
void updateAsync() override;
std::string getAssetType() const override;
/**
* Stages this prefab onto a scene item.
*
* @param item The scene item to stage.
*/
void stagePrefab(std::shared_ptr<SceneItem> item);
~PrefabLoader();
};
}

View File

@@ -42,7 +42,7 @@ namespace Dawn {
auto it = assets.find(j);
if(it == assets.end()) {
auto parent = this->parent.lock();
assertNotNull(parent, "Couldn't find asset.");
assertNotNull(parent, "Couldn't find asset %s", j.c_str());
return parent->getAsset<T>(j);
}
auto asset = std::dynamic_pointer_cast<T>(it->second);
@@ -80,5 +80,6 @@ namespace Dawn {
friend class PrefabLoader;
friend class LoaderForSceneItems;
friend class SceneLoader;
friend class SceneItem;
};
}

View File

@@ -7,7 +7,8 @@
#include "game/Game.hpp"
#include "assert/assert.hpp"
#include "scene/Scene.hpp"
#include "component/SceneComponentRegistry.hpp"
#include "util/JSON.hpp"
#include "PrefabLoader.hpp"
using namespace Dawn;
@@ -76,29 +77,33 @@ void SceneLoader::updateSync() {
auto &itemName = item.key();
auto &itemData = item.value();
auto sceneItem = ctx->items[itemName];
sceneItem->name = itemName;
ctx->data = itemData;
sceneItem->load(ctx);
if(itemData.contains("components")) {
for(auto &cmpItem : itemData["components"].items()) {
auto &cmpName = cmpItem.key();
auto &cmpData = cmpItem.value();
assertTrue(
cmpData.contains("type"),
"Component missing type in %s",
cmpName.c_str()
);
auto cmpType = cmpData["type"].get<std::string>();
auto cmp = SceneComponentRegistry::createComponent(
cmpType, sceneItem
);
ctx->data = cmpData;
ctx->components[cmpName] = cmp;
cmp->load(ctx);
}
std::shared_ptr<SceneLoadContext> itemCtx;
if(itemData.contains("prefab")) {
auto prefabLoader = ctx->getAsset<PrefabLoader>(
itemData["prefab"].get<std::string>()
);
assertNotNull(prefabLoader, "Prefab loader not found");
assertTrue(prefabLoader->loaded, "Prefab loader not loaded");
assertNotNull(
prefabLoader->jsonLoader,
"Prefab JSON loader not found"
);
assertTrue(
prefabLoader->jsonLoader->loaded,
"Prefab JSON loader not loaded"
);
itemCtx = prefabLoader->ctx;
itemCtx->data = json(prefabLoader->jsonLoader->data);
itemCtx->parent = this->ctx;
JSON::mergeObjectsRecursive(itemCtx->data, itemData);
} else {
itemCtx = this->ctx;
itemCtx->data = json(itemData);
}
sceneItem->load(itemCtx);
}
}