| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501 | 
							- using System.Collections;
 
- using System.Collections.Generic;
 
- using GPUECSAnimationBaker.Engine.AnimatorSystem;
 
- using GpuEcsAnimationBaker.Engine.Data;
 
- using Unity.Collections;
 
- using Unity.Mathematics;
 
- using Unity.Transforms;
 
- using UnityEngine;
 
- public class GPUAnimtion
 
- {
 
-     // public GpuEcsAnimatorBehaviour GameObject;
 
-     //
 
-     // public Renderer Renderer;
 
-     public GpuEcsAnimationDataComponent gpuEcsAnimationData;
 
-     public List<GpuEcsAnimationDataBufferElement> gpuEcsAnimationDataBuffer;
 
-     public List<GpuEcsAnimationEventOccurenceBufferElement> gpuEcsAnimationEventOccurenceBuffer;
 
-     public GpuEcsAnimatorShaderDataComponent gpuEcsAnimatorShaderData;
 
-     public GpuEcsAnimatorInitializedComponent gpuEcsAnimatorInitialized;
 
-     private GpuEcsAnimatorControlComponent gpuEcsAnimatorControl;
 
-     private GpuEcsAnimatorControlStateComponent gpuEcsAnimatorControlState;
 
-     private GpuEcsAnimatorTransitionInfoComponent gpuEcsAnimatorTransitionInfo;
 
-     private GpuEcsAnimatorStateComponent gpuEcsAnimatorState;
 
-     public List<GpuEcsAttachmentAnchorDataBufferElement> gpuEcsAttachmentAnchorData;
 
-     public List<GpuEcsCurrentAttachmentAnchorBufferElement> gpuEcsCurrentAttachmentAnchors;
 
-     public GpuEcsAnimatorEventBufferElement gpuEcsAnimatorEventBuffer;
 
-     public int animtionIndex;
 
-     // private MaterialPropertyBlock _materialPropertyBlock;
 
-     // private Renderer renderer;
 
-     public void SetSpeed(float speed)
 
-     {
 
-         gpuEcsAnimatorControl.animatorInfo.speedFactor = speed;
 
-     }
 
-     [ContextMenu("adadadsa")]
 
-     public void SetAnimtionIndex(AnimatorInfo animatorInfo)
 
-     {
 
-         gpuEcsAnimatorControl.animatorInfo = animatorInfo;
 
-     }
 
-     public void SetAnimtionIndex(int animatorInfo)
 
-     {
 
-         gpuEcsAnimatorControl.animatorInfo.animationID = animatorInfo;
 
-     }
 
-     public void GetGPUAnchors(int index, out Vector3 pos, out Quaternion unityQuaternion)
 
-     {
 
-         if (gpuEcsCurrentAttachmentAnchors.Count <= index)
 
-         {
 
-             pos = Vector3.zero;
 
-             unityQuaternion = Quaternion.identity;
 
-             return;
 
-         }
 
-         GpuEcsCurrentAttachmentAnchorBufferElement gpuEcsCurrentAttachmentAnchorBufferElement =
 
-             gpuEcsCurrentAttachmentAnchors[0];
 
-         float3 pos2 = gpuEcsCurrentAttachmentAnchorBufferElement.currentTransform.TransformPoint(float3.zero);
 
-         pos = new Vector3(pos2.x, pos2.y, pos2.z);
 
-         float4 xuanzhaung = gpuEcsCurrentAttachmentAnchorBufferElement.currentTransform
 
-             .TransformRotation(quaternion.identity).value;
 
-         unityQuaternion = new Quaternion(xuanzhaung.x, xuanzhaung.y, xuanzhaung.z, xuanzhaung.w);
 
-     }
 
-     // Update is called once per frame
 
-     public void Update()
 
-     {
 
-         Execute();
 
-         // if (gpuEcsCurrentAttachmentAnchors.Count > 0)
 
-         // {
 
-         //     float3 pos2 = gpuEcsCurrentAttachmentAnchors[0].currentTransform.TransformPoint(float3.zero);
 
-         //     float3 pos = LocalTransform.FromMatrix(gpuEcsCurrentAttachmentAnchors[0].currentTransform).Position;
 
-         //     Debug.Log(pos);
 
-         //     // Matrix4x4 matrix4X4 = new Matrix4x4();
 
-         //     // float3 pos=    float3(0,0,0);
 
-         // }
 
-         // _materialPropertyBlock.SetMatrix("_AnimationState", gpuEcsAnimatorShaderData.shaderData);
 
-         // _materialPropertyBlock.SetFloat("_EnableAnimation", 1);
 
-         // renderer.SetPropertyBlock(_materialPropertyBlock);
 
-     }
 
-     public void Init(GpuEcsAnimatorBehaviour gpuEcsAnimatorBehaviour)
 
-     {
 
-         // _materialPropertyBlock = new MaterialPropertyBlock();
 
-         // GpuEcsAnimatedMeshBehaviour ecsAnimatedMeshBehaviour = gpuEcsAnimatorBehaviour.gameObject.transform
 
-         //     .GetComponentInChildren<GpuEcsAnimatedMeshBehaviour>();
 
-         // renderer = ecsAnimatedMeshBehaviour.GetComponent<Renderer>();
 
-         // renderer.GetPropertyBlock(_materialPropertyBlock);
 
-         gpuEcsAnimationData = new GpuEcsAnimationDataComponent()
 
-         {
 
-             nbrOfAttachmentAnchors = gpuEcsAnimatorBehaviour.nbrOfAttachmentAnchors,
 
-             totalNbrOfFrames = gpuEcsAnimatorBehaviour.totalNbrOfFrames
 
-         };
 
-         gpuEcsAnimationDataBuffer =
 
-             new List<GpuEcsAnimationDataBufferElement>();
 
-         for (int animationIndex = 0; animationIndex < gpuEcsAnimatorBehaviour.animations.Length; animationIndex++)
 
-         {
 
-             GpuEcsAnimationData gpuEcsAnimationData = gpuEcsAnimatorBehaviour.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
 
-             });
 
-         }
 
-         gpuEcsAnimationEventOccurenceBuffer = new List<GpuEcsAnimationEventOccurenceBufferElement>();
 
-         for (int animationEventOccurenceId = 0;
 
-              animationEventOccurenceId < gpuEcsAnimatorBehaviour.animationEventOccurences.Length;
 
-              animationEventOccurenceId++)
 
-         {
 
-             GpuEcsAnimationEventOccurence occurence =
 
-                 gpuEcsAnimatorBehaviour.animationEventOccurences[animationEventOccurenceId];
 
-             gpuEcsAnimationEventOccurenceBuffer.Add(new GpuEcsAnimationEventOccurenceBufferElement()
 
-             {
 
-                 eventNormalizedTime = occurence.eventNormalizedTime,
 
-                 eventId = occurence.eventId
 
-             });
 
-         }
 
-         gpuEcsAnimatorShaderData = 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 =
 
-             gpuEcsAnimatorBehaviour.GetComponent<GpuEcsAnimatorInitializerBehaviour>();
 
-         if (initializer != null) initialAnimationID = initializer.GetInitialAnimationID();
 
-         gpuEcsAnimatorInitialized = new GpuEcsAnimatorInitializedComponent()
 
-         {
 
-             initialized = false
 
-         };
 
-         gpuEcsAnimatorControl = new GpuEcsAnimatorControlComponent()
 
-         {
 
-             animatorInfo = new AnimatorInfo()
 
-             {
 
-                 animationID = initialAnimationID,
 
-                 blendFactor = 0,
 
-                 speedFactor = 1
 
-             },
 
-             transitionSpeed = 0,
 
-             startNormalizedTime = 0
 
-         };
 
-         gpuEcsAnimatorControlState =
 
-             new GpuEcsAnimatorControlStateComponent()
 
-             {
 
-                 state = GpuEcsAnimatorControlStates.Start
 
-             };
 
-         gpuEcsAnimatorTransitionInfo =
 
-             new GpuEcsAnimatorTransitionInfoComponent();
 
-         gpuEcsAnimatorState = new GpuEcsAnimatorStateComponent();
 
-         gpuEcsAttachmentAnchorData =
 
-             new List<GpuEcsAttachmentAnchorDataBufferElement>();
 
-         gpuEcsCurrentAttachmentAnchors =
 
-             new List<GpuEcsCurrentAttachmentAnchorBufferElement>();
 
-         if (gpuEcsAnimatorBehaviour.attachmentAnchorData != null && gpuEcsAnimatorBehaviour.nbrOfAttachmentAnchors > 0)
 
-         {
 
-             int anchorDataLength = gpuEcsAnimatorBehaviour.attachmentAnchorData.anchorTransforms.Length;
 
-             NativeArray<GpuEcsAttachmentAnchorDataBufferElement> anchors =
 
-                 new NativeArray<GpuEcsAttachmentAnchorDataBufferElement>(anchorDataLength, Allocator.Temp);
 
-             for (int i = 0; i < anchorDataLength; i++)
 
-                 anchors[i] = new GpuEcsAttachmentAnchorDataBufferElement()
 
-                     { anchorTransform = gpuEcsAnimatorBehaviour.attachmentAnchorData.anchorTransforms[i] };
 
-             gpuEcsAttachmentAnchorData.AddRange(anchors);
 
-             anchors.Dispose();
 
-             NativeArray<GpuEcsCurrentAttachmentAnchorBufferElement> currentAnchorTransforms =
 
-                 new NativeArray<GpuEcsCurrentAttachmentAnchorBufferElement>(
 
-                     gpuEcsAnimatorBehaviour.nbrOfAttachmentAnchors,
 
-                     Allocator.Temp);
 
-             gpuEcsCurrentAttachmentAnchors.AddRange(currentAnchorTransforms);
 
-             currentAnchorTransforms.Dispose();
 
-         }
 
-         gpuEcsAnimatorEventBuffer = new GpuEcsAnimatorEventBufferElement();
 
-     }
 
-     public void Execute()
 
-     {
 
-         // gpuEcsAnimatorEventBuffer.Clear();
 
-         if (!gpuEcsAnimatorInitialized.initialized)
 
-         {
 
-             // We switch immediately to the first animation, no transition
 
-             gpuEcsAnimatorTransitionInfo = new GpuEcsAnimatorTransitionInfoComponent()
 
-             {
 
-                 current = gpuEcsAnimatorControl.animatorInfo,
 
-                 blendPreviousToCurrent = 1f
 
-             };
 
-             gpuEcsAnimatorState = new GpuEcsAnimatorStateComponent()
 
-             {
 
-                 currentNormalizedTime = gpuEcsAnimatorControl.startNormalizedTime,
 
-                 stoppedPrevious = false,
 
-                 stoppedCurrent = false
 
-             };
 
-             gpuEcsAnimatorInitialized.initialized = true;
 
-         }
 
-         else if (gpuEcsAnimatorControl.animatorInfo.animationID != gpuEcsAnimatorTransitionInfo.current.animationID)
 
-         {
 
-             // A new animation (or animation combination) has been started, so we need to do a transition
 
-             // from the old one to the new
 
-             gpuEcsAnimatorTransitionInfo = new GpuEcsAnimatorTransitionInfoComponent()
 
-             {
 
-                 current = gpuEcsAnimatorControl.animatorInfo,
 
-                 previous = gpuEcsAnimatorTransitionInfo.current,
 
-                 blendPreviousToCurrent = 0f
 
-             };
 
-             gpuEcsAnimatorState = new GpuEcsAnimatorStateComponent()
 
-             {
 
-                 previousNormalizedTime = gpuEcsAnimatorState.currentNormalizedTime,
 
-                 stoppedPrevious = gpuEcsAnimatorState.stoppedCurrent,
 
-                 currentNormalizedTime = gpuEcsAnimatorControl.startNormalizedTime,
 
-                 stoppedCurrent = false,
 
-             };
 
-         }
 
-         else
 
-         {
 
-             // The same animation (or animation combination) is still running, but the parameters might have changed
 
-             // (blendPrimaryToSecondary or speedFactor)
 
-             gpuEcsAnimatorTransitionInfo.current = gpuEcsAnimatorControl.animatorInfo;
 
-         }
 
-         GpuEcsAnimatorControlStates controlState = gpuEcsAnimatorControlState.state;
 
-         if (gpuEcsAnimatorControlState.state == GpuEcsAnimatorControlStates.Start)
 
-             gpuEcsAnimatorState.stoppedCurrent = false;
 
-         else if (gpuEcsAnimatorControlState.state == GpuEcsAnimatorControlStates.Stop)
 
-             gpuEcsAnimatorState.stoppedCurrent = true;
 
-         gpuEcsAnimatorControlState.state = GpuEcsAnimatorControlStates.KeepCurrentState;
 
-         if (!gpuEcsAnimatorState.stoppedCurrent)
 
-         {
 
-             UpdateAnimatorState(ref gpuEcsAnimatorState.currentNormalizedTime, ref gpuEcsAnimatorState.stoppedCurrent,
 
-                 ref gpuEcsAnimatorEventBuffer,
 
-                 gpuEcsAnimatorTransitionInfo.current, controlState, gpuEcsAnimationDataBuffer,
 
-                 gpuEcsAnimationEventOccurenceBuffer,
 
-                 out float primaryBlendFactor, out float primaryTransitionToNextFrame, out int primaryFrameIndex,
 
-                 out float secondaryBlendFactor, out float secondaryTransitionToNextFrame, out int secondaryFrameIndex,
 
-                 forPrevious: false);
 
-             if (gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent >= 1f)
 
-             {
 
-                 gpuEcsAnimatorShaderData.shaderData = new float4x4(
 
-                     primaryBlendFactor, primaryTransitionToNextFrame, primaryFrameIndex, 0,
 
-                     secondaryBlendFactor, secondaryTransitionToNextFrame, secondaryFrameIndex, 0,
 
-                     0, 0, 0, 0,
 
-                     0, 0, 0, 0);
 
-                 //Apply attachment anchor transforms
 
-                 for (int attachmentAnchorIndex = 0;
 
-                      attachmentAnchorIndex < gpuEcsAnimationData.nbrOfAttachmentAnchors;
 
-                      attachmentAnchorIndex++)
 
-                 {
 
-                     int baseIndex = gpuEcsAnimationData.totalNbrOfFrames * attachmentAnchorIndex;
 
-                     gpuEcsCurrentAttachmentAnchors[attachmentAnchorIndex] =
 
-                         new GpuEcsCurrentAttachmentAnchorBufferElement()
 
-                         {
 
-                             currentTransform = LerpBlend(gpuEcsAttachmentAnchorData, baseIndex,
 
-                                 primaryFrameIndex, secondaryFrameIndex,
 
-                                 primaryTransitionToNextFrame, secondaryTransitionToNextFrame,
 
-                                 secondaryBlendFactor)
 
-                         };
 
-                 }
 
-             }
 
-             else
 
-             {
 
-                 if (gpuEcsAnimatorControl.transitionSpeed == 0)
 
-                     gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent = 1f;
 
-                 else
 
-                 {
 
-                     gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent +=
 
-                         Time.deltaTime / gpuEcsAnimatorControl.transitionSpeed;
 
-                     if (gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent > 1f)
 
-                         gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent = 1f;
 
-                 }
 
-                 float previousToCurrent = gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent;
 
-                 float currentToPrevious = 1f - previousToCurrent;
 
-                 UpdateAnimatorState(ref gpuEcsAnimatorState.previousNormalizedTime,
 
-                     ref gpuEcsAnimatorState.stoppedPrevious,
 
-                     ref gpuEcsAnimatorEventBuffer,
 
-                     gpuEcsAnimatorTransitionInfo.previous, controlState, gpuEcsAnimationDataBuffer,
 
-                     gpuEcsAnimationEventOccurenceBuffer,
 
-                     out float previousPrimaryBlendFactor, out float previousPrimaryTransitionToNextFrame,
 
-                     out int previousPrimaryFrameIndex,
 
-                     out float previousSecondaryBlendFactor, out float previousSecondaryTransitionToNextFrame,
 
-                     out int previousSecondaryFrameIndex,
 
-                     forPrevious: true);
 
-                 gpuEcsAnimatorShaderData.shaderData = new float4x4(
 
-                     previousToCurrent * primaryBlendFactor, primaryTransitionToNextFrame, primaryFrameIndex, 0,
 
-                     previousToCurrent * secondaryBlendFactor, secondaryTransitionToNextFrame, secondaryFrameIndex, 0,
 
-                     currentToPrevious * previousPrimaryBlendFactor, previousPrimaryTransitionToNextFrame,
 
-                     previousPrimaryFrameIndex, 0,
 
-                     currentToPrevious * previousSecondaryBlendFactor, previousSecondaryTransitionToNextFrame,
 
-                     previousSecondaryFrameIndex, 0);
 
-                 for (int attachmentAnchorIndex = 0;
 
-                      attachmentAnchorIndex < gpuEcsAnimationData.nbrOfAttachmentAnchors;
 
-                      attachmentAnchorIndex++)
 
-                 {
 
-                     int baseIndex = gpuEcsAnimationData.totalNbrOfFrames * attachmentAnchorIndex;
 
-                     float4x4 current = LerpBlend(gpuEcsAttachmentAnchorData, baseIndex,
 
-                         primaryFrameIndex, secondaryFrameIndex,
 
-                         primaryTransitionToNextFrame, secondaryTransitionToNextFrame,
 
-                         secondaryBlendFactor);
 
-                     float4x4 previous = LerpBlend(gpuEcsAttachmentAnchorData, baseIndex,
 
-                         previousPrimaryFrameIndex, previousSecondaryFrameIndex,
 
-                         previousPrimaryTransitionToNextFrame, previousSecondaryTransitionToNextFrame,
 
-                         previousSecondaryBlendFactor);
 
-                     gpuEcsCurrentAttachmentAnchors[attachmentAnchorIndex] =
 
-                         new GpuEcsCurrentAttachmentAnchorBufferElement()
 
-                         {
 
-                             currentTransform = LerpTransform(previous, current, previousToCurrent)
 
-                         };
 
-                 }
 
-             }
 
-         }
 
-     }
 
-     private float4x4 LerpBlend(in List<GpuEcsAttachmentAnchorDataBufferElement> gpuEcsAttachmentAnchorData,
 
-         int baseIndex, int frameIndexA, int frameIndexB,
 
-         float frameIndexATransitionToNextFrame, float frameIndexBTransitionToNextFrame,
 
-         float t)
 
-     {
 
-         float4x4 result;
 
-         if (t == 0)
 
-             result = LerpNextFrame(gpuEcsAttachmentAnchorData, baseIndex, frameIndexA,
 
-                 frameIndexATransitionToNextFrame);
 
-         else if (t == 1f)
 
-             result = LerpNextFrame(gpuEcsAttachmentAnchorData, baseIndex, frameIndexB,
 
-                 frameIndexBTransitionToNextFrame);
 
-         else
 
-         {
 
-             float4x4 primary = LerpNextFrame(gpuEcsAttachmentAnchorData, baseIndex, frameIndexA,
 
-                 frameIndexATransitionToNextFrame);
 
-             float4x4 secondary = LerpNextFrame(gpuEcsAttachmentAnchorData, baseIndex, frameIndexB,
 
-                 frameIndexBTransitionToNextFrame);
 
-             result = LerpTransform(primary, secondary, t);
 
-         }
 
-         return result;
 
-     }
 
-     private float4x4 LerpNextFrame(in List<GpuEcsAttachmentAnchorDataBufferElement> gpuEcsAttachmentAnchorData,
 
-         int baseIndex, int frameIndex, float transitionToNextFrame)
 
-     {
 
-         return LerpTransform(
 
-             gpuEcsAttachmentAnchorData[baseIndex + frameIndex].anchorTransform,
 
-             gpuEcsAttachmentAnchorData[baseIndex + frameIndex + 1].anchorTransform,
 
-             transitionToNextFrame
 
-         );
 
-     }
 
-     private float4x4 LerpTransform(float4x4 valueA, float4x4 valueB, float t)
 
-     {
 
-         float3 posA = new float3(valueA.c3.x, valueA.c3.y, valueA.c3.z);
 
-         quaternion rotA = new quaternion(valueA);
 
-         float3 posB = new float3(valueB.c3.x, valueB.c3.y, valueB.c3.z);
 
-         quaternion rotB = new quaternion(valueB);
 
-         float3 pos = math.lerp(posA, posB, t);
 
-         Quaternion rot = math.slerp(rotA, rotB, t);
 
-         return float4x4.TRS(pos, rot, new float3(1f, 1f, 1f));
 
-     }
 
-     private void UpdateAnimatorState(ref float normalizedTime, ref bool stopped,
 
-         ref GpuEcsAnimatorEventBufferElement gpuEcsAnimatorEventBuffer,
 
-         AnimatorInfo animatorInfo,
 
-         in GpuEcsAnimatorControlStates controlState,
 
-         in List<GpuEcsAnimationDataBufferElement> gpuEcsAnimationDataBuffer,
 
-         in List<GpuEcsAnimationEventOccurenceBufferElement> gpuEcsAnimationEventOccurenceBuffer,
 
-         out float primaryBlendFactor, out float primaryTransitionToNextFrame, out int primaryFrameIndex,
 
-         out float secondaryBlendFactor, out float secondaryTransitionToNextFrame, out int secondaryFrameIndex,
 
-         bool forPrevious)
 
-     {
 
-         GpuEcsAnimationDataBufferElement animationData = gpuEcsAnimationDataBuffer[animatorInfo.animationID];
 
-         if (animationData.nbrOfInBetweenSamples == 1)
 
-         {
 
-             float blendSpeedAdjustment = 1f;
 
-             UpdateAnimationNormalizedTime(ref normalizedTime, ref stopped, ref gpuEcsAnimatorEventBuffer, animatorInfo,
 
-                 controlState,
 
-                 gpuEcsAnimationEventOccurenceBuffer, animationData, blendSpeedAdjustment,
 
-                 out float transitionToNextFrame, out int relativeFrameIndex, forPrevious);
 
-             primaryBlendFactor = 1;
 
-             primaryTransitionToNextFrame = transitionToNextFrame;
 
-             primaryFrameIndex = animationData.startFrameIndex + relativeFrameIndex;
 
-             secondaryBlendFactor = 0;
 
-             secondaryTransitionToNextFrame = 0;
 
-             secondaryFrameIndex = 0;
 
-         }
 
-         else
 
-         {
 
-             float endBlend = (float)(animationData.nbrOfInBetweenSamples - 1);
 
-             float currentBlendSetFloat = animatorInfo.blendFactor * endBlend;
 
-             int currentBlendSet = (int)math.floor(currentBlendSetFloat);
 
-             float transitionToNextSet = currentBlendSetFloat - (float)currentBlendSet;
 
-             float blendSpeedAdjustment = animatorInfo.blendFactor * animationData.blendTimeCorrection +
 
-                                          (1f - animatorInfo.blendFactor);
 
-             UpdateAnimationNormalizedTime(ref normalizedTime, ref stopped, ref gpuEcsAnimatorEventBuffer, animatorInfo,
 
-                 controlState,
 
-                 gpuEcsAnimationEventOccurenceBuffer, animationData, blendSpeedAdjustment,
 
-                 out float transitionToNextFrame, out int relativeFrameIndex, forPrevious);
 
-             primaryBlendFactor = 1f - transitionToNextSet;
 
-             primaryTransitionToNextFrame = transitionToNextFrame;
 
-             primaryFrameIndex = animationData.startFrameIndex + currentBlendSet * animationData.nbrOfFramesPerSample +
 
-                                 relativeFrameIndex;
 
-             secondaryBlendFactor = transitionToNextSet;
 
-             secondaryTransitionToNextFrame = transitionToNextFrame;
 
-             secondaryFrameIndex = animationData.startFrameIndex +
 
-                                   (currentBlendSet + 1) * animationData.nbrOfFramesPerSample + relativeFrameIndex;
 
-         }
 
-     }
 
-     private void UpdateAnimationNormalizedTime(ref float normalizedTime, ref bool stopped,
 
-         ref GpuEcsAnimatorEventBufferElement gpuEcsAnimatorEventBuffer,
 
-         AnimatorInfo animatorInfo, in GpuEcsAnimatorControlStates controlState,
 
-         in List<GpuEcsAnimationEventOccurenceBufferElement> gpuEcsAnimationEventOccurenceBuffer,
 
-         GpuEcsAnimationDataBufferElement animationData, float blendSpeedAdjustment,
 
-         out float transitionToNextFrame, out int relativeFrameIndex, bool forPrevious)
 
-     {
 
-         int endFrame = animationData.nbrOfFramesPerSample - 1;
 
-         float animationLength = (float)endFrame / GlobalConstants.SampleFrameRate;
 
-         float currentTime = normalizedTime * animationLength;
 
-         if (!stopped) currentTime += Time.deltaTime * animatorInfo.speedFactor * blendSpeedAdjustment;
 
-         float normalizedTimeLastUpdate = normalizedTime;
 
-         normalizedTime = currentTime / animationLength;
 
-         for (int eventOccurencId = animationData.startEventOccurenceId;
 
-              eventOccurencId < animationData.startEventOccurenceId + animationData.nbrOfEventOccurenceIds;
 
-              eventOccurencId++)
 
-         {
 
-             GpuEcsAnimationEventOccurenceBufferElement occurence = gpuEcsAnimationEventOccurenceBuffer[eventOccurencId];
 
-             if (normalizedTimeLastUpdate < occurence.eventNormalizedTime &&
 
-                 normalizedTime > occurence.eventNormalizedTime)
 
-             {
 
-                 //Trigger event
 
-                 gpuEcsAnimatorEventBuffer = (new GpuEcsAnimatorEventBufferElement()
 
-                 {
 
-                     animationId = animatorInfo.animationID,
 
-                     eventId = occurence.eventId
 
-                 });
 
-             }
 
-         }
 
-         if (!forPrevious && (animationData.loop || controlState == GpuEcsAnimatorControlStates.Start))
 
-         {
 
-             while (normalizedTime >= 1f) normalizedTime -= 1f;
 
-         }
 
-         else
 
-         {
 
-             if (normalizedTime >= 1f)
 
-             {
 
-                 normalizedTime = 1f;
 
-                 stopped = true;
 
-             }
 
-         }
 
-         if (normalizedTime == 1f)
 
-         {
 
-             relativeFrameIndex = endFrame - 1;
 
-             transitionToNextFrame = 1f;
 
-         }
 
-         else
 
-         {
 
-             float relativeFrameIndexFloat = normalizedTime * (float)endFrame;
 
-             relativeFrameIndex = (int)math.floor(relativeFrameIndexFloat);
 
-             transitionToNextFrame = relativeFrameIndexFloat - (float)relativeFrameIndex;
 
-         }
 
-     }
 
- }
 
 
  |