mirror of
https://github.com/MadeOfJelly/MushMachine.git
synced 2025-06-20 03:36:37 +02:00
adopt engine stuff to new update strategy
This commit is contained in:
@ -1,9 +1,11 @@
|
||||
#include "./simple_scene.hpp"
|
||||
#include "spdlog/fmt/bundled/core.h"
|
||||
|
||||
//#include "../systems_container.hpp"
|
||||
|
||||
#include <entt/entity/registry.hpp>
|
||||
|
||||
|
||||
#include <tracy/Tracy.hpp>
|
||||
|
||||
#include <mm/logger.hpp>
|
||||
@ -18,50 +20,61 @@ bool SimpleSceneService::enable(Engine& engine) {
|
||||
_scene->set<MM::Engine*>(&engine);
|
||||
}
|
||||
|
||||
{
|
||||
_f_update_handle = engine.addFixedUpdate([this](Engine& e) { this->sceneFixedUpdate(e); });
|
||||
if (_f_update_handle.expired()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto tmp_lock = _f_update_handle.lock();
|
||||
tmp_lock->priority = 0;
|
||||
}
|
||||
|
||||
{
|
||||
_f_update_changer_handle = engine.addFixedUpdate([this](Engine& e) { this->changeSceneFixedUpdate(e); });
|
||||
if (_f_update_changer_handle.expired()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto tmp_lock = _f_update_changer_handle.lock();
|
||||
tmp_lock->priority = -100;
|
||||
}
|
||||
resetTime();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SimpleSceneService::disable(Engine& engine) {
|
||||
if (!_f_update_handle.expired()) {
|
||||
engine.removeFixedUpdate(_f_update_handle);
|
||||
_f_update_handle.reset();
|
||||
}
|
||||
|
||||
if (!_f_update_changer_handle.expired()) {
|
||||
engine.removeFixedUpdate(_f_update_changer_handle);
|
||||
_f_update_changer_handle.reset();
|
||||
}
|
||||
void SimpleSceneService::disable(Engine&) {
|
||||
}
|
||||
|
||||
void SimpleSceneService::sceneFixedUpdate(Engine& engine) {
|
||||
std::vector<UpdateStrategies::UpdateCreationInfo> SimpleSceneService::registerUpdates(void) {
|
||||
return {
|
||||
{
|
||||
"SimpleSceneService::scene_tick"_hs,
|
||||
"SimpleSceneService::scene_tick",
|
||||
[this](Engine& e) { this->sceneFixedUpdate(e); },
|
||||
UpdateStrategies::update_phase_t::MAIN,
|
||||
true,
|
||||
{} // no dependencies"
|
||||
},
|
||||
{
|
||||
"SimpleSceneService::scene_change"_hs,
|
||||
"SimpleSceneService::scene_change",
|
||||
[this](Engine& e) { this->changeSceneFixedUpdate(e); },
|
||||
UpdateStrategies::update_phase_t::MAIN,
|
||||
true,
|
||||
{"SimpleSceneService::scene_update"_hs} // first update, than change????
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
void SimpleSceneService::sceneFixedUpdate(Engine&) {
|
||||
ZoneScoped;
|
||||
const auto f_delta = engine.getFixedDeltaTime();
|
||||
|
||||
::MM::EachSystemInScene(*_scene, [&](::MM::Scene& s, ::MM::System& fn) {
|
||||
fn(s, f_delta);
|
||||
});
|
||||
auto newNow = clock::now();
|
||||
auto deltaTime = std::chrono::duration_cast<std::chrono::nanoseconds>(newNow - _last_time);
|
||||
_last_time = newNow;
|
||||
_accumulator += deltaTime.count();
|
||||
const double dt = f_delta * 1'000'000'000.0;
|
||||
|
||||
TracyPlot("MM::Services::SimpleSceneService::_scene.alive", (int64_t)_scene->alive());
|
||||
size_t continuous_counter = 0;
|
||||
|
||||
// TODO: this is just cancer
|
||||
while (_accumulator >= static_cast<decltype(_accumulator)>(dt)){
|
||||
_accumulator -= static_cast<decltype(_accumulator)>(dt);
|
||||
continuous_counter++;
|
||||
|
||||
::MM::EachSystemInScene(*_scene, [&](::MM::Scene& s, ::MM::System& fn) {
|
||||
fn(s, f_delta * delta_factor);
|
||||
});
|
||||
|
||||
TracyPlot("MM::Services::SimpleSceneService::_scene.alive", (int64_t)_scene->alive());
|
||||
}
|
||||
|
||||
if (continuous_counter > 2) {
|
||||
LOG_SSS(fmt::format("had {} contiguous scene ticks!", continuous_counter));
|
||||
}
|
||||
}
|
||||
|
||||
void SimpleSceneService::changeSceneFixedUpdate(Engine& engine) {
|
||||
@ -95,5 +108,11 @@ void SimpleSceneService::changeSceneNow(std::unique_ptr<Scene>&& new_scene) {
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
void SimpleSceneService::resetTime(void) {
|
||||
_last_time = clock::now();
|
||||
_accumulator = 0;
|
||||
}
|
||||
|
||||
} // MM::Services
|
||||
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
#include <mm/services/scene_service_interface.hpp>
|
||||
|
||||
#include <chrono>
|
||||
|
||||
namespace MM::Services {
|
||||
|
||||
// provides an implementation for SceneServiceInterface
|
||||
@ -10,15 +12,26 @@ namespace MM::Services {
|
||||
std::unique_ptr<Scene> _scene;
|
||||
std::unique_ptr<Scene> _next_scene; // enqueued next scene
|
||||
|
||||
MM::Engine::FunctionDataHandle _f_update_handle;
|
||||
MM::Engine::FunctionDataHandle _f_update_changer_handle;
|
||||
using clock = std::chrono::high_resolution_clock;
|
||||
long long int _accumulator = 0;
|
||||
std::chrono::time_point<clock> _last_time;
|
||||
|
||||
public:
|
||||
const float f_delta;
|
||||
|
||||
float delta_factor = 1.f;
|
||||
|
||||
public:
|
||||
explicit SimpleSceneService(const float update_delta = 1.f/60.f) : f_delta(update_delta) {}
|
||||
|
||||
const char* name(void) override { return "SimpleSceneService"; }
|
||||
|
||||
bool enable(Engine& engine) override;
|
||||
void disable(Engine& engine) override;
|
||||
|
||||
std::vector<UpdateStrategies::UpdateCreationInfo> registerUpdates(void) override;
|
||||
|
||||
private:
|
||||
void sceneFixedUpdate(Engine& engine);
|
||||
void changeSceneFixedUpdate(Engine& engine);
|
||||
|
||||
@ -29,6 +42,8 @@ namespace MM::Services {
|
||||
|
||||
// be carefull of that one
|
||||
void changeSceneNow(std::unique_ptr<Scene>&& new_scene) override;
|
||||
|
||||
void resetTime(void);
|
||||
};
|
||||
|
||||
} // MM::Services
|
||||
|
@ -5,14 +5,14 @@
|
||||
#include <entt/entity/registry.hpp>
|
||||
|
||||
TEST(simple_scene, add_en_dis) {
|
||||
MM::Engine e;
|
||||
MM::Engine engine;
|
||||
|
||||
e.addService<MM::Services::SimpleSceneService>();
|
||||
engine.addService<MM::Services::SimpleSceneService>();
|
||||
|
||||
ASSERT_TRUE(e.enableService<MM::Services::SimpleSceneService>());
|
||||
ASSERT_TRUE(engine.enableService<MM::Services::SimpleSceneService>());
|
||||
|
||||
{
|
||||
auto* sss = e.tryService<MM::Services::SimpleSceneService>();
|
||||
auto* sss = engine.tryService<MM::Services::SimpleSceneService>();
|
||||
ASSERT_NE(sss, nullptr);
|
||||
|
||||
auto& s = sss->getScene();
|
||||
@ -20,19 +20,19 @@ TEST(simple_scene, add_en_dis) {
|
||||
ASSERT_TRUE(s.valid(e));
|
||||
}
|
||||
|
||||
e.disableService<MM::Services::SimpleSceneService>();
|
||||
engine.disableService<MM::Services::SimpleSceneService>();
|
||||
}
|
||||
|
||||
TEST(simple_scene, add_en_dis_provide) {
|
||||
MM::Engine e;
|
||||
MM::Engine engine;
|
||||
|
||||
e.addService<MM::Services::SimpleSceneService>();
|
||||
e.provide<MM::Services::SceneServiceInterface, MM::Services::SimpleSceneService>();
|
||||
engine.addService<MM::Services::SimpleSceneService>();
|
||||
engine.provide<MM::Services::SceneServiceInterface, MM::Services::SimpleSceneService>();
|
||||
|
||||
ASSERT_TRUE(e.enableService<MM::Services::SimpleSceneService>());
|
||||
ASSERT_TRUE(engine.enableService<MM::Services::SimpleSceneService>());
|
||||
|
||||
{
|
||||
auto* ssi = e.tryService<MM::Services::SceneServiceInterface>();
|
||||
auto* ssi = engine.tryService<MM::Services::SceneServiceInterface>();
|
||||
ASSERT_NE(ssi, nullptr);
|
||||
|
||||
auto& s = ssi->getScene();
|
||||
@ -40,7 +40,7 @@ TEST(simple_scene, add_en_dis_provide) {
|
||||
ASSERT_TRUE(s.valid(e));
|
||||
}
|
||||
|
||||
e.disableService<MM::Services::SimpleSceneService>();
|
||||
engine.disableService<MM::Services::SimpleSceneService>();
|
||||
}
|
||||
|
||||
TEST(simple_scene, change_scene) {
|
||||
@ -60,7 +60,9 @@ TEST(simple_scene, change_scene) {
|
||||
|
||||
ASSERT_TRUE(sss->getScene().valid(e));
|
||||
|
||||
engine.fixedUpdate();
|
||||
//engine.fixedUpdate();
|
||||
engine.getUpdateStrategy().addDefered([](MM::Engine& eng) {eng.stop();});
|
||||
engine.run();
|
||||
|
||||
ASSERT_FALSE(sss->getScene().valid(e));
|
||||
}
|
||||
|
Reference in New Issue
Block a user