فهرست منبع

Reduce amount of unnecessary Frustum::UpdatePlanes() calls. A default-constructed degenerate frustum no longer has its planes updated on construction, but instead the planes will remain in default-constructed state.

Lasse Öörni 9 سال پیش
والد
کامیت
a1c458f28e

+ 6 - 3
Source/Urho3D/Graphics/Camera.cpp

@@ -601,9 +601,12 @@ const Matrix3x4& Camera::GetView() const
 
 void Camera::SetAspectRatioInternal(float aspectRatio)
 {
-    aspectRatio_ = aspectRatio;
-    frustumDirty_ = true;
-    projectionDirty_ = true;
+    if (aspectRatio != aspectRatio_)
+    {
+        aspectRatio_ = aspectRatio;
+        frustumDirty_ = true;
+        projectionDirty_ = true;
+    }
     MarkNetworkUpdate();
 }
 

+ 10 - 0
Source/Urho3D/Graphics/Light.cpp

@@ -396,6 +396,16 @@ Frustum Light::GetFrustum() const
     return ret;
 }
 
+Frustum Light::GetViewSpaceFrustum(const Matrix3x4& view) const
+{
+    // Note: frustum is unaffected by node or parent scale
+    Matrix3x4 frustumTransform(node_ ? Matrix3x4(node_->GetWorldPosition(), node_->GetWorldRotation(), 1.0f) :
+                               Matrix3x4::IDENTITY);
+    Frustum ret;
+    ret.Define(fov_, aspectRatio_, 1.0f, M_MIN_NEARCLIP, range_, view * frustumTransform);
+    return ret;
+}
+
 int Light::GetNumShadowSplits() const
 {
     unsigned ret = 1;

+ 3 - 0
Source/Urho3D/Graphics/Light.h

@@ -271,6 +271,9 @@ public:
 
     /// Return spotlight frustum.
     Frustum GetFrustum() const;
+    /// Return spotlight frustum in the specified view space.
+    Frustum GetViewSpaceFrustum(const Matrix3x4& view) const;
+
     /// Return number of shadow map cascade splits for a directional light, considering also graphics API limitations.
     int GetNumShadowSplits() const;
 

+ 2 - 2
Source/Urho3D/Graphics/Renderer.cpp

@@ -846,7 +846,7 @@ Texture2D* Renderer::GetShadowMap(Light* light, Camera* camera, unsigned viewWid
         else
         {
             // Calculate spot light pixel size from the projection of its frustum far vertices
-            Frustum lightFrustum = light->GetFrustum().Transformed(view);
+            Frustum lightFrustum = light->GetViewSpaceFrustum(view);
             lightBox.Define(&lightFrustum.vertices_[4], 4);
         }
 
@@ -1443,7 +1443,7 @@ const Rect& Renderer::GetLightScissor(Light* light, Camera* camera)
     assert(light->GetLightType() != LIGHT_DIRECTIONAL);
     if (light->GetLightType() == LIGHT_SPOT)
     {
-        Frustum viewFrustum(light->GetFrustum().Transformed(view));
+        Frustum viewFrustum(light->GetViewSpaceFrustum(view));
         return lightScissorCache_[combination] = viewFrustum.Projected(projection);
     }
     else // LIGHT_POINT

+ 0 - 1
Source/Urho3D/Math/Frustum.cpp

@@ -59,7 +59,6 @@ void ProjectAndMergeEdge(Vector3 v0, Vector3 v1, Rect& rect, const Matrix4& proj
 
 Frustum::Frustum()
 {
-    UpdatePlanes();
 }
 
 Frustum::Frustum(const Frustum& frustum)