diff --git a/include/Nazara/Graphics/ForwardFramePipeline.hpp b/include/Nazara/Graphics/ForwardFramePipeline.hpp index 338b2ece5..7a9697418 100644 --- a/include/Nazara/Graphics/ForwardFramePipeline.hpp +++ b/include/Nazara/Graphics/ForwardFramePipeline.hpp @@ -86,6 +86,7 @@ namespace Nz UInt32 renderMask; NazaraSlot(Light, OnLightDataInvalided, onLightInvalidated); + NazaraSlot(Light, OnLightTransformInvalided, onLightTransformInvalidated); NazaraSlot(Light, OnLightShadowCastingChanged, onLightShadowCastingChanged); }; diff --git a/include/Nazara/Graphics/Light.hpp b/include/Nazara/Graphics/Light.hpp index a8c350696..e97902307 100644 --- a/include/Nazara/Graphics/Light.hpp +++ b/include/Nazara/Graphics/Light.hpp @@ -56,6 +56,7 @@ namespace Nz NazaraSignal(OnLightDataInvalided, Light* /*emitter*/); NazaraSignal(OnLightShadowCastingChanged, Light* /*light*/, bool /*isShadowCasting*/); NazaraSignal(OnLightShadowMapSettingChange, Light* /*light*/, PixelFormat /*newPixelFormat*/, UInt32 /*newSize*/); + NazaraSignal(OnLightTransformInvalided, Light* /*emitter*/); protected: inline void UpdateBoundingVolume(const BoundingVolumef& boundingVolume); diff --git a/include/Nazara/Graphics/SpotLight.inl b/include/Nazara/Graphics/SpotLight.inl index 2eb85bd9e..ae29daa74 100644 --- a/include/Nazara/Graphics/SpotLight.inl +++ b/include/Nazara/Graphics/SpotLight.inl @@ -115,6 +115,7 @@ namespace Nz UpdateBoundingVolume(); UpdateViewProjMatrix(); + OnLightTransformInvalided(this); } inline void SpotLight::UpdateRadius(float radius) @@ -133,6 +134,7 @@ namespace Nz UpdateBoundingVolume(); UpdateViewProjMatrix(); + OnLightTransformInvalided(this); } inline void SpotLight::UpdateBoundingVolume() diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index 9e7874781..b0d67b709 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -292,6 +292,7 @@ namespace Nz const Matrix4f& viewProjMatrix = lightData->camera->GetViewerInstance().GetViewProjMatrix(); Frustumf frustum = Frustumf::Extract(viewProjMatrix); + GetDebugDrawer().DrawFrustum(frustum, Nz::Color::Blue); std::size_t visibilityHash = 5U; @@ -599,6 +600,12 @@ namespace Nz lightData->camera->UpdateZFar(spotLight.GetRadius()); lightData->camera->UpdateViewport(Recti(0, 0, SafeCast(shadowMapSize), SafeCast(shadowMapSize))); + lightData->onLightTransformInvalidated.Connect(lightData->light->OnLightTransformInvalided, [lightData](Light* light) + { + SpotLight& spotLight = SafeCast(*light); + ViewerInstance& viewerInstance = lightData->camera->GetViewerInstance(); + viewerInstance.UpdateViewMatrix(Nz::Matrix4f::TransformInverse(spotLight.GetPosition(), spotLight.GetRotation())); + }); viewerInstance.UpdateViewMatrix(Nz::Matrix4f::TransformInverse(spotLight.GetPosition(), spotLight.GetRotation())); } diff --git a/src/Nazara/Graphics/SpotLight.cpp b/src/Nazara/Graphics/SpotLight.cpp index 55d16e8ac..43f3ecc22 100644 --- a/src/Nazara/Graphics/SpotLight.cpp +++ b/src/Nazara/Graphics/SpotLight.cpp @@ -35,7 +35,7 @@ namespace Nz void SpotLight::UpdateTransform(const Vector3f& position, const Quaternionf& rotation, const Vector3f& /*scale*/) { - UpdatePosition(position); + m_position = position; //< don't call UpdatePosition to prevent double update UpdateRotation(rotation); } }