#pragma once #include #include #include struct UI_Run_State; class EyeTrackingRuntime { public: void Configure(const UI_Run_State& rs); void Start(); void Stop(); bool LoopRunning() const; bool RuntimeActive() const; bool UsingDirectML() const; bool ConsumeDmlFallbackFlag(); std::string GetLastError() const; bool CameraAccessRevoked() const { return camera_access_revoked.load(); } void SetCameraAccessRevoked(bool value) { camera_access_revoked.store(value); } bool CameraInitialized() const { return camera_initialized.load(); } void SetCameraInitialized(bool value) { camera_initialized.store(value); } bool CameraSearching() const { return camera_searching.load(); } void SetCameraSearching(bool value) { camera_searching.store(value); } bool FrustumLoadFailure() const { return frustum_failure.load(); } bool ModelLoadFailure() const { return model_failure.load(); } bool SteamVRWaiting() const { return steamvr_waiting.load(); } const int DesiredWidth = 800; const int DesiredHeight = 400; const int CameraBufferSize = 1; private: void RunLoop(); std::atomic running{ false }; std::atomic stop_requested{ false }; std::atomic using_directml{ true }; std::atomic dml_fallback_triggered{ false }; std::atomic camera_access_revoked{ false }; std::atomic camera_initialized{ false }; std::atomic camera_searching{ false }; std::atomic frustum_failure{ false }; std::atomic model_failure{ false }; std::atomic inference_ready{ false }; std::atomic steamvr_waiting{ false }; std::string last_error; mutable std::mutex state_mutex; }; extern EyeTrackingRuntime eyetracking_runtime;