From 771ab9008aba1bb713a4ffa247bdf603ff636bd4 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Mon, 20 Jan 2020 15:34:00 +0700 Subject: [PATCH 1/6] rename sample scene prefabs --- .../{scene_prefab.json => sample_04.json} | 22 ++++++++++++++++++- ...spine_scene_prefab.json => sample_06.json} | 16 +++++++++++++- samples/sources/sample_04/sample_04.cpp | 4 +++- samples/sources/sample_06/sample_06.cpp | 2 +- samples/sources/sample_07/sample_07.cpp | 2 ++ 5 files changed, 42 insertions(+), 4 deletions(-) rename samples/bin/library/scenes/{scene_prefab.json => sample_04.json} (75%) rename samples/bin/library/scenes/{spine_scene_prefab.json => sample_06.json} (65%) diff --git a/samples/bin/library/scenes/scene_prefab.json b/samples/bin/library/scenes/sample_04.json similarity index 75% rename from samples/bin/library/scenes/scene_prefab.json rename to samples/bin/library/scenes/sample_04.json index 6a0c19ed..84f48cb3 100644 --- a/samples/bin/library/scenes/scene_prefab.json +++ b/samples/bin/library/scenes/sample_04.json @@ -3,13 +3,21 @@ "scene" : {} }, "children" : [{ - "prototype" : "../prefabs/camera_prefab.json" + "prototype" : "../prefabs/camera_prefab.json", + "components" : { + "named" : { + "name" : "camera" + } + } },{ "prototype" : "../prefabs/gnome_prefab.json", "components" : { "actor" : { "translation" : [0,0], "scale" : 20 + }, + "named" : { + "name" : "gnome" } } }, { @@ -20,6 +28,9 @@ }, "actor" : { "translation" : [-50,-50] + }, + "named" : { + "name" : "ship(1)" } } }, { @@ -30,6 +41,9 @@ }, "actor" : { "translation" : [50,-50] + }, + "named" : { + "name" : "ship(2)" } } }, { @@ -44,6 +58,9 @@ "actor" : { "translation" : [0,180], "scale" : 3 + }, + "named" : { + "name" : "label(1)" } } }, { @@ -58,6 +75,9 @@ "actor" : { "translation" : [0.5,-180.5], "scale" : 3 + }, + "named" : { + "name" : "label(2)" } } }] diff --git a/samples/bin/library/scenes/spine_scene_prefab.json b/samples/bin/library/scenes/sample_06.json similarity index 65% rename from samples/bin/library/scenes/spine_scene_prefab.json rename to samples/bin/library/scenes/sample_06.json index 5254139b..3bdff06b 100644 --- a/samples/bin/library/scenes/spine_scene_prefab.json +++ b/samples/bin/library/scenes/sample_06.json @@ -3,13 +3,21 @@ "scene" : {} }, "children" : [{ - "prototype" : "../prefabs/camera_prefab.json" + "prototype" : "../prefabs/camera_prefab.json", + "components" : { + "named" : { + "name" : "camera" + } + } },{ "prototype" : "../prefabs/coin_prefab.json", "components" : { "actor" : { "translation" : [350,250], "scale" : 0.25 + }, + "named" : { + "name" : "coin" } } }, { @@ -18,6 +26,9 @@ "actor" : { "translation" : [300,-350], "scale" : 0.25 + }, + "named" : { + "name" : "raptor" } } }, { @@ -26,6 +37,9 @@ "actor" : { "translation" : [-100,0], "scale" : 0.9 + }, + "named" : { + "name" : "dragon" } } }] diff --git a/samples/sources/sample_04/sample_04.cpp b/samples/sources/sample_04/sample_04.cpp index 57da8de3..7c6967de 100644 --- a/samples/sources/sample_04/sample_04.cpp +++ b/samples/sources/sample_04/sample_04.cpp @@ -59,7 +59,7 @@ namespace } private: bool create_scene() { - auto scene_prefab_res = the().load_asset("scenes/scene_prefab.json"); + auto scene_prefab_res = the().load_asset("scenes/sample_04.json"); auto scene_go = scene_prefab_res ? the().instantiate(scene_prefab_res->content()) : gobject(); @@ -79,6 +79,8 @@ namespace int e2d_main(int argc, char *argv[]) { const auto starter_params = starter::parameters( engine::parameters("sample_04", "enduro2d") + .window_params(engine::window_parameters() + .size({1024, 768})) .timer_params(engine::timer_parameters() .maximal_framerate(100))); modules::initialize(argc, argv, starter_params).start(); diff --git a/samples/sources/sample_06/sample_06.cpp b/samples/sources/sample_06/sample_06.cpp index 2f676fcd..c38a4f56 100644 --- a/samples/sources/sample_06/sample_06.cpp +++ b/samples/sources/sample_06/sample_06.cpp @@ -97,7 +97,7 @@ namespace } private: bool create_scene() { - auto scene_prefab_res = the().load_asset("scenes/spine_scene_prefab.json"); + auto scene_prefab_res = the().load_asset("scenes/sample_06.json"); auto scene_go = scene_prefab_res ? the().instantiate(scene_prefab_res->content()) : gobject(); diff --git a/samples/sources/sample_07/sample_07.cpp b/samples/sources/sample_07/sample_07.cpp index 5347f222..f6fe1bb0 100644 --- a/samples/sources/sample_07/sample_07.cpp +++ b/samples/sources/sample_07/sample_07.cpp @@ -79,6 +79,8 @@ namespace int e2d_main(int argc, char *argv[]) { const auto starter_params = starter::parameters( engine::parameters("sample_07", "enduro2d") + .window_params(engine::window_parameters() + .size({1024, 768})) .timer_params(engine::timer_parameters() .maximal_framerate(100))); modules::initialize(argc, argv, starter_params).start(); From aa0d0fda15337fbcf4332bdca075b40bc2289496 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Tue, 21 Jan 2020 03:32:32 +0700 Subject: [PATCH 2/6] separate ecs render event by cameras --- headers/enduro2d/high/_all.hpp | 2 + headers/enduro2d/high/_high.hpp | 2 + headers/enduro2d/high/systems/_systems.hpp | 16 ++- .../enduro2d/high/systems/frame_system.hpp | 32 +++++ .../enduro2d/high/systems/world_system.hpp | 26 ++++ samples/sources/sample_00/sample_00.cpp | 2 + samples/sources/sample_01/sample_01.cpp | 2 + samples/sources/sample_02/sample_02.cpp | 2 + samples/sources/sample_03/sample_03.cpp | 6 +- samples/sources/sample_04/sample_04.cpp | 4 +- samples/sources/sample_05/sample_05.cpp | 2 + samples/sources/sample_06/sample_06.cpp | 4 +- samples/sources/sample_07/sample_07.cpp | 4 +- sources/enduro2d/high/starter.cpp | 62 ++-------- .../enduro2d/high/systems/flipbook_system.cpp | 6 +- .../enduro2d/high/systems/frame_system.cpp | 114 ++++++++++++++++++ .../enduro2d/high/systems/label_system.cpp | 6 +- .../enduro2d/high/systems/render_system.cpp | 43 ++----- .../enduro2d/high/systems/script_system.cpp | 8 +- .../enduro2d/high/systems/spine_system.cpp | 6 +- .../enduro2d/high/systems/world_system.cpp | 47 ++++++++ 21 files changed, 289 insertions(+), 107 deletions(-) create mode 100644 headers/enduro2d/high/systems/frame_system.hpp create mode 100644 headers/enduro2d/high/systems/world_system.hpp create mode 100644 sources/enduro2d/high/systems/frame_system.cpp create mode 100644 sources/enduro2d/high/systems/world_system.cpp diff --git a/headers/enduro2d/high/_all.hpp b/headers/enduro2d/high/_all.hpp index 5de944b3..6d142acc 100644 --- a/headers/enduro2d/high/_all.hpp +++ b/headers/enduro2d/high/_all.hpp @@ -44,10 +44,12 @@ #include "components/sprite_renderer.hpp" #include "systems/flipbook_system.hpp" +#include "systems/frame_system.hpp" #include "systems/label_system.hpp" #include "systems/render_system.hpp" #include "systems/script_system.hpp" #include "systems/spine_system.hpp" +#include "systems/world_system.hpp" #include "address.hpp" #include "asset.hpp" diff --git a/headers/enduro2d/high/_high.hpp b/headers/enduro2d/high/_high.hpp index bd21cd71..d58b674c 100644 --- a/headers/enduro2d/high/_high.hpp +++ b/headers/enduro2d/high/_high.hpp @@ -62,10 +62,12 @@ namespace e2d class sprite_renderer; class flipbook_system; + class frame_system; class label_system; class render_system; class script_system; class spine_system; + class world_system; template < typename Asset, typename Content > class content_asset; diff --git a/headers/enduro2d/high/systems/_systems.hpp b/headers/enduro2d/high/systems/_systems.hpp index 66c0e587..99b65c11 100644 --- a/headers/enduro2d/high/systems/_systems.hpp +++ b/headers/enduro2d/high/systems/_systems.hpp @@ -25,10 +25,20 @@ namespace e2d::systems f32 time{0.f}; }; - struct render_event {}; - struct pre_render_event {}; - struct post_render_event {}; + struct render_event { + ecs::const_entity cam_e; + }; + struct pre_render_event { + ecs::const_entity cam_e; + }; + + struct post_render_event { + ecs::const_entity cam_e; + }; + + struct frame_update_event {}; + struct frame_render_event {}; struct frame_finalize_event {}; using update_system = ecs::system; diff --git a/headers/enduro2d/high/systems/frame_system.hpp b/headers/enduro2d/high/systems/frame_system.hpp new file mode 100644 index 00000000..7ebe38e2 --- /dev/null +++ b/headers/enduro2d/high/systems/frame_system.hpp @@ -0,0 +1,32 @@ +/******************************************************************************* + * This file is part of the "Enduro2D" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com) + ******************************************************************************/ + +#pragma once + +#include "_systems.hpp" + +namespace e2d +{ + class frame_system final + : public ecs::system< + ecs::after, + ecs::after> { + public: + frame_system(); + ~frame_system() noexcept; + + void process( + ecs::registry& owner, + const ecs::after& trigger) override; + + void process( + ecs::registry& owner, + const ecs::after& trigger) override; + private: + class internal_state; + std::unique_ptr state_; + }; +} diff --git a/headers/enduro2d/high/systems/world_system.hpp b/headers/enduro2d/high/systems/world_system.hpp new file mode 100644 index 00000000..9f6c7906 --- /dev/null +++ b/headers/enduro2d/high/systems/world_system.hpp @@ -0,0 +1,26 @@ +/******************************************************************************* + * This file is part of the "Enduro2D" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com) + ******************************************************************************/ + +#pragma once + +#include "_systems.hpp" + +namespace e2d +{ + class world_system final + : public ecs::system> { + public: + world_system(); + ~world_system() noexcept; + + void process( + ecs::registry& owner, + const ecs::after& trigger) override; + private: + class internal_state; + std::unique_ptr state_; + }; +} diff --git a/samples/sources/sample_00/sample_00.cpp b/samples/sources/sample_00/sample_00.cpp index 475374d9..e9e74212 100644 --- a/samples/sources/sample_00/sample_00.cpp +++ b/samples/sources/sample_00/sample_00.cpp @@ -212,6 +212,8 @@ namespace int e2d_main(int argc, char *argv[]) { auto params = engine::parameters("sample_00", "enduro2d") + .window_params(engine::window_parameters() + .size({1024, 768})) .timer_params(engine::timer_parameters() .maximal_framerate(100)); modules::initialize(argc, argv, params).start(); diff --git a/samples/sources/sample_01/sample_01.cpp b/samples/sources/sample_01/sample_01.cpp index 7259897a..1c825d0c 100644 --- a/samples/sources/sample_01/sample_01.cpp +++ b/samples/sources/sample_01/sample_01.cpp @@ -272,6 +272,8 @@ namespace int e2d_main(int argc, char *argv[]) { auto params = engine::parameters("sample_01", "enduro2d") + .window_params(engine::window_parameters() + .size({1024, 768})) .timer_params(engine::timer_parameters() .maximal_framerate(100)); modules::initialize(argc, argv, params).start(); diff --git a/samples/sources/sample_02/sample_02.cpp b/samples/sources/sample_02/sample_02.cpp index 7878d72b..62bccd06 100644 --- a/samples/sources/sample_02/sample_02.cpp +++ b/samples/sources/sample_02/sample_02.cpp @@ -254,6 +254,8 @@ namespace int e2d_main(int argc, char *argv[]) { auto params = engine::parameters("sample_02", "enduro2d") + .window_params(engine::window_parameters() + .size({1024, 768})) .timer_params(engine::timer_parameters() .maximal_framerate(100)); modules::initialize(argc, argv, params).start(); diff --git a/samples/sources/sample_03/sample_03.cpp b/samples/sources/sample_03/sample_03.cpp index 1a88463e..23d41c4d 100644 --- a/samples/sources/sample_03/sample_03.cpp +++ b/samples/sources/sample_03/sample_03.cpp @@ -39,11 +39,11 @@ namespace } }; - class camera_system final : public systems::render_system { + class camera_system final : public systems::post_update_system { public: void process( ecs::registry& owner, - const systems::render_event& event) override + const systems::post_update_event& event) override { E2D_UNUSED(event); owner.for_joined_components( @@ -192,6 +192,8 @@ namespace int e2d_main(int argc, char *argv[]) { const auto starter_params = starter::parameters( engine::parameters("sample_03", "enduro2d") + .window_params(engine::window_parameters() + .size({1024, 768})) .timer_params(engine::timer_parameters() .maximal_framerate(100))); modules::initialize(argc, argv, starter_params).start(); diff --git a/samples/sources/sample_04/sample_04.cpp b/samples/sources/sample_04/sample_04.cpp index 7c6967de..6c07a3dd 100644 --- a/samples/sources/sample_04/sample_04.cpp +++ b/samples/sources/sample_04/sample_04.cpp @@ -32,11 +32,11 @@ namespace } }; - class camera_system final : public systems::render_system { + class camera_system final : public systems::post_update_system { public: void process( ecs::registry& owner, - const systems::render_event& event) override + const systems::post_update_event& event) override { E2D_UNUSED(event); owner.for_joined_components( diff --git a/samples/sources/sample_05/sample_05.cpp b/samples/sources/sample_05/sample_05.cpp index a963c62d..5740be19 100644 --- a/samples/sources/sample_05/sample_05.cpp +++ b/samples/sources/sample_05/sample_05.cpp @@ -79,6 +79,8 @@ namespace int e2d_main(int argc, char *argv[]) { auto params = engine::parameters("sample_05", "enduro2d") + .window_params(engine::window_parameters() + .size({1024, 768})) .timer_params(engine::timer_parameters() .maximal_framerate(100)); modules::initialize(argc, argv, params).start(); diff --git a/samples/sources/sample_06/sample_06.cpp b/samples/sources/sample_06/sample_06.cpp index c38a4f56..5e9579a9 100644 --- a/samples/sources/sample_06/sample_06.cpp +++ b/samples/sources/sample_06/sample_06.cpp @@ -70,11 +70,11 @@ namespace } }; - class camera_system final : public systems::render_system { + class camera_system final : public systems::post_update_system { public: void process( ecs::registry& owner, - const systems::render_event& event) override + const systems::post_update_event& event) override { E2D_UNUSED(event); owner.for_joined_components( diff --git a/samples/sources/sample_07/sample_07.cpp b/samples/sources/sample_07/sample_07.cpp index f6fe1bb0..dce8351c 100644 --- a/samples/sources/sample_07/sample_07.cpp +++ b/samples/sources/sample_07/sample_07.cpp @@ -32,11 +32,11 @@ namespace } }; - class camera_system final : public systems::render_system { + class camera_system final : public systems::post_update_system { public: void process( ecs::registry& owner, - const systems::render_event& event) override + const systems::post_update_event& event) override { E2D_UNUSED(event); owner.for_joined_components( diff --git a/sources/enduro2d/high/starter.cpp b/sources/enduro2d/high/starter.cpp index e9b37ae7..9790f8b6 100644 --- a/sources/enduro2d/high/starter.cpp +++ b/sources/enduro2d/high/starter.cpp @@ -29,10 +29,12 @@ #include #include +#include #include #include #include #include +#include namespace { @@ -54,6 +56,8 @@ namespace ecs::registry_filler(the().registry()) .feature(ecs::feature() .add_system()) + .feature(ecs::feature() + .add_system()) .feature(ecs::feature() .add_system()) .feature(ecs::feature() @@ -61,7 +65,9 @@ namespace .feature(ecs::feature() .add_system()) .feature(ecs::feature() - .add_system()); + .add_system()) + .feature(ecs::feature() + .add_system()); return !application_ || application_->initialize(); } @@ -73,67 +79,19 @@ namespace bool frame_tick() final { E2D_PROFILER_SCOPE("application.frame_tick"); - - world& w = the(); - engine& e = the(); - - const f32 dt = e.delta_time(); - const f32 time = e.time(); - - { - E2D_PROFILER_SCOPE("ecs.pre_update"); - w.registry().process_event(systems::pre_update_event{dt,time}); - } - - { - E2D_PROFILER_SCOPE("ecs.update"); - w.registry().process_event(systems::update_event{dt,time}); - } - - { - E2D_PROFILER_SCOPE("ecs.post_update"); - w.registry().process_event(systems::post_update_event{dt,time}); - } - + the().registry().process_event(systems::frame_update_event{}); return !the().should_close() || (application_ && !application_->on_should_close()); } void frame_render() final { E2D_PROFILER_SCOPE("application.frame_render"); - - world& w = the(); - - { - E2D_PROFILER_SCOPE("ecs.pre_render"); - w.registry().process_event(systems::pre_render_event{}); - } - - { - E2D_PROFILER_SCOPE("ecs.render"); - w.registry().process_event(systems::render_event{}); - } - - { - E2D_PROFILER_SCOPE("ecs.post_render"); - w.registry().process_event(systems::post_render_event{}); - } + the().registry().process_event(systems::frame_render_event{}); } void frame_finalize() final { E2D_PROFILER_SCOPE("application.frame_finalize"); - - world& w = the(); - - { - E2D_PROFILER_SCOPE("ecs.frame_finalize"); - w.registry().process_event(systems::frame_finalize_event{}); - } - - { - E2D_PROFILER_SCOPE("world.finalize_instances"); - w.finalize_instances(); - } + the().registry().process_event(systems::frame_finalize_event{}); } private: starter::application_uptr application_; diff --git a/sources/enduro2d/high/systems/flipbook_system.cpp b/sources/enduro2d/high/systems/flipbook_system.cpp index c79a1730..08a45264 100644 --- a/sources/enduro2d/high/systems/flipbook_system.cpp +++ b/sources/enduro2d/high/systems/flipbook_system.cpp @@ -82,7 +82,7 @@ namespace e2d internal_state() = default; ~internal_state() noexcept = default; - void process(f32 dt, ecs::registry& owner) { + void process_update(f32 dt, ecs::registry& owner) { update_flipbook_timers(dt, owner); update_flipbook_sprites(owner); } @@ -100,7 +100,7 @@ namespace e2d ecs::registry& owner, const ecs::after& trigger) { - E2D_PROFILER_SCOPE("flipbook_system.process"); - state_->process(trigger.event.dt, owner); + E2D_PROFILER_SCOPE("flipbook_system.process_update"); + state_->process_update(trigger.event.dt, owner); } } diff --git a/sources/enduro2d/high/systems/frame_system.cpp b/sources/enduro2d/high/systems/frame_system.cpp new file mode 100644 index 00000000..9efb36bf --- /dev/null +++ b/sources/enduro2d/high/systems/frame_system.cpp @@ -0,0 +1,114 @@ +/******************************************************************************* + * This file is part of the "Enduro2D" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com) + ******************************************************************************/ + +#include + +#include +#include + +namespace +{ + using namespace e2d; + + template < typename Event > + void for_all_cameras(ecs::registry& owner) { + const auto comp = [](const auto& l, const auto& r) noexcept { + return std::get(l).depth() < std::get(r).depth(); + }; + + const auto func = [&owner]( + const ecs::const_entity& e, + const camera&) + { + owner.process_event(Event{e}); + }; + + systems::for_extracted_sorted_components( + owner, + comp, + func, + !ecs::exists>()); + } +} + +namespace e2d +{ + // + // frame_system::internal_state + // + + class frame_system::internal_state final : private noncopyable { + public: + internal_state(engine& e) + : engine_(e) {} + ~internal_state() noexcept = default; + + void process_frame_update(ecs::registry& owner) { + const f32 dt = engine_.delta_time(); + const f32 time = engine_.time(); + + { + E2D_PROFILER_SCOPE("ecs.pre_update"); + owner.process_event(systems::pre_update_event{dt,time}); + } + + { + E2D_PROFILER_SCOPE("ecs.update"); + owner.process_event(systems::update_event{dt,time}); + } + + { + E2D_PROFILER_SCOPE("ecs.post_update"); + owner.process_event(systems::post_update_event{dt,time}); + } + } + + void process_frame_render(ecs::registry& owner) { + { + E2D_PROFILER_SCOPE("ecs.pre_render"); + for_all_cameras(owner); + } + + { + E2D_PROFILER_SCOPE("ecs.render"); + for_all_cameras(owner); + } + + { + E2D_PROFILER_SCOPE("ecs.post_render"); + for_all_cameras(owner); + } + } + private: + engine& engine_; + }; + + // + // frame_system + // + + frame_system::frame_system() + : state_(new internal_state(the())) {} + frame_system::~frame_system() noexcept = default; + + void frame_system::process( + ecs::registry& owner, + const ecs::after& trigger) + { + E2D_UNUSED(trigger); + E2D_PROFILER_SCOPE("frame_system.frame_update"); + state_->process_frame_update(owner); + } + + void frame_system::process( + ecs::registry& owner, + const ecs::after& trigger) + { + E2D_UNUSED(trigger); + E2D_PROFILER_SCOPE("frame_system.process_frame_render"); + state_->process_frame_render(owner); + } +} diff --git a/sources/enduro2d/high/systems/label_system.cpp b/sources/enduro2d/high/systems/label_system.cpp index d0e273d4..9814b504 100644 --- a/sources/enduro2d/high/systems/label_system.cpp +++ b/sources/enduro2d/high/systems/label_system.cpp @@ -378,7 +378,7 @@ namespace e2d internal_state() = default; ~internal_state() noexcept = default; - void process(ecs::registry& owner) { + void process_update(ecs::registry& owner) { update_dirty_labels(owner); } }; @@ -396,7 +396,7 @@ namespace e2d const ecs::after& trigger) { E2D_UNUSED(trigger); - E2D_PROFILER_SCOPE("label_system.process"); - state_->process(owner); + E2D_PROFILER_SCOPE("label_system.process_update"); + state_->process_update(owner); } } diff --git a/sources/enduro2d/high/systems/render_system.cpp b/sources/enduro2d/high/systems/render_system.cpp index 264ee187..0c57c0ce 100644 --- a/sources/enduro2d/high/systems/render_system.cpp +++ b/sources/enduro2d/high/systems/render_system.cpp @@ -21,8 +21,6 @@ namespace using namespace e2d::render_system_impl; void for_all_scenes(drawer::context& ctx, const ecs::registry& owner) { - E2D_PROFILER_SCOPE("render_system.for_all_scenes"); - const auto comp = [](const auto& l, const auto& r) noexcept { return std::get(l).depth() < std::get(r).depth(); }; @@ -43,30 +41,6 @@ namespace func, !ecs::exists>()); } - - void for_all_cameras(drawer& drawer, const ecs::registry& owner) { - E2D_PROFILER_SCOPE("render_system.for_all_cameras"); - - const auto comp = [](const auto& l, const auto& r) noexcept { - return std::get(l).depth() < std::get(r).depth(); - }; - - const auto func = [&drawer, &owner]( - const ecs::const_entity&, - const camera& cam, - const actor& cam_a) - { - drawer.with(cam, cam_a.node(), [&owner](drawer::context& ctx){ - for_all_scenes(ctx, owner); - }); - }; - - systems::for_extracted_sorted_components( - owner, - comp, - func, - !ecs::exists>()); - } } namespace e2d @@ -81,8 +55,16 @@ namespace e2d : drawer_(the(), the(), the(), the()) {} ~internal_state() noexcept = default; - void process(ecs::registry& owner) { - for_all_cameras(drawer_, owner); + void process_render(const ecs::const_entity& cam_e, ecs::registry& owner) { + if ( !cam_e.valid() || !ecs::exists_all()(cam_e) ) { + return; + } + drawer_.with( + cam_e.get_component(), + cam_e.get_component().node(), + [&owner](drawer::context& ctx){ + for_all_scenes(ctx, owner); + }); } private: drawer drawer_; @@ -100,8 +82,7 @@ namespace e2d ecs::registry& owner, const ecs::after& trigger) { - E2D_UNUSED(trigger); - E2D_PROFILER_SCOPE("render_system.process"); - state_->process(owner); + E2D_PROFILER_SCOPE("render_system.process_render"); + state_->process_render(trigger.event.cam_e, owner); } } diff --git a/sources/enduro2d/high/systems/script_system.cpp b/sources/enduro2d/high/systems/script_system.cpp index 4c707596..3e0226de 100644 --- a/sources/enduro2d/high/systems/script_system.cpp +++ b/sources/enduro2d/high/systems/script_system.cpp @@ -94,7 +94,7 @@ namespace e2d } ~internal_state() noexcept = default; - void update_process(ecs::registry& owner) { + void process_update(ecs::registry& owner) { systems::for_extracted_components(owner, [](ecs::entity e, behaviour& b, actor& a){ if ( !a.node() || !a.node()->owner() ) { @@ -125,8 +125,8 @@ namespace e2d const systems::update_event& event) { E2D_UNUSED(event); - E2D_PROFILER_SCOPE("script_system.process"); - state_->update_process(owner); + E2D_PROFILER_SCOPE("script_system.process_update"); + state_->process_update(owner); } void script_system::process( @@ -134,7 +134,7 @@ namespace e2d const ecs::before& trigger) { E2D_UNUSED(trigger); - E2D_PROFILER_SCOPE("script_system.process"); + E2D_PROFILER_SCOPE("script_system.process_events"); state_->process_events(owner); } } diff --git a/sources/enduro2d/high/systems/spine_system.cpp b/sources/enduro2d/high/systems/spine_system.cpp index f46517f5..9d37641e 100644 --- a/sources/enduro2d/high/systems/spine_system.cpp +++ b/sources/enduro2d/high/systems/spine_system.cpp @@ -235,7 +235,7 @@ namespace e2d internal_state() = default; ~internal_state() noexcept = default; - void process(f32 dt, ecs::registry& owner) { + void process_update(f32 dt, ecs::registry& owner) { process_commands(owner); clear_commands(owner); clear_events(owner); @@ -258,7 +258,7 @@ namespace e2d ecs::registry& owner, const ecs::after& trigger) { - E2D_PROFILER_SCOPE("spine_system.process"); - state_->process(trigger.event.dt, owner); + E2D_PROFILER_SCOPE("spine_system.process_update"); + state_->process_update(trigger.event.dt, owner); } } diff --git a/sources/enduro2d/high/systems/world_system.cpp b/sources/enduro2d/high/systems/world_system.cpp new file mode 100644 index 00000000..b18bbdf9 --- /dev/null +++ b/sources/enduro2d/high/systems/world_system.cpp @@ -0,0 +1,47 @@ +/******************************************************************************* + * This file is part of the "Enduro2D" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com) + ******************************************************************************/ + +#include + +#include + +namespace e2d +{ + // + // world_system::internal_state + // + + class world_system::internal_state final : private noncopyable { + public: + internal_state(world& w) + : world_(w) {} + ~internal_state() noexcept = default; + + void process_frame_finalize(ecs::registry& owner) { + E2D_UNUSED(owner); + world_.finalize_instances(); + } + private: + world& world_; + }; + + // + // world_system + // + + world_system::world_system() + : state_(new internal_state(the())) {} + world_system::~world_system() noexcept = default; + + void world_system::process( + ecs::registry& owner, + const ecs::after& trigger) + { + E2D_UNUSED(trigger); + E2D_PROFILER_SCOPE("world_system.process_frame_finalize"); + state_->process_frame_finalize(owner); + } +} From 5ba9b666bd4b0188fea93747dbd5fa4cc2bf1e4e Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Tue, 21 Jan 2020 04:18:39 +0700 Subject: [PATCH 3/6] dummy camera gizmos component --- headers/enduro2d/high/components/camera.hpp | 16 +++++++++ headers/enduro2d/high/components/label.hpp | 3 +- .../bin/library/prefabs/camera_prefab.json | 6 +++- samples/bin/library/scenes/sample_04.json | 7 +--- samples/bin/library/scenes/sample_06.json | 7 +--- sources/enduro2d/high/components/camera.cpp | 36 +++++++++++++++++++ sources/enduro2d/high/starter.cpp | 2 ++ 7 files changed, 62 insertions(+), 15 deletions(-) diff --git a/headers/enduro2d/high/components/camera.hpp b/headers/enduro2d/high/components/camera.hpp index 48162e6c..8ce8e40c 100644 --- a/headers/enduro2d/high/components/camera.hpp +++ b/headers/enduro2d/high/components/camera.hpp @@ -15,6 +15,8 @@ namespace e2d { class camera final { + public: + class gizmos final {}; public: camera() = default; @@ -53,6 +55,20 @@ namespace e2d asset_dependencies& dependencies, const collect_context& ctx) const; }; + + template <> + class factory_loader final : factory_loader<> { + public: + static const char* schema_source; + + bool operator()( + camera::gizmos& component, + const fill_context& ctx) const; + + bool operator()( + asset_dependencies& dependencies, + const collect_context& ctx) const; + }; } namespace e2d diff --git a/headers/enduro2d/high/components/label.hpp b/headers/enduro2d/high/components/label.hpp index 139030ed..3afcb8dc 100644 --- a/headers/enduro2d/high/components/label.hpp +++ b/headers/enduro2d/high/components/label.hpp @@ -18,8 +18,7 @@ namespace e2d { class label final { public: - class dirty final { - }; + class dirty final {}; public: ENUM_HPP_CLASS_DECL(haligns, u8, (left) diff --git a/samples/bin/library/prefabs/camera_prefab.json b/samples/bin/library/prefabs/camera_prefab.json index ae6043da..8ebbb405 100644 --- a/samples/bin/library/prefabs/camera_prefab.json +++ b/samples/bin/library/prefabs/camera_prefab.json @@ -1,7 +1,11 @@ { "components" : { + "named" : { + "name" : "camera" + }, "camera" : { "background" : [1.0, 0.4, 0.0, 1.0] - } + }, + "camera.gizmos" : {} } } diff --git a/samples/bin/library/scenes/sample_04.json b/samples/bin/library/scenes/sample_04.json index 84f48cb3..9ca55ed6 100644 --- a/samples/bin/library/scenes/sample_04.json +++ b/samples/bin/library/scenes/sample_04.json @@ -3,12 +3,7 @@ "scene" : {} }, "children" : [{ - "prototype" : "../prefabs/camera_prefab.json", - "components" : { - "named" : { - "name" : "camera" - } - } + "prototype" : "../prefabs/camera_prefab.json" },{ "prototype" : "../prefabs/gnome_prefab.json", "components" : { diff --git a/samples/bin/library/scenes/sample_06.json b/samples/bin/library/scenes/sample_06.json index 3bdff06b..44fa4f7e 100644 --- a/samples/bin/library/scenes/sample_06.json +++ b/samples/bin/library/scenes/sample_06.json @@ -3,12 +3,7 @@ "scene" : {} }, "children" : [{ - "prototype" : "../prefabs/camera_prefab.json", - "components" : { - "named" : { - "name" : "camera" - } - } + "prototype" : "../prefabs/camera_prefab.json" },{ "prototype" : "../prefabs/coin_prefab.json", "components" : { diff --git a/sources/enduro2d/high/components/camera.cpp b/sources/enduro2d/high/components/camera.cpp index 4ce0952d..1523f91e 100644 --- a/sources/enduro2d/high/components/camera.cpp +++ b/sources/enduro2d/high/components/camera.cpp @@ -76,11 +76,47 @@ namespace e2d } } +namespace e2d +{ + const char* factory_loader::schema_source = R"json({ + "type" : "object", + "required" : [], + "additionalProperties" : false, + "properties" : {} + })json"; + + bool factory_loader::operator()( + camera::gizmos& component, + const fill_context& ctx) const + { + E2D_UNUSED(component, ctx); + return true; + } + + bool factory_loader::operator()( + asset_dependencies& dependencies, + const collect_context& ctx) const + { + E2D_UNUSED(dependencies, ctx); + return true; + } +} + namespace e2d { const char* component_inspector::title = "camera"; void component_inspector::operator()(gcomponent& c) const { + if ( bool gizmos = c.owner().component().exists(); + ImGui::Checkbox("gizmos", &gizmos) ) + { + if ( gizmos ) { + c.owner().component().ensure(); + } else { + c.owner().component().remove(); + } + } + if ( i32 depth = c->depth(); ImGui::DragInt("depth", &depth) ) { diff --git a/sources/enduro2d/high/starter.cpp b/sources/enduro2d/high/starter.cpp index 9790f8b6..251ede53 100644 --- a/sources/enduro2d/high/starter.cpp +++ b/sources/enduro2d/high/starter.cpp @@ -178,6 +178,7 @@ namespace e2d .register_component("actor") .register_component("behaviour") .register_component("camera") + .register_component("camera.gizmos") .register_component("flipbook_player") .register_component