summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiaohong Bao <bao@lindenlab.com>2013-08-30 11:02:15 -0600
committerXiaohong Bao <bao@lindenlab.com>2013-08-30 11:02:15 -0600
commitf713fe492f8b86a0743e0a553d62f06ff62500bb (patch)
treef45ce691e7f07a64e659f3f2742e005fa857bfa8
parent1751650dbcad4ea66b2c3779aa52960ec1640466 (diff)
fix for SH-4295: Interesting: Teleporting to previous location leave some objects invisible.
-rwxr-xr-xindra/newview/llagent.cpp1
-rwxr-xr-xindra/newview/llspatialpartition.cpp12
-rwxr-xr-xindra/newview/llspatialpartition.h2
-rwxr-xr-xindra/newview/pipeline.cpp1
4 files changed, 13 insertions, 3 deletions
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 2d7008b4ef..a7bd628d5a 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 725afb9014..c7cd0919ec 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 @@ public:
{
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 @@ public:
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 5c4cdcdba1..4026175a9a 100755
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -450,6 +450,8 @@ public:
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 e77d85849d..e71355466a 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -7314,6 +7314,7 @@ void LLPipeline::doResetVertexBuffers()
}
}
}
+ LLSpatialPartition::sTeleportRequested = FALSE;
resetDrawOrders();