diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llvovolume.cpp | 26 | ||||
| -rw-r--r-- | indra/newview/llvovolume.h | 4 | 
2 files changed, 22 insertions, 8 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();      } diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 66c87494df..4136c13315 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -170,7 +170,6 @@ public:  				const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const;  				void	markForUpdate(BOOL priority); -                void    onVolumeUpdateFromServer();  				void	markForUnload()							{ LLViewerObject::markForUnload(TRUE); mVolumeChanged = TRUE; }  				void    faceMappingChanged()                    { mFaceMappingChanged=TRUE; }; @@ -387,6 +386,7 @@ protected:  	static S32 mRenderComplexity_last;  	static S32 mRenderComplexity_current; +    void onDrawableUpdateFromServer();  	void requestMediaDataUpdate(bool isNew);  	void cleanUpMediaImpls();  	void addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) ; @@ -425,7 +425,7 @@ private:  	LLPointer<LLViewerFetchedTexture> mLightTexture;  	media_list_t mMediaImplList;  	S32			mLastFetchedMediaVersion; // as fetched from the server, starts as -1 -    U64         mServerVolumeUpdateCount; +    U32         mServerDrawableUpdateCount;  	S32 mIndexInTex[LLRender::NUM_VOLUME_TEXTURE_CHANNELS];  	S32 mMDCImplCount;  | 
