SH-2188. Invalid VBO updates for rigged attachments.
This commit is contained in:
@@ -1364,29 +1364,38 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
|
||||
return;
|
||||
}
|
||||
|
||||
LLVertexBuffer* buffer = face->getVertexBuffer();
|
||||
LLPointer<LLVertexBuffer> buffer = face->getVertexBuffer();
|
||||
LLDrawable* drawable = face->getDrawable();
|
||||
|
||||
U32 data_mask = face->getRiggedVertexBufferDataMask();
|
||||
|
||||
if (!buffer ||
|
||||
if (buffer.isNull() ||
|
||||
buffer->getTypeMask() != data_mask ||
|
||||
buffer->getRequestedVerts() != vol_face.mNumVertices)
|
||||
buffer->getRequestedVerts() != vol_face.mNumVertices ||
|
||||
buffer->getRequestedIndices() != vol_face.mNumIndices ||
|
||||
(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
|
||||
{
|
||||
face->setGeomIndex(0);
|
||||
face->setIndicesIndex(0);
|
||||
face->setSize(vol_face.mNumVertices, vol_face.mNumIndices, true);
|
||||
|
||||
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
|
||||
if (buffer.isNull() || buffer->getTypeMask() != data_mask)
|
||||
{ //make a new buffer
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
|
||||
}
|
||||
buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);
|
||||
}
|
||||
else
|
||||
else //resize existing buffer
|
||||
{
|
||||
buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
|
||||
buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
|
||||
}
|
||||
|
||||
buffer->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), true);
|
||||
face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
|
||||
|
||||
face->setVertexBuffer(buffer);
|
||||
|
||||
@@ -1488,6 +1497,11 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (drawable && (face->getTEOffset() == drawable->getNumFaces()-1))
|
||||
{
|
||||
drawable->clearState(LLDrawable::REBUILD_ALL);
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
@@ -1518,7 +1532,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
LLVolume* volume = vobj->getVolume();
|
||||
S32 te = face->getTEOffset();
|
||||
|
||||
if (!volume || volume->getNumVolumeFaces() <= te)
|
||||
if (!volume || volume->getNumVolumeFaces() <= te || !volume->isMeshAssetLoaded())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1717,7 +1717,7 @@ void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
|
||||
if (data.mModel[i].notNull())
|
||||
{
|
||||
LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));
|
||||
volume->copyVolumeFaces(data.mModel[i]);
|
||||
volume->setMeshAssetLoaded(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2184,11 +2184,6 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
|
||||
|
||||
if (volume)
|
||||
{
|
||||
if (volume->getNumVolumeFaces() == 0 && !volume->isTetrahedron())
|
||||
{
|
||||
volume->makeTetrahedron();
|
||||
}
|
||||
|
||||
LLVolumeParams params = volume->getParams();
|
||||
|
||||
LLVolumeLODGroup* group = LLPrimitive::getVolumeManager()->getGroup(params);
|
||||
@@ -2199,7 +2194,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
|
||||
if (last_lod >= 0)
|
||||
{
|
||||
LLVolume* lod = group->refLOD(last_lod);
|
||||
if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
|
||||
if (lod && !lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0)
|
||||
{
|
||||
group->derefLOD(lod);
|
||||
return last_lod;
|
||||
@@ -2211,7 +2206,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
|
||||
for (S32 i = detail-1; i >= 0; --i)
|
||||
{
|
||||
LLVolume* lod = group->refLOD(i);
|
||||
if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
|
||||
if (lod && !lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0)
|
||||
{
|
||||
group->derefLOD(lod);
|
||||
return i;
|
||||
@@ -2224,7 +2219,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
|
||||
for (S32 i = detail+1; i < 4; ++i)
|
||||
{
|
||||
LLVolume* lod = group->refLOD(i);
|
||||
if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
|
||||
if (lod && !lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0)
|
||||
{
|
||||
group->derefLOD(lod);
|
||||
return i;
|
||||
@@ -2493,7 +2488,6 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol
|
||||
if (volume->getNumVolumeFaces() <= 0)
|
||||
{
|
||||
llwarns << "Mesh loading returned empty volume." << llendl;
|
||||
volume->makeTetrahedron();
|
||||
}
|
||||
|
||||
{ //update system volume
|
||||
@@ -2501,6 +2495,7 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol
|
||||
if (sys_volume)
|
||||
{
|
||||
sys_volume->copyVolumeFaces(volume);
|
||||
sys_volume->setMeshAssetLoaded(TRUE);
|
||||
LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -763,9 +763,6 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo
|
||||
{ //meshes might not have all LODs, get the force detail to best existing LOD
|
||||
LLUUID mesh_id = volume_params.getSculptID();
|
||||
|
||||
//profile and path params don't matter for meshes
|
||||
volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
|
||||
|
||||
lod = gMeshRepo.getActualMeshLOD(volume_params, lod);
|
||||
if (lod == -1)
|
||||
{
|
||||
@@ -828,7 +825,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo
|
||||
// if it's a mesh
|
||||
if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
|
||||
{
|
||||
if (getVolume()->getNumVolumeFaces() == 0 || getVolume()->isTetrahedron())
|
||||
if (!getVolume()->isMeshAssetLoaded())
|
||||
{
|
||||
//load request not yet issued, request pipeline load this mesh
|
||||
LLUUID asset_id = volume_params.getSculptID();
|
||||
@@ -2268,7 +2265,7 @@ U32 LLVOVolume::getHighLODTriangleCount()
|
||||
else if (isMesh())
|
||||
{
|
||||
LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3);
|
||||
if (ref->isTetrahedron() || ref->getNumVolumeFaces() == 0)
|
||||
if (!ref->isMeshAssetLoaded() || ref->getNumVolumeFaces() == 0)
|
||||
{
|
||||
gMeshRepo.loadMesh(this, volume->getParams(), LLModel::LOD_HIGH);
|
||||
}
|
||||
@@ -3141,7 +3138,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
||||
LLVOVolume* vobj = drawablep->getVOVolume();
|
||||
|
||||
#if MESH_ENABLED
|
||||
if (vobj->getVolume() && vobj->getVolume()->isTetrahedron() || (vobj->isMesh() && !gMeshRepo.meshRezEnabled()))
|
||||
if (vobj->isMesh() &&
|
||||
(vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded() || !gMeshRepo.meshRezEnabled()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user