diff options
| author | simon@Simon-PC.lindenlab.com <simon@Simon-PC.lindenlab.com> | 2012-05-07 13:24:52 -0700 | 
|---|---|---|
| committer | simon@Simon-PC.lindenlab.com <simon@Simon-PC.lindenlab.com> | 2012-05-07 13:24:52 -0700 | 
| commit | 71bbb384b056476bbf1177d20b2ade16ca0a4bcf (patch) | |
| tree | cf6c14b1886190f9ae723c065d43e3b243f82a72 /indra | |
| parent | 68ec4d8355326f7c42c8e6fbabe774df6e5f41dd (diff) | |
MAINT-753 : [crashhunters] crash at LLVOVolume::updateFaceFlags().  Null pointer checks are good.
Reviewed by Kelly
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/lldrawable.cpp | 29 | ||||
| -rw-r--r-- | indra/newview/lldrawable.h | 6 | ||||
| -rw-r--r-- | indra/newview/llfloaterbvhpreview.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llfloaterimagepreview.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 101 | ||||
| -rw-r--r-- | indra/newview/lltoolmorph.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llviewerjointattachment.cpp | 24 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 16 | ||||
| -rw-r--r-- | indra/newview/llviewerobjectlist.cpp | 5 | ||||
| -rwxr-xr-x | indra/newview/llviewerwindow.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 41 | ||||
| -rw-r--r-- | indra/newview/llvograss.cpp | 29 | ||||
| -rw-r--r-- | indra/newview/llvoground.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llvosurfacepatch.cpp | 64 | ||||
| -rw-r--r-- | indra/newview/llvotree.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 120 | ||||
| -rw-r--r-- | indra/newview/llvowater.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 47 | 
18 files changed, 355 insertions, 174 deletions
| diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 55fb135898..98246162f0 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -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(); +			}  		}  	} diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index 6a3d15db7f..e2064b79f8 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -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]; diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp index ac33a05f42..fa0ad20fdb 100644 --- a/indra/newview/llfloaterbvhpreview.cpp +++ b/indra/newview/llfloaterbvhpreview.cpp @@ -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); diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 92ee8ddac6..6b2492d927 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -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(); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 27dea1c7a0..e886f83671 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -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()); +	if (face) +	{ +		llassert(face->verify()); -	LLVertexBuffer* buffer = face->getVertexBuffer(); +		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); +		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) -							{ -								llerrs << "Face texture index out of bounds." << llendl; -							} -							else if (facep->mDrawInfo->mTextureList[index] != facep->getTexture()) +							if (index < 255)  							{ -								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; +								}  							}  						}  					} diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index 718201e381..0d5daf129f 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -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); diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp index 4e14824e69..3a04bbed4f 100644 --- a/indra/newview/llviewerjointattachment.cpp +++ b/indra/newview/llviewerjointattachment.cpp @@ -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); +					}  				}  			}  		} diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index e590f29a9a..1aa541793f 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -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; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 6912faa9ec..c8ba2b6f58 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -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)  				{ diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 0a582107af..ca5523dfbd 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -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: diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 7cbb47100d..c221c7fdd8 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -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);  	} diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index be3558aad1..44968342bf 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -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; diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp index 0060f81ab5..6da54435e3 100644 --- a/indra/newview/llvoground.cpp +++ b/indra/newview/llvoground.cpp @@ -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())  	{ diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index bf6158eeaf..94a3111f4c 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -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();  	}  } diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 4564207da4..3556bde9a8 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -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); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 3430e1a610..75ab807c39 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -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(); +				}  			}  		}  	} diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index cd78157944..942eff6171 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -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]; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index c40dafd433..34dd15c9a1 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -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(); +		}  	}  } | 
