using System; using System.Runtime.CompilerServices; using Rukhanka.Toolbox; using Unity.Collections; using Unity.Entities; using Unity.Mathematics; ///////////////////////////////////////////////////////////////////////////////// namespace Rukhanka { public struct RuntimeAnimationData: IComponentData { internal NativeList animatedBonesBuffer; internal NativeList worldSpaceBonesBuffer; internal NativeList boneToEntityArr; internal NativeList boneTransformFlagsHolderArr; ///////////////////////////////////////////////////////////////////////////////// public static RuntimeAnimationData MakeDefault() { var rv = new RuntimeAnimationData() { animatedBonesBuffer = new (Allocator.Persistent), worldSpaceBonesBuffer = new (Allocator.Persistent), boneToEntityArr = new (Allocator.Persistent), boneTransformFlagsHolderArr = new (Allocator.Persistent), }; return rv; } ///////////////////////////////////////////////////////////////////////////////// public void Dispose() { animatedBonesBuffer.Dispose(); worldSpaceBonesBuffer.Dispose(); boneToEntityArr.Dispose(); boneTransformFlagsHolderArr.Dispose(); } ///////////////////////////////////////////////////////////////////////////////// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlySpan GetAnimationDataForRigRO(in NativeList animatedBonesBuffer, int offset, int length) { var rv = animatedBonesBuffer.GetReadOnlySpan(offset, length); return rv; } ///////////////////////////////////////////////////////////////////////////////// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span GetAnimationDataForRigRW(in NativeList animatedBonesBuffer, int offset, int length) { var rv = animatedBonesBuffer.GetSpan(offset, length); return rv; } ///////////////////////////////////////////////////////////////////////////////// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlySpan GetAnimationDataForRigRO ( in NativeList animatedBonesBuffer, in RigDefinitionComponent rigDefinition ) { return GetAnimationDataForRigRO(animatedBonesBuffer, rigDefinition.dynamicFrameData.bonePoseOffset, rigDefinition.dynamicFrameData.rigBoneCount); } /////////////////////////////////////////////////////////////////////////////////////////// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Span GetAnimationDataForRigRW ( in NativeList animatedBonesBuffer, in RigDefinitionComponent rigDefinition ) { return GetAnimationDataForRigRW(animatedBonesBuffer, rigDefinition.dynamicFrameData.bonePoseOffset, rigDefinition.dynamicFrameData.rigBoneCount); } /////////////////////////////////////////////////////////////////////////////////////////// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AnimationTransformFlags GetAnimationTransformFlagsRO(in NativeList boneToEntityArr, in NativeList boneTransformFlagsArr, int globalBoneIndex, int boneCount) { var boneInfo = boneToEntityArr[globalBoneIndex]; var rv = AnimationTransformFlags.CreateFromBufferRO(boneTransformFlagsArr, boneInfo.z, boneCount); return rv; } /////////////////////////////////////////////////////////////////////////////////////////// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AnimationTransformFlags GetAnimationTransformFlagsRW(in NativeList boneToEntityArr, in NativeList boneTransformFlagsArr, int globalBoneIndex, int boneCount) { var boneInfo = boneToEntityArr[globalBoneIndex]; var rv = AnimationTransformFlags.CreateFromBufferRW(boneTransformFlagsArr, boneInfo.z, boneCount); return rv; } } }