// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once #include "Engine/Graphics/RenderView.h" #include "Engine/Graphics/GPUPipelineStatePermutations.h" #include "RendererPass.h" #include "Engine/Content/Assets/Shader.h" #include "Engine/Content/Assets/Model.h" /// /// Lighting rendering service. Handles dynamic lights diffuse and specular color calculations. /// class LightPass : public RendererPass { private: AssetReference _shader; GPUPipelineStatePermutationsPs<2> _psLightDir; GPUPipelineStatePermutationsPs<4> _psLightPointNormal; GPUPipelineStatePermutationsPs<4> _psLightPointInverted; GPUPipelineStatePermutationsPs<4> _psLightSpotNormal; GPUPipelineStatePermutationsPs<4> _psLightSpotInverted; GPUPipelineState* _psLightSkyNormal = nullptr; GPUPipelineState* _psLightSkyInverted = nullptr; GPUPipelineState* _psClearDiffuse = nullptr; AssetReference _sphereModel; PixelFormat _shadowMaskFormat; public: /// /// Performs the lighting rendering for the input task. /// /// The rendering context batch. /// The light accumulation buffer (input and output). void RenderLight(RenderContextBatch& renderContextBatch, GPUTextureView* lightBuffer); private: #if COMPILE_WITH_DEV_ENV void OnShaderReloading(Asset* obj) { _psLightDir.Release(); _psLightPointNormal.Release(); _psLightPointInverted.Release(); _psLightSpotNormal.Release(); _psLightSpotInverted.Release(); _psLightSkyNormal->ReleaseGPU(); _psLightSkyInverted->ReleaseGPU(); invalidateResources(); } #endif public: // [RendererPass] String ToString() const override; bool Init() override; void Dispose() override; protected: // [RendererPass] bool setupResources() override; };