diff --git a/CMakeLists.txt b/CMakeLists.txt index 310e690..31d63b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,7 @@ find_package(fx-gltf REQUIRED) add_subdirectory(${PROJECT_SOURCE_DIR}/lib) add_library(fever_core + src/asset/asset_manager.cpp src/components/transform.cpp # src/core/application.cpp src/core/camera.cpp diff --git a/README.md b/README.md index 8af385f..b7ad2ec 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -A work in progress game engine written in C++ using OpenGL and [entt](https://github.com/skypjack/entt). +A work in progress game engine written in C++ using OpenGL and [flecs](https://flecs.dev). ![A screenshot](screenshot.png) diff --git a/apps/flecs-test/main.cpp b/apps/flecs-test/main.cpp index 59b3735..81e4f50 100644 --- a/apps/flecs-test/main.cpp +++ b/apps/flecs-test/main.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -14,6 +15,13 @@ int main() world.import (); world.import (); + world.import (); + + Asset::AssetManager manager; + manager.register_asset_type(world); + auto handle0 = manager.load(world, "hi"); + auto handle1 = manager.load(world, "hi"); + auto handle2 = manager.load(world, "hi2"); #ifndef NDEBUG world.import (); diff --git a/src/asset/asset_manager.cpp b/src/asset/asset_manager.cpp new file mode 100644 index 0000000..a80d0be --- /dev/null +++ b/src/asset/asset_manager.cpp @@ -0,0 +1,10 @@ +#include "asset_manager.h" + +namespace Asset { + +AssetModule::AssetModule(flecs::world& world) +{ + auto asset_manager = world.component(); +} + +} // namespace Asset diff --git a/src/asset/asset_manager.h b/src/asset/asset_manager.h new file mode 100644 index 0000000..4f925f2 --- /dev/null +++ b/src/asset/asset_manager.h @@ -0,0 +1,61 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace Asset { + +struct AssetModule +{ + AssetModule(flecs::world& world); +}; + +template struct AssetCache +{ + std::unordered_map> cache; +}; + +template struct AssetLoader +{ + template std::shared_ptr operator()(Args&&...) + { + static_assert(sizeof(T) == 0, "AssetLoader not implemented for this type."); + } +}; + +template <> struct AssetLoader +{ + std::shared_ptr operator()(std::string_view path) + { + static int i = 0; + return std::make_shared(i++); + } +}; + +struct AssetManager +{ + template void register_asset_type(flecs::world& world) + { + world.set>({}); + } + + template std::shared_ptr load(flecs::world& world, std::string asset_path) + { + auto asset_cache = world.get_mut>(); + + auto asset_it = asset_cache->cache.find(asset_path); + if (asset_it != asset_cache->cache.end()) + return asset_it->second; + + AssetLoader asset_loader; + auto loaded_asset = asset_loader(asset_path); + + asset_cache->cache.emplace(asset_path, loaded_asset); + return loaded_asset; + } +}; + +} // namespace Asset