From f713fe492f8b86a0743e0a553d62f06ff62500bb Mon Sep 17 00:00:00 2001
From: Xiaohong Bao <bao@lindenlab.com>
Date: Fri, 30 Aug 2013 11:02:15 -0600
Subject: [PATCH] fix for SH-4295: Interesting: Teleporting to previous
 location leave some objects invisible.

---
 indra/newview/llagent.cpp            |  1 +
 indra/newview/llspatialpartition.cpp | 12 +++++++++---
 indra/newview/llspatialpartition.h   |  2 ++
 indra/newview/pipeline.cpp           |  1 +
 4 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 2d7008b4efb..a7bd628d5ab 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -3802,6 +3802,7 @@ bool LLAgent::teleportCore(bool is_local)
 
 		//release geometry from old location
 		gPipeline.resetVertexBuffers();
+		LLSpatialPartition::sTeleportRequested = TRUE;
 	}
 	make_ui_sound("UISndTeleportOut");
 	
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 725afb9014d..c7cd0919ec4 100755
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -68,6 +68,7 @@ BOOL LLSpatialGroup::sNoDelete = FALSE;
 static F32 sLastMaxTexPriority = 1.f;
 static F32 sCurMaxTexPriority = 1.f;
 
+BOOL LLSpatialPartition::sTeleportRequested = FALSE;
 
 //static counter for frame to switch LOD on
 
@@ -900,7 +901,7 @@ void LLSpatialGroup::destroyGL(bool keep_occlusion)
 {
 	setState(LLSpatialGroup::GEOM_DIRTY | LLSpatialGroup::IMAGE_DIRTY);
 
-	if (!keep_occlusion)
+	if (!keep_occlusion && !LLSpatialPartition::sTeleportRequested)
 	{ //going to need a rebuild
 		gPipeline.markRebuild(this, TRUE);
 	}
@@ -1392,6 +1393,8 @@ void drawBoxOutline(const LLVector4a& pos, const LLVector4a& size)
 class LLOctreeDirty : public OctreeTraveler
 {
 public:
+	LLOctreeDirty(bool no_rebuild) : mNoRebuild(no_rebuild){}
+
 	virtual void visit(const OctreeNode* state)
 	{
 		LLSpatialGroup* group = (LLSpatialGroup*) state->getListener(0);
@@ -1404,7 +1407,7 @@ class LLOctreeDirty : public OctreeTraveler
 			{
 				continue;
 			}
-			if (drawable->getVObj().notNull() && !group->getSpatialPartition()->mRenderByGroup)
+			if (!mNoRebuild && drawable->getVObj().notNull() && !group->getSpatialPartition()->mRenderByGroup)
 			{
 				gPipeline.markRebuild(drawable, LLDrawable::REBUILD_ALL, TRUE);
 			}
@@ -1416,6 +1419,9 @@ class LLOctreeDirty : public OctreeTraveler
 			traverse(bridge->mOctree);
 		}
 	}
+
+private:
+	BOOL mNoRebuild;
 };
 
 void LLSpatialPartition::restoreGL()
@@ -1424,7 +1430,7 @@ void LLSpatialPartition::restoreGL()
 
 void LLSpatialPartition::resetVertexBuffers()
 {
-	LLOctreeDirty dirty;
+	LLOctreeDirty dirty(sTeleportRequested);
 	dirty.traverse(mOctree);
 }
 
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 5c4cdcdba1a..4026175a9a9 100755
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -450,6 +450,8 @@ class LLSpatialPartition: public LLViewerOctreePartition, public LLGeometryManag
 	U32 mVertexDataMask;
 	F32 mSlopRatio; //percentage distance must change before drawables receive LOD update (default is 0.25);
 	BOOL mDepthMask; //if TRUE, objects in this partition will be written to depth during alpha rendering
+
+	static BOOL sTeleportRequested; //started to issue a teleport request
 };
 
 // class for creating bridges between spatial partitions
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index e77d85849d4..e71355466a1 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -7314,6 +7314,7 @@ void LLPipeline::doResetVertexBuffers()
 			}
 		}
 	}
+	LLSpatialPartition::sTeleportRequested = FALSE;
 
 	resetDrawOrders();
 
-- 
GitLab