Example #1
0
        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);
            }
        }
Example #2
0
        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));
            }
        }