From b9694e8cc6b85a0089f97ff3c21862adc75a7ee5 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Wed, 11 Dec 2024 21:49:32 +0100 Subject: working proof of concept replay system --- src/crepe/system/ReplaySystem.cpp | 33 ++++++++++++++++++++------------- src/crepe/system/ReplaySystem.h | 8 +++++++- 2 files changed, 27 insertions(+), 14 deletions(-) (limited to 'src/crepe/system') diff --git a/src/crepe/system/ReplaySystem.cpp b/src/crepe/system/ReplaySystem.cpp index 5a90752..a6b8fb1 100644 --- a/src/crepe/system/ReplaySystem.cpp +++ b/src/crepe/system/ReplaySystem.cpp @@ -1,8 +1,8 @@ -#include "ScriptSystem.h" - +#include "../util/Log.h" #include "../manager/ReplayManager.h" #include "../manager/SystemManager.h" +#include "RenderSystem.h" #include "ReplaySystem.h" using namespace crepe; @@ -45,6 +45,7 @@ void ReplaySystem::update_playing() { ReplayManager::Recording & recording = replay.recording; if (recording.frames.size() == recording.frame) { + dbg_log("Finished playback"); this->playback_end(); return; } @@ -52,27 +53,33 @@ void ReplaySystem::update_playing() { ComponentManager & components = this->mediator.component_manager; ComponentManager::Snapshot & frame = recording.frames.at(recording.frame); + dbg_logf("Playing recording frame {}", recording.frame); components.restore(frame); recording.frame++; } void ReplaySystem::playback_begin() { SystemManager & systems = this->mediator.system_manager; - systems.get_system().active = false; - // TODO: store system active state - // TODO: disable most systems - // TODO: store components snapshot -} + ComponentManager & components = this->mediator.component_manager; -void ReplaySystem::playback_end() { - ReplayManager & replay = this->mediator.replay_manager; + this->playback = { + .components = components.save(), + .systems = systems.save(), + }; - replay.state = ReplayManager::IDLE; + systems.disable_all(); + systems.get_system().active = true; + systems.get_system().active = true; +} +void ReplaySystem::playback_end() { SystemManager & systems = this->mediator.system_manager; - systems.get_system().active = true; + ComponentManager & components = this->mediator.component_manager; - // TODO: restore system active state snapshot - // TODO: restore components snapshot + components.restore(this->playback.components); + systems.restore(this->playback.systems); + + ReplayManager & replay = this->mediator.replay_manager; + replay.state = ReplayManager::IDLE; } diff --git a/src/crepe/system/ReplaySystem.h b/src/crepe/system/ReplaySystem.h index fb40176..6f6fce4 100644 --- a/src/crepe/system/ReplaySystem.h +++ b/src/crepe/system/ReplaySystem.h @@ -1,6 +1,7 @@ #pragma once #include "../manager/ReplayManager.h" +#include "../manager/SystemManager.h" #include "System.h" @@ -17,7 +18,12 @@ private: void update_recording(); void update_playing(); - std::unordered_map system_active_snapshot; + struct Snapshot { + ComponentManager::Snapshot components; + SystemManager::Snapshot systems; + }; + Snapshot playback; + void playback_begin(); void playback_end(); }; -- cgit v1.2.3