Made scenes, items and components a lot cleaner, asset manager also cleans up properly.
This commit is contained in:
@@ -30,44 +30,27 @@ void AssetManager::update() {
|
||||
}
|
||||
|
||||
void AssetManager::remove(const std::shared_ptr<AssetLoader> loader) {
|
||||
auto existing = std::find(
|
||||
pendingAssetLoaders.begin(), pendingAssetLoaders.end(), loader
|
||||
);
|
||||
if(existing != pendingAssetLoaders.end()) {
|
||||
pendingAssetLoaders.erase(existing);
|
||||
for(
|
||||
auto it = pendingAssetLoaders.begin();
|
||||
it != pendingAssetLoaders.end();
|
||||
it++
|
||||
) {
|
||||
if(*it != loader) continue;
|
||||
pendingAssetLoaders.erase(it);
|
||||
return;
|
||||
}
|
||||
|
||||
existing = std::find(
|
||||
finishedAssetLoaders.begin(), finishedAssetLoaders.end(), loader
|
||||
);
|
||||
if(existing != finishedAssetLoaders.end()) {
|
||||
finishedAssetLoaders.erase(existing);
|
||||
for(
|
||||
auto it = finishedAssetLoaders.begin();
|
||||
it != finishedAssetLoaders.end();
|
||||
it++
|
||||
) {
|
||||
if(it->lock() != loader) continue;
|
||||
finishedAssetLoaders.erase(it);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Disabled because it does not respect scopes
|
||||
// void AssetManager::removeExisting(const std::string &filename) {
|
||||
// auto existing = std::find_if(
|
||||
// pendingAssetLoaders.begin(), pendingAssetLoaders.end(),
|
||||
// [&](auto &loader) {
|
||||
// return loader->name == filename;
|
||||
// }
|
||||
// );
|
||||
// if(existing != pendingAssetLoaders.end()) {
|
||||
// pendingAssetLoaders.erase(existing);
|
||||
// }
|
||||
|
||||
// existing = std::find_if(
|
||||
// finishedAssetLoaders.begin(), finishedAssetLoaders.end(),
|
||||
// [&](auto &loader) {
|
||||
// return loader->name == filename;
|
||||
// }
|
||||
// );
|
||||
// if(existing != finishedAssetLoaders.end()) {
|
||||
// finishedAssetLoaders.erase(existing);
|
||||
// }
|
||||
// }
|
||||
|
||||
bool_t AssetManager::isEverythingLoaded() {
|
||||
return pendingAssetLoaders.size() == 0;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace Dawn {
|
||||
private:
|
||||
std::weak_ptr<Game> game;
|
||||
std::vector<std::shared_ptr<AssetLoader>> pendingAssetLoaders;
|
||||
std::vector<std::shared_ptr<AssetLoader>> finishedAssetLoaders;
|
||||
std::vector<std::weak_ptr<AssetLoader>> finishedAssetLoaders;
|
||||
|
||||
/**
|
||||
* Returns an existing asset loader if it exists.
|
||||
@@ -24,32 +24,21 @@ namespace Dawn {
|
||||
*/
|
||||
template<class T>
|
||||
std::shared_ptr<T> getExisting(const std::string &filename) {
|
||||
auto existing = std::find_if(
|
||||
pendingAssetLoaders.begin(),
|
||||
pendingAssetLoaders.end(),
|
||||
[&](auto &loader) {
|
||||
return (
|
||||
loader->name == filename &&
|
||||
loader->getAssetType() == T::ASSET_TYPE
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
if(existing == pendingAssetLoaders.end()) {
|
||||
existing = std::find_if(
|
||||
finishedAssetLoaders.begin(), finishedAssetLoaders.end(),
|
||||
[&](auto &loader) {
|
||||
return (
|
||||
loader->name == filename &&
|
||||
loader->getAssetType() == T::ASSET_TYPE
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
if(existing == finishedAssetLoaders.end()) return nullptr;
|
||||
for(auto &loader : pendingAssetLoaders) {
|
||||
if(loader->name != filename) continue;
|
||||
if(loader->getAssetType() != T::ASSET_TYPE) continue;
|
||||
return std::static_pointer_cast<T>(loader);
|
||||
}
|
||||
|
||||
return std::static_pointer_cast<T>(*existing);
|
||||
for(auto &wLoader : finishedAssetLoaders) {
|
||||
auto loader = wLoader.lock();
|
||||
if(!loader) continue;
|
||||
if(loader->name != filename) continue;
|
||||
if(loader->getAssetType() != T::ASSET_TYPE) continue;
|
||||
return std::static_pointer_cast<T>(loader);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -57,8 +57,40 @@ void SceneLoader::setupDependencies() {
|
||||
this->state = SceneLoaderState::LOADING_DEPENDENCIES;
|
||||
}
|
||||
|
||||
void SceneLoader::sceneInitializer(Scene &scene) {
|
||||
std::cout << "Initializing scene" << std::endl;
|
||||
void SceneLoader::updateAsync() {
|
||||
switch(this->state) {
|
||||
case SceneLoaderState::INITIAL:
|
||||
this->jsonLoader = getAssetManager()->get<JSONLoader>(this->name);
|
||||
this->state = SceneLoaderState::LOADING_JSON;
|
||||
break;
|
||||
|
||||
case SceneLoaderState::LOADING_JSON:
|
||||
assertNotNull(this->jsonLoader, "JSON Loader is NULL?");
|
||||
if(!this->jsonLoader->loaded) return;
|
||||
this->setupDependencies();
|
||||
break;
|
||||
|
||||
case SceneLoaderState::LOADING_DEPENDENCIES:
|
||||
// Check if all dependencies are loaded.
|
||||
for(auto &asset : ctx.assets) {
|
||||
if(!asset.second->loaded) return;
|
||||
}
|
||||
this->state = SceneLoaderState::DEPENDENCIES_LOADED;
|
||||
break;
|
||||
|
||||
case SceneLoaderState::DEPENDENCIES_LOADED:
|
||||
std::cout << "Deps Loaded" << std::endl;
|
||||
ctx.scene = std::make_shared<Scene>(this->getAssetManager()->getGame());
|
||||
this->state = SceneLoaderState::PENDING_STAGE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SceneLoader::updateSync() {
|
||||
if(this->state != SceneLoaderState::PENDING_STAGE) return;
|
||||
|
||||
auto &data = this->jsonLoader->data;
|
||||
if(data.contains("items")) {
|
||||
@@ -66,7 +98,7 @@ void SceneLoader::sceneInitializer(Scene &scene) {
|
||||
for(auto &item : data["items"].items()) {
|
||||
auto &itemName = item.key();
|
||||
auto &itemData = item.value();
|
||||
auto sceneItem = scene.createSceneItem();
|
||||
auto sceneItem = ctx.scene->createSceneItem();
|
||||
ctx.items[itemName] = sceneItem;
|
||||
}
|
||||
|
||||
@@ -97,51 +129,7 @@ void SceneLoader::sceneInitializer(Scene &scene) {
|
||||
|
||||
this->jsonLoader = nullptr;
|
||||
this->state = SceneLoaderState::DONE;
|
||||
getAssetManager()->remove(shared_from_this());
|
||||
}
|
||||
|
||||
void SceneLoader::updateAsync() {
|
||||
switch(this->state) {
|
||||
case SceneLoaderState::INITIAL:
|
||||
this->jsonLoader = getAssetManager()->get<JSONLoader>(this->name);
|
||||
this->state = SceneLoaderState::LOADING_JSON;
|
||||
break;
|
||||
|
||||
case SceneLoaderState::LOADING_JSON:
|
||||
assertNotNull(this->jsonLoader, "JSON Loader is NULL?");
|
||||
if(!this->jsonLoader->loaded) return;
|
||||
this->setupDependencies();
|
||||
break;
|
||||
|
||||
case SceneLoaderState::LOADING_DEPENDENCIES:
|
||||
// Check if all dependencies are loaded.
|
||||
for(auto &asset : ctx.assets) {
|
||||
if(!asset.second->loaded) return;
|
||||
}
|
||||
|
||||
this->state = SceneLoaderState::DEPENDENCIES_LOADED;
|
||||
break;
|
||||
|
||||
case SceneLoaderState::DEPENDENCIES_LOADED:
|
||||
std::cout << "Deps Loaded" << std::endl;
|
||||
this->loaded = true;
|
||||
ctx.scene = std::make_shared<Scene>(
|
||||
this->getAssetManager()->getGame(),
|
||||
[this](Scene &scene) -> void {
|
||||
this->sceneInitializer(scene);
|
||||
}
|
||||
);
|
||||
this->state = SceneLoaderState::PENDING_STAGE;
|
||||
this->loaded = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SceneLoader::updateSync() {
|
||||
|
||||
this->loaded = true;
|
||||
}
|
||||
|
||||
std::string SceneLoader::getAssetType() const {
|
||||
|
||||
@@ -31,13 +31,6 @@ namespace Dawn {
|
||||
*/
|
||||
void setupDependencies();
|
||||
|
||||
/**
|
||||
* Scene intializer function to stage the loaded scene.
|
||||
*
|
||||
* @param scene Scene that is being staged.
|
||||
*/
|
||||
void sceneInitializer(Scene &scene);
|
||||
|
||||
public:
|
||||
const static std::string ASSET_TYPE;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user