From ccac47c1a71884c04a00d95358770b170f346fbd Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Mon, 16 Jul 2012 14:31:15 -0500
Subject: [PATCH] MAINT-1223 Fix for alpha updates not triggering LoD updates.

---
 indra/newview/lldrawable.cpp | 12 ------------
 indra/newview/llface.cpp     | 15 ++++++++++++++-
 indra/newview/llvovolume.cpp |  9 ++++++++-
 indra/newview/llvovolume.h   |  3 ++-
 4 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 98246162f0..108ec92f6d 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -783,18 +783,6 @@ void LLDrawable::updateTexture()
 
 	if (getVOVolume())
 	{
-		/*if (isActive())
-		{
-			if (isRoot())
-			{
-				mQuietCount = 0;
-			}
-			else
-			{
-				getParent()->mQuietCount = 0;
-			}
-		}*/
-				
 		gPipeline.markRebuild(this, LLDrawable::REBUILD_MATERIAL, TRUE);
 	}
 }
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 2d84c5d7de..373b1930f5 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -326,7 +326,20 @@ void LLFace::setTexture(LLViewerTexture* tex)
 
 void LLFace::dirtyTexture()
 {
-	gPipeline.markTextured(getDrawable());
+	LLDrawable* drawablep = getDrawable();
+
+	if (mVObjp.notNull() && mVObjp->getVolume() && 
+		mTexture.notNull() && mTexture->getComponents() == 4)
+	{ //dirty texture on an alpha object should be treated as an LoD update
+		LLVOVolume* vobj = drawablep->getVOVolume();
+		if (vobj)
+		{
+			vobj->mLODChanged = TRUE;
+		}
+		gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_VOLUME, FALSE);
+	}		
+			
+	gPipeline.markTextured(drawablep);
 }
 
 void LLFace::switchTexture(LLViewerTexture* new_texture)
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index c4e7ea44b4..7ccb6dc8dc 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1879,7 +1879,8 @@ S32 LLVOVolume::setTEColor(const U8 te, const LLColor4& color)
 	}
 	else if (color != tep->getColor())
 	{
-		if (color.mV[3] != tep->getColor().mV[3])
+		F32 old_alpha = tep->getColor().mV[3];
+		if (color.mV[3] != old_alpha)
 		{
 			gPipeline.markTextured(mDrawable);
 		}
@@ -1889,6 +1890,12 @@ S32 LLVOVolume::setTEColor(const U8 te, const LLColor4& color)
 			// These should only happen on updates which are not the initial update.
 			mDrawable->setState(LLDrawable::REBUILD_COLOR);
 			dirtyMesh();
+
+			if (old_alpha >= 1.f || color.mV[3] <= 0.f)
+			{ //treat this alpha change as an LoD update since render batches will need to get rebuilt
+				mLODChanged = TRUE;
+				gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
+			}
 		}
 	}
 
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index c4505b4bd8..29e782e9dd 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -340,7 +340,8 @@ public:
 	U8 mTexAnimMode;
 private:
 	friend class LLDrawable;
-	
+	friend class LLFace;
+
 	BOOL		mFaceMappingChanged;
 	LLFrameTimer mTextureUpdateTimer;
 	S32			mLOD;
-- 
GitLab