From 3d21b2302b322ee75bb7082314f063fe4950a2d3 Mon Sep 17 00:00:00 2001
From: William Todd Stinson <stinson@lindenlab.com>
Date: Tue, 13 Nov 2012 15:16:26 -0800
Subject: [PATCH] MAINT-1891: FIX Updating the LLPipeline::clearRebuildGroups()
 to preserve HUD groups.  clearRebuildGroups() is called during the teleport
 process.  In the previous state, HUD objects were being incorrectly removed
 from the rebuild groups during the teleport process.  This change will
 preserve HUD groups and should resolve this issue.

---
 indra/newview/pipeline.cpp | 39 +++++++++++++++++++++++++++++++++++---
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 678898797f0..d9f4aa009b5 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -2577,26 +2577,59 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_PRIORITY_GROUPS("Rebuild Priority G
 
 void LLPipeline::clearRebuildGroups()
 {
+	LLSpatialGroup::sg_vector_t	hudGroups;
+
 	mGroupQ1Locked = true;
 	// Iterate through all drawables on the priority build queue,
 	for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin();
 		 iter != mGroupQ1.end(); ++iter)
 	{
 		LLSpatialGroup* group = *iter;
-		group->clearState(LLSpatialGroup::IN_BUILD_Q1);
+
+		// If the group contains HUD objects, save the group
+		if (group->isHUDGroup())
+		{
+			hudGroups.push_back(group);
+		}
+		// Else, no HUD objects so clear the build state
+		else
+		{
+			group->clearState(LLSpatialGroup::IN_BUILD_Q1);
+		}
 	}
+
+	// Clear the group
 	mGroupQ1.clear();
+
+	// Copy the saved HUD groups back in
+	mGroupQ1.assign(hudGroups.begin(), hudGroups.end());
 	mGroupQ1Locked = false;
 
+	// Clear the HUD groups
+	hudGroups.clear();
+
 	mGroupQ2Locked = true;
 	for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ2.begin();
 		 iter != mGroupQ2.end(); ++iter)
 	{
 		LLSpatialGroup* group = *iter;
-		group->clearState(LLSpatialGroup::IN_BUILD_Q2);
-	}	
 
+		// If the group contains HUD objects, save the group
+		if (group->isHUDGroup())
+		{
+			hudGroups.push_back(group);
+		}
+		// Else, no HUD objects so clear the build state
+		else
+		{
+			group->clearState(LLSpatialGroup::IN_BUILD_Q2);
+		}
+	}	
+	// Clear the group
 	mGroupQ2.clear();
+
+	// Copy the saved HUD groups back in
+	mGroupQ2.assign(hudGroups.begin(), hudGroups.end());
 	mGroupQ2Locked = false;
 }
 
-- 
GitLab