unsafe static public void Blend( ref AnimationStream output, ref AnimationStream input1, ref AnimationStream input2, float weight ) { Assert.IsFalse(output.IsNull); Assert.AreEqual(output.Rig.Value.GetHashCode(), input1.Rig.Value.GetHashCode()); Assert.AreEqual(output.Rig.Value.GetHashCode(), input2.Rig.Value.GetHashCode()); // Blend 4 wide lerp non rotation data float4 *input1Data = input1.GetDataChunkUnsafePtr(); float4 *input2Data = input2.GetDataChunkUnsafePtr(); float4 *outputData = output.GetDataChunkUnsafePtr(); for (int i = 0, count = output.DataChunkCount; i < count; ++i) { outputData[i] = math.lerp(input1Data[i], input2Data[i], weight); } // Blend 4-wide rotations quaternion4 *inputRot1 = input1.GetRotationChunkUnsafePtr(); quaternion4 *inputRot2 = input2.GetRotationChunkUnsafePtr(); quaternion4 *outputRot = output.GetRotationChunkUnsafePtr(); for (int i = 0, count = output.RotationChunkCount; i < count; ++i) { outputRot[i] = mathex.lerp(inputRot1[i], inputRot2[i], weight); } }
static unsafe public void BlendAdditiveLayer( ref AnimationStream output, ref AnimationStream input, float weight, NativeArray <WeightData> weightMasks ) { Assert.IsFalse(output.IsNull); Assert.AreEqual(output.Rig.Value.GetHashCode(), input.Rig.Value.GetHashCode()); Assert.AreEqual(WeightDataSize(output.Rig), weightMasks.Length); int wIdx = 0; float4 *wMask = (float4 *)weightMasks.GetUnsafeReadOnlyPtr(); // Blend 4-wide lerp non rotation data float4 *inputData = input.GetDataChunkUnsafePtr(); float4 *outputData = output.GetDataChunkUnsafePtr(); for (int i = 0, count = output.DataChunkCount; i < count; ++i, ++wIdx) { outputData[i] = math.mad(inputData[i], wMask[wIdx] * weight, outputData[i]); } // Blend 4-wide rotations quaternion4 *inputRot = input.GetRotationChunkUnsafePtr(); quaternion4 *outputRot = output.GetRotationChunkUnsafePtr(); for (int i = 0, count = output.RotationChunkCount; i < count; ++i, ++wIdx) { outputRot[i] = mathex.mul(outputRot[i], mathex.quatWeight(inputRot[i], wMask[wIdx] * weight)); } }