From 9f4036e77a04d28b320e45496035d15d4a0448b2 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Fri, 9 Jan 2026 21:57:06 +0000 Subject: [PATCH] Stuff --- src/app/service_based_app.cpp | 1 + .../impl/application_loop_service.cpp | 34 ++++++----- .../impl/application_loop_service.hpp | 7 ++- src/services/impl/frame_workflow_service.cpp | 51 ++++++++++++++++ src/services/impl/frame_workflow_service.hpp | 39 ++++++++++++ .../impl/frame_workflow_step_registrar.cpp | 60 +++++++++++++++++++ .../interfaces/i_frame_workflow_service.hpp | 11 ++++ 7 files changed, 187 insertions(+), 16 deletions(-) create mode 100644 src/services/impl/frame_workflow_service.cpp create mode 100644 src/services/impl/frame_workflow_service.hpp create mode 100644 src/services/impl/frame_workflow_step_registrar.cpp create mode 100644 src/services/interfaces/i_frame_workflow_service.hpp diff --git a/src/app/service_based_app.cpp b/src/app/service_based_app.cpp index c77646b..8807a8f 100644 --- a/src/app/service_based_app.cpp +++ b/src/app/service_based_app.cpp @@ -41,6 +41,7 @@ #include "services/impl/workflow_definition_parser.hpp" #include "services/impl/workflow_executor.hpp" #include "services/impl/workflow_step_registry.hpp" +#include "services/impl/frame_workflow_service.hpp" #include "services/interfaces/i_platform_service.hpp" #include "services/interfaces/i_probe_service.hpp" #include "services/interfaces/i_render_graph_service.hpp" diff --git a/src/services/impl/application_loop_service.cpp b/src/services/impl/application_loop_service.cpp index 16b95c8..6a76df3 100644 --- a/src/services/impl/application_loop_service.cpp +++ b/src/services/impl/application_loop_service.cpp @@ -12,6 +12,7 @@ ApplicationLoopService::ApplicationLoopService(std::shared_ptr logger, std::shared_ptr sceneService, std::shared_ptr renderCoordinatorService, std::shared_ptr audioService, + std::shared_ptr frameWorkflowService, std::shared_ptr crashRecoveryService) : logger_(std::move(logger)), windowService_(std::move(windowService)), @@ -21,6 +22,7 @@ ApplicationLoopService::ApplicationLoopService(std::shared_ptr logger, sceneService_(std::move(sceneService)), renderCoordinatorService_(std::move(renderCoordinatorService)), audioService_(std::move(audioService)), + frameWorkflowService_(std::move(frameWorkflowService)), crashRecoveryService_(std::move(crashRecoveryService)) { if (logger_) { logger_->Trace("ApplicationLoopService", "ApplicationLoopService", @@ -107,24 +109,28 @@ void ApplicationLoopService::ProcessFrame(float deltaTime, float elapsedTime) { "Entering"); } - if (physicsService_) { - physicsService_->StepSimulation(deltaTime); - } + if (frameWorkflowService_) { + frameWorkflowService_->ExecuteFrame(deltaTime, elapsedTime); + } else { + if (physicsService_) { + physicsService_->StepSimulation(deltaTime); + } - if (sceneService_) { - sceneService_->UpdateScene(deltaTime); - } + if (sceneService_) { + sceneService_->UpdateScene(deltaTime); + } - if (renderCoordinatorService_) { - renderCoordinatorService_->RenderFrame(elapsedTime); - } + if (renderCoordinatorService_) { + renderCoordinatorService_->RenderFrame(elapsedTime); + } - if (audioService_) { - audioService_->Update(); - } + if (audioService_) { + audioService_->Update(); + } - if (inputService_) { - inputService_->UpdateGuiInput(); + if (inputService_) { + inputService_->UpdateGuiInput(); + } } if (logger_) { diff --git a/src/services/impl/application_loop_service.hpp b/src/services/impl/application_loop_service.hpp index 6e85c7c..85cd6d8 100644 --- a/src/services/impl/application_loop_service.hpp +++ b/src/services/impl/application_loop_service.hpp @@ -1,6 +1,7 @@ #pragma once #include "../interfaces/i_application_loop_service.hpp" +#include "../interfaces/i_frame_workflow_service.hpp" #include "../interfaces/i_audio_service.hpp" #include "../interfaces/i_crash_recovery_service.hpp" #include "../interfaces/i_input_service.hpp" @@ -23,8 +24,9 @@ public: std::shared_ptr physicsService, std::shared_ptr sceneService, std::shared_ptr renderCoordinatorService, - std::shared_ptr audioService, - std::shared_ptr crashRecoveryService); + std::shared_ptr audioService, + std::shared_ptr frameWorkflowService, + std::shared_ptr crashRecoveryService); ~ApplicationLoopService() override = default; void Run() override; @@ -41,6 +43,7 @@ private: std::shared_ptr sceneService_; std::shared_ptr renderCoordinatorService_; std::shared_ptr audioService_; + std::shared_ptr frameWorkflowService_; std::shared_ptr crashRecoveryService_; bool running_ = false; double lastMemoryCheckSeconds_ = 0.0; diff --git a/src/services/impl/frame_workflow_service.cpp b/src/services/impl/frame_workflow_service.cpp new file mode 100644 index 0000000..a5d9873 --- /dev/null +++ b/src/services/impl/frame_workflow_service.cpp @@ -0,0 +1,51 @@ +#include "frame_workflow_service.hpp" + +#include "frame_workflow_step_registrar.hpp" +#include "workflow_definition_parser.hpp" +#include "../interfaces/i_logger.hpp" + +#include + +namespace sdl3cpp::services::impl { + +FrameWorkflowService::FrameWorkflowService(std::shared_ptr logger, + std::shared_ptr audioService, + std::shared_ptr inputService, + std::shared_ptr physicsService, + std::shared_ptr sceneService, + std::shared_ptr renderService, + const std::filesystem::path& templatePath) + : registry_(std::make_shared()), + executor_(registry_, logger), + logger_(std::move(logger)) { + std::filesystem::path path = templatePath.empty() + ? std::filesystem::current_path() / "config" / "workflows" / "templates" / "frame_default.json" + : templatePath; + + WorkflowDefinitionParser parser; + workflow_ = parser.ParseFile(path); + + FrameWorkflowStepRegistrar registrar(logger_, + std::move(audioService), + std::move(inputService), + std::move(physicsService), + std::move(sceneService), + std::move(renderService)); + registrar.RegisterUsedSteps(workflow_, registry_); +} + +void FrameWorkflowService::ExecuteFrame(float deltaTime, float elapsedTime) { + if (logger_) { + logger_->Trace("FrameWorkflowService", "ExecuteFrame", + "delta=" + std::to_string(deltaTime) + + ", elapsed=" + std::to_string(elapsedTime), + "Running frame workflow"); + } + + WorkflowContext context; + context.Set("frame.delta", static_cast(deltaTime)); + context.Set("frame.elapsed", static_cast(elapsedTime)); + executor_.Execute(workflow_, context); +} + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/frame_workflow_service.hpp b/src/services/impl/frame_workflow_service.hpp new file mode 100644 index 0000000..c0e5866 --- /dev/null +++ b/src/services/impl/frame_workflow_service.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include "../interfaces/i_frame_workflow_service.hpp" +#include "../interfaces/i_logger.hpp" +#include "../interfaces/i_audio_service.hpp" +#include "../interfaces/i_input_service.hpp" +#include "../interfaces/i_physics_service.hpp" +#include "../interfaces/i_render_coordinator_service.hpp" +#include "../interfaces/i_scene_service.hpp" + +#include "workflow_executor.hpp" +#include "workflow_definition_parser.hpp" +#include "workflow_step_registry.hpp" + +#include +#include + +namespace sdl3cpp::services::impl { + +class FrameWorkflowService final : public IFrameWorkflowService { +public: + FrameWorkflowService(std::shared_ptr logger, + std::shared_ptr audioService, + std::shared_ptr inputService, + std::shared_ptr physicsService, + std::shared_ptr sceneService, + std::shared_ptr renderService, + const std::filesystem::path& templatePath = {}); + + void ExecuteFrame(float deltaTime, float elapsedTime) override; + +private: + WorkflowDefinition workflow_; + std::shared_ptr registry_; + WorkflowExecutor executor_; + std::shared_ptr logger_; +}; + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/frame_workflow_step_registrar.cpp b/src/services/impl/frame_workflow_step_registrar.cpp new file mode 100644 index 0000000..cc9f389 --- /dev/null +++ b/src/services/impl/frame_workflow_step_registrar.cpp @@ -0,0 +1,60 @@ +#include "frame_workflow_step_registrar.hpp" + +#include "workflow_frame_audio_step.hpp" +#include "workflow_frame_begin_step.hpp" +#include "workflow_frame_gui_step.hpp" +#include "workflow_frame_physics_step.hpp" +#include "workflow_frame_render_step.hpp" +#include "workflow_frame_scene_step.hpp" +#include "workflow_step_registry.hpp" + +#include +#include + +namespace sdl3cpp::services::impl { + +FrameWorkflowStepRegistrar::FrameWorkflowStepRegistrar(std::shared_ptr logger, + std::shared_ptr audioService, + std::shared_ptr inputService, + std::shared_ptr physicsService, + std::shared_ptr sceneService, + std::shared_ptr renderService) + : logger_(std::move(logger)), + audioService_(std::move(audioService)), + inputService_(std::move(inputService)), + physicsService_(std::move(physicsService)), + sceneService_(std::move(sceneService)), + renderService_(std::move(renderService)) {} + +void FrameWorkflowStepRegistrar::RegisterUsedSteps( + const WorkflowDefinition& workflow, + const std::shared_ptr& registry) const { + if (!registry) { + throw std::runtime_error("FrameWorkflowStepRegistrar: registry is null"); + } + std::unordered_set plugins; + for (const auto& step : workflow.steps) { + plugins.insert(step.plugin); + } + + if (plugins.contains("frame.begin")) { + registry->RegisterStep(std::make_shared(logger_)); + } + if (plugins.contains("frame.physics")) { + registry->RegisterStep(std::make_shared(physicsService_, logger_)); + } + if (plugins.contains("frame.scene")) { + registry->RegisterStep(std::make_shared(sceneService_, logger_)); + } + if (plugins.contains("frame.render")) { + registry->RegisterStep(std::make_shared(renderService_, logger_)); + } + if (plugins.contains("frame.audio")) { + registry->RegisterStep(std::make_shared(audioService_, logger_)); + } + if (plugins.contains("frame.gui")) { + registry->RegisterStep(std::make_shared(inputService_, logger_)); + } +} + +} // namespace sdl3cpp::services::impl diff --git a/src/services/interfaces/i_frame_workflow_service.hpp b/src/services/interfaces/i_frame_workflow_service.hpp new file mode 100644 index 0000000..7cc85af --- /dev/null +++ b/src/services/interfaces/i_frame_workflow_service.hpp @@ -0,0 +1,11 @@ +#pragma once + +namespace sdl3cpp::services { + +class IFrameWorkflowService { +public: + virtual ~IFrameWorkflowService() = default; + virtual void ExecuteFrame(float deltaTime, float elapsedTime) = 0; +}; + +} // namespace sdl3cpp::services