#pragma once #include "HealthTelemetry.h" #include "RuntimeJson.h" #include "ShaderTypes.h" #include #include #include #include #include #include #include #include class RuntimeStore; class RuntimeHost { public: RuntimeHost(); HealthTelemetry& GetHealthTelemetry() { return mHealthTelemetry; } const HealthTelemetry& GetHealthTelemetry() const { return mHealthTelemetry; } bool AutoReloadEnabled() const { return mAutoReloadEnabled; } private: struct AppConfig { std::string shaderLibrary = "shaders"; unsigned short serverPort = 8080; unsigned short oscPort = 9000; std::string oscBindAddress = "127.0.0.1"; double oscSmoothing = 0.18; bool autoReload = true; unsigned maxTemporalHistoryFrames = 4; unsigned previewFps = 30; bool enableExternalKeying = false; std::string inputVideoFormat = "1080p"; std::string inputFrameRate = "59.94"; std::string outputVideoFormat = "1080p"; std::string outputFrameRate = "59.94"; }; struct LayerPersistentState { std::string id; std::string shaderId; bool bypass = false; std::map parameterValues; }; struct PersistentState { std::vector layers; }; bool NormalizeAndValidateValue(const ShaderParameterDefinition& definition, const JsonValue& value, ShaderParameterValue& normalizedValue, std::string& error) const; ShaderParameterValue DefaultValueForDefinition(const ShaderParameterDefinition& definition) const; void EnsureLayerDefaultsLocked(LayerPersistentState& layerState, const ShaderPackage& shaderPackage) const; JsonValue SerializeLayerStackLocked() const; bool DeserializeLayerStackLocked(const JsonValue& layersValue, std::vector& layers, std::string& error); void NormalizePersistentLayerIdsLocked(); JsonValue SerializeParameterValue(const ShaderParameterDefinition& definition, const ShaderParameterValue& value) const; std::string TemporalHistorySourceToString(TemporalHistorySource source) const; LayerPersistentState* FindLayerById(const std::string& layerId); const LayerPersistentState* FindLayerById(const std::string& layerId) const; std::string GenerateLayerId(); void MarkRenderStateDirtyLocked(); void MarkParameterStateDirtyLocked(); private: friend class RuntimeStore; friend class RuntimeCoordinator; HealthTelemetry mHealthTelemetry; mutable std::mutex mMutex; AppConfig mConfig; PersistentState mPersistentState; std::filesystem::path mRepoRoot; std::filesystem::path mUiRoot; std::filesystem::path mDocsRoot; std::filesystem::path mShaderRoot; std::filesystem::path mRuntimeRoot; std::filesystem::path mPresetRoot; std::filesystem::path mRuntimeStatePath; std::filesystem::path mConfigPath; std::filesystem::path mWrapperPath; std::filesystem::path mGeneratedGlslPath; std::filesystem::path mPatchedGlslPath; std::map mPackagesById; std::vector mPackageOrder; std::vector mPackageStatuses; bool mReloadRequested; bool mCompileSucceeded; std::string mCompileMessage; double mStartupRandom; unsigned short mServerPort; bool mAutoReloadEnabled; std::chrono::steady_clock::time_point mStartTime; std::chrono::steady_clock::time_point mLastScanTime; std::atomic mFrameCounter{ 0 }; std::atomic mRenderStateVersion{ 0 }; std::atomic mParameterStateVersion{ 0 }; uint64_t mNextLayerId; };