123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- #if ENABLE_ANIMATION_COLLECTION && ENABLE_ANIMATION_BURST
- #define ENABLE_SPRITESKIN_COMPOSITE
- #endif
- using System;
- using Unity.Collections;
- using Unity.Collections.LowLevel.Unsafe;
- namespace UnityEngine.U2D.Animation
- {
- public sealed partial class SpriteSkin : MonoBehaviour
- #if ENABLE_SPRITESKIN_COMPOSITE
- {
- int m_TransformId;
- NativeArray<int> m_BoneTransformId;
- int m_RootBoneTransformId;
- NativeCustomSlice<Vector2> m_SpriteUVs;
- NativeCustomSlice<Vector3> m_SpriteVertices;
- NativeCustomSlice<Vector4> m_SpriteTangents;
- NativeCustomSlice<BoneWeight> m_SpriteBoneWeights;
- NativeCustomSlice<Matrix4x4> m_SpriteBindPoses;
- NativeCustomSlice<int> m_BoneTransformIdNativeSlice;
- bool m_SpriteHasTangents;
- int m_SpriteVertexStreamSize;
- int m_SpriteVertexCount;
- int m_SpriteTangentVertexOffset;
- int m_DataIndex = -1;
- bool m_BoneCacheUpdateToDate = false;
- void OnEnableBatch()
- {
- m_TransformId = gameObject.transform.GetInstanceID();
- UpdateSpriteDeform();
- if (m_UseBatching && m_BatchSkinning == false)
- {
- CacheBoneTransformIds(true);
- SpriteSkinComposite.instance.AddSpriteSkin(this);
- m_BatchSkinning = true;
- }
- else
- SpriteSkinComposite.instance.AddSpriteSkinForLateUpdate(this);
- }
- void OnResetBatch()
- {
- if (m_UseBatching)
- {
- CacheBoneTransformIds(true);
- SpriteSkinComposite.instance.CopyToSpriteSkinData(this);
- }
- }
- void OnDisableBatch()
- {
- RemoveTransformFromSpriteSkinComposite();
- SpriteSkinComposite.instance.RemoveSpriteSkin(this);
- SpriteSkinComposite.instance.RemoveSpriteSkinForLateUpdate(this);
- m_BatchSkinning = false;
- }
- internal void UpdateSpriteDeform()
- {
- if (sprite == null)
- {
- m_SpriteUVs = NativeCustomSlice<Vector2>.Default();
- m_SpriteVertices = NativeCustomSlice<Vector3>.Default();
- m_SpriteTangents = NativeCustomSlice<Vector4>.Default();
- m_SpriteBoneWeights = NativeCustomSlice<BoneWeight>.Default();
- m_SpriteBindPoses = NativeCustomSlice<Matrix4x4>.Default();
- m_SpriteHasTangents = false;
- m_SpriteVertexStreamSize = 0;
- m_SpriteVertexCount = 0;
- m_SpriteTangentVertexOffset = 0;
- }
- else
- {
- m_SpriteUVs = new NativeCustomSlice<Vector2>(sprite.GetVertexAttribute<Vector2>(UnityEngine.Rendering.VertexAttribute.TexCoord0));
- m_SpriteVertices = new NativeCustomSlice<Vector3>(sprite.GetVertexAttribute<Vector3>(UnityEngine.Rendering.VertexAttribute.Position));
- m_SpriteTangents = new NativeCustomSlice<Vector4>(sprite.GetVertexAttribute<Vector4>(UnityEngine.Rendering.VertexAttribute.Tangent));
- m_SpriteBoneWeights = new NativeCustomSlice<BoneWeight>(sprite.GetVertexAttribute<BoneWeight>(UnityEngine.Rendering.VertexAttribute.BlendWeight));
- m_SpriteBindPoses = new NativeCustomSlice<Matrix4x4>(sprite.GetBindPoses());
- m_SpriteHasTangents = sprite.HasVertexAttribute(Rendering.VertexAttribute.Tangent);
- m_SpriteVertexStreamSize = sprite.GetVertexStreamSize();
- m_SpriteVertexCount = sprite.GetVertexCount();
- m_SpriteTangentVertexOffset = sprite.GetVertexStreamOffset(Rendering.VertexAttribute.Tangent);
- }
- SpriteSkinComposite.instance.CopyToSpriteSkinData(this);
- }
- void CacheBoneTransformIds(bool forceUpdate = false)
- {
- if (!m_BoneCacheUpdateToDate || forceUpdate)
- {
- SpriteSkinComposite.instance.RemoveTransformById(m_RootBoneTransformId);
- if (rootBone != null)
- {
- m_RootBoneTransformId = rootBone.GetInstanceID();
- if (this.enabled)
- SpriteSkinComposite.instance.AddSpriteSkinRootBoneTransform(this);
- }
- else
- m_RootBoneTransformId = 0;
- if (boneTransforms != null)
- {
- int boneCount = 0;
- for (int i = 0; i < boneTransforms.Length; ++i)
- {
- if (boneTransforms[i] != null)
- ++boneCount;
- }
- if (m_BoneTransformId.IsCreated)
- {
- for (int i = 0; i < m_BoneTransformId.Length; ++i)
- SpriteSkinComposite.instance.RemoveTransformById(m_BoneTransformId[i]);
- NativeArrayHelpers.ResizeIfNeeded(ref m_BoneTransformId, boneCount);
- }
- else
- {
- m_BoneTransformId = new NativeArray<int>(boneCount, Allocator.Persistent);
- }
- m_BoneTransformIdNativeSlice = new NativeCustomSlice<int>(m_BoneTransformId);
- for (int i = 0, j = 0; i < boneTransforms.Length; ++i)
- {
- if (boneTransforms[i] != null)
- {
- m_BoneTransformId[j] = boneTransforms[i].GetInstanceID();
- ++j;
- }
- }
- if (this.enabled)
- {
- SpriteSkinComposite.instance.AddSpriteSkinBoneTransform(this);
- }
- }
- else
- {
- if (m_BoneTransformId.IsCreated)
- NativeArrayHelpers.ResizeIfNeeded(ref m_BoneTransformId, 0);
- else
- m_BoneTransformId = new NativeArray<int>(0, Allocator.Persistent);
- }
- CacheValidFlag();
- m_BoneCacheUpdateToDate = true;
- SpriteSkinComposite.instance.CopyToSpriteSkinData(this);
- }
- }
- void UseBatchingBatch()
- {
- if (!this.enabled)
- return;
- if (m_UseBatching)
- {
- m_BatchSkinning = true;
- CacheBoneTransformIds();
- SpriteSkinComposite.instance.AddSpriteSkin(this);
- SpriteSkinComposite.instance.RemoveSpriteSkinForLateUpdate(this);
- }
- else
- {
- SpriteSkinComposite.instance.RemoveSpriteSkin(this);
- SpriteSkinComposite.instance.AddSpriteSkinForLateUpdate(this);
- RemoveTransformFromSpriteSkinComposite();
- m_BatchSkinning = false;
- }
- }
- void RemoveTransformFromSpriteSkinComposite()
- {
- if (m_BoneTransformId.IsCreated)
- {
- for (int i = 0; i < m_BoneTransformId.Length; ++i)
- SpriteSkinComposite.instance.RemoveTransformById(m_BoneTransformId[i]);
- m_BoneTransformId.Dispose();
- }
- SpriteSkinComposite.instance.RemoveTransformById(m_RootBoneTransformId);
- m_RootBoneTransformId = -1;
- m_BoneCacheUpdateToDate = false;
- }
- internal void CopyToSpriteSkinData(ref SpriteSkinData data, int spriteSkinIndex)
- {
- CacheBoneTransformIds();
- CacheCurrentSprite();
- data.vertices = m_SpriteVertices;
- data.boneWeights = m_SpriteBoneWeights;
- data.bindPoses = m_SpriteBindPoses;
- data.tangents = m_SpriteTangents;
- data.hasTangents = m_SpriteHasTangents;
- data.spriteVertexStreamSize = m_SpriteVertexStreamSize;
- data.spriteVertexCount = m_SpriteVertexCount;
- data.tangentVertexOffset = m_SpriteTangentVertexOffset;
- data.transformId = m_TransformId;
- data.boneTransformId = m_BoneTransformIdNativeSlice;
- m_DataIndex = spriteSkinIndex;
- }
- internal bool NeedUpdateCompositeCache()
- {
- unsafe
- {
- var iptr = new IntPtr(sprite.GetVertexAttribute<Vector2>(UnityEngine.Rendering.VertexAttribute.TexCoord0).GetUnsafeReadOnlyPtr());
- var rs = m_SpriteUVs.data != iptr;
- if (rs)
- {
- UpdateSpriteDeform();
- }
- return rs;
- }
- }
- internal bool BatchValidate()
- {
- CacheBoneTransformIds();
- CacheCurrentSprite();
- return (m_IsValid && spriteRenderer.enabled && (alwaysUpdate || spriteRenderer.isVisible));
- }
- void OnBoneTransformChanged()
- {
- if (this.enabled)
- {
- CacheBoneTransformIds(true);
- }
- }
- void OnRootBoneTransformChanged()
- {
- if (this.enabled)
- {
- CacheBoneTransformIds(true);
- }
- }
- void OnBeforeSerializeBatch()
- {}
- void OnAfterSerializeBatch()
- {
- #if UNITY_EDITOR
- m_BoneCacheUpdateToDate = false;
- #endif
- }
- }
- #else
- {
- void OnEnableBatch(){}
- internal void UpdateSpriteDeform(){}
- void OnResetBatch(){}
- void UseBatchingBatch(){}
- void OnDisableBatch(){}
- void OnBoneTransformChanged(){}
- void OnRootBoneTransformChanged(){}
- void OnBeforeSerializeBatch(){}
- void OnAfterSerializeBatch(){}
- }
- #endif
- }
|