diff --git a/framework/CMakeLists.txt b/framework/CMakeLists.txt index 3ca3540..63263f6 100644 --- a/framework/CMakeLists.txt +++ b/framework/CMakeLists.txt @@ -15,10 +15,10 @@ if(NOT MM_HEADLESS) add_subdirectory(sdl_service) add_subdirectory(simple_sdl_renderer) add_subdirectory(opengl_primitives) - #add_subdirectory(opengl_renderer) - #add_subdirectory(imgui) - #add_subdirectory(input) + add_subdirectory(opengl_renderer) + add_subdirectory(imgui) + add_subdirectory(input) add_subdirectory(sound) - #add_subdirectory(tilemap) + add_subdirectory(tilemap) endif() diff --git a/framework/imgui/src/mm/services/imgui_s.cpp b/framework/imgui/src/mm/services/imgui_s.cpp index eb503b6..d74fb00 100644 --- a/framework/imgui/src/mm/services/imgui_s.cpp +++ b/framework/imgui/src/mm/services/imgui_s.cpp @@ -91,14 +91,14 @@ void ImGuiService::disable(Engine& engine) { ImGui::DestroyContext(); } -void ImGuiService::imgui_new_frame(Engine& engine) { +void ImGuiService::imgui_new_frame(Engine&) { ZoneScopedN("MM::Services::ImGuiService::imgui_new_frame"); #ifdef MM_OPENGL_3 ImGui_ImplOpenGL3_NewFrame(); #endif - ImGui_ImplSDL2_NewFrame(engine.getService().win); + ImGui_ImplSDL2_NewFrame(); ImGui::NewFrame(); } diff --git a/framework/imgui/test/CMakeLists.txt b/framework/imgui/test/CMakeLists.txt index 7634554..e16713a 100644 --- a/framework/imgui/test/CMakeLists.txt +++ b/framework/imgui/test/CMakeLists.txt @@ -43,7 +43,7 @@ target_include_directories(imgui_scene_tools_test PRIVATE ".") target_link_libraries(imgui_scene_tools_test engine - simple_scene + organizer_scene opengl_renderer_s imgui_service imgui_render_task @@ -100,7 +100,6 @@ target_include_directories(imgui_text_edit_test PRIVATE ".") target_link_libraries(imgui_text_edit_test engine - simple_scene opengl_renderer_s imgui_service imgui_render_task diff --git a/framework/imgui/test/scene_tools_test.cpp b/framework/imgui/test/scene_tools_test.cpp index 259de0c..225b8df 100644 --- a/framework/imgui/test/scene_tools_test.cpp +++ b/framework/imgui/test/scene_tools_test.cpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include #include @@ -31,10 +31,10 @@ TEST(imgui_scene_tools, it) { engine.addService(argv0, "imgui_scene_tools_test"); ASSERT_TRUE(engine.enableService()); - engine.addService(); - ASSERT_TRUE(engine.enableService()); + engine.addService(); + ASSERT_TRUE(engine.enableService()); - bool provide_ret = engine.provide(); + bool provide_ret = engine.provide(); ASSERT_TRUE(provide_ret); engine.addService(); @@ -56,16 +56,12 @@ TEST(imgui_scene_tools, it) { rs.addRenderTask(engine); - //InitializeYojimbo(); - engine.run(); // TODO: clear asset manager sdl_ss.destroyWindow(); - - //ShutdownYojimbo(); } int main(int argc, char** argv) { diff --git a/framework/imgui/test/text_edit_test.cpp b/framework/imgui/test/text_edit_test.cpp index 8607aeb..aaa6935 100644 --- a/framework/imgui/test/text_edit_test.cpp +++ b/framework/imgui/test/text_edit_test.cpp @@ -7,7 +7,6 @@ #include #include -#include #include #include #include @@ -20,8 +19,6 @@ #include #include -#include - static char* argv0; using namespace entt::literals; @@ -55,12 +52,6 @@ TEST(imgui_text_edit, it) { engine.addService(argv0, "imgui_text_edit_test"); ASSERT_TRUE(engine.enableService()); - engine.addService(); - ASSERT_TRUE(engine.enableService()); - - bool provide_ret = engine.provide(); - ASSERT_TRUE(provide_ret); - engine.addService(); ASSERT_TRUE(engine.enableService()); @@ -70,15 +61,11 @@ TEST(imgui_text_edit, it) { engine.addService(); ASSERT_TRUE(engine.enableService()); - engine.addService(); - auto& rs = engine.addService(); ASSERT_TRUE(engine.enableService()); rs.addRenderTask(engine); - ASSERT_TRUE(engine.enableService()); - engine.addService([](MM::Engine& e) { static MM::FileTextEditor fte{e}; fte.renderImGui(); @@ -103,12 +90,6 @@ TEST(imgui_text_edit, shader) { engine.addService(argv0, "imgui_text_edit_test"); ASSERT_TRUE(engine.enableService()); - engine.addService(); - ASSERT_TRUE(engine.enableService()); - - bool provide_ret = engine.provide(); - ASSERT_TRUE(provide_ret); - engine.addService(); ASSERT_TRUE(engine.enableService()); @@ -118,18 +99,11 @@ TEST(imgui_text_edit, shader) { engine.addService(); ASSERT_TRUE(engine.enableService()); - engine.addService(); - auto& rs = engine.addService(); ASSERT_TRUE(engine.enableService()); rs.addRenderTask(engine); - ASSERT_TRUE(engine.enableService()); - - //auto& rc = engine.getScene().ctx(); - //rc.registerRenderer(); - MM::FileTextEditor fte{engine}; MM::FileShaderEditor fse{engine}; engine.addService([&](MM::Engine&) { @@ -142,24 +116,6 @@ TEST(imgui_text_edit, shader) { fse.open("shader/quad_renderer/frag.glsl"); // TODO: a shader to display plx - //{ - //auto& ecs = engine.getScene(); - - //auto& ee = igsts->getEntityEditor(); - //ee.registerTrivial("QuadRenderable"); - //ee.registerComponentCreateFn(ecs.type(), - //[](MM::EngineConfig::ECS& ecs, MM::EngineConfig::Entity e) { - //auto& r = ecs.assign(e); - //r._texture = MM::ResourceManager::ref().get("default"_hs); - //} - //); - //ee.registerComponentWidgetFn(ecs.type(), - //[](MM::EngineConfig::ECS& ecs, MM::EngineConfig::Entity e) { - //auto& r = ecs.get(e); - //MM::ImGuiWidgets::Components::QuadRenderable(r); - //} - //); - //} engine.run(); diff --git a/framework/opengl_renderer/test/CMakeLists.txt b/framework/opengl_renderer/test/CMakeLists.txt index e3461be..6d1e1bc 100644 --- a/framework/opengl_renderer/test/CMakeLists.txt +++ b/framework/opengl_renderer/test/CMakeLists.txt @@ -31,6 +31,8 @@ target_link_libraries(simple_rect_render_task_test simple_velocity_system + random + gtest_main ) @@ -100,6 +102,8 @@ target_link_libraries(blur_render_task_test simple_velocity_system + random + gtest_main ) diff --git a/framework/opengl_renderer/test/batched_spritesheet_render_task_test.cpp b/framework/opengl_renderer/test/batched_spritesheet_render_task_test.cpp index f659aab..31a69d3 100644 --- a/framework/opengl_renderer/test/batched_spritesheet_render_task_test.cpp +++ b/framework/opengl_renderer/test/batched_spritesheet_render_task_test.cpp @@ -4,10 +4,11 @@ #include #include -#include +#include #include #include +#include #include @@ -15,15 +16,29 @@ #include #include +#include #include #include #include "res/textures.zip.h" +#include + using namespace entt::literals; const char* argv0; +void update_spritesheet_animation(entt::view, MM::OpenGL::SpriteSheetRenderable> view, float& accu, const MM::Components::TimeDelta& td) { + accu += td.tickDelta; + + if (accu >= 1.f/10) { + accu -= 1.f/10; + view.each([](auto& spr) { + spr.tile_index = (spr.tile_index+spr.sp.tile_count.x) % (spr.sp.tile_count.x*spr.sp.tile_count.y); + }); + } +} + TEST(batched_spritesheet_render_task, it) { MM::Engine engine; @@ -32,10 +47,10 @@ TEST(batched_spritesheet_render_task, it) { sdl_ss.createGLWindow("batched_spritesheet_render_task_test", 1280, 720); - engine.addService(); - ASSERT_TRUE(engine.enableService()); + engine.addService(); + ASSERT_TRUE(engine.enableService()); - bool provide_ret = engine.provide(); + bool provide_ret = engine.provide(); ASSERT_TRUE(provide_ret); auto& scene = engine.tryService()->getScene(); @@ -54,19 +69,13 @@ TEST(batched_spritesheet_render_task, it) { rs.addRenderTask(engine); - float accu = 0.f; - MM::AddSystemToScene(scene, [&accu](auto& scene, float delta) { - accu += delta; + // setup systems + scene.set(0.f); // accu + auto& org = scene.set(); + org.emplace<&update_spritesheet_animation>("update_spritesheet_animation"); - if (accu >= 1.f/10) { - accu -= 1.f/10; - scene.template view() - .each([](auto, auto& spr) { - spr.tile_index = (spr.tile_index+spr.sp.tile_count.x) % (spr.sp.tile_count.x*spr.sp.tile_count.y); - } - ); - } - }); + // HACK: instead you would switch to this scene + engine.getService().updateOrganizerVertices(scene); auto& rm_t = MM::ResourceManager::ref(); ASSERT_TRUE(rm_t.load("anim_run", engine, "/textures/animation_running-1_ea_0.3.png")); diff --git a/framework/opengl_renderer/test/blur_render_task_test.cpp b/framework/opengl_renderer/test/blur_render_task_test.cpp index a6bfe7f..9e244a8 100644 --- a/framework/opengl_renderer/test/blur_render_task_test.cpp +++ b/framework/opengl_renderer/test/blur_render_task_test.cpp @@ -4,11 +4,12 @@ #include #include -#include +#include #include #include #include +#include #include #include @@ -26,7 +27,7 @@ #include -#include +#include using namespace entt::literals; @@ -40,10 +41,10 @@ TEST(blur_render_task, it) { sdl_ss.createGLWindow("blur_render_task_test", 1280, 720); - engine.addService(); - ASSERT_TRUE(engine.enableService()); + engine.addService(); + ASSERT_TRUE(engine.enableService()); - bool provide_ret = engine.provide(); + bool provide_ret = engine.provide(); ASSERT_TRUE(provide_ret); auto& scene = engine.tryService()->getScene(); @@ -111,9 +112,13 @@ TEST(blur_render_task, it) { // setup v system - MM::AddSystemToScene(scene, MM::Systems::SimpleVelocity); + auto& org = scene.set(); + org.emplace<&MM::Systems::simple_velocity>("simple_velocity"); - std::mt19937 mt(42); + // HACK: instead you would switch to this scene + engine.getService().updateOrganizerVertices(scene); + + MM::Random::SRNG rng{42}; for (int i = 0; i < 10; i++) { auto e = scene.create(); @@ -124,14 +129,10 @@ TEST(blur_render_task, it) { auto& v = scene.emplace(e); v.rotation = float(i) * 0.3f; - if (mt() % 2) { + if (rng.roll(0.5f)) { auto& col = scene.emplace(e); - auto rc = [&mt]() -> float { - return (mt() % 1001) / 1000.f ; - }; - col.color = {rc(),rc(),rc(),1}; + col.color = {rng.zeroToOne(), rng.zeroToOne(), rng.zeroToOne(), 1.f}; } - } engine.run(); diff --git a/framework/opengl_renderer/test/fast_sky_render_task_test.cpp b/framework/opengl_renderer/test/fast_sky_render_task_test.cpp index 6d6d016..e2882c0 100644 --- a/framework/opengl_renderer/test/fast_sky_render_task_test.cpp +++ b/framework/opengl_renderer/test/fast_sky_render_task_test.cpp @@ -4,15 +4,17 @@ #include #include -#include +#include #include #include +#include #include #include #include +#include const char* argv0; @@ -24,10 +26,10 @@ TEST(fast_sky_render_task, it) { sdl_ss.createGLWindow("fast_sky_render_task_test", 1280, 720); - engine.addService(); - ASSERT_TRUE(engine.enableService()); + engine.addService(); + ASSERT_TRUE(engine.enableService()); - bool provide_ret = engine.provide(); + bool provide_ret = engine.provide(); ASSERT_TRUE(provide_ret); auto& scene = engine.tryService()->getScene(); @@ -39,7 +41,13 @@ TEST(fast_sky_render_task, it) { rs.addRenderTask(engine); - MM::AddSystemToScene(scene, MM::Systems::FastSkySun); + // setup systems + auto& org = scene.set(); + org.emplace<&MM::Systems::fast_sky_sun>("fast_sky_sun"); + + // HACK: instead you would switch to this scene + engine.getService().updateOrganizerVertices(scene); + auto& cam = scene.set(); cam.setPerspective(); diff --git a/framework/opengl_renderer/test/simple_rect_render_task_test.cpp b/framework/opengl_renderer/test/simple_rect_render_task_test.cpp index 868f403..cbae391 100644 --- a/framework/opengl_renderer/test/simple_rect_render_task_test.cpp +++ b/framework/opengl_renderer/test/simple_rect_render_task_test.cpp @@ -1,4 +1,3 @@ -#include "entt/entity/fwd.hpp" #include #include @@ -9,6 +8,7 @@ #include #include +#include #include @@ -17,7 +17,7 @@ #include -#include +#include const char* argv0; @@ -46,10 +46,12 @@ TEST(simple_rect_render_task, it) { // setup v system auto& org = scene.set(); + org.emplace<&MM::Systems::simple_velocity>("simple_velocity"); - //MM::AddSystemToScene(scene, MM::Systems::SimpleVelocity); + // HACK: instead you would switch to this scene + engine.getService().updateOrganizerVertices(scene); - std::mt19937 mt(42); + MM::Random::SRNG rng{42}; for (int y = 0; y < 10; y++) { for (int i = 0; i < 10; i++) { @@ -62,14 +64,10 @@ TEST(simple_rect_render_task, it) { auto& v = scene.emplace(e); v.rotation = i * 0.3f; - if (mt() % 2) { + if (rng.roll(0.5f)) { auto& col = scene.emplace(e); - auto rc = [&mt]() -> float { - return (mt() % 1001) / 1000.f ; - }; - col.color = {rc(),rc(),rc(),1}; + col.color = {rng.zeroToOne(), rng.zeroToOne(), rng.zeroToOne(), 1.f}; } - } } diff --git a/framework/opengl_renderer/test/simple_sprite_render_task_test.cpp b/framework/opengl_renderer/test/simple_sprite_render_task_test.cpp index 1d467cf..0d098b1 100644 --- a/framework/opengl_renderer/test/simple_sprite_render_task_test.cpp +++ b/framework/opengl_renderer/test/simple_sprite_render_task_test.cpp @@ -4,10 +4,11 @@ #include #include -#include +#include #include #include +#include #include @@ -31,10 +32,10 @@ TEST(simple_sprite_render_task, it) { sdl_ss.createGLWindow("simple_sprite_render_task_test", 1280, 720); - engine.addService(); - ASSERT_TRUE(engine.enableService()); + engine.addService(); + ASSERT_TRUE(engine.enableService()); - bool provide_ret = engine.provide(); + bool provide_ret = engine.provide(); ASSERT_TRUE(provide_ret); auto& scene = engine.tryService()->getScene(); @@ -47,7 +48,11 @@ TEST(simple_sprite_render_task, it) { rs.addRenderTask(engine); // setup v system - MM::AddSystemToScene(scene, MM::Systems::SimpleVelocity); + auto& org = scene.set(); + org.emplace<&MM::Systems::simple_velocity>("simple_velocity"); + + // HACK: instead you would switch to this scene + engine.getService().updateOrganizerVertices(scene); auto& rm_t = MM::ResourceManager::ref(); diff --git a/framework/opengl_renderer/test/simple_spritesheet_render_task_test.cpp b/framework/opengl_renderer/test/simple_spritesheet_render_task_test.cpp index ddf8217..936cc3f 100644 --- a/framework/opengl_renderer/test/simple_spritesheet_render_task_test.cpp +++ b/framework/opengl_renderer/test/simple_spritesheet_render_task_test.cpp @@ -4,10 +4,11 @@ #include #include -#include +#include #include #include +#include #include @@ -15,6 +16,7 @@ #include #include +#include #include #include @@ -22,6 +24,17 @@ using namespace entt::literals; +void update_spritesheet_animation(entt::view, MM::OpenGL::SpriteSheetRenderable> view, float& accu, const MM::Components::TimeDelta& td) { + accu += td.tickDelta; + + if (accu >= 1.f/10) { + accu -= 1.f/10; + view.each([](auto& spr) { + spr.tile_index = (spr.tile_index+spr.sp.tile_count.x) % (spr.sp.tile_count.x*spr.sp.tile_count.y); + }); + } +} + TEST(simple_spritesheet_render_task, it) { MM::Engine engine; @@ -30,10 +43,10 @@ TEST(simple_spritesheet_render_task, it) { sdl_ss.createGLWindow("simple_spritesheet_render_task_test", 1280, 720); - engine.addService(); - ASSERT_TRUE(engine.enableService()); + engine.addService(); + ASSERT_TRUE(engine.enableService()); - bool provide_ret = engine.provide(); + bool provide_ret = engine.provide(); ASSERT_TRUE(provide_ret); auto& scene = engine.tryService()->getScene(); @@ -52,19 +65,13 @@ TEST(simple_spritesheet_render_task, it) { rs.addRenderTask(engine); - float accu = 0.f; - MM::AddSystemToScene(scene, [&accu](auto& scene, float delta) { - accu += delta; + // setup systems + scene.set(0.f); // accu + auto& org = scene.set(); + org.emplace<&update_spritesheet_animation>("update_spritesheet_animation"); - if (accu >= 1.f/10) { - accu -= 1.f/10; - scene.template view() - .each([](auto, auto& spr) { - spr.tile_index = (spr.tile_index+spr.sp.tile_count.x) % (spr.sp.tile_count.x*spr.sp.tile_count.y); - } - ); - } - }); + // HACK: instead you would switch to this scene + engine.getService().updateOrganizerVertices(scene); auto& rm_t = MM::ResourceManager::ref(); ASSERT_TRUE(rm_t.load("anim_run", engine, "/textures/animation_running-1_ea_0.3.png")); diff --git a/framework/opengl_renderer/test/tilemap_render_task_test.cpp b/framework/opengl_renderer/test/tilemap_render_task_test.cpp index 402a7d2..7b7ccca 100644 --- a/framework/opengl_renderer/test/tilemap_render_task_test.cpp +++ b/framework/opengl_renderer/test/tilemap_render_task_test.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include @@ -27,10 +27,10 @@ TEST(tilemap_render_task_test, it) { sdl_ss.createGLWindow("tilemap_render_task_test", 1280, 720); - engine.addService(); - ASSERT_TRUE(engine.enableService()); + engine.addService(); + ASSERT_TRUE(engine.enableService()); - bool provide_ret = engine.provide(); + bool provide_ret = engine.provide(); ASSERT_TRUE(provide_ret); auto& scene = engine.tryService()->getScene(); diff --git a/framework/random/src/mm/random/srng.hpp b/framework/random/src/mm/random/srng.hpp index 7899461..6eff526 100644 --- a/framework/random/src/mm/random/srng.hpp +++ b/framework/random/src/mm/random/srng.hpp @@ -7,6 +7,10 @@ namespace MM::Random { // Seeded (Pseudo-) Random Number Generator struct SRNG { + // make shuffle compat + // TODO: add more type info + using result_type = uint32_t; + uint32_t seed = 1337; int32_t pos = 0; diff --git a/screens/CMakeLists.txt b/screens/CMakeLists.txt index a8d6b10..2db0498 100644 --- a/screens/CMakeLists.txt +++ b/screens/CMakeLists.txt @@ -2,6 +2,6 @@ cmake_minimum_required(VERSION 3.2) project(screens CXX) if(NOT MM_HEADLESS) - #add_subdirectory(mm_logo) + add_subdirectory(mm_logo) endif() diff --git a/screens/mm_logo/CMakeLists.txt b/screens/mm_logo/CMakeLists.txt index 3aa30d4..898165f 100644 --- a/screens/mm_logo/CMakeLists.txt +++ b/screens/mm_logo/CMakeLists.txt @@ -21,6 +21,8 @@ target_link_libraries(mm_logo_screen simple_sprite_render_task common_components + + random ) #if (BUILD_TESTING) diff --git a/screens/mm_logo/src/mm/screens/mm_logo_screen.cpp b/screens/mm_logo/src/mm/screens/mm_logo_screen.cpp index fcb82db..fb1a461 100644 --- a/screens/mm_logo/src/mm/screens/mm_logo_screen.cpp +++ b/screens/mm_logo/src/mm/screens/mm_logo_screen.cpp @@ -6,6 +6,7 @@ #include #include +#include #include @@ -14,12 +15,60 @@ #include #include +#include #include +#include #include namespace MM::Screens { +namespace Components { + + struct screen_timer { + float accumulator = 0.f; + float duration = 0.f; + std::string next_screen; + }; + + struct easing { + glm::vec2 start{0.f, 0.f}; + glm::vec2 end{0.f, 0.f}; + + float accumulator = 0.f; + float duration = 1.f; + }; + +} // Components + +namespace Systems { + + void screen_timer_system(Components::screen_timer& sc_timer, const MM::Components::TimeDelta& td, const MM::Engine* engine) { + sc_timer.accumulator += td.tickDelta; + if (sc_timer.accumulator >= sc_timer.duration) { + engine->getService().queueChangeScreenTo(sc_timer.next_screen); + } + } + + // elastic scale easing + void elasic_scale_easing(entt::view, MM::Components::Transform2D, Components::easing> view, const MM::Components::TimeDelta& td) { + view.each([&td](auto& t, auto& easing_comp) { + easing_comp.accumulator += td.tickDelta; + + // taken from https://github.com/warrenm/AHEasing + // licensed under WTFPL + auto elasticOut = [](float x) -> float { + return glm::sin(-13.f * glm::half_pi() * (x + 1.f)) * glm::pow(2.f, -10.f * x) + 1.f; + }; + + t.scale.x = glm::mix(easing_comp.start.x, easing_comp.end.x, elasticOut(easing_comp.accumulator / easing_comp.duration)); + t.scale.y = glm::mix(easing_comp.start.y, easing_comp.end.y, elasticOut(easing_comp.accumulator / easing_comp.duration)); + + }); + } + +} // Systems + #include "../res/mush_machine_logo_1.svg.png.h" void create_mm_logo(MM::Engine& engine, MM::Services::ScreenDirector::Screen& screen, @@ -27,14 +76,14 @@ void create_mm_logo(MM::Engine& engine, MM::Services::ScreenDirector::Screen& sc using namespace entt::literals; screen.start_enable.push_back(engine.type()); - screen.start_enable.push_back(engine.type()); + screen.start_enable.push_back(engine.type()); - screen.start_provide.push_back({engine.type(), engine.type()}); + screen.start_provide.push_back({engine.type(), engine.type()}); - screen.end_disable.push_back(engine.type()); + screen.end_disable.push_back(engine.type()); - screen.start_fn = [anim_duration, screen_duration, next_screen](MM::Engine& engine) { - auto& rs = engine.getService(); + screen.start_fn = [anim_duration, screen_duration, next_screen](MM::Engine& _engine) { + auto& rs = _engine.getService(); //rss->renderers.clear(); @@ -47,7 +96,7 @@ void create_mm_logo(MM::Engine& engine, MM::Services::ScreenDirector::Screen& sc } if (!found) { - rs.addRenderTask(engine); + rs.addRenderTask(_engine); } // ================================================= @@ -59,58 +108,18 @@ void create_mm_logo(MM::Engine& engine, MM::Services::ScreenDirector::Screen& sc // ================================================= - engine.getService().changeSceneNow(std::make_unique()); - auto& scene = engine.getService().getScene(); + auto new_scene = std::make_unique(); + auto& scene = *new_scene; - scene.ctx_or_set(&engine); + auto& org = scene.set(); - struct easing { - glm::vec2 start{0.f, 0.f}; - glm::vec2 end{0.f, 0.f}; + scene.set(&_engine); - float accumulator = 0.f; - float duration = 1.f; - }; + scene.set(0.f, screen_duration, next_screen); - struct screen_timer { - float accumulator = 0.f; - }; + org.emplace<&Systems::screen_timer_system>("screen_timer_system"); - MM::AddSystemToScene(scene, [screen_duration, next_screen](MM::Scene& scene, float delta) { - auto& sc_timer = scene.ctx(); - sc_timer.accumulator += delta; - - if (sc_timer.accumulator >= screen_duration) { - scene.ctx()->getService().queueChangeScreenTo(next_screen); - } - }); - scene.set(); - - // elastic scale easing - MM::AddSystemToScene(scene, [](MM::Scene& scene, float delta) { - auto view = scene.view(); - - for (auto& e : view) { - auto& t = view.get(e); - auto& easing_comp = view.get(e); - easing_comp.accumulator += delta; - - //auto elasticOut = [](float x) -> float { - //const float c4 = (2.f * glm::pi()) / 3.f; - //return x <= 0.f ? 0.f : x >= 1.f ? 1.f // limit output to [0,1] - //: glm::pow(2.f, -10.f * x) * glm::sin((x * 10.f - 0.75f) * c4) + 1.f; - //}; - // taken from https://github.com/warrenm/AHEasing - // licensed under WTFPL - auto elasticOut = [](float x) -> float { - return glm::sin(-13.f * glm::half_pi() * (x + 1.f)) * glm::pow(2.f, -10.f * x) + 1.f; - }; - - t.scale.x = glm::mix(easing_comp.start.x, easing_comp.end.x, elasticOut(easing_comp.accumulator / easing_comp.duration)); - t.scale.y = glm::mix(easing_comp.start.y, easing_comp.end.y, elasticOut(easing_comp.accumulator / easing_comp.duration)); - - } - }); + org.emplace<&Systems::elasic_scale_easing>("elasic_scale_easing"); auto& cam = scene.set(); cam.horizontalViewPortSize = 89.f; @@ -122,7 +131,7 @@ void create_mm_logo(MM::Engine& engine, MM::Services::ScreenDirector::Screen& sc auto& t = scene.emplace(e_logo); t.scale = {0,0}; - auto& easing_comp = scene.emplace(e_logo); + auto& easing_comp = scene.emplace(e_logo); easing_comp.start = {0.f, 0.f}; easing_comp.end = {50.f * 1.12609649122807017543f, 50.f}; easing_comp.duration = anim_duration; @@ -152,19 +161,21 @@ void create_mm_logo(MM::Engine& engine, MM::Services::ScreenDirector::Screen& sc 1.f, }; - std::mt19937_64 mt{std::random_device{}()}; + //std::mt19937_64 mt{std::random_device{}()}; + MM::Random::SRNG rng{std::random_device{}(), 0}; std::vector colors {color1, color2, color3}; - std::shuffle(colors.begin(), colors.end(), mt); + std::shuffle(colors.begin(), colors.end(), rng); auto& col = scene.emplace(e_logo); col.color = {colors.front(), 1.f}; } + _engine.getService().changeSceneNow(std::move(new_scene)); }; - screen.end_fn = [](MM::Engine& engine) { - engine.getService().changeSceneNow(std::make_unique()); + screen.end_fn = [](MM::Engine& _engine) { + _engine.getService().changeSceneNow(std::make_unique()); }; } diff --git a/systems/CMakeLists.txt b/systems/CMakeLists.txt index 5da2891..f1876a0 100644 --- a/systems/CMakeLists.txt +++ b/systems/CMakeLists.txt @@ -4,7 +4,7 @@ project(systems CXX) add_subdirectory(simple_velocity) if(NOT MM_HEADLESS) - #add_subdirectory(player_velocity) - #add_subdirectory(fast_sky_sun) + add_subdirectory(player_velocity) + add_subdirectory(fast_sky_sun) endif() diff --git a/systems/fast_sky_sun/CMakeLists.txt b/systems/fast_sky_sun/CMakeLists.txt index 3913b5e..03ad879 100644 --- a/systems/fast_sky_sun/CMakeLists.txt +++ b/systems/fast_sky_sun/CMakeLists.txt @@ -11,6 +11,7 @@ target_include_directories(fast_sky_sun_system PUBLIC "${CMAKE_CURRENT_SOURCE_DI target_link_libraries(fast_sky_sun_system engine fast_sky_render_task + common_components ) if(EMSCRIPTEN) diff --git a/systems/fast_sky_sun/src/mm/systems/fast_sky_sun_system.cpp b/systems/fast_sky_sun/src/mm/systems/fast_sky_sun_system.cpp index cd8b48d..b3f9327 100644 --- a/systems/fast_sky_sun/src/mm/systems/fast_sky_sun_system.cpp +++ b/systems/fast_sky_sun/src/mm/systems/fast_sky_sun_system.cpp @@ -2,6 +2,8 @@ #include +#include + #include #include @@ -10,10 +12,8 @@ namespace MM::Systems { -void FastSkySun(Scene& scene, float delta) { - auto& sky_ctx = scene.ctx(); - - sky_ctx.time += delta * 0.2f; +void fast_sky_sun(MM::OpenGL::RenderTasks::FastSkyContext& sky_ctx, const MM::Components::TimeDelta& delta) { + sky_ctx.time += delta.tickDelta * 0.2f; sky_ctx.fsun.y = glm::sin(sky_ctx.time * 0.01f); sky_ctx.fsun.z = glm::cos(sky_ctx.time * 0.01f); diff --git a/systems/fast_sky_sun/src/mm/systems/fast_sky_sun_system.hpp b/systems/fast_sky_sun/src/mm/systems/fast_sky_sun_system.hpp index e45a4ca..682e724 100644 --- a/systems/fast_sky_sun/src/mm/systems/fast_sky_sun_system.hpp +++ b/systems/fast_sky_sun/src/mm/systems/fast_sky_sun_system.hpp @@ -2,10 +2,18 @@ #include +// fwd +namespace MM::OpenGL::RenderTasks { + struct FastSkyContext; +} +namespace MM::Components { + struct TimeDelta; +} + namespace MM::Systems { // this system updates time and sun depending on time with the time delta - void FastSkySun(Scene& scene, float delta); + void fast_sky_sun(MM::OpenGL::RenderTasks::FastSkyContext& c, const MM::Components::TimeDelta& delta); } // MM::Systems diff --git a/systems/player_velocity/src/mm/systems/player_velocity2d_system.cpp b/systems/player_velocity/src/mm/systems/player_velocity2d_system.cpp index b5d9b74..ae786a2 100644 --- a/systems/player_velocity/src/mm/systems/player_velocity2d_system.cpp +++ b/systems/player_velocity/src/mm/systems/player_velocity2d_system.cpp @@ -2,34 +2,28 @@ #include -#include - -#include - #include namespace MM::Systems { - void PlayerVelocity2D(Scene& scene, float) { - ZoneScopedN("MM::Systems::PlayerVelocity2D"); - MM::Engine* engine_ptr = scene.ctx(); - auto& input_ss = engine_ptr->getService(); +void player_velocity2d(entt::view, MM::Input::PlayerID, MM::Components::Velocity2D> view, const MM::Engine* engine) { + ZoneScopedN("MM::Systems::PlayerVelocity2D"); - scene.view().each( - [&input_ss](const MM::Input::PlayerID p_id, MM::Components::Velocity2D& v) { - //const float movement_speed = 8.f; // apply via post processing + auto& input_ss = engine->getService(); - auto vec_force = input_ss.getMoveForce(p_id); + view.each([&input_ss](const MM::Input::PlayerID p_id, MM::Components::Velocity2D& v) { + //const float movement_speed = 8.f; // apply via post processing - if (vec_force >= 0.01f) { - v.velocity = input_ss.getMoveVec(p_id); - v.velocity *= vec_force; - //v.velocity *= movement_speed; - } else { - v.velocity = {0.f, 0.f}; - } - } - ); - } + auto vec_force = input_ss.getMoveForce(p_id); + + if (vec_force >= 0.01f) { + v.velocity = input_ss.getMoveVec(p_id); + //v.velocity *= vec_force; + } else { + v.velocity = {0.f, 0.f}; + } + }); } +} // MM::Systems + diff --git a/systems/player_velocity/src/mm/systems/player_velocity2d_system.hpp b/systems/player_velocity/src/mm/systems/player_velocity2d_system.hpp index 2be382a..7b038c3 100644 --- a/systems/player_velocity/src/mm/systems/player_velocity2d_system.hpp +++ b/systems/player_velocity/src/mm/systems/player_velocity2d_system.hpp @@ -1,13 +1,14 @@ #pragma once -//#include #include +#include +#include +#include namespace MM::Systems { - // this system transforms the input from the input_ss into velocity - // uses Components::Velocity2D, PlayerID - void PlayerVelocity2D(Scene& scene, float delta); + // this system transforms the input from the input_service into velocity + void player_velocity2d(entt::view, MM::Input::PlayerID, MM::Components::Velocity2D> view, const MM::Engine* engine); } // MM::Systems diff --git a/systems/player_velocity/test/CMakeLists.txt b/systems/player_velocity/test/CMakeLists.txt index 123b6df..6918fed 100644 --- a/systems/player_velocity/test/CMakeLists.txt +++ b/systems/player_velocity/test/CMakeLists.txt @@ -6,7 +6,7 @@ target_include_directories(player_velocity_test PRIVATE ".") target_link_libraries(player_velocity_test player_velocity_system - simple_scene + organizer_scene gtest_main ) diff --git a/systems/player_velocity/test/player_velocity_test.cpp b/systems/player_velocity/test/player_velocity_test.cpp index 33c905e..8195e07 100644 --- a/systems/player_velocity/test/player_velocity_test.cpp +++ b/systems/player_velocity/test/player_velocity_test.cpp @@ -3,9 +3,10 @@ #include #include #include -#include +#include #include +#include #include @@ -19,16 +20,21 @@ TEST(player_velocity, basic_run) { engine.addService(); ASSERT_TRUE(engine.enableService()); - engine.addService(delta); - ASSERT_TRUE(engine.enableService()); + engine.addService(delta); + ASSERT_TRUE(engine.enableService()); - bool provide_ret = engine.provide(); + bool provide_ret = engine.provide(); ASSERT_TRUE(provide_ret); auto& scene = engine.tryService()->getScene(); // setup v system - MM::AddSystemToScene(scene, MM::Systems::PlayerVelocity2D); + auto& org = scene.set(); + org.emplace<&MM::Systems::player_velocity2d>("player_velocity2d"); + + // HACK: instead you would switch to this scene + engine.getService().updateOrganizerVertices(scene); + //auto [e, t, v] = scene.create(); //t.position = { 0.f, 0.f };