// Copyright (c) Wojciech Figat. All rights reserved. #pragma once #include "Engine/Graphics/PixelFormat.h" #include "Engine/Scripting/ScriptingObjectReference.h" #include "Engine/Level/Actor.h" // Amount of frames to wait for data from probe update job #define PROBES_RENDERER_LATENCY_FRAMES 1 class EnvironmentProbe; class SkyLight; class RenderTask; /// /// Probes rendering service /// class ProbesRenderer { public: enum class EntryType { Invalid = 0, EnvProbe = 1, SkyLight = 2, }; struct Entry { EntryType Type = EntryType::Invalid; ScriptingObjectReference Actor; float Timeout = 0.0f; bool UseTextureData() const; int32 GetResolution() const; PixelFormat GetFormat() const; }; public: /// /// Minimum amount of time between two updated of probes /// static TimeSpan ProbesUpdatedBreak; /// /// Time after last probe update when probes updating content will be released /// static TimeSpan ProbesReleaseDataTime; int32 GetBakeQueueSize(); static Delegate OnRegisterBake; static Delegate OnFinishBake; public: /// /// Checks if resources are ready to render probes (shaders or textures may be during loading). /// /// True if is ready, otherwise false. static bool HasReadyResources(); /// /// Init probes content /// /// True if cannot init service static bool Init(); /// /// Release probes content /// static void Release(); public: /// /// Register probe to baking service. /// /// Probe to bake /// Timeout in seconds left to bake it. static void Bake(EnvironmentProbe* probe, float timeout = 0); /// /// Register probe to baking service. /// /// Probe to bake /// Timeout in seconds left to bake it. static void Bake(SkyLight* probe, float timeout = 0); private: static void OnRender(RenderTask* task, GPUContext* context); };