diff --git a/CMakeLists.txt b/CMakeLists.txt index aecfefa7cdcfe54d74c5087821c601391c8c3958..5a8aeffeee8148a1cb09969a1ce068ad7e3ab5fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,11 +28,12 @@ endif () add_subdirectory(vendor/imgui/) add_subdirectory(vendor/flecs/core) +add_subdirectory(vendor/flecs/modules) # engine #set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-checks=*") add_subdirectory(fggl) # extras -add_subdirectory(tests) +#add_subdirectory(tests) add_subdirectory(demo) diff --git a/demo/main.cpp b/demo/main.cpp index f68e2890cac0924d2b20a8857552291aca38ce5c..066522d4643459f27080db04d38906ad914b62d3 100644 --- a/demo/main.cpp +++ b/demo/main.cpp @@ -12,6 +12,7 @@ #include <fggl/gfx/ecs-cam.hpp> #include <fggl/math/ecs.hpp> +#include <fggl/debug/ecs.hpp> #include <fggl/data/procedural.hpp> #include <fggl/debug/debug.h> @@ -217,15 +218,6 @@ int main(int argc, char* argv[]) { camEnt.set<fggl::components::Camera>({}); } - auto floorEnt = world.create(); - { - floorEnt.set<fggl::math::Transform>( {} ); - - fggl::data::Mesh mesh = fggl::data::make_quad_xz(); - auto token = meshRenderer.upload( mesh ); - floorEnt.set<fggl::components::GfxToken>( token ); - } - // bunker prefab constexpr float HALF_PI = M_PI / 2.0f; constexpr int nSections = 2; @@ -262,15 +254,35 @@ int main(int argc, char* argv[]) { } // create testing bunkers - int nCubes = 3; + int nCubes = 1; for ( int i=0; i<nCubes; i++ ) { auto bunker = world.create(bunkerPrototype); - //bunker.add<fggl::components::GfxMat>(); auto trans = bunker.get_mut<fggl::components::Transform>(); trans->origin( glm::vec3( i * 5.0f, 0.0f, 0.0f) ); } + auto floorEnt = world.create("floor"); + { + floorEnt.set<fggl::math::Transform>( {} ); + floorEnt.set<fggl::components::GfxMat>( {} ); + + auto trans = floorEnt.get_mut<fggl::components::Transform>(); + trans->origin( glm::vec3( 10.0f, 0.0f, 0.0f) ); + + // create mesh + fggl::data::Mesh mesh; + fggl::data::make_cube( mesh, fggl::math::mat4(1.0f) ); + for (int i=0; i<10; i++ ) { + fggl::data::make_cube( mesh, glm::translate( fggl::math::mat4( 1.0f ), fggl::math::vec3( 0.0f, i * 1.0f, 0.0f) ) ); + } + mesh.removeDups(); + + auto token = meshRenderer.upload( mesh ); + token.pipeline = cache.get("phong"); + + floorEnt.set<fggl::components::GfxToken>( token ); + } fggl::gfx::Input& input = fggl::gfx::Input::instance(); @@ -291,6 +303,7 @@ int main(int argc, char* argv[]) { // imgui demos debugJoystickWindow( &joystickWindow, input ); debugGamepadWindow( &gamepadWindow, input ); + fggl::debug::showEntityList(world.ecs()); // render step ogl.clear(); diff --git a/fggl/debug/CMakeLists.txt b/fggl/debug/CMakeLists.txt index 50de25c3af8ca1322276f6b3191a98353fd50372..c4480861ca37798c8d51faf59648572cb831f91d 100644 --- a/fggl/debug/CMakeLists.txt +++ b/fggl/debug/CMakeLists.txt @@ -2,6 +2,7 @@ target_sources(fggl PRIVATE debug.cpp + ecs.cpp ) target_link_libraries(fggl imgui) diff --git a/fggl/debug/ecs.cpp b/fggl/debug/ecs.cpp new file mode 100644 index 0000000000000000000000000000000000000000..185af4d17cd6eade1d480d151c82961c8239f05e --- /dev/null +++ b/fggl/debug/ecs.cpp @@ -0,0 +1,23 @@ +#include <fggl/debug/ecs.hpp> +#include <fggl/math/ecs.hpp> + +#include <string> +#include <imgui.h> + +namespace fggl::debug { + + void showEntityList(flecs::world &world) { + auto query = world.query<const fggl::components::Transform>(); + bool visible = true; + + ImGui::Begin("Entity List", &visible); + query.iter([&visible](flecs::iter& it, const fggl::components::Transform* t) { + for ( auto i : it ) { + auto entity = it.entity(i); + ImGui::Text("%s (#%lu)", entity.name().c_str(), entity.id() ); + } + }); + ImGui::End(); + } + +} diff --git a/fggl/debug/ecs.hpp b/fggl/debug/ecs.hpp new file mode 100644 index 0000000000000000000000000000000000000000..9a599429c7d26865c0cc8e344fae020fc4948f00 --- /dev/null +++ b/fggl/debug/ecs.hpp @@ -0,0 +1,17 @@ +#include <flecs.h> +#include <flecs_meta.h> + +namespace fggl::debug { + void showEntityList(flecs::world& world); +} + +namespace fggl::systems { + + class Editor { + inline Editor(flecs::world& world) { + world.system<Editor>(); + + flecs::import<flecs::components::meta>(world); + } + }; +} diff --git a/fggl/ecs2/CMakeLists.txt b/fggl/ecs2/CMakeLists.txt index 1b492b620e69c4e4b10cd5764cf6d8f8ee5f8ca3..1c2d48895a019cbbc3e2d70c41c98b66d869c373 100644 --- a/fggl/ecs2/CMakeLists.txt +++ b/fggl/ecs2/CMakeLists.txt @@ -3,4 +3,4 @@ target_sources(fggl PRIVATE ecs.cpp ) -target_link_libraries(fggl flecs) +target_link_libraries(fggl flecs flecsmodules) diff --git a/vendor/flecs/modules/CMakeLists.txt b/vendor/flecs/modules/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..ec65c275816a05af548645be058454fb78848410 --- /dev/null +++ b/vendor/flecs/modules/CMakeLists.txt @@ -0,0 +1,5 @@ +project(flecsmodules LANGUAGES C) + +add_library(flecsmodules STATIC src/flecs_meta.c ) +target_include_directories(flecsmodules PUBLIC include/) +target_link_libraries(flecsmodules flecs)