44* @licence: MIT
55*/
66
7+ #include < cstdint>
8+ #include < string>
9+
710#include < OvCore/ECS/Components/CMaterialRenderer.h>
11+ #include < OvCore/ECS/Components/CSkinnedMeshRenderer.h>
812#include < OvCore/Global/ServiceLocator.h>
913#include < OvCore/Rendering/EngineBufferRenderFeature.h>
1014#include < OvCore/Rendering/EngineDrawableDescriptor.h>
1115#include < OvCore/Rendering/ShadowRenderPass.h>
16+ #include < OvCore/Rendering/SkinningUtils.h>
1217#include < OvCore/ResourceManagement/ShaderManager.h>
1318
1419#include < OvRendering/Features/LightingRenderFeature.h>
1520#include < OvRendering/HAL/Profiling.h>
1621
1722constexpr uint8_t kMaxShadowMaps = 1 ;
23+ const std::string kShadowPassName = " SHADOW_PASS" ;
24+ const std::string kSkinningFeatureName = std::string{ OvCore::Rendering::SkinningUtils::kFeatureName };
1825
1926OvCore::Rendering::ShadowRenderPass::ShadowRenderPass (OvRendering::Core::CompositeRenderer& p_renderer) :
2027 OvRendering::Core::ARenderPass(p_renderer)
@@ -91,6 +98,8 @@ void OvCore::Rendering::ShadowRenderPass::_DrawShadows(
9198 OvCore::SceneSystem::Scene& p_scene
9299)
93100{
101+ using namespace OvCore ::Rendering;
102+
94103 for (auto modelRenderer : p_scene.GetFastAccessComponents ().modelRenderers )
95104 {
96105 auto & actor = modelRenderer->owner ;
@@ -106,18 +115,25 @@ void OvCore::Rendering::ShadowRenderPass::_DrawShadows(
106115 continue ;
107116 }
108117
118+ const auto skinnedRenderer = actor.GetComponent <OvCore::ECS ::Components::CSkinnedMeshRenderer>();
119+ const bool hasSkinning = SkinningUtils::IsSkinningActive (skinnedRenderer);
120+
109121 const auto & materials = materialRenderer->GetMaterials ();
110122 const auto & modelMatrix = actor.transform .GetWorldMatrix ();
111123
112124 for (auto mesh : model->GetMeshes ())
113125 {
114126 if (auto material = materials.at (mesh->GetMaterialIndex ()); material && material->IsValid () && material->IsShadowCaster ())
115127 {
116- const std::string shadowPassName = " SHADOW_PASS" ;
128+ const bool materialHasShadowPass = material->HasPass (kShadowPassName );
129+ const bool canUseMaterialShadowPass =
130+ materialHasShadowPass &&
131+ (!hasSkinning || material->SupportsFeature (kSkinningFeatureName ));
117132
118- // If the material has shadow pass, use it, otherwise use the shadow fallback material
133+ // If the material has a compatible shadow pass, use it.
134+ // Otherwise, use the shadow fallback material.
119135 auto & targetMaterial =
120- material-> HasPass (shadowPassName) ?
136+ canUseMaterialShadowPass ?
121137 *material :
122138 m_shadowMaterial;
123139
@@ -138,13 +154,18 @@ void OvCore::Rendering::ShadowRenderPass::_DrawShadows(
138154 drawable.stateMask .frontfaceCulling = false ;
139155 drawable.stateMask .backfaceCulling = false ;
140156
141- drawable.pass = shadowPassName ;
157+ drawable.pass = kShadowPassName ;
142158
143159 drawable.AddDescriptor <EngineDrawableDescriptor>({
144160 modelMatrix,
145161 materialRenderer->GetUserMatrix ()
146162 });
147163
164+ if (hasSkinning && targetMaterial.SupportsFeature (kSkinningFeatureName ))
165+ {
166+ SkinningUtils::ApplyToDrawable (drawable, *skinnedRenderer, &targetMaterial.GetFeatures ());
167+ }
168+
148169 m_renderer.DrawEntity (p_pso, drawable);
149170 }
150171 }
0 commit comments