MAINT-2811 Fix for infinite loop on octree code during teleport.

meow-7.2.2
Dave Parks 2013-08-30 15:55:20 -05:00
parent f638fc803d
commit cacefaf2fc
5 changed files with 40 additions and 21 deletions

View File

@ -802,6 +802,7 @@ BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detai
{
// Scale by 4 to generate proper tex coords.
mProfile[i].mul(scale);
llassert(mProfile[i].isFinite3());
}
if (hollow)
@ -839,6 +840,7 @@ BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detai
{
// Scale by 3 to generate proper tex coords.
mProfile[i].mul(scale);
llassert(mProfile[i].isFinite3());
}
if (path_open)
@ -989,6 +991,7 @@ BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detai
{
mOpen = FALSE;
mProfile.push_back(mProfile[0]);
llassert(mProfile[0].isFinite3());
mTotal++;
}
}
@ -2127,7 +2130,7 @@ BOOL LLVolume::generate()
{
rot_mat.rotate(*profile++, tmp);
dst->setAdd(tmp,offset);
llassert(less_than_max_mag(*dst));
llassert(dst->isFinite3());
++dst;
}
}
@ -2840,6 +2843,8 @@ void LLVolume::sculptGeneratePlaceholder()
p[1] = (F32)(sin(F_PI * v) * sin(2.0 * F_PI * u) * RADIUS);
p[2] = (F32)(cos(F_PI * v) * RADIUS);
llassert(pt.isFinite3());
}
line += sizeT;
}
@ -2927,6 +2932,8 @@ void LLVolume::sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8
LLVector4a scale(-1.f,1,1,1);
pt.mul(scale);
}
llassert(pt.isFinite3());
}
line += sizeT;
@ -5552,12 +5559,14 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
tc->mV[0] = (*p)[0]+0.5f;
tc->mV[1] = (*p)[1]+0.5f;
llassert(less_than_max_mag(*src));
llassert(src->isFinite3());
update_min_max(min,max,*src);
update_min_max(min_uv, max_uv, *tc);
*pos = *src;
llassert(pos->isFinite3());
++p;
++tc;
++src;
@ -5577,11 +5586,13 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
tc->mV[0] = (*p)[0]+0.5f;
tc->mV[1] = 0.5f - (*p)[1];
llassert(less_than_max_mag(*src));
llassert(src->isFinite3());
update_min_max(min,max,*src);
update_min_max(min_uv, max_uv, *tc);
*pos = *src;
llassert(pos->isFinite3());
++p;
++tc;
@ -6468,8 +6479,11 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
// mQ = { 0, a[X]*b[Y] - a[Y]*b[X], a[Z]*b[X] - a[X]*b[Z], a[Y]*b[Z] - a[Z]*b[Y] }
vector1 = _mm_sub_ps( vector2, _mm_mul_ps( amQ, bmQ ));
llassert(v1.isFinite3());
v1.store4a((F32*) output);
output++;
idx += 3;
}
@ -6498,14 +6512,8 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
n1.add(c);
n2.add(c);
llassert(llfinite(c.getF32ptr()[0]));
llassert(llfinite(c.getF32ptr()[1]));
llassert(llfinite(c.getF32ptr()[2]));
llassert(!llisnan(c.getF32ptr()[0]));
llassert(!llisnan(c.getF32ptr()[1]));
llassert(!llisnan(c.getF32ptr()[2]));
llassert(c.isFinite3());
//even out quad contributions
switch (i%2+1)
{

View File

@ -1073,8 +1073,6 @@ class LLAdvancedCheckInfoDisplay : public view_listener_t
U32 info_display = info_display_from_string( userdata.asString() );
bool new_value = false;
LL_INFOS("ViewerMenu") << "check " << userdata.asString() << LL_ENDL;
if ( info_display != 0 )
{
new_value = LLPipeline::toggleRenderDebugControl( (void*)info_display );

View File

@ -160,7 +160,11 @@ LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 bo
}
mVOPartGroupp->setViewerPartGroup(this);
mVOPartGroupp->setPositionAgent(getCenterAgent());
mBoxSide = box_side;
F32 scale = box_side * 0.5f;
mVOPartGroupp->setScale(LLVector3(scale,scale,scale));
//gPipeline.addObject(mVOPartGroupp);

View File

@ -105,6 +105,9 @@ public:
void shift(const LLVector3 &offset);
F32 getBoxRadius() { return mBoxRadius; }
F32 getBoxSide() { return mBoxSide; }
typedef std::vector<LLViewerPart*> part_list_t;
part_list_t mParticles;
@ -125,6 +128,7 @@ public:
protected:
LLVector3 mCenterAgent;
F32 mBoxRadius;
F32 mBoxSide;
LLVector3 mMinObjPos;
LLVector3 mMaxObjPos;

View File

@ -176,24 +176,28 @@ BOOL LLVOPartGroup::isActive() const
F32 LLVOPartGroup::getBinRadius()
{
return mScale.mV[0]*2.f;
return mViewerPartGroupp->getBoxSide();
}
void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
const LLVector3& pos_agent = getPositionAgent();
newMin.load3( (pos_agent - mScale).mV);
newMax.load3( (pos_agent + mScale).mV);
LLVector4a scale;
LLVector4a p;
p.load3(pos_agent.mV);
scale.splat(mScale.mV[0]+mViewerPartGroupp->getBoxSide()*0.5f);
newMin.setSub(p, scale);
newMax.setAdd(p,scale);
llassert(newMin.isFinite3());
llassert(newMax.isFinite3());
LLVector4a pos;
pos.load3(pos_agent.mV);
llassert(pos.isFinite3());
mDrawable->setPositionGroup(pos);
llassert(p.isFinite3());
mDrawable->setPositionGroup(p);
}
void LLVOPartGroup::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
@ -459,6 +463,7 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
}
//record max scale (used to stretch bounding box for visibility culling)
mScale.set(max_scale, max_scale, max_scale);
mDrawable->movePartition();