|
@@ -201,12 +201,12 @@ void BillboardSet::UpdateBatches(const FrameInfo& frame)
|
|
|
bufferDirty_ = true;
|
|
bufferDirty_ = true;
|
|
|
|
|
|
|
|
hasOrthoCamera_ = frame.camera_->IsOrthographic();
|
|
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());
|
|
distance_ = frame.camera_->GetDistance(GetWorldBoundingBox().Center());
|
|
|
|
|
|
|
|
// Calculate scaled distance for animation LOD
|
|
// Calculate scaled distance for animation LOD
|
|
@@ -778,6 +778,7 @@ void BillboardSet::CalculateFixedScreenSize(const FrameInfo& frame)
|
|
|
{
|
|
{
|
|
|
float invViewHeight = 1.0f / frame.viewSize_.y_;
|
|
float invViewHeight = 1.0f / frame.viewSize_.y_;
|
|
|
float halfViewWorldSize = frame.camera_->GetHalfViewSize();
|
|
float halfViewWorldSize = frame.camera_->GetHalfViewSize();
|
|
|
|
|
+ bool scaleFactorChanged = false;
|
|
|
|
|
|
|
|
if (!frame.camera_->IsOrthographic())
|
|
if (!frame.camera_->IsOrthographic())
|
|
|
{
|
|
{
|
|
@@ -788,18 +789,33 @@ void BillboardSet::CalculateFixedScreenSize(const FrameInfo& frame)
|
|
|
for (unsigned i = 0; i < billboards_.Size(); ++i)
|
|
for (unsigned i = 0; i < billboards_.Size(); ++i)
|
|
|
{
|
|
{
|
|
|
Vector4 projPos(viewProj * Vector4(billboardTransform * billboards_[i].position_, 1.0f));
|
|
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
|
|
else
|
|
|
{
|
|
{
|
|
|
for (unsigned i = 0; i < billboards_.Size(); ++i)
|
|
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;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|