| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | using System;using System.Collections.Generic;using GpuEcsAnimationBaker.Engine.Data;using Unity.Collections;using Unity.Entities;using Unity.Mathematics;using UnityEngine;namespace GPUECSAnimationBaker.Engine.AnimatorSystem{    public class GpuEcsAnimatorBehaviour : MonoBehaviour    {        public int totalNbrOfFrames;        public int nbrOfAttachmentAnchors;        public GpuEcsAnimationData[] animations;        public GpuEcsAnimationEventOccurence[] animationEventOccurences;        public TransformUsageFlags transformUsageFlags = TransformUsageFlags.Dynamic;        public GpuEcsAttachmentAnchorData attachmentAnchorData;        public List<string> anchorNames=new List<string>();    }    [Serializable]    public struct GpuEcsAnimationEventOccurence    {        public float eventNormalizedTime;        public int eventId;    }    public class GpuEcsAnimatorBaker : Baker<GpuEcsAnimatorBehaviour>    {        public override void Bake(GpuEcsAnimatorBehaviour authoring)        {            Entity entity = GetEntity(authoring.transformUsageFlags);            AddComponent(entity, new GpuEcsAnimationDataComponent()            {                nbrOfAttachmentAnchors = authoring.nbrOfAttachmentAnchors,                totalNbrOfFrames = authoring.totalNbrOfFrames            });                        DynamicBuffer<GpuEcsAnimationDataBufferElement> gpuEcsAnimationDataBuffer = AddBuffer<GpuEcsAnimationDataBufferElement>(entity);            for (int animationIndex = 0; animationIndex < authoring.animations.Length; animationIndex++)            {                GpuEcsAnimationData gpuEcsAnimationData = authoring.animations[animationIndex];                gpuEcsAnimationDataBuffer.Add(new GpuEcsAnimationDataBufferElement()                {                    startFrameIndex = gpuEcsAnimationData.startFrameIndex,                    nbrOfFramesPerSample = gpuEcsAnimationData.nbrOfFramesPerSample,                    nbrOfInBetweenSamples = gpuEcsAnimationData.nbrOfInBetweenSamples,                    blendTimeCorrection = gpuEcsAnimationData.blendTimeCorrection,                    startEventOccurenceId = gpuEcsAnimationData.startEventOccurenceId,                    nbrOfEventOccurenceIds = gpuEcsAnimationData.nbrOfEventOccurenceIds,                    loop = gpuEcsAnimationData.loop                });            }                        DynamicBuffer<GpuEcsAnimationEventOccurenceBufferElement> gpuEcsAnimationEventOccurenceBuffer = AddBuffer<GpuEcsAnimationEventOccurenceBufferElement>(entity);            for (int animationEventOccurenceId = 0; animationEventOccurenceId < authoring.animationEventOccurences.Length; animationEventOccurenceId++)            {                GpuEcsAnimationEventOccurence occurence = authoring.animationEventOccurences[animationEventOccurenceId];                gpuEcsAnimationEventOccurenceBuffer.Add(new GpuEcsAnimationEventOccurenceBufferElement()                {                    eventNormalizedTime = occurence.eventNormalizedTime,                    eventId = occurence.eventId                });            }                        AddComponent(entity, new GpuEcsAnimatorShaderDataComponent()            {                shaderData = new float4x4(                    1f, 0, 0, 0,                     0, 0, 0, 0,                     0, 0, 0, 0,                    0, 0, 0, 0)            });            int initialAnimationID = 0;            GpuEcsAnimatorInitializerBehaviour initializer = authoring.GetComponent<GpuEcsAnimatorInitializerBehaviour>();            if (initializer != null) initialAnimationID = initializer.GetInitialAnimationID();            AddComponent(entity, new GpuEcsAnimatorInitializedComponent()            {                initialized = false            });                        AddComponent(entity, new GpuEcsAnimatorControlComponent()            {                animatorInfo = new AnimatorInfo()                {                    animationID = initialAnimationID,                    blendFactor = 0,                    speedFactor = 1                },                transitionSpeed = 0,                startNormalizedTime = 0            });            AddComponent(entity, new GpuEcsAnimatorControlStateComponent()            {                state = GpuEcsAnimatorControlStates.Start            });                            AddComponent<GpuEcsAnimatorTransitionInfoComponent>(entity);            AddComponent<GpuEcsAnimatorStateComponent>(entity);            DynamicBuffer<GpuEcsAttachmentAnchorDataBufferElement> anchorDataBuffer = AddBuffer<GpuEcsAttachmentAnchorDataBufferElement>(entity);            DynamicBuffer<GpuEcsCurrentAttachmentAnchorBufferElement> currentAnchorTransformBuffer = AddBuffer<GpuEcsCurrentAttachmentAnchorBufferElement>(entity);            if (authoring.attachmentAnchorData != null && authoring.nbrOfAttachmentAnchors > 0)            {                int anchorDataLength = authoring.attachmentAnchorData.anchorTransforms.Length;                NativeArray<GpuEcsAttachmentAnchorDataBufferElement> anchors = new NativeArray<GpuEcsAttachmentAnchorDataBufferElement>(anchorDataLength, Allocator.Temp);                for (int i = 0; i < anchorDataLength; i++)                     anchors[i] = new GpuEcsAttachmentAnchorDataBufferElement() { anchorTransform = authoring.attachmentAnchorData.anchorTransforms[i] };                anchorDataBuffer.AddRange(anchors);                anchors.Dispose();                NativeArray<GpuEcsCurrentAttachmentAnchorBufferElement> currentAnchorTransforms = new NativeArray<GpuEcsCurrentAttachmentAnchorBufferElement>(authoring.nbrOfAttachmentAnchors, Allocator.Temp);                currentAnchorTransformBuffer.AddRange(currentAnchorTransforms);                currentAnchorTransforms.Dispose();            }            AddBuffer<GpuEcsAnimatorEventBufferElement>(entity);        }    }}
 |