Ver Fonte

DynamicBones: additive mode

lviguier há 7 meses atrás
pai
commit
4972cbbf9c
1 ficheiros alterados com 88 adições e 94 exclusões
  1. 88 94
      h3d/anim/BufferAnimation.hx

+ 88 - 94
h3d/anim/BufferAnimation.hx

@@ -165,98 +165,45 @@ class BufferAnimation extends Animation {
 
 			var m = o.matrix;
 			if( m != null ) {
-				var dynJoint = Std.downcast(o.targetSkin.getSkinData().allJoints[o.targetJoint], h3d.anim.Skin.DynamicJoint);
-				if (dynJoint == null) {
-					if( layout.has(Position) ) {
-						m._41 = lerpValue();
-						m._42 = lerpValue();
-						m._43 = lerpValue();
-					} else {
-						m._41 = m._14;
-						m._42 = m._24;
-						m._43 = m._34;
-					}
-
-					if( layout.has(Rotation) ) {
-						var q1x : Float32 = data[offset1++];
-						var q1y : Float32 = data[offset1++];
-						var q1z : Float32 = data[offset1++];
-						var q1w : Float32 = Math.sqrt(hxd.Math.abs(1 - (q1x*q1x+q1y*q1y+q1z*q1z)));
-						var q2x : Float32 = data[offset2++];
-						var q2y : Float32 = data[offset2++];
-						var q2z : Float32 = data[offset2++];
-						var q2w : Float32 = Math.sqrt(hxd.Math.abs(1 - (q2x*q2x+q2y*q2y+q2z*q2z)));
-
-						// qlerp nearest
-						var dot = q1x * q2x + q1y * q2y + q1z * q2z + q1w * q2w;
-						var q2 = dot < 0 ? -k2 : k2;
-						var qx = q1x * k1 + q2x * q2;
-						var qy = q1y * k1 + q2y * q2;
-						var qz = q1z * k1 + q2z * q2;
-						var qw = q1w * k1 + q2w * q2;
-						// make sure the resulting quaternion is normalized
-						var ql = 1 / Math.sqrt(qx * qx + qy * qy + qz * qz + qw * qw);
-						qx *= ql;
-						qy *= ql;
-						qz *= ql;
-						qw *= ql;
-
-						if( decompose ) {
-							m._12 = qx;
-							m._13 = qy;
-							m._21 = qz;
-							m._23 = qw;
-							if( layout.has(Scale) ) {
-								m._11 = lerpValue();
-								m._22 = lerpValue();
-								m._33 = lerpValue();
-							} else {
-								m._11 = 1;
-								m._22 = 1;
-								m._33 = 1;
-							}
-						} else {
-							// quaternion to matrix
-							var xx = qx * qx;
-							var xy = qx * qy;
-							var xz = qx * qz;
-							var xw = qx * qw;
-							var yy = qy * qy;
-							var yz = qy * qz;
-							var yw = qy * qw;
-							var zz = qz * qz;
-							var zw = qz * qw;
-							m._11 = 1 - 2 * ( yy + zz );
-							m._12 = 2 * ( xy + zw );
-							m._13 = 2 * ( xz - yw );
-							m._21 = 2 * ( xy - zw );
-							m._22 = 1 - 2 * ( xx + zz );
-							m._23 = 2 * ( yz + xw );
-							m._31 = 2 * ( xz + yw );
-							m._32 = 2 * ( yz - xw );
-							m._33 = 1 - 2 * ( xx + yy );
-							if( layout.has(Scale) ) {
-								var sx = lerpValue();
-								var sy = lerpValue();
-								var sz = lerpValue();
-								m._11 *= sx;
-								m._12 *= sx;
-								m._13 *= sx;
-								m._21 *= sy;
-								m._22 *= sy;
-								m._23 *= sy;
-								m._31 *= sz;
-								m._32 *= sz;
-								m._33 *= sz;
-							}
-						}
-
-					} else {
-						m._12 = 0;
-						m._13 = 0;
-						m._21 = 0;
-						m._23 = decompose ? 1 : 0;
+				if( layout.has(Position) ) {
+					m._41 = lerpValue();
+					m._42 = lerpValue();
+					m._43 = lerpValue();
+				} else {
+					m._41 = m._14;
+					m._42 = m._24;
+					m._43 = m._34;
+				}
 
+				if( layout.has(Rotation) ) {
+					var q1x : Float32 = data[offset1++];
+					var q1y : Float32 = data[offset1++];
+					var q1z : Float32 = data[offset1++];
+					var q1w : Float32 = Math.sqrt(hxd.Math.abs(1 - (q1x*q1x+q1y*q1y+q1z*q1z)));
+					var q2x : Float32 = data[offset2++];
+					var q2y : Float32 = data[offset2++];
+					var q2z : Float32 = data[offset2++];
+					var q2w : Float32 = Math.sqrt(hxd.Math.abs(1 - (q2x*q2x+q2y*q2y+q2z*q2z)));
+
+					// qlerp nearest
+					var dot = q1x * q2x + q1y * q2y + q1z * q2z + q1w * q2w;
+					var q2 = dot < 0 ? -k2 : k2;
+					var qx = q1x * k1 + q2x * q2;
+					var qy = q1y * k1 + q2y * q2;
+					var qz = q1z * k1 + q2z * q2;
+					var qw = q1w * k1 + q2w * q2;
+					// make sure the resulting quaternion is normalized
+					var ql = 1 / Math.sqrt(qx * qx + qy * qy + qz * qz + qw * qw);
+					qx *= ql;
+					qy *= ql;
+					qz *= ql;
+					qw *= ql;
+
+					if( decompose ) {
+						m._12 = qx;
+						m._13 = qy;
+						m._21 = qz;
+						m._23 = qw;
 						if( layout.has(Scale) ) {
 							m._11 = lerpValue();
 							m._22 = lerpValue();
@@ -266,10 +213,57 @@ class BufferAnimation extends Animation {
 							m._22 = 1;
 							m._33 = 1;
 						}
+					} else {
+						// quaternion to matrix
+						var xx = qx * qx;
+						var xy = qx * qy;
+						var xz = qx * qz;
+						var xw = qx * qw;
+						var yy = qy * qy;
+						var yz = qy * qz;
+						var yw = qy * qw;
+						var zz = qz * qz;
+						var zw = qz * qw;
+						m._11 = 1 - 2 * ( yy + zz );
+						m._12 = 2 * ( xy + zw );
+						m._13 = 2 * ( xz - yw );
+						m._21 = 2 * ( xy - zw );
+						m._22 = 1 - 2 * ( xx + zz );
+						m._23 = 2 * ( yz + xw );
+						m._31 = 2 * ( xz + yw );
+						m._32 = 2 * ( yz - xw );
+						m._33 = 1 - 2 * ( xx + yy );
+						if( layout.has(Scale) ) {
+							var sx = lerpValue();
+							var sy = lerpValue();
+							var sz = lerpValue();
+							m._11 *= sx;
+							m._12 *= sx;
+							m._13 *= sx;
+							m._21 *= sy;
+							m._22 *= sy;
+							m._23 *= sy;
+							m._31 *= sz;
+							m._32 *= sz;
+							m._33 *= sz;
+						}
+					}
+
+				} else {
+					m._12 = 0;
+					m._13 = 0;
+					m._21 = 0;
+					m._23 = decompose ? 1 : 0;
+
+					if( layout.has(Scale) ) {
+						m._11 = lerpValue();
+						m._22 = lerpValue();
+						m._33 = lerpValue();
+					} else {
+						m._11 = 1;
+						m._22 = 1;
+						m._33 = 1;
 					}
-				}
-				else {
-					m = dynJoint.relPos;
 				}
 
 				if( o.targetSkin != null ) {