diff options
| author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2015-09-14 11:05:08 -0400 | 
|---|---|---|
| committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2015-09-14 11:05:08 -0400 | 
| commit | 7f19cb367e6182fff78d66738087601470faa9fa (patch) | |
| tree | 1f70a2f5a05479013ef019877dae554e1ee8f339 /indra | |
| parent | 9d44aaab46eff6d16ff50d8b6c12df821f637761 (diff) | |
| parent | 6b2c1d5f104047af8aa71d01b7d8fbe9a0ad3493 (diff) | |
merge
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/llmath/llvolume.cpp | 18 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl | 3 | ||||
| -rwxr-xr-x | indra/newview/lldrawpoolavatar.cpp | 38 | ||||
| -rwxr-xr-x | indra/newview/llvovolume.cpp | 27 | 
4 files changed, 35 insertions, 51 deletions
| diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index c2198b91a7..cd417c913d 100755 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -2536,6 +2536,8 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)  					U32 cur_influence = 0;  					LLVector4 wght(0,0,0,0); +                    U32 joints[4] = {0,0,0,0}; +					LLVector4 joints_with_weights(0,0,0,0);  					while (joint != END_INFLUENCES && idx < weights.size())  					{ @@ -2543,7 +2545,9 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)  						influence |= ((U16) weights[idx++] << 8);  						F32 w = llclamp((F32) influence / 65535.f, 0.f, 0.99999f); -						wght.mV[cur_influence++] = (F32) joint + w; +						wght.mV[cur_influence] = w; +						joints[cur_influence] = joint; +						cur_influence++;  						if (cur_influence >= 4)  						{ @@ -2554,8 +2558,16 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)  							joint = weights[idx++];  						}  					} - -					face.mWeights[cur_vertex].loadua(wght.mV); +                    F32 wsum = wght.mV[VX] + wght.mV[VY] + wght.mV[VZ] + wght.mV[VW]; +                    if (wsum <= 0.f) +                    { +                        wght = LLVector4(0.99999f,0.f,0.f,0.f); +                    } +                    for (U32 k=0; k<4; k++) +                    { +                        joints_with_weights[k] = (F32) joints[k] + wght[k]; +                    } +					face.mWeights[cur_vertex].loadua(joints_with_weights.mV);  					cur_vertex++;  				} diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl index d3eed775bf..b342abb7c1 100755 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -40,8 +40,7 @@ mat4 getObjectSkinnedTransform()  		 index = min(index, vec4(151.0));  		 index = max(index, vec4( 0.0)); -	float scale = 1.0/(w.x+w.y+w.z+w.w); -	w *= scale; +    w *= 1.0/(w.x+w.y+w.z+w.w);  	int i1 = int(index.x);  	int i2 = int(index.y); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 9dd4c2ce0d..f1bfe4ecb2 100755 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1554,7 +1554,8 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*  		(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))  	{  		if (drawable && drawable->isState(LLDrawable::REBUILD_ALL)) -		{ //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues +		{ +            //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues  			for (S32 i = 0; i < drawable->getNumFaces(); ++i)  			{  				LLFace* facep = drawable->getFace(i); @@ -1571,13 +1572,15 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*  			buffer = face->getVertexBuffer();  		}  		else -		{ //just rebuild this face +		{ +			//just rebuild this face  			getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);  		}  	}  	if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime()) -	{ //perform software vertex skinning for this face +	{ +		//perform software vertex skinning for this face  		LLStrider<LLVector3> position;  		LLStrider<LLVector3> normal; @@ -1605,10 +1608,6 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*  			{  				joint = avatar->getJoint("mPelvis");  			} -			if (!joint) -			{ -				LL_DEBUGS("Avatar") << "Failed to find " << skin->mJointNames[j] << LL_ENDL; -			}  			if (joint)  			{  				mat[j] = skin->mInvBindMatrix[j]; @@ -1633,27 +1632,14 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*  			{  				F32 w = weight[j][k]; -				idx[k] = llclamp((S32) floorf(w), 0, JOINT_COUNT-1); +				idx[k] = llclamp((S32) floorf(w), (S32)0, (S32)JOINT_COUNT-1);  				wght[k] = w - floorf(w);  				scale += wght[k];  			} - -            if (scale > 0.f) -            { -                wght *= 1.f/scale; -            } -            else -            { -                // Complete weighting fail - all zeroes.  Just -                // pick some values that add up to 1.0 so we -                // don't wind up with garbage vertices -                // pointing off at (0,0,0) -                wght[0] = 1.f; -                wght[1] = 0.f; -                wght[2] = 0.f; -                wght[3] = 0.f; -            } +            // This is enforced  in unpackVolumeFaces() +            llassert(scale>0.f); +			wght *= 1.f/scale;  			for (U32 k = 0; k < 4; k++)  			{ @@ -1752,6 +1738,10 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  				for (U32 i = 0; i < count; ++i)  				{  					LLJoint* joint = avatar->getJoint(skin->mJointNames[i]); +                    if (!joint) +                    { +                        joint = avatar->getJoint("mPelvis"); +                    }  					if (joint)  					{  						mat[i] = skin->mInvBindMatrix[i]; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 25e61c259f..eefe452c14 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4184,12 +4184,6 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons  			mat[j] = skin->mInvBindMatrix[j];  			mat[j] *= joint->getWorldMatrix();  		} -		else -		{ -            // This shouldn't be possible unless the avatar skeleton -            // is corrupt. -			llassert(false); -		}  	}  	for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i) @@ -4229,21 +4223,9 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons  						wght[k] = w - floorf(w);  						scale += wght[k];  					} -					if (scale > 0.f) -					{ -						wght *= 1.f / scale; -					} -                    else -                    { -                        // Complete weighting fail - all zeroes.  Just -                        // pick some values that add up to 1.0 so we -                        // don't wind up with garbage vertices -                        // pointing off at (0,0,0) -                        wght[0] = 1.f; -                        wght[1] = 0.f; -                        wght[2] = 0.f; -                        wght[3] = 0.f; -                    } +                    // This is enforced  in unpackVolumeFaces() +                    llassert(scale>0.f); +                    wght *= 1.f / scale;  					for (U32 k = 0; k < 4; k++)  					{ @@ -4252,7 +4234,8 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons  						LLMatrix4a src;  						// Insure ref'd bone is in our clamped array of mats  						// clamp idx to maxJoints to avoid reading garbage off stack in release -						src.setMul(mp[(idx[k]<maxJoints)?idx[k]:0], w); +                        S32 index = llclamp((S32)idx[k],(S32)0,(S32)kMaxJoints-1); +						src.setMul(mp[index], w);  						final_mat.add(src);  					} | 
