From 22e55153e5e5c96bf15945719e7723a8775c3fee Mon Sep 17 00:00:00 2001
From: Joseph Walton-Rivers <joseph@walton-rivers.uk>
Date: Mon, 17 Oct 2022 14:12:36 +0100
Subject: [PATCH] allow the entity factory to provided at calltime

---
 demo/demo/rollball.cpp                | 2 +-
 fggl/entity/loader/loader.cpp         | 2 +-
 fggl/entity/module.cpp                | 6 +++++-
 include/fggl/entity/loader/loader.hpp | 2 +-
 4 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/demo/demo/rollball.cpp b/demo/demo/rollball.cpp
index 0838fff..55f8631 100644
--- a/demo/demo/rollball.cpp
+++ b/demo/demo/rollball.cpp
@@ -85,7 +85,7 @@ namespace demo {
 
 		// asset loader
 		auto* assetLoader = m_owner.service<fggl::assets::Loader>();
-		assetLoader->load("rollball.yml", fggl::entity::PROTOTYPE_ASSET);
+		assetLoader->load("rollball.yml", fggl::entity::PROTOTYPE_ASSET, entFactory);
 		assetLoader->load("rollball.yml", fggl::entity::SCENE, this);
 
 		// collectable callbacks
diff --git a/fggl/entity/loader/loader.cpp b/fggl/entity/loader/loader.cpp
index 4baa790..ba19af3 100644
--- a/fggl/entity/loader/loader.cpp
+++ b/fggl/entity/loader/loader.cpp
@@ -77,7 +77,7 @@ namespace fggl::entity {
 		return nullptr;
 	}
 
-	assets::AssetRefRaw load_prototype(assets::Loader* loader, EntityFactory *factory, const assets::AssetGUID &guid, assets::AssetData data) {
+	assets::AssetRefRaw load_prototype(assets::Loader* loader, const assets::AssetGUID &guid, assets::AssetData data, EntityFactory* factory) {
 		auto *filePath = std::get<assets::AssetPath *>(data);
 
 		// We need to process the prototypes, and load them into the asset system.
diff --git a/fggl/entity/module.cpp b/fggl/entity/module.cpp
index d6447e4..22cf0a0 100644
--- a/fggl/entity/module.cpp
+++ b/fggl/entity/module.cpp
@@ -45,7 +45,11 @@ namespace fggl::entity {
 			// we are responsible for prefabs...
 			auto *assetLoader = services.get<assets::Loader>();
 			assetLoader->setFactory(PROTOTYPE_ASSET, [factory](assets::Loader* loader, const assets::AssetGUID &a, assets::AssetData b, void* ptr) {
-				return load_prototype(loader, factory, a, b);
+				EntityFactory* facPtr = factory;
+				if ( ptr != nullptr ) {
+					facPtr = (EntityFactory*)ptr;
+				}
+				return load_prototype(loader, a, b, facPtr);
 			}, assets::LoadType::PATH);
 			assetLoader->setFactory(SCENE, load_scene, assets::LoadType::PATH);
 
diff --git a/include/fggl/entity/loader/loader.hpp b/include/fggl/entity/loader/loader.hpp
index 9a816dd..322b76c 100644
--- a/include/fggl/entity/loader/loader.hpp
+++ b/include/fggl/entity/loader/loader.hpp
@@ -173,7 +173,7 @@ namespace fggl::entity {
 			}
 	};
 
-	assets::AssetRefRaw load_prototype(assets::Loader* loader, EntityFactory *factory, const assets::AssetGUID &guid, assets::AssetData data);
+	assets::AssetRefRaw load_prototype(assets::Loader* loader, const assets::AssetGUID &guid, assets::AssetData data, EntityFactory* factory);
 	assets::AssetRefRaw load_scene(assets::Loader* loader, const assets::AssetGUID& asset, assets::AssetData data, void* ptr);
 
 } // namespace fggl::entity
-- 
GitLab