diff options
| author | Dave Parks <davep@lindenlab.com> | 2012-01-18 15:38:25 -0600 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2012-01-18 15:38:25 -0600 | 
| commit | 852700fbfb6fd751a61f295f5f77afe1e2db38ed (patch) | |
| tree | 4934b91dc6c3b902ccb9748964a1ab8d6aae45a3 | |
| parent | 122691b8367dd33b06c83667118a603f848d371f (diff) | |
SH-2598 Fix for crash when rendering mesh silhouette (workaround driver bug by rendering from client memory instead of using face VBO).
| -rw-r--r-- | indra/newview/llselectmgr.cpp | 51 | 
1 files changed, 25 insertions, 26 deletions
| diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 5d0d1ef9a3..6111255a66 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -5556,38 +5556,37 @@ BOOL LLSelectNode::allowOperationOnNode(PermissionBit op, U64 group_proxy_power)  //helper function for pushing relevant vertices from drawable to GL  void pushWireframe(LLDrawable* drawable)  { -	if (drawable->isState(LLDrawable::RIGGED)) -	{ //render straight from rigged volume if this is a rigged attachment -		LLVOVolume* vobj = drawable->getVOVolume(); -		if (vobj) -		{ -			vobj->updateRiggedVolume(); -			LLRiggedVolume* rigged_volume = vobj->getRiggedVolume(); -			if (rigged_volume) -			{ -				LLVertexBuffer::unbind(); -				gGL.pushMatrix(); -				gGL.multMatrix((F32*) vobj->getRelativeXform().mMatrix); -				for (S32 i = 0; i < rigged_volume->getNumVolumeFaces(); ++i) -				{ -					const LLVolumeFace& face = rigged_volume->getVolumeFace(i); -					LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, face.mTexCoords, face.mNumIndices, face.mIndices); -				} -				gGL.popMatrix(); -			} -		} -	} -	else +	LLVOVolume* vobj = drawable->getVOVolume(); +	if (vobj)  	{ -		for (S32 i = 0; i < drawable->getNumFaces(); ++i) +		LLVertexBuffer::unbind(); +		gGL.pushMatrix(); +		gGL.multMatrix((F32*) vobj->getRelativeXform().mMatrix); + +		LLVolume* volume = NULL; + +		if (drawable->isState(LLDrawable::RIGGED)) +		{ +				vobj->updateRiggedVolume(); +				volume = vobj->getRiggedVolume(); +		} +		else +		{ +			volume = vobj->getVolume(); +		} + +		if (volume)  		{ -			LLFace* face = drawable->getFace(i); -			if (face->verify()) +			for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)  			{ -				pushVerts(face, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0); +				const LLVolumeFace& face = volume->getVolumeFace(i); +				LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, face.mTexCoords, face.mNumIndices, face.mIndices);  			}  		} + +		gGL.popMatrix();  	} +	  }  void LLSelectNode::renderOneWireframe(const LLColor4& color) | 
