diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llvovolume.cpp | 113 | 
1 files changed, 58 insertions, 55 deletions
| diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 080d1f774a..47965a1584 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3768,82 +3768,85 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons  		LLVector4a* weight = vol_face.mWeights; -		LLMatrix4a bind_shape_matrix; -		bind_shape_matrix.loadu(skin->mBindShapeMatrix); - -		LLVector4a* pos = dst_face.mPositions; - +		if ( weight )  		{ -			LLFastTimer t(FTM_SKIN_RIGGED); +			LLMatrix4a bind_shape_matrix; +			bind_shape_matrix.loadu(skin->mBindShapeMatrix); + +			LLVector4a* pos = dst_face.mPositions; -			for (U32 j = 0; j < dst_face.mNumVertices; ++j)  			{ -				LLMatrix4a final_mat; -				final_mat.clear(); +				LLFastTimer t(FTM_SKIN_RIGGED); -				S32 idx[4]; +				for (U32 j = 0; j < dst_face.mNumVertices; ++j) +				{ +					LLMatrix4a final_mat; +					final_mat.clear(); -				LLVector4 wght; +					S32 idx[4]; -				F32 scale = 0.f; -				for (U32 k = 0; k < 4; k++) -				{ -					F32 w = weight[j][k]; +					LLVector4 wght; -					idx[k] = (S32) floorf(w); -					wght[k] = w - floorf(w); -					scale += wght[k]; -				} +					F32 scale = 0.f; +					for (U32 k = 0; k < 4; k++) +					{ +						F32 w = weight[j][k]; -				wght *= 1.f/scale; +						idx[k] = (S32) floorf(w); +						wght[k] = w - floorf(w); +						scale += wght[k]; +					} -				for (U32 k = 0; k < 4; k++) -				{ -					F32 w = wght[k]; +					wght *= 1.f/scale; -					LLMatrix4a src; -					src.setMul(mp[idx[k]], w); +					for (U32 k = 0; k < 4; k++) +					{ +						F32 w = wght[k]; -					final_mat.add(src); -				} +						LLMatrix4a src; +						src.setMul(mp[idx[k]], w); + +						final_mat.add(src); +					} -				LLVector4a& v = vol_face.mPositions[j]; -				LLVector4a t; -				LLVector4a dst; -				bind_shape_matrix.affineTransform(v, t); -				final_mat.affineTransform(t, dst); -				pos[j] = dst; -			} +					LLVector4a& v = vol_face.mPositions[j]; +					LLVector4a t; +					LLVector4a dst; +					bind_shape_matrix.affineTransform(v, t); +					final_mat.affineTransform(t, dst); +					pos[j] = dst; +				} -			//update bounding box -			LLVector4a& min = dst_face.mExtents[0]; -			LLVector4a& max = dst_face.mExtents[1]; +				//update bounding box +				LLVector4a& min = dst_face.mExtents[0]; +				LLVector4a& max = dst_face.mExtents[1]; -			min = pos[0]; -			max = pos[1]; +				min = pos[0]; +				max = pos[1]; -			for (U32 j = 1; j < dst_face.mNumVertices; ++j) -			{ -				min.setMin(min, pos[j]); -				max.setMax(max, pos[j]); -			} +				for (U32 j = 1; j < dst_face.mNumVertices; ++j) +				{ +					min.setMin(min, pos[j]); +					max.setMax(max, pos[j]); +				} -			dst_face.mCenter->setAdd(dst_face.mExtents[0], dst_face.mExtents[1]); -			dst_face.mCenter->mul(0.5f); +				dst_face.mCenter->setAdd(dst_face.mExtents[0], dst_face.mExtents[1]); +				dst_face.mCenter->mul(0.5f); -		} +			} -		{ -			LLFastTimer t(FTM_RIGGED_OCTREE); -			delete dst_face.mOctree; -			dst_face.mOctree = NULL; +			{ +				LLFastTimer t(FTM_RIGGED_OCTREE); +				delete dst_face.mOctree; +				dst_face.mOctree = NULL; -			LLVector4a size; -			size.setSub(dst_face.mExtents[1], dst_face.mExtents[0]); -			size.splat(size.getLength3().getF32()*0.5f); +				LLVector4a size; +				size.setSub(dst_face.mExtents[1], dst_face.mExtents[0]); +				size.splat(size.getLength3().getF32()*0.5f); -			dst_face.createOctree(1.f); +				dst_face.createOctree(1.f); +			}  		}  	}  } | 
