Browse Source

Always recalculate scale factor for fixed size billboards. Does not dirty the buffer unless actually changed. Closes #1790.

Lasse Öörni 8 years ago
parent
commit
ebdf905538
1 changed files with 25 additions and 9 deletions
  1. 25 9
      Source/Urho3D/Graphics/BillboardSet.cpp

+ 25 - 9
Source/Urho3D/Graphics/BillboardSet.cpp

@@ -201,12 +201,12 @@ void BillboardSet::UpdateBatches(const FrameInfo& frame)
             bufferDirty_ = true;
 
         hasOrthoCamera_ = frame.camera_->IsOrthographic();
-
-        // Calculate fixed screen size scale factor for billboards if needed
-        if (fixedScreenSize_)
-            CalculateFixedScreenSize(frame);
     }
 
+    // Calculate fixed screen size scale factor for billboards. Will not dirty the buffer unless actually changed
+    if (fixedScreenSize_)
+        CalculateFixedScreenSize(frame);
+
     distance_ = frame.camera_->GetDistance(GetWorldBoundingBox().Center());
 
     // Calculate scaled distance for animation LOD
@@ -778,6 +778,7 @@ void BillboardSet::CalculateFixedScreenSize(const FrameInfo& frame)
 {
     float invViewHeight = 1.0f / frame.viewSize_.y_;
     float halfViewWorldSize = frame.camera_->GetHalfViewSize();
+    bool scaleFactorChanged = false;
 
     if (!frame.camera_->IsOrthographic())
     {
@@ -788,18 +789,33 @@ void BillboardSet::CalculateFixedScreenSize(const FrameInfo& frame)
         for (unsigned i = 0; i < billboards_.Size(); ++i)
         {
             Vector4 projPos(viewProj * Vector4(billboardTransform * billboards_[i].position_, 1.0f));
-            billboards_[i].screenScaleFactor_ = invViewHeight * halfViewWorldSize * projPos.w_;
+            float newScaleFactor = invViewHeight * halfViewWorldSize * projPos.w_;
+            if (newScaleFactor != billboards_[i].screenScaleFactor_)
+            {
+                billboards_[i].screenScaleFactor_ = newScaleFactor;
+                scaleFactorChanged = true;
+            }
         }
     }
     else
     {
         for (unsigned i = 0; i < billboards_.Size(); ++i)
-            billboards_[i].screenScaleFactor_ = invViewHeight * halfViewWorldSize;
+        {
+            float newScaleFactor = invViewHeight * halfViewWorldSize;
+            if (newScaleFactor != billboards_[i].screenScaleFactor_)
+            {
+                billboards_[i].screenScaleFactor_ = newScaleFactor;
+                scaleFactorChanged = true;
+            }
+        }
     }
 
-    bufferDirty_ = true;
-    forceUpdate_ = true;
-    worldBoundingBoxDirty_ = true;
+    if (scaleFactorChanged)
+    {
+        bufferDirty_ = true;
+        forceUpdate_ = true;
+        worldBoundingBoxDirty_ = true;
+    }
 }
 
 }