#pragma once #include "HealthTelemetry.h" #include "RuntimeJson.h" #include "ShaderTypes.h" #include #include #include #include #include #include #include #include class RuntimeSnapshotProvider; class RuntimeStore { public: struct StoredParameterSnapshot { std::string layerId; ShaderParameterDefinition definition; ShaderParameterValue currentValue; bool hasCurrentValue = false; }; 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; }; RuntimeStore(); HealthTelemetry& GetHealthTelemetry(); const HealthTelemetry& GetHealthTelemetry() const; bool InitializeStore(std::string& error); std::string BuildPersistentStateJson() const; bool PollStoredFileChanges(bool& registryChanged, bool& reloadRequested, std::string& error); bool CreateStoredLayer(const std::string& shaderId, std::string& error); bool DeleteStoredLayer(const std::string& layerId, std::string& error); bool MoveStoredLayer(const std::string& layerId, int direction, std::string& error); bool MoveStoredLayerToIndex(const std::string& layerId, std::size_t targetIndex, std::string& error); bool SetStoredLayerBypassState(const std::string& layerId, bool bypassed, std::string& error); bool SetStoredLayerShaderSelection(const std::string& layerId, const std::string& shaderId, std::string& error); bool SetStoredParameterValue(const std::string& layerId, const std::string& parameterId, const ShaderParameterValue& value, bool persistState, std::string& error); bool ResetStoredLayerParameterValues(const std::string& layerId, std::string& error); bool SaveStackPresetSnapshot(const std::string& presetName, std::string& error) const; bool LoadStackPresetSnapshot(const std::string& presetName, std::string& error); bool HasStoredLayer(const std::string& layerId) const; bool HasStoredShader(const std::string& shaderId) const; bool TryGetStoredParameterById(const std::string& layerId, const std::string& parameterId, StoredParameterSnapshot& snapshot, std::string& error) const; bool TryGetStoredParameterByControlKey(const std::string& layerKey, const std::string& parameterKey, StoredParameterSnapshot& snapshot, std::string& error) const; bool ResolveStoredLayerMove(const std::string& layerId, int direction, bool& shouldMove, std::string& error) const; bool ResolveStoredLayerMoveToIndex(const std::string& layerId, std::size_t targetIndex, bool& shouldMove, std::string& error) const; bool IsValidStackPresetName(const std::string& presetName) const; double GetRuntimeElapsedSeconds() const; const std::filesystem::path& GetRuntimeRepositoryRoot() const; const std::filesystem::path& GetRuntimeUiRoot() const; const std::filesystem::path& GetRuntimeDocsRoot() const; const std::filesystem::path& GetRuntimeDataRoot() const; unsigned short GetConfiguredControlServerPort() const; unsigned short GetConfiguredOscPort() const; const std::string& GetConfiguredOscBindAddress() const; double GetConfiguredOscSmoothing() const; unsigned GetConfiguredMaxTemporalHistoryFrames() const; unsigned GetConfiguredPreviewFps() const; bool IsExternalKeyingConfigured() const; const std::string& GetConfiguredInputVideoFormat() const; const std::string& GetConfiguredInputFrameRate() const; const std::string& GetConfiguredOutputVideoFormat() const; const std::string& GetConfiguredOutputFrameRate() const; void SetBoundControlServerPort(unsigned short port); void SetCompileStatus(bool succeeded, const std::string& message); void ClearReloadRequest(); private: friend class RuntimeSnapshotProvider; bool LoadConfig(std::string& error); bool LoadPersistentState(std::string& error); bool SavePersistentState(std::string& error) const; bool ScanShaderPackages(std::string& error); std::string ReadTextFile(const std::filesystem::path& path, std::string& error) const; bool WriteTextFile(const std::filesystem::path& path, const std::string& contents, std::string& error) const; bool ResolvePaths(std::string& error); std::vector GetStackPresetNamesLocked() const; std::string MakeSafePresetFileStem(const std::string& presetName) const; bool TryResolveStoredLayerAndParameterByControlKeyLocked(const std::string& layerKey, const std::string& parameterKey, const LayerPersistentState*& matchedLayer, const ShaderPackage*& matchedPackage, std::vector::const_iterator& parameterIt, std::string& error) const; bool CopyShaderPackageForStoredLayer(const std::string& layerId, ShaderPackage& shaderPackage, std::string& error) const; void GetShaderCompilerInputs(std::filesystem::path& repoRoot, std::filesystem::path& wrapperPath, std::filesystem::path& generatedGlslPath, std::filesystem::path& patchedGlslPath, unsigned& maxTemporalHistoryFrames) const; uint64_t GetRenderStateVersion() const; uint64_t GetParameterStateVersion() const; void AdvanceFrameCounter(); void BuildLayerRenderStates(unsigned outputWidth, unsigned outputHeight, std::vector& states) const; bool TryBuildLayerRenderStates(unsigned outputWidth, unsigned outputHeight, std::vector& states) const; bool TryRefreshLayerParameters(std::vector& states) const; void RefreshDynamicRenderStateFields(std::vector& states) const; void BuildLayerRenderStatesLocked(unsigned outputWidth, unsigned outputHeight, std::vector& states) const; void RefreshLayerParametersLocked(std::vector& states) const; void RefreshDynamicRenderStateFieldsLocked(std::vector& states) const; JsonValue BuildRuntimeStateValue() const; JsonValue SerializeLayerStack() const; 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(); 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; };