summaryrefslogtreecommitdiff
path: root/indra/newview/llvovolume.cpp
diff options
context:
space:
mode:
authorSabrina Shanman <cosmic@lindenlab.com>2022-07-13 16:34:44 +0000
committerSabrina Shanman <cosmic@lindenlab.com>2022-07-13 16:34:44 +0000
commitdc5a293eff36d04cc9eac7ee4122d3a83c881253 (patch)
tree51cb649dfecd58293c77ec2aa7460f5ef7fa6bc1 /indra/newview/llvovolume.cpp
parentc287bc0a860532c09b02cb1e1b233395b05bbcb7 (diff)
parent1614e4390b514de33609ea94835e75c6ddf9b316 (diff)
Merged in SL-17691 (pull request #1054)
SL-17691: Color changes on objects cause octree rebuilds Approved-by: Andrey Lihatskiy
Diffstat (limited to 'indra/newview/llvovolume.cpp')
-rw-r--r--indra/newview/llvovolume.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index eb8ff29aca..f4a938e57d 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -230,7 +230,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
mMediaImplList.resize(getNumTEs());
mLastFetchedMediaVersion = -1;
- mServerVolumeUpdateCount = 0;
+ mServerDrawableUpdateCount = 0;
memset(&mIndexInTex, 0, sizeof(S32) * LLRender::NUM_VOLUME_TEXTURE_CHANNELS);
mMDCImplCount = 0;
mLastRiggingInfoLOD = -1;
@@ -326,6 +326,9 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
LLColor4U color;
const S32 teDirtyBits = (TEM_CHANGE_TEXTURE|TEM_CHANGE_COLOR|TEM_CHANGE_MEDIA);
+ const bool previously_volume_changed = mVolumeChanged;
+ const bool previously_face_mapping_changed = mFaceMappingChanged;
+ const bool previously_color_changed = mColorChanged;
// Do base class updates...
U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
@@ -401,7 +404,6 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
if (setVolume(volume_params, 0))
{
markForUpdate(TRUE);
- onVolumeUpdateFromServer();
}
}
@@ -438,7 +440,6 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
if (setVolume(volume_params, 0))
{
markForUpdate(TRUE);
- onVolumeUpdateFromServer();
}
S32 res2 = unpackTEMessage(*dp);
if (TEM_INVALID == res2)
@@ -551,14 +552,27 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
// ...and clean up any media impls
cleanUpMediaImpls();
+ if ((
+ (mVolumeChanged && !previously_volume_changed) ||
+ (mFaceMappingChanged && !previously_face_mapping_changed) ||
+ (mColorChanged && !previously_color_changed)
+ )
+ && !mLODChanged) {
+ onDrawableUpdateFromServer();
+ }
+
return retval;
}
-void LLVOVolume::onVolumeUpdateFromServer()
+// Called when a volume, material, etc is updated by the server, possibly by a
+// script. If this occurs too often for this object, mark it as active so that
+// it doesn't disrupt the octree/render batches, thereby potentially causing a
+// big performance penalty.
+void LLVOVolume::onDrawableUpdateFromServer()
{
constexpr U32 UPDATES_UNTIL_ACTIVE = 8;
- ++mServerVolumeUpdateCount;
- if (mDrawable && !mDrawable->isActive() && mServerVolumeUpdateCount > UPDATES_UNTIL_ACTIVE)
+ ++mServerDrawableUpdateCount;
+ if (mDrawable && !mDrawable->isActive() && mServerDrawableUpdateCount > UPDATES_UNTIL_ACTIVE)
{
mDrawable->makeActive();
}