summaryrefslogtreecommitdiff
path: root/indra/newview/lldrawable.cpp
diff options
context:
space:
mode:
authorDave Parks <davep@lindenlab.com>2011-05-12 17:39:08 -0500
committerDave Parks <davep@lindenlab.com>2011-05-12 17:39:08 -0500
commit93696ac019865898d35d37d1e32d7a4b819a0c93 (patch)
treeafac704c0d5ad56c0bc2ed603e6f0bb15f525431 /indra/newview/lldrawable.cpp
parent6fcf9e4817a5c245f7779dd030b0ba75dab10e5e (diff)
parent4911586023144bd10d6a91f3f1be1e65af0c706d (diff)
merge
Diffstat (limited to 'indra/newview/lldrawable.cpp')
-rw-r--r--indra/newview/lldrawable.cpp220
1 files changed, 140 insertions, 80 deletions
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 8106fada11..bdc12ec0e3 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -35,6 +35,7 @@
#include "llcriticaldamp.h"
#include "llface.h"
#include "lllightconstants.h"
+#include "llmatrix4a.h"
#include "llsky.h"
#include "llsurfacepatch.h"
#include "llviewercamera.h"
@@ -85,6 +86,7 @@ void LLDrawable::incrementVisible()
sCurVisible++;
sCurPixelAngle = (F32) gViewerWindow->getWindowHeightRaw()/LLViewerCamera::getInstance()->getView();
}
+
void LLDrawable::init()
{
// mXform
@@ -115,6 +117,11 @@ void LLDrawable::initClass()
void LLDrawable::destroy()
{
+ if (gDebugGL)
+ {
+ gPipeline.checkReferences(this);
+ }
+
if (isDead())
{
sNumZombieDrawables--;
@@ -133,6 +140,7 @@ void LLDrawable::destroy()
{
llinfos << "- Zombie drawables: " << sNumZombieDrawables << llendl;
}*/
+
}
void LLDrawable::markDead()
@@ -170,6 +178,11 @@ LLVOVolume* LLDrawable::getVOVolume() const
}
}
+const LLMatrix4& LLDrawable::getRenderMatrix() const
+{
+ return isRoot() ? getWorldMatrix() : getParent()->getWorldMatrix();
+}
+
BOOL LLDrawable::isLight() const
{
LLViewerObject* objectp = mVObjp;
@@ -183,20 +196,30 @@ BOOL LLDrawable::isLight() const
}
}
+static LLFastTimer::DeclareTimer FTM_CLEANUP_DRAWABLE("Cleanup Drawable");
+static LLFastTimer::DeclareTimer FTM_DEREF_DRAWABLE("Deref");
+static LLFastTimer::DeclareTimer FTM_DELETE_FACES("Faces");
+
void LLDrawable::cleanupReferences()
{
- LLFastTimer t(FTM_PIPELINE);
+ LLFastTimer t(FTM_CLEANUP_DRAWABLE);
- std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());
- mFaces.clear();
+ {
+ LLFastTimer t(FTM_DELETE_FACES);
+ std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());
+ mFaces.clear();
+ }
gObjectList.removeDrawable(this);
gPipeline.unlinkDrawable(this);
- // Cleanup references to other objects
- mVObjp = NULL;
- mParent = NULL;
+ {
+ LLFastTimer t(FTM_DEREF_DRAWABLE);
+ // Cleanup references to other objects
+ mVObjp = NULL;
+ mParent = NULL;
+ }
}
void LLDrawable::cleanupDeadDrawables()
@@ -685,13 +708,15 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
LLVOVolume* volume = getVOVolume();
if (volume)
{
- volume->updateRelativeXform();
- pos = volume->getRelativeXform().getTranslation();
- if (isStatic())
+ if (getSpatialGroup())
{
- pos += volume->getRegion()->getOriginAgent();
+ pos.set(getPositionGroup().getF32ptr());
}
-
+ else
+ {
+ pos = getPositionAgent();
+ }
+
if (isState(LLDrawable::HAS_ALPHA))
{
for (S32 i = 0; i < getNumFaces(); i++)
@@ -699,21 +724,23 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
LLFace* facep = getFace(i);
if (force_update || facep->getPoolType() == LLDrawPool::POOL_ALPHA)
{
- LLVector3 box = (facep->mExtents[1] - facep->mExtents[0]) * 0.25f;
+ LLVector4a box;
+ box.setSub(facep->mExtents[1], facep->mExtents[0]);
+ box.mul(0.25f);
LLVector3 v = (facep->mCenterLocal-camera.getOrigin());
const LLVector3& at = camera.getAtAxis();
for (U32 j = 0; j < 3; j++)
{
- v.mV[j] -= box.mV[j] * at.mV[j];
+ v.mV[j] -= box[j] * at.mV[j];
}
facep->mDistance = v * camera.getAtAxis();
}
}
- }
+ }
}
else
{
- pos = LLVector3(getPositionGroup());
+ pos = LLVector3(getPositionGroup().getF32ptr());
}
pos -= camera.getOrigin();
@@ -739,7 +766,7 @@ void LLDrawable::updateTexture()
if (getVOVolume())
{
- if (isActive())
+ /*if (isActive())
{
if (isRoot())
{
@@ -749,7 +776,7 @@ void LLDrawable::updateTexture()
{
getParent()->mQuietCount = 0;
}
- }
+ }*/
gPipeline.markRebuild(this, LLDrawable::REBUILD_MATERIAL, TRUE);
}
@@ -762,7 +789,7 @@ BOOL LLDrawable::updateGeometry(BOOL priority)
return res;
}
-void LLDrawable::shiftPos(const LLVector3 &shift_vector)
+void LLDrawable::shiftPos(const LLVector4a &shift_vector)
{
if (isDead())
{
@@ -794,20 +821,19 @@ void LLDrawable::shiftPos(const LLVector3 &shift_vector)
for (S32 i = 0; i < getNumFaces(); i++)
{
LLFace *facep = getFace(i);
- facep->mCenterAgent += shift_vector;
- facep->mExtents[0] += shift_vector;
- facep->mExtents[1] += shift_vector;
+ facep->mCenterAgent += LLVector3(shift_vector.getF32ptr());
+ facep->mExtents[0].add(shift_vector);
+ facep->mExtents[1].add(shift_vector);
if (!volume && facep->hasGeometry())
{
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
- mExtents[0] += shift_vector;
- mExtents[1] += shift_vector;
- mPositionGroup += LLVector3d(shift_vector);
+ mExtents[0].add(shift_vector);
+ mExtents[1].add(shift_vector);
+ mPositionGroup.add(shift_vector);
}
else if (mSpatialBridge)
{
@@ -815,9 +841,9 @@ void LLDrawable::shiftPos(const LLVector3 &shift_vector)
}
else if (isAvatar())
{
- mExtents[0] += shift_vector;
- mExtents[1] += shift_vector;
- mPositionGroup += LLVector3d(shift_vector);
+ mExtents[0].add(shift_vector);
+ mExtents[1].add(shift_vector);
+ mPositionGroup.add(shift_vector);
}
mVObjp->onShift(shift_vector);
@@ -829,21 +855,26 @@ const LLVector3& LLDrawable::getBounds(LLVector3& min, LLVector3& max) const
return mXform.getPositionW();
}
-const LLVector3* LLDrawable::getSpatialExtents() const
+const LLVector4a* LLDrawable::getSpatialExtents() const
{
return mExtents;
}
-void LLDrawable::setSpatialExtents(LLVector3 min, LLVector3 max)
+void LLDrawable::setSpatialExtents(const LLVector3& min, const LLVector3& max)
+{
+ mExtents[0].load3(min.mV);
+ mExtents[1].load3(max.mV);
+}
+
+void LLDrawable::setSpatialExtents(const LLVector4a& min, const LLVector4a& max)
{
- LLVector3 size = max - min;
mExtents[0] = min;
- mExtents[1] = max;
+ mExtents[1] = max;
}
-void LLDrawable::setPositionGroup(const LLVector3d& pos)
+void LLDrawable::setPositionGroup(const LLVector4a& pos)
{
- mPositionGroup.setVec(pos);
+ mPositionGroup = pos;
}
void LLDrawable::updateSpatialExtents()
@@ -857,7 +888,7 @@ void LLDrawable::updateSpatialExtents()
if (mSpatialBridge.notNull())
{
- mPositionGroup.setVec(0,0,0);
+ mPositionGroup.splat(0.f);
}
}
@@ -910,6 +941,18 @@ void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
{
mSpatialGroupp->setState(LLSpatialGroup::GEOM_DIRTY);
}*/
+
+ if (mSpatialGroupp != groupp && getVOVolume())
+ { //NULL out vertex buffer references for volumes on spatial group change to maintain
+ //requirement that every face vertex buffer is either NULL or points to a vertex buffer
+ //contained by its drawable's spatial group
+ for (S32 i = 0; i < getNumFaces(); ++i)
+ {
+ LLFace* facep = getFace(i);
+ facep->clearVertexBuffer();
+ }
+ }
+
mSpatialGroupp = groupp;
}
@@ -1027,7 +1070,7 @@ BOOL LLDrawable::isVisible() const
//=======================================
LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask)
-: LLSpatialPartition(data_mask, render_by_group, FALSE)
+: LLSpatialPartition(data_mask, render_by_group, GL_STREAM_DRAW_ARB)
{
mDrawable = root;
root->setSpatialBridge(this);
@@ -1068,59 +1111,72 @@ void LLSpatialBridge::updateSpatialExtents()
root->rebound();
}
- LLXformMatrix* mat = mDrawable->getXform();
-
- LLVector3 offset = root->mBounds[0];
- LLVector3 size = root->mBounds[1];
+ LLVector4a offset;
+ LLVector4a size = root->mBounds[1];
- LLVector3 center = LLVector3(0,0,0) * mat->getWorldMatrix();
- LLQuaternion rotation = LLQuaternion(mat->getWorldMatrix());
+ //VECTORIZE THIS
+ LLMatrix4a mat;
+ mat.loadu(mDrawable->getXform()->getWorldMatrix());
+
+ LLVector4a t;
+ t.splat(0.f);
+
+ LLVector4a center;
+ mat.affineTransform(t, center);
- offset *= rotation;
- center += offset;
+ mat.rotate(root->mBounds[0], offset);
+ center.add(offset);
- LLVector3 v[4];
+ LLVector4a v[4];
+
//get 4 corners of bounding box
- v[0] = (size * rotation);
- v[1] = (LLVector3(-size.mV[0], -size.mV[1], size.mV[2]) * rotation);
- v[2] = (LLVector3(size.mV[0], -size.mV[1], -size.mV[2]) * rotation);
- v[3] = (LLVector3(-size.mV[0], size.mV[1], -size.mV[2]) * rotation);
+ mat.rotate(size,v[0]);
- LLVector3& newMin = mExtents[0];
- LLVector3& newMax = mExtents[1];
+ LLVector4a scale;
+
+ scale.set(-1.f, -1.f, 1.f);
+ scale.mul(size);
+ mat.rotate(scale, v[1]);
+
+ scale.set(1.f, -1.f, -1.f);
+ scale.mul(size);
+ mat.rotate(scale, v[2]);
+
+ scale.set(-1.f, 1.f, -1.f);
+ scale.mul(size);
+ mat.rotate(scale, v[3]);
+
+
+ LLVector4a& newMin = mExtents[0];
+ LLVector4a& newMax = mExtents[1];
newMin = newMax = center;
for (U32 i = 0; i < 4; i++)
{
- for (U32 j = 0; j < 3; j++)
- {
- F32 delta = fabsf(v[i].mV[j]);
- F32 min = center.mV[j] - delta;
- F32 max = center.mV[j] + delta;
-
- if (min < newMin.mV[j])
- {
- newMin.mV[j] = min;
- }
-
- if (max > newMax.mV[j])
- {
- newMax.mV[j] = max;
- }
- }
- }
+ LLVector4a delta;
+ delta.setAbs(v[i]);
+ LLVector4a min;
+ min.setSub(center, delta);
+ LLVector4a max;
+ max.setAdd(center, delta);
- LLVector3 diagonal = newMax - newMin;
- mRadius = diagonal.magVec() * 0.5f;
+ newMin.setMin(newMin, min);
+ newMax.setMax(newMax, max);
+ }
+
+ LLVector4a diagonal;
+ diagonal.setSub(newMax, newMin);
+ mRadius = diagonal.getLength3().getF32() * 0.5f;
- mPositionGroup.setVec((newMin + newMax) * 0.5f);
+ mPositionGroup.setAdd(newMin,newMax);
+ mPositionGroup.mul(0.5f);
updateBinRadius();
}
void LLSpatialBridge::updateBinRadius()
{
- mBinRadius = llmin((F32) mOctree->getSize().mdV[0]*0.5f, 256.f);
+ mBinRadius = llmin( mOctree->getSize()[0]*0.5f, 256.f);
}
LLCamera LLSpatialBridge::transformCamera(LLCamera& camera)
@@ -1261,8 +1317,12 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>*
LLSpatialGroup* group = (LLSpatialGroup*) mOctree->getListener(0);
group->rebound();
- LLVector3 center = (mExtents[0] + mExtents[1]) * 0.5f;
- LLVector3 size = (mExtents[1]-mExtents[0]) * 0.5f;
+ LLVector4a center;
+ center.setAdd(mExtents[0], mExtents[1]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(mExtents[1], mExtents[0]);
+ size.mul(0.5f);
if ((LLPipeline::sShadowRender && camera_in.AABBInFrustum(center, size)) ||
LLPipeline::sImpostorRender ||
@@ -1375,11 +1435,11 @@ BOOL LLSpatialBridge::updateMove()
return TRUE;
}
-void LLSpatialBridge::shiftPos(const LLVector3& vec)
+void LLSpatialBridge::shiftPos(const LLVector4a& vec)
{
- mExtents[0] += vec;
- mExtents[1] += vec;
- mPositionGroup += LLVector3d(vec);
+ mExtents[0].add(vec);
+ mExtents[1].add(vec);
+ mPositionGroup.add(vec);
}
void LLSpatialBridge::cleanupReferences()
@@ -1497,7 +1557,7 @@ F32 LLHUDBridge::calcPixelArea(LLSpatialGroup* group, LLCamera& camera)
}
-void LLHUDBridge::shiftPos(const LLVector3& vec)
+void LLHUDBridge::shiftPos(const LLVector4a& vec)
{
//don't shift hud bridges on region crossing
}