diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 2d7008b4efb744f4ad0d9f1e2eff002e318e51af..a7bd628d5abec6f82dd06cdb73c27a881a3fec6a 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 725afb9014dce406059ca02cbebd2f418b626c18..c7cd0919ec4bbab05ce99f725c802c7549ca9836 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 5c4cdcdba1afb4c9f8dcea567bb10427c7277685..4026175a9a9589b6c27b645e8819d04555680e15 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 e77d85849d4f11e86a4eac5f413cc5251a05da12..e71355466a176c7d74ed2088a63774e6a2cdccbe 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7314,6 +7314,7 @@ void LLPipeline::doResetVertexBuffers() } } } + LLSpatialPartition::sTeleportRequested = FALSE; resetDrawOrders();