MAINT-753 : [crashhunters] crash at LLVOVolume::updateFaceFlags(). Null pointer checks are good.
Reviewed by Kellymaster
parent
68ec4d8355
commit
71bbb384b0
|
|
@ -604,7 +604,11 @@ void LLDrawable::moveUpdatePipeline(BOOL moved)
|
|||
// Update the face centers.
|
||||
for (S32 i = 0; i < getNumFaces(); i++)
|
||||
{
|
||||
getFace(i)->updateCenterAgent();
|
||||
LLFace* face = getFace(i);
|
||||
if (face)
|
||||
{
|
||||
face->updateCenterAgent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -734,7 +738,8 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
|
|||
for (S32 i = 0; i < getNumFaces(); i++)
|
||||
{
|
||||
LLFace* facep = getFace(i);
|
||||
if (force_update || facep->getPoolType() == LLDrawPool::POOL_ALPHA)
|
||||
if (facep &&
|
||||
(force_update || facep->getPoolType() == LLDrawPool::POOL_ALPHA))
|
||||
{
|
||||
LLVector4a box;
|
||||
box.setSub(facep->mExtents[1], facep->mExtents[0]);
|
||||
|
|
@ -833,13 +838,16 @@ void LLDrawable::shiftPos(const LLVector4a &shift_vector)
|
|||
for (S32 i = 0; i < getNumFaces(); i++)
|
||||
{
|
||||
LLFace *facep = getFace(i);
|
||||
facep->mCenterAgent += LLVector3(shift_vector.getF32ptr());
|
||||
facep->mExtents[0].add(shift_vector);
|
||||
facep->mExtents[1].add(shift_vector);
|
||||
|
||||
if (!volume && facep->hasGeometry())
|
||||
if (facep)
|
||||
{
|
||||
facep->clearVertexBuffer();
|
||||
facep->mCenterAgent += LLVector3(shift_vector.getF32ptr());
|
||||
facep->mExtents[0].add(shift_vector);
|
||||
facep->mExtents[1].add(shift_vector);
|
||||
|
||||
if (!volume && facep->hasGeometry())
|
||||
{
|
||||
facep->clearVertexBuffer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -961,7 +969,10 @@ void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
|
|||
for (S32 i = 0; i < getNumFaces(); ++i)
|
||||
{
|
||||
LLFace* facep = getFace(i);
|
||||
facep->clearVertexBuffer();
|
||||
if (facep)
|
||||
{
|
||||
facep->clearVertexBuffer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -334,12 +334,14 @@ inline LLFace* LLDrawable::getFace(const S32 i) const
|
|||
|
||||
if ((U32) i >= mFaces.size())
|
||||
{
|
||||
llerrs << "Invalid face index." << llendl;
|
||||
llwarns << "Invalid face index." << llendl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!mFaces[i])
|
||||
{
|
||||
llerrs << "Null face found." << llendl;
|
||||
llwarns << "Null face found." << llendl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return mFaces[i];
|
||||
|
|
|
|||
|
|
@ -1124,9 +1124,13 @@ BOOL LLPreviewAnimation::render()
|
|||
LLVertexBuffer::unbind();
|
||||
LLGLDepthTest gls_depth(GL_TRUE);
|
||||
|
||||
LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool();
|
||||
avatarp->dirtyMesh();
|
||||
avatarPoolp->renderAvatars(avatarp); // renders only one avatar
|
||||
LLFace* face = avatarp->mDrawable->getFace(0);
|
||||
if (face)
|
||||
{
|
||||
LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)face->getPool();
|
||||
avatarp->dirtyMesh();
|
||||
avatarPoolp->renderAvatars(avatarp); // renders only one avatar
|
||||
}
|
||||
}
|
||||
|
||||
gGL.color4f(1,1,1,1);
|
||||
|
|
|
|||
|
|
@ -704,9 +704,13 @@ BOOL LLImagePreviewAvatar::render()
|
|||
// make sure alpha=0 shows avatar material color
|
||||
LLGLDisable no_blend(GL_BLEND);
|
||||
|
||||
LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool();
|
||||
gPipeline.enableLightsPreview();
|
||||
avatarPoolp->renderAvatars(avatarp); // renders only one avatar
|
||||
LLFace* face = avatarp->mDrawable->getFace(0);
|
||||
if (face)
|
||||
{
|
||||
LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)face->getPool();
|
||||
gPipeline.enableLightsPreview();
|
||||
avatarPoolp->renderAvatars(avatarp); // renders only one avatar
|
||||
}
|
||||
}
|
||||
|
||||
gGL.popUIMatrix();
|
||||
|
|
|
|||
|
|
@ -1513,7 +1513,10 @@ void LLSpatialGroup::destroyGL(bool keep_occlusion)
|
|||
for (S32 j = 0; j < drawable->getNumFaces(); j++)
|
||||
{
|
||||
LLFace* facep = drawable->getFace(j);
|
||||
facep->clearVertexBuffer();
|
||||
if (facep)
|
||||
{
|
||||
facep->clearVertexBuffer();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2502,18 +2505,21 @@ void pushVerts(LLSpatialGroup* group, U32 mask)
|
|||
|
||||
void pushVerts(LLFace* face, U32 mask)
|
||||
{
|
||||
llassert(face->verify());
|
||||
|
||||
LLVertexBuffer* buffer = face->getVertexBuffer();
|
||||
|
||||
if (buffer && (face->getGeomCount() >= 3))
|
||||
if (face)
|
||||
{
|
||||
buffer->setBuffer(mask);
|
||||
U16 start = face->getGeomStart();
|
||||
U16 end = start + face->getGeomCount()-1;
|
||||
U32 count = face->getIndicesCount();
|
||||
U16 offset = face->getIndicesStart();
|
||||
buffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
|
||||
llassert(face->verify());
|
||||
|
||||
LLVertexBuffer* buffer = face->getVertexBuffer();
|
||||
|
||||
if (buffer && (face->getGeomCount() >= 3))
|
||||
{
|
||||
buffer->setBuffer(mask);
|
||||
U16 start = face->getGeomStart();
|
||||
U16 end = start + face->getGeomCount()-1;
|
||||
U32 count = face->getIndicesCount();
|
||||
U16 offset = face->getIndicesStart();
|
||||
buffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2650,7 +2656,7 @@ void renderOctree(LLSpatialGroup* group)
|
|||
for (S32 j = 0; j < drawable->getNumFaces(); j++)
|
||||
{
|
||||
LLFace* face = drawable->getFace(j);
|
||||
if (face->getVertexBuffer())
|
||||
if (face && face->getVertexBuffer())
|
||||
{
|
||||
if (gFrameTimeSeconds - face->mLastUpdateTime < 0.5f)
|
||||
{
|
||||
|
|
@ -3021,15 +3027,17 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
|
|||
for (S32 i = 0; i < drawable->getNumFaces(); i++)
|
||||
{
|
||||
LLFace* facep = drawable->getFace(i);
|
||||
if (facep)
|
||||
{
|
||||
ext = facep->mExtents;
|
||||
|
||||
ext = facep->mExtents;
|
||||
|
||||
pos.setAdd(ext[0], ext[1]);
|
||||
pos.mul(0.5f);
|
||||
size.setSub(ext[1], ext[0]);
|
||||
size.mul(0.5f);
|
||||
pos.setAdd(ext[0], ext[1]);
|
||||
pos.mul(0.5f);
|
||||
size.setSub(ext[1], ext[0]);
|
||||
size.mul(0.5f);
|
||||
|
||||
drawBoxOutline(pos,size);
|
||||
drawBoxOutline(pos,size);
|
||||
}
|
||||
}
|
||||
|
||||
//render drawable bounding box
|
||||
|
|
@ -3521,18 +3529,21 @@ void renderPhysicsShapes(LLSpatialGroup* group)
|
|||
for (S32 i = 0; i < drawable->getNumFaces(); ++i)
|
||||
{
|
||||
LLFace* face = drawable->getFace(i);
|
||||
LLVertexBuffer* buff = face->getVertexBuffer();
|
||||
if (buff)
|
||||
if (face)
|
||||
{
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
LLVertexBuffer* buff = face->getVertexBuffer();
|
||||
if (buff)
|
||||
{
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
|
||||
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
|
||||
buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
|
||||
buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
|
||||
|
||||
gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
|
||||
gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3556,6 +3567,7 @@ void renderTexturePriority(LLDrawable* drawable)
|
|||
|
||||
//LLViewerTexture* imagep = facep->getTexture();
|
||||
//if (imagep)
|
||||
if (facep)
|
||||
{
|
||||
|
||||
//F32 vsize = imagep->mMaxVirtualSize;
|
||||
|
|
@ -3608,7 +3620,11 @@ void renderPoints(LLDrawable* drawablep)
|
|||
gGL.diffuseColor3f(1,1,1);
|
||||
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
|
||||
{
|
||||
gGL.vertex3fv(drawablep->getFace(i)->mCenterLocal.mV);
|
||||
LLFace * face = drawablep->getFace(i);
|
||||
if (face)
|
||||
{
|
||||
gGL.vertex3fv(face->mCenterLocal.mV);
|
||||
}
|
||||
}
|
||||
gGL.end();
|
||||
}
|
||||
|
|
@ -3685,7 +3701,11 @@ void renderLights(LLDrawable* drawablep)
|
|||
|
||||
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
|
||||
{
|
||||
pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX);
|
||||
LLFace * face = drawablep->getFace(i);
|
||||
if (face)
|
||||
{
|
||||
pushVerts(face, LLVertexBuffer::MAP_VERTEX);
|
||||
}
|
||||
}
|
||||
|
||||
const LLVector4a* ext = drawablep->getSpatialExtents();
|
||||
|
|
@ -4083,18 +4103,21 @@ public:
|
|||
for (U32 i = 0; i < drawable->getNumFaces(); ++i)
|
||||
{
|
||||
LLFace* facep = drawable->getFace(i);
|
||||
U8 index = facep->getTextureIndex();
|
||||
if (facep->mDrawInfo)
|
||||
if (facep)
|
||||
{
|
||||
if (index < 255)
|
||||
U8 index = facep->getTextureIndex();
|
||||
if (facep->mDrawInfo)
|
||||
{
|
||||
if (facep->mDrawInfo->mTextureList.size() <= index)
|
||||
if (index < 255)
|
||||
{
|
||||
llerrs << "Face texture index out of bounds." << llendl;
|
||||
}
|
||||
else if (facep->mDrawInfo->mTextureList[index] != facep->getTexture())
|
||||
{
|
||||
llerrs << "Face texture index incorrect." << llendl;
|
||||
if (facep->mDrawInfo->mTextureList.size() <= index)
|
||||
{
|
||||
llerrs << "Face texture index out of bounds." << llendl;
|
||||
}
|
||||
else if (facep->mDrawInfo->mTextureList[index] != facep->getTexture())
|
||||
{
|
||||
llerrs << "Face texture index incorrect." << llendl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -225,7 +225,8 @@ BOOL LLVisualParamHint::render()
|
|||
|
||||
LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE);
|
||||
|
||||
if (gAgentAvatarp->mDrawable.notNull())
|
||||
if (gAgentAvatarp->mDrawable.notNull() &&
|
||||
gAgentAvatarp->mDrawable->getFace(0))
|
||||
{
|
||||
LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)gAgentAvatarp->mDrawable->getFace(0)->getPool();
|
||||
LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE);
|
||||
|
|
|
|||
|
|
@ -127,7 +127,11 @@ void LLViewerJointAttachment::setupDrawable(LLViewerObject *object)
|
|||
{
|
||||
for (S32 face_num = 0; face_num < object->mDrawable->getNumFaces(); face_num++)
|
||||
{
|
||||
object->mDrawable->getFace(face_num)->setState(LLFace::HUD_RENDER);
|
||||
LLFace *face = object->mDrawable->getFace(face_num);
|
||||
if (face)
|
||||
{
|
||||
face->setState(LLFace::HUD_RENDER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -146,7 +150,11 @@ void LLViewerJointAttachment::setupDrawable(LLViewerObject *object)
|
|||
{
|
||||
for (S32 face_num = 0; face_num < childp->mDrawable->getNumFaces(); face_num++)
|
||||
{
|
||||
childp->mDrawable->getFace(face_num)->setState(LLFace::HUD_RENDER);
|
||||
LLFace * face = childp->mDrawable->getFace(face_num);
|
||||
if (face)
|
||||
{
|
||||
face->setState(LLFace::HUD_RENDER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -254,7 +262,11 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object)
|
|||
{
|
||||
for (S32 face_num = 0; face_num < object->mDrawable->getNumFaces(); face_num++)
|
||||
{
|
||||
object->mDrawable->getFace(face_num)->clearState(LLFace::HUD_RENDER);
|
||||
LLFace * face = object->mDrawable->getFace(face_num);
|
||||
if (face)
|
||||
{
|
||||
face->clearState(LLFace::HUD_RENDER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -272,7 +284,11 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object)
|
|||
{
|
||||
for (S32 face_num = 0; face_num < childp->mDrawable->getNumFaces(); face_num++)
|
||||
{
|
||||
childp->mDrawable->getFace(face_num)->clearState(LLFace::HUD_RENDER);
|
||||
LLFace * face = childp->mDrawable->getFace(face_num);
|
||||
if (face)
|
||||
{
|
||||
face->clearState(LLFace::HUD_RENDER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -432,7 +432,9 @@ void LLViewerObject::dump() const
|
|||
llinfos << "PositionAgent: " << getPositionAgent() << llendl;
|
||||
llinfos << "PositionGlobal: " << getPositionGlobal() << llendl;
|
||||
llinfos << "Velocity: " << getVelocity() << llendl;
|
||||
if (mDrawable.notNull() && mDrawable->getNumFaces())
|
||||
if (mDrawable.notNull() &&
|
||||
mDrawable->getNumFaces() &&
|
||||
mDrawable->getFace(0))
|
||||
{
|
||||
LLFacePool *poolp = mDrawable->getFace(0)->getPool();
|
||||
if (poolp)
|
||||
|
|
@ -4467,7 +4469,11 @@ U32 LLViewerObject::getNumVertices() const
|
|||
num_faces = mDrawable->getNumFaces();
|
||||
for (i = 0; i < num_faces; i++)
|
||||
{
|
||||
num_vertices += mDrawable->getFace(i)->getGeomCount();
|
||||
LLFace * facep = mDrawable->getFace(i);
|
||||
if (facep)
|
||||
{
|
||||
num_vertices += facep->getGeomCount();
|
||||
}
|
||||
}
|
||||
}
|
||||
return num_vertices;
|
||||
|
|
@ -4482,7 +4488,11 @@ U32 LLViewerObject::getNumIndices() const
|
|||
num_faces = mDrawable->getNumFaces();
|
||||
for (i = 0; i < num_faces; i++)
|
||||
{
|
||||
num_indices += mDrawable->getFace(i)->getIndicesCount();
|
||||
LLFace * facep = mDrawable->getFace(i);
|
||||
if (facep)
|
||||
{
|
||||
num_indices += facep->getIndicesCount();
|
||||
}
|
||||
}
|
||||
}
|
||||
return num_indices;
|
||||
|
|
|
|||
|
|
@ -1718,7 +1718,10 @@ void LLViewerObjectList::generatePickList(LLCamera &camera)
|
|||
LLViewerObject* last_objectp = NULL;
|
||||
for (S32 face_num = 0; face_num < drawablep->getNumFaces(); face_num++)
|
||||
{
|
||||
LLViewerObject* objectp = drawablep->getFace(face_num)->getViewerObject();
|
||||
LLFace * facep = drawablep->getFace(face_num);
|
||||
if (!facep) continue;
|
||||
|
||||
LLViewerObject* objectp = facep->getViewerObject();
|
||||
|
||||
if (objectp && objectp != last_objectp)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5194,8 +5194,10 @@ void LLPickInfo::getSurfaceInfo()
|
|||
if (objectp->mDrawable.notNull() && mObjectFace > -1)
|
||||
{
|
||||
LLFace* facep = objectp->mDrawable->getFace(mObjectFace);
|
||||
|
||||
mUVCoords = facep->surfaceToTexture(mSTCoords, mIntersection, mNormal);
|
||||
if (facep)
|
||||
{
|
||||
mUVCoords = facep->surfaceToTexture(mSTCoords, mIntersection, mNormal);
|
||||
}
|
||||
}
|
||||
|
||||
// and XY coords:
|
||||
|
|
|
|||
|
|
@ -2004,11 +2004,17 @@ void LLVOAvatar::releaseMeshData()
|
|||
if (mDrawable.notNull())
|
||||
{
|
||||
LLFace* facep = mDrawable->getFace(0);
|
||||
facep->setSize(0, 0);
|
||||
for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++)
|
||||
if (facep)
|
||||
{
|
||||
facep = mDrawable->getFace(i);
|
||||
facep->setSize(0, 0);
|
||||
for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++)
|
||||
{
|
||||
facep = mDrawable->getFace(i);
|
||||
if (facep)
|
||||
{
|
||||
facep->setSize(0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2093,15 +2099,20 @@ void LLVOAvatar::updateMeshData()
|
|||
part_index-- ;
|
||||
}
|
||||
|
||||
LLFace* facep ;
|
||||
LLFace* facep = NULL;
|
||||
if(f_num < mDrawable->getNumFaces())
|
||||
{
|
||||
facep = mDrawable->getFace(f_num);
|
||||
}
|
||||
else
|
||||
{
|
||||
facep = mDrawable->addFace(mDrawable->getFace(0)->getPool(), mDrawable->getFace(0)->getTexture()) ;
|
||||
facep = mDrawable->getFace(0);
|
||||
if (facep)
|
||||
{
|
||||
facep = mDrawable->addFace(facep->getPool(), facep->getTexture()) ;
|
||||
}
|
||||
}
|
||||
if (!facep) continue;
|
||||
|
||||
// resize immediately
|
||||
facep->setSize(num_vertices, num_indices);
|
||||
|
|
@ -4130,11 +4141,11 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
|
|||
{ //LOD changed or new mesh created, allocate new vertex buffer if needed
|
||||
if (needs_rebuild || mDirtyMesh >= 2 || mVisibilityRank <= 4)
|
||||
{
|
||||
updateMeshData();
|
||||
updateMeshData();
|
||||
mDirtyMesh = 0;
|
||||
mNeedsSkin = TRUE;
|
||||
mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY);
|
||||
}
|
||||
mNeedsSkin = TRUE;
|
||||
mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY);
|
||||
}
|
||||
}
|
||||
|
||||
if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) <= 0)
|
||||
|
|
@ -4159,10 +4170,14 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
|
|||
mNeedsSkin = FALSE;
|
||||
mLastSkinTime = gFrameTimeSeconds;
|
||||
|
||||
LLVertexBuffer* vb = mDrawable->getFace(0)->getVertexBuffer();
|
||||
if (vb)
|
||||
LLFace * face = mDrawable->getFace(0);
|
||||
if (face)
|
||||
{
|
||||
vb->flush();
|
||||
LLVertexBuffer* vb = face->getVertexBuffer();
|
||||
if (vb)
|
||||
{
|
||||
vb->flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -8253,7 +8268,7 @@ BOOL LLVOAvatar::updateLOD()
|
|||
BOOL res = updateJointLODs();
|
||||
|
||||
LLFace* facep = mDrawable->getFace(0);
|
||||
if (!facep->getVertexBuffer())
|
||||
if (!facep || !facep->getVertexBuffer())
|
||||
{
|
||||
dirtyMesh(2);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -381,8 +381,10 @@ BOOL LLVOGrass::updateLOD()
|
|||
{
|
||||
mNumBlades <<= 1;
|
||||
}
|
||||
|
||||
face->setSize(mNumBlades*8, mNumBlades*12);
|
||||
if (face)
|
||||
{
|
||||
face->setSize(mNumBlades*8, mNumBlades*12);
|
||||
}
|
||||
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
|
||||
}
|
||||
else if (num_blades <= (mNumBlades >> 1))
|
||||
|
|
@ -392,7 +394,10 @@ BOOL LLVOGrass::updateLOD()
|
|||
mNumBlades >>=1;
|
||||
}
|
||||
|
||||
face->setSize(mNumBlades*8, mNumBlades*12);
|
||||
if (face)
|
||||
{
|
||||
face->setSize(mNumBlades*8, mNumBlades*12);
|
||||
}
|
||||
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -450,14 +455,16 @@ void LLVOGrass::plantBlades()
|
|||
}
|
||||
|
||||
LLFace *face = mDrawable->getFace(0);
|
||||
if (face)
|
||||
{
|
||||
face->setTexture(getTEImage(0));
|
||||
face->setState(LLFace::GLOBAL);
|
||||
face->setSize(mNumBlades * 8, mNumBlades * 12);
|
||||
face->setVertexBuffer(NULL);
|
||||
face->setTEOffset(0);
|
||||
face->mCenterLocal = mPosition + mRegionp->getOriginAgent();
|
||||
}
|
||||
|
||||
face->setTexture(getTEImage(0));
|
||||
face->setState(LLFace::GLOBAL);
|
||||
face->setSize(mNumBlades * 8, mNumBlades * 12);
|
||||
face->setVertexBuffer(NULL);
|
||||
face->setTEOffset(0);
|
||||
face->mCenterLocal = mPosition + mRegionp->getOriginAgent();
|
||||
|
||||
mDepth = (face->mCenterLocal - LLViewerCamera::getInstance()->getOrigin())*LLViewerCamera::getInstance()->getAtAxis();
|
||||
mDrawable->setPosition(face->mCenterLocal);
|
||||
mDrawable->movePartition();
|
||||
|
|
@ -487,6 +494,8 @@ void LLVOGrass::getGeometry(S32 idx,
|
|||
LLColor4U color(255,255,255,255);
|
||||
|
||||
LLFace *face = mDrawable->getFace(idx);
|
||||
if (!face)
|
||||
return;
|
||||
|
||||
F32 width = sSpeciesTable[mSpecies]->mBladeSizeX;
|
||||
F32 height = sSpeciesTable[mSpecies]->mBladeSizeY;
|
||||
|
|
|
|||
|
|
@ -82,6 +82,7 @@ LLDrawable *LLVOGround::createDrawable(LLPipeline *pipeline)
|
|||
return mDrawable;
|
||||
}
|
||||
|
||||
// TO DO - this always returns TRUE,
|
||||
BOOL LLVOGround::updateGeometry(LLDrawable *drawable)
|
||||
{
|
||||
LLStrider<LLVector3> verticesp;
|
||||
|
|
@ -96,6 +97,8 @@ BOOL LLVOGround::updateGeometry(LLDrawable *drawable)
|
|||
if (drawable->getNumFaces() < 1)
|
||||
drawable->addFace(poolp, NULL);
|
||||
face = drawable->getFace(0);
|
||||
if (!face)
|
||||
return TRUE;
|
||||
|
||||
if (!face->getVertexBuffer())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -296,18 +296,20 @@ void LLVOSurfacePatch::updateFaceSize(S32 idx)
|
|||
}
|
||||
|
||||
LLFace* facep = mDrawable->getFace(idx);
|
||||
|
||||
S32 num_vertices = 0;
|
||||
S32 num_indices = 0;
|
||||
|
||||
if (mLastStride)
|
||||
if (facep)
|
||||
{
|
||||
getGeomSizesMain(mLastStride, num_vertices, num_indices);
|
||||
getGeomSizesNorth(mLastStride, mLastNorthStride, num_vertices, num_indices);
|
||||
getGeomSizesEast(mLastStride, mLastEastStride, num_vertices, num_indices);
|
||||
}
|
||||
S32 num_vertices = 0;
|
||||
S32 num_indices = 0;
|
||||
|
||||
if (mLastStride)
|
||||
{
|
||||
getGeomSizesMain(mLastStride, num_vertices, num_indices);
|
||||
getGeomSizesNorth(mLastStride, mLastNorthStride, num_vertices, num_indices);
|
||||
getGeomSizesEast(mLastStride, mLastEastStride, num_vertices, num_indices);
|
||||
}
|
||||
|
||||
facep->setSize(num_vertices, num_indices);
|
||||
facep->setSize(num_vertices, num_indices);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLVOSurfacePatch::updateLOD()
|
||||
|
|
@ -322,30 +324,32 @@ void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
|
|||
LLStrider<U16> &indicesp)
|
||||
{
|
||||
LLFace* facep = mDrawable->getFace(0);
|
||||
if (facep)
|
||||
{
|
||||
U32 index_offset = facep->getGeomIndex();
|
||||
|
||||
U32 index_offset = facep->getGeomIndex();
|
||||
|
||||
updateMainGeometry(facep,
|
||||
verticesp,
|
||||
normalsp,
|
||||
texCoords0p,
|
||||
texCoords1p,
|
||||
indicesp,
|
||||
index_offset);
|
||||
updateNorthGeometry(facep,
|
||||
verticesp,
|
||||
normalsp,
|
||||
texCoords0p,
|
||||
texCoords1p,
|
||||
indicesp,
|
||||
index_offset);
|
||||
updateEastGeometry(facep,
|
||||
updateMainGeometry(facep,
|
||||
verticesp,
|
||||
normalsp,
|
||||
texCoords0p,
|
||||
texCoords1p,
|
||||
indicesp,
|
||||
index_offset);
|
||||
updateNorthGeometry(facep,
|
||||
verticesp,
|
||||
normalsp,
|
||||
texCoords0p,
|
||||
texCoords1p,
|
||||
indicesp,
|
||||
index_offset);
|
||||
updateEastGeometry(facep,
|
||||
verticesp,
|
||||
normalsp,
|
||||
texCoords0p,
|
||||
texCoords1p,
|
||||
indicesp,
|
||||
index_offset);
|
||||
}
|
||||
}
|
||||
|
||||
void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
|
||||
|
|
@ -864,7 +868,11 @@ void LLVOSurfacePatch::dirtyGeom()
|
|||
if (mDrawable)
|
||||
{
|
||||
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
|
||||
mDrawable->getFace(0)->setVertexBuffer(NULL);
|
||||
LLFace* facep = mDrawable->getFace(0);
|
||||
if (facep)
|
||||
{
|
||||
facep->setVertexBuffer(NULL);
|
||||
}
|
||||
mDrawable->movePartition();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -490,11 +490,16 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
|
|||
if(mTrunkLOD >= sMAX_NUM_TREE_LOD_LEVELS) //do not display the tree.
|
||||
{
|
||||
mReferenceBuffer = NULL ;
|
||||
mDrawable->getFace(0)->setVertexBuffer(NULL);
|
||||
LLFace * facep = drawable->getFace(0);
|
||||
if (facep)
|
||||
{
|
||||
facep->setVertexBuffer(NULL);
|
||||
}
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
if (mReferenceBuffer.isNull() || !mDrawable->getFace(0)->getVertexBuffer())
|
||||
if (mDrawable->getFace(0) &&
|
||||
(mReferenceBuffer.isNull() || !mDrawable->getFace(0)->getVertexBuffer()))
|
||||
{
|
||||
const F32 SRR3 = 0.577350269f; // sqrt(1/3)
|
||||
const F32 SRR2 = 0.707106781f; // sqrt(1/2)
|
||||
|
|
@ -507,6 +512,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
|
|||
S32 lod;
|
||||
|
||||
LLFace *face = drawable->getFace(0);
|
||||
if (!face) return TRUE;
|
||||
|
||||
face->mCenterAgent = getPositionAgent();
|
||||
face->mCenterLocal = face->mCenterAgent;
|
||||
|
|
@ -879,6 +885,7 @@ void LLVOTree::updateMesh()
|
|||
calcNumVerts(vert_count, index_count, mTrunkLOD, stop_depth, mDepth, mTrunkDepth, mBranches);
|
||||
|
||||
LLFace* facep = mDrawable->getFace(0);
|
||||
if (!facep) return;
|
||||
LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolTree::VERTEX_DATA_MASK, GL_STATIC_DRAW_ARB);
|
||||
buff->allocateBuffer(vert_count, index_count, TRUE);
|
||||
facep->setVertexBuffer(buff);
|
||||
|
|
|
|||
|
|
@ -520,6 +520,7 @@ void LLVOVolume::animateTextures()
|
|||
for (S32 i = start; i <= end; i++)
|
||||
{
|
||||
LLFace* facep = mDrawable->getFace(i);
|
||||
if (!facep) continue;
|
||||
if(facep->getVirtualSize() <= MIN_TEX_ANIM_SIZE && facep->mTextureMatrix) continue;
|
||||
|
||||
const LLTextureEntry* te = facep->getTextureEntry();
|
||||
|
|
@ -734,8 +735,11 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
|
|||
for (S32 i = 0; i < num_faces; i++)
|
||||
{
|
||||
LLFace* face = mDrawable->getFace(i);
|
||||
face->setPixelArea(0.f);
|
||||
face->setVirtualSize(0.f);
|
||||
if (face)
|
||||
{
|
||||
face->setPixelArea(0.f);
|
||||
face->setVirtualSize(0.f);
|
||||
}
|
||||
}
|
||||
|
||||
return ;
|
||||
|
|
@ -765,6 +769,7 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
|
|||
for (S32 i = 0; i < num_faces; i++)
|
||||
{
|
||||
LLFace* face = mDrawable->getFace(i);
|
||||
if (!face) continue;
|
||||
const LLTextureEntry *te = face->getTextureEntry();
|
||||
LLViewerTexture *imagep = face->getTexture();
|
||||
if (!imagep || !te ||
|
||||
|
|
@ -1268,7 +1273,8 @@ BOOL LLVOVolume::calcLOD()
|
|||
llround(radius, 0.01f));
|
||||
|
||||
|
||||
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO))
|
||||
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO) &&
|
||||
mDrawable->getFace(0))
|
||||
{
|
||||
//setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail));
|
||||
|
||||
|
|
@ -1347,25 +1353,23 @@ void LLVOVolume::updateFaceFlags()
|
|||
for (S32 i = 0; i < getVolume()->getNumFaces(); i++)
|
||||
{
|
||||
LLFace *face = mDrawable->getFace(i);
|
||||
if (!face)
|
||||
if (face)
|
||||
{
|
||||
return;
|
||||
}
|
||||
BOOL fullbright = getTE(i)->getFullbright();
|
||||
face->clearState(LLFace::FULLBRIGHT | LLFace::HUD_RENDER | LLFace::LIGHT);
|
||||
|
||||
BOOL fullbright = getTE(i)->getFullbright();
|
||||
face->clearState(LLFace::FULLBRIGHT | LLFace::HUD_RENDER | LLFace::LIGHT);
|
||||
|
||||
if (fullbright || (mMaterial == LL_MCODE_LIGHT))
|
||||
{
|
||||
face->setState(LLFace::FULLBRIGHT);
|
||||
}
|
||||
if (mDrawable->isLight())
|
||||
{
|
||||
face->setState(LLFace::LIGHT);
|
||||
}
|
||||
if (isHUDAttachment())
|
||||
{
|
||||
face->setState(LLFace::HUD_RENDER);
|
||||
if (fullbright || (mMaterial == LL_MCODE_LIGHT))
|
||||
{
|
||||
face->setState(LLFace::FULLBRIGHT);
|
||||
}
|
||||
if (mDrawable->isLight())
|
||||
{
|
||||
face->setState(LLFace::LIGHT);
|
||||
}
|
||||
if (isHUDAttachment())
|
||||
{
|
||||
face->setState(LLFace::HUD_RENDER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1402,6 +1406,8 @@ void LLVOVolume::regenFaces()
|
|||
for (S32 i = 0; i < mNumFaces; i++)
|
||||
{
|
||||
LLFace* facep = count_changed ? addFace(i) : mDrawable->getFace(i);
|
||||
if (!facep) continue;
|
||||
|
||||
facep->setTEOffset(i);
|
||||
facep->setTexture(getTEImage(i));
|
||||
facep->setViewerObject(this);
|
||||
|
|
@ -1747,16 +1753,19 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
|
|||
void LLVOVolume::updateFaceSize(S32 idx)
|
||||
{
|
||||
LLFace* facep = mDrawable->getFace(idx);
|
||||
if (idx >= getVolume()->getNumVolumeFaces())
|
||||
if (facep)
|
||||
{
|
||||
facep->setSize(0,0, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
|
||||
facep->setSize(vol_face.mNumVertices, vol_face.mNumIndices,
|
||||
true); // <--- volume faces should be padded for 16-byte alignment
|
||||
if (idx >= getVolume()->getNumVolumeFaces())
|
||||
{
|
||||
facep->setSize(0,0, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
|
||||
facep->setSize(vol_face.mNumVertices, vol_face.mNumIndices,
|
||||
true); // <--- volume faces should be padded for 16-byte alignment
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3129,6 +3138,7 @@ U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const
|
|||
for (S32 i = 0; i < num_faces; ++i)
|
||||
{
|
||||
const LLFace* face = drawablep->getFace(i);
|
||||
if (!face) continue;
|
||||
const LLTextureEntry* te = face->getTextureEntry();
|
||||
const LLViewerTexture* img = face->getTexture();
|
||||
|
||||
|
|
@ -3400,6 +3410,7 @@ F32 LLVOVolume::getBinRadius()
|
|||
for (S32 i = 0; i < mDrawable->getNumFaces(); i++)
|
||||
{
|
||||
LLFace* face = mDrawable->getFace(i);
|
||||
if (!face) continue;
|
||||
if (face->getPoolType() == LLDrawPool::POOL_ALPHA &&
|
||||
!face->canRenderAsMask())
|
||||
{
|
||||
|
|
@ -3623,7 +3634,8 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
|
|||
{
|
||||
LLFace* face = mDrawable->getFace(face_hit);
|
||||
|
||||
if (pick_transparent || !face->getTexture() || !face->getTexture()->hasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n)))
|
||||
if (face &&
|
||||
(pick_transparent || !face->getTexture() || !face->getTexture()->hasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n))))
|
||||
{
|
||||
v_end = p;
|
||||
if (face_hitp != NULL)
|
||||
|
|
@ -4233,6 +4245,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
|
||||
{
|
||||
LLFace* facep = drawablep->getFace(i);
|
||||
if (!facep)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//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
|
||||
|
|
@ -4453,12 +4469,20 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
S32 face;
|
||||
for (face = 0; face < vobj->getNumTEs(); face++)
|
||||
{
|
||||
drawablep->getFace(face)->setState(LLFace::TEXTURE_ANIM);
|
||||
LLFace * facep = drawablep->getFace(face);
|
||||
if (facep)
|
||||
{
|
||||
facep->setState(LLFace::TEXTURE_ANIM);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (vobj->mTextureAnimp->mFace < vobj->getNumTEs())
|
||||
{
|
||||
drawablep->getFace(vobj->mTextureAnimp->mFace)->setState(LLFace::TEXTURE_ANIM);
|
||||
LLFace * facep = drawablep->getFace(vobj->mTextureAnimp->mFace);
|
||||
if (facep)
|
||||
{
|
||||
facep->setState(LLFace::TEXTURE_ANIM);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4682,10 +4706,13 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
|
|||
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
|
||||
{
|
||||
LLFace* face = drawablep->getFace(i);
|
||||
LLVertexBuffer* buff = face->getVertexBuffer();
|
||||
if (face && buff && buff->isLocked())
|
||||
if (face)
|
||||
{
|
||||
buff->flush();
|
||||
LLVertexBuffer* buff = face->getVertexBuffer();
|
||||
if (buff && buff->isLocked())
|
||||
{
|
||||
buff->flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -5166,20 +5193,21 @@ 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->getPixelArea() > FORCE_CULL_AREA &&
|
||||
facep->getGeomCount() + vertex_count <= 65536)
|
||||
if (facep)
|
||||
{
|
||||
vertex_count += facep->getGeomCount();
|
||||
index_count += facep->getIndicesCount();
|
||||
if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA &&
|
||||
facep->getGeomCount() + vertex_count <= 65536)
|
||||
{
|
||||
vertex_count += facep->getGeomCount();
|
||||
index_count += facep->getIndicesCount();
|
||||
|
||||
//remember face (for sorting)
|
||||
mFaceList.push_back(facep);
|
||||
}
|
||||
else
|
||||
{
|
||||
facep->clearVertexBuffer();
|
||||
//remember face (for sorting)
|
||||
mFaceList.push_back(facep);
|
||||
}
|
||||
else
|
||||
{
|
||||
facep->clearVertexBuffer();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -146,6 +146,10 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)
|
|||
drawable->addFace(poolp, NULL);
|
||||
}
|
||||
face = drawable->getFace(0);
|
||||
if (!face)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// LLVector2 uvs[4];
|
||||
// LLVector3 vtx[4];
|
||||
|
|
|
|||
|
|
@ -3173,7 +3173,11 @@ void renderScriptedBeacons(LLDrawable* drawablep)
|
|||
S32 count = drawablep->getNumFaces();
|
||||
for (face_id = 0; face_id < count; face_id++)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
|
||||
LLFace * facep = drawablep->getFace(face_id);
|
||||
if (facep)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(facep);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3199,7 +3203,11 @@ void renderScriptedTouchBeacons(LLDrawable* drawablep)
|
|||
S32 count = drawablep->getNumFaces();
|
||||
for (face_id = 0; face_id < count; face_id++)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
|
||||
LLFace * facep = drawablep->getFace(face_id);
|
||||
if (facep)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(facep);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3224,7 +3232,11 @@ void renderPhysicalBeacons(LLDrawable* drawablep)
|
|||
S32 count = drawablep->getNumFaces();
|
||||
for (face_id = 0; face_id < count; face_id++)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
|
||||
LLFace * facep = drawablep->getFace(face_id);
|
||||
if (facep)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(facep);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3260,7 +3272,11 @@ void renderMOAPBeacons(LLDrawable* drawablep)
|
|||
S32 count = drawablep->getNumFaces();
|
||||
for (face_id = 0; face_id < count; face_id++)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
|
||||
LLFace * facep = drawablep->getFace(face_id);
|
||||
if (facep)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(facep);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3285,7 +3301,11 @@ void renderParticleBeacons(LLDrawable* drawablep)
|
|||
S32 count = drawablep->getNumFaces();
|
||||
for (face_id = 0; face_id < count; face_id++)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
|
||||
LLFace * facep = drawablep->getFace(face_id);
|
||||
if (facep)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(facep);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3303,7 +3323,11 @@ void renderSoundHighlights(LLDrawable* drawablep)
|
|||
S32 count = drawablep->getNumFaces();
|
||||
for (face_id = 0; face_id < count; face_id++)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
|
||||
LLFace * facep = drawablep->getFace(face_id);
|
||||
if (facep)
|
||||
{
|
||||
gPipeline.mHighlightFaces.push_back(facep);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3488,7 +3512,11 @@ void LLPipeline::postSort(LLCamera& camera)
|
|||
{
|
||||
if (object->mDrawable)
|
||||
{
|
||||
gPipeline.mSelectedFaces.push_back(object->mDrawable->getFace(te));
|
||||
LLFace * facep = object->mDrawable->getFace(te);
|
||||
if (facep)
|
||||
{
|
||||
gPipeline.mSelectedFaces.push_back(facep);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -6193,7 +6221,10 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
|
|||
for (S32 i = 0; i < drawable->getNumFaces(); i++)
|
||||
{
|
||||
LLFace* facep = drawable->getFace(i);
|
||||
facep->clearVertexBuffer();
|
||||
if (facep)
|
||||
{
|
||||
facep->clearVertexBuffer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue