Improved prefab loading a bit.
This commit is contained in:
@@ -32,5 +32,8 @@ namespace Dawn {
|
||||
);
|
||||
|
||||
~LoaderForSceneItems();
|
||||
|
||||
friend class SceneLoader;
|
||||
friend class PrefabLoader;
|
||||
};
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user