PO/Library/PackageCache/com.unity.2d.animation@5.0.7/Runtime/PrepareSkinningSystem.cs

83 lines
3.5 KiB
C#

#if ENABLE_ENTITIES
using Unity.Collections;
using Unity.Entities;
using Unity.Mathematics;
using UnityEngine.U2D.Common;
using UnityEngine.Scripting;
namespace UnityEngine.U2D.Animation
{
[Preserve]
[UnityEngine.ExecuteAlways]
[UpdateInGroup(typeof(PresentationSystemGroup))]
internal class PrepareSkinningSystem : ComponentSystem
{
EntityQuery m_ComponentGroup;
protected override void OnCreateManager()
{
m_ComponentGroup = GetEntityQuery(typeof(SpriteSkin), typeof(WorldToLocal), typeof(SpriteComponent), typeof(Vertex), typeof(BoneTransform));
}
protected override void OnUpdate()
{
var worldToLocalComponents = m_ComponentGroup.ToComponentDataArray<WorldToLocal>(Allocator.TempJob);
var counter = 0;
Entities.With(m_ComponentGroup).ForEach((Entity entity, SpriteSkin spriteSkin) =>
{
var sr = EntityManager.GetSharedComponentData<SpriteComponent>(entity);
var vertexBuffer = EntityManager.GetBuffer<Vertex>(entity);
var boneTransformBuffer = EntityManager.GetBuffer<BoneTransform>(entity);
var currentSprite = sr.Value;
var currentWorldToLocal = worldToLocalComponents[counter];
Sprite sprite = null;
if (spriteSkin != null)
{
var spriteRenderer = spriteSkin.spriteRenderer;
var isValid = spriteRenderer.enabled && spriteSkin.isValid;
var isVisible = spriteRenderer.isVisible || spriteSkin.ForceSkinning;
if (!isValid)
spriteSkin.DeactivateSkinning();
else if (isVisible)
{
spriteSkin.ForceSkinning = false;
sprite = spriteRenderer.sprite;
float4x4 worldToLocal = spriteSkin.transform.worldToLocalMatrix;
if (vertexBuffer.Length != sprite.GetVertexCount())
{
vertexBuffer = PostUpdateCommands.SetBuffer<Vertex>(entity);
vertexBuffer.ResizeUninitialized(sprite.GetVertexCount());
}
InternalEngineBridge.SetDeformableBuffer(spriteRenderer, vertexBuffer.Reinterpret<Vector3>().AsNativeArray());
if (boneTransformBuffer.Length != spriteSkin.boneTransforms.Length)
{
boneTransformBuffer = PostUpdateCommands.SetBuffer<BoneTransform>(entity);
boneTransformBuffer.ResizeUninitialized(spriteSkin.boneTransforms.Length);
}
for (var j = 0; j < boneTransformBuffer.Length; ++j)
boneTransformBuffer[j] = new BoneTransform() { Value = spriteSkin.boneTransforms[j].localToWorldMatrix };
PostUpdateCommands.SetComponent<WorldToLocal>(entity, new WorldToLocal() { Value = worldToLocal });
}
if (currentSprite != sprite)
PostUpdateCommands.SetSharedComponent<SpriteComponent>(entity, new SpriteComponent() { Value = sprite });
if (!spriteRenderer.enabled)
spriteSkin.ForceSkinning = true;
}
});
worldToLocalComponents.Dispose();
}
}
}
#endif