More should-be-safe changes. Prep for pipeline work.
This commit is contained in:
@@ -1272,6 +1272,17 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
|
||||
regenFaces();
|
||||
}
|
||||
genBBoxes(FALSE);
|
||||
|
||||
if (mSculptChanged)
|
||||
{ //changes in sculpt maps can thrash an object bounding box without
|
||||
//triggering a spatial group bounding box update -- force spatial group
|
||||
//to update bounding boxes
|
||||
LLSpatialGroup* group = mDrawable->getSpatialGroup();
|
||||
if (group)
|
||||
{
|
||||
group->unbound();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2347,7 +2358,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
||||
(type == LLRenderPass::PASS_INVISIBLE) ||
|
||||
(type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT));
|
||||
|
||||
if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL))
|
||||
if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_NORMAL))
|
||||
{
|
||||
llwarns << "Non fullbright face has no normals!" << llendl;
|
||||
return;
|
||||
@@ -2383,13 +2394,13 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
||||
glow = (U8) (facep->getTextureEntry()->getGlow() * 255);
|
||||
}
|
||||
|
||||
if (facep->mVertexBuffer.isNull())
|
||||
if (!facep->getVertexBuffer())
|
||||
{
|
||||
llerrs << "WTF?" << llendl;
|
||||
}
|
||||
|
||||
if (idx >= 0 &&
|
||||
draw_vec[idx]->mVertexBuffer == facep->mVertexBuffer &&
|
||||
draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() &&
|
||||
draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
|
||||
(LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex) &&
|
||||
#if LL_DARWIN
|
||||
@@ -2416,7 +2427,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
||||
U32 offset = facep->getIndicesStart();
|
||||
U32 count = facep->getIndicesCount();
|
||||
LLPointer<LLDrawInfo> draw_info = new LLDrawInfo(start,end,count,offset,tex,
|
||||
facep->mVertexBuffer, fullbright, bump);
|
||||
facep->getVertexBuffer(), fullbright, bump);
|
||||
draw_info->mGroup = group;
|
||||
draw_info->mVSize = facep->getVirtualSize();
|
||||
draw_vec.push_back(draw_info);
|
||||
@@ -2513,20 +2524,23 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
||||
//for each face
|
||||
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
|
||||
{
|
||||
LLFace* facep = drawablep->getFace(i);
|
||||
|
||||
//ALWAYS null out vertex buffer on rebuild -- if the face lands in a render
|
||||
// batch, it will recover its vertex buffer reference from the spatial group
|
||||
facep->setVertexBuffer(NULL);
|
||||
//sum up face verts and indices
|
||||
drawablep->updateFaceSize(i);
|
||||
LLFace* facep = drawablep->getFace(i);
|
||||
|
||||
if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0)
|
||||
{
|
||||
facep->mVertexBuffer = NULL;
|
||||
facep->mLastVertexBuffer = NULL;
|
||||
facep->clearVertexBuffer();
|
||||
continue;
|
||||
}
|
||||
|
||||
cur_total += facep->getGeomCount();
|
||||
|
||||
if (facep->hasGeometry() && facep->mPixelArea > FORCE_CULL_AREA)
|
||||
if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
|
||||
{
|
||||
const LLTextureEntry* te = facep->getTextureEntry();
|
||||
LLViewerTexture* tex = facep->getTexture();
|
||||
@@ -2539,7 +2553,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
||||
}
|
||||
}
|
||||
|
||||
BOOL force_simple = (facep->mPixelArea < FORCE_SIMPLE_RENDER_AREA);
|
||||
BOOL force_simple = (facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA);
|
||||
U32 type = gPipeline.getPoolTypeFromTE(te, tex);
|
||||
if (type != LLDrawPool::POOL_ALPHA && force_simple)
|
||||
{
|
||||
@@ -2625,8 +2639,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
||||
}
|
||||
else
|
||||
{ //face has no renderable geometry
|
||||
facep->mVertexBuffer = NULL;
|
||||
facep->mLastVertexBuffer = NULL;
|
||||
facep->clearVertexBuffer();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2697,7 +2710,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
|
||||
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
|
||||
{
|
||||
LLFace* face = drawablep->getFace(i);
|
||||
if (face && face->mVertexBuffer.notNull())
|
||||
if (face && face->getVertexBuffer())
|
||||
{
|
||||
face->getGeometryVolume(*volume, face->getTEOffset(),
|
||||
vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
|
||||
@@ -2748,9 +2761,10 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
|
||||
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
|
||||
{
|
||||
LLFace* face = drawablep->getFace(i);
|
||||
if (face && face->mVertexBuffer.notNull() && face->mVertexBuffer->isLocked())
|
||||
LLVertexBuffer* buff = face ? face->getVertexBuffer() : NULL;
|
||||
if (buff && buff->isLocked())
|
||||
{
|
||||
face->mVertexBuffer->setBuffer(0) ;
|
||||
buff->setBuffer(0) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2852,14 +2866,13 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
||||
buffer->allocateBuffer(geom_count, index_count, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage)
|
||||
{ //resize pre-existing buffer
|
||||
if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage ||
|
||||
buffer->getTypeMask() != mask)
|
||||
{
|
||||
//Using group->mSpatialPartition->mVertexDataMask may be dropping MAP_BINORMAL on RENDER_BUMP...
|
||||
buffer = createVertexBuffer(mask /*group->mSpatialPartition->mVertexDataMask*/,
|
||||
buffer = createVertexBuffer(mask,
|
||||
group->mBufferUsage);
|
||||
buffer->allocateBuffer(geom_count, index_count, TRUE);
|
||||
llassert_always(buffer->getTypeMask() == mask);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2875,11 +2888,12 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
||||
U16 index_offset = 0;
|
||||
|
||||
while (face_iter < i)
|
||||
{
|
||||
{ //update face indices for new buffer
|
||||
facep = *face_iter;
|
||||
facep->mIndicesIndex = indices_index;
|
||||
facep->mGeomIndex = index_offset;
|
||||
facep->mVertexBuffer = buffer;
|
||||
facep->setIndicesIndex(indices_index);
|
||||
facep->setGeomIndex(index_offset);
|
||||
facep->setVertexBuffer(buffer);
|
||||
|
||||
{
|
||||
facep->updateRebuildFlags();
|
||||
if (!LLPipeline::sDelayVBUpdate)
|
||||
@@ -2900,9 +2914,12 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
|
||||
}
|
||||
|
||||
index_offset += facep->getGeomCount();
|
||||
indices_index += facep->mIndicesCount;
|
||||
indices_index += facep->getIndicesCount();
|
||||
|
||||
BOOL force_simple = facep->mPixelArea < FORCE_SIMPLE_RENDER_AREA;
|
||||
|
||||
//append face to appropriate render batch
|
||||
|
||||
BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA;
|
||||
BOOL fullbright = facep->isState(LLFace::FULLBRIGHT);
|
||||
if ((mask & LLVertexBuffer::MAP_NORMAL) == 0)
|
||||
{ //paranoia check to make sure GL doesn't try to read non-existant normals
|
||||
@@ -3071,7 +3088,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
|
||||
//sum up face verts and indices
|
||||
drawablep->updateFaceSize(i);
|
||||
LLFace* facep = drawablep->getFace(i);
|
||||
if (facep->hasGeometry() && facep->mPixelArea > FORCE_CULL_AREA)
|
||||
if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
|
||||
{
|
||||
vertex_count += facep->getGeomCount();
|
||||
index_count += facep->getIndicesCount();
|
||||
@@ -3081,8 +3098,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
|
||||
}
|
||||
else
|
||||
{
|
||||
facep->mVertexBuffer = NULL;
|
||||
facep->mLastVertexBuffer = NULL;
|
||||
facep->clearVertexBuffer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user