public static Entity Instantiate(EntityArchetype archetype, List <IComponentData> componentDatas, SpriteSheetAnimator animator)
        {
            Entity e = EntityManager.CreateEntity(archetype);
            SpriteSheetAnimationClip startAnim = animator.animations[animator.defaultAnimationClipIndex];
            int      maxSprites = startAnim.FrameCount;
            Material material   = SpriteSheetCache.GetMaterial(animator.animations[animator.defaultAnimationClipIndex].AnimationName);
            int      bufferID   = DynamicBufferManager.AddDynamicBuffers(DynamicBufferManager.GetEntityBuffer(material), material);

            foreach (IComponentData Idata in componentDatas)
            {
                EntityManager.SetComponentData(e, Idata);
            }

            var spriteSheetMaterial = new SpriteSheetMaterial {
                material = material
            };
            BufferHook bh = new BufferHook {
                bufferID = bufferID, bufferEntityID = DynamicBufferManager.GetEntityBufferID(spriteSheetMaterial)
            };

            EntityManager.SetComponentData(e, bh);
            EntityManager.SetComponentData(e, new SpriteSheetAnimation {
                frameCount = maxSprites, framesPerSecond = startAnim.FramesPerSecond, playMode = startAnim.PlayMode
            });
            EntityManager.SetComponentData(e, new SpriteIndex {
                Value = 0
            });
            EntityManager.SetSharedComponentData(e, spriteSheetMaterial);
            animator.managedEntity = e;
            SpriteSheetCache.AddAnimator(e, animator);
            return(e);
        }
        public static void SetAnimation(Entity e, SpriteSheetAnimationClip animation)
        {
            int      bufferEntityID = EntityManager.GetComponentData <BufferHook>(e).bufferEntityID;
            int      bufferID       = EntityManager.GetComponentData <BufferHook>(e).bufferID;
            Material oldMaterial    = DynamicBufferManager.GetMaterial(bufferEntityID);
            string   oldAnimation   = SpriteSheetCache.GetMaterialName(oldMaterial);

            if (animation.AnimationName != oldAnimation)
            {
                Material material            = SpriteSheetCache.GetMaterial(animation.AnimationName);
                var      spriteSheetMaterial = new SpriteSheetMaterial {
                    material = material
                };

                DynamicBufferManager.RemoveBuffer(oldMaterial, bufferID);

                //use new buffer
                bufferID = DynamicBufferManager.AddDynamicBuffers(DynamicBufferManager.GetEntityBuffer(material), material);
                BufferHook bh = new BufferHook {
                    bufferID = bufferID, bufferEntityID = DynamicBufferManager.GetEntityBufferID(spriteSheetMaterial)
                };

                EntityManager.SetSharedComponentData(e, spriteSheetMaterial);
                EntityManager.SetComponentData(e, bh);
            }
            EntityManager.SetComponentData(e, new SpriteSheetAnimation {
                frameCount = animation.Sprites.Length, framesPerSecond = animation.FramesPerSecond, playMode = animation.PlayMode, elapsedTime = 0
            });
            EntityManager.SetComponentData(e, new SpriteIndex {
                Value = 0
            });
        }
        public static void SetAnimation(EntityCommandBuffer commandBuffer, Entity e, SpriteSheetAnimationClip animation, BufferHook hook)
        {
            Material oldMaterial  = DynamicBufferManager.GetMaterial(hook.bufferEntityID);
            string   oldAnimation = SpriteSheetCache.GetMaterialName(oldMaterial);

            if (animation.AnimationName != oldAnimation)
            {
                Material material            = SpriteSheetCache.GetMaterial(animation.AnimationName);
                var      spriteSheetMaterial = new SpriteSheetMaterial {
                    material = material
                };

                //clean old buffer
                DynamicBufferManager.RemoveBuffer(oldMaterial, hook.bufferID);

                //use new buffer
                int        bufferID = DynamicBufferManager.AddDynamicBuffers(DynamicBufferManager.GetEntityBuffer(material), material);
                BufferHook bh       = new BufferHook {
                    bufferID = bufferID, bufferEntityID = DynamicBufferManager.GetEntityBufferID(spriteSheetMaterial)
                };

                commandBuffer.SetSharedComponent(e, spriteSheetMaterial);
                commandBuffer.SetComponent(e, bh);
            }
            commandBuffer.SetComponent(e, new SpriteSheetAnimation {
                frameCount = animation.FrameCount, framesPerSecond = animation.FramesPerSecond, playMode = animation.PlayMode, elapsedTime = 0
            });
            commandBuffer.SetComponent(e, new SpriteIndex {
                Value = 0
            });
        }
        public static void DestroyEntity(Entity e, string materialName)
        {
            Material material = SpriteSheetCache.GetMaterial(materialName);
            int      bufferID = EntityManager.GetComponentData <BufferHook>(e).bufferID;

            DynamicBufferManager.RemoveBuffer(material, bufferID);
            EntityManager.DestroyEntity(e);
        }
        public static void RecordSpriteSheet(Sprite[] sprites, string spriteSheetName, int spriteCount = 0)
        {
            KeyValuePair <Material, float4[]> atlasData = SpriteSheetCache.BakeSprites(sprites, spriteSheetName);
            SpriteSheetMaterial material = new SpriteSheetMaterial {
                material = atlasData.Key
            };

            DynamicBufferManager.GenerateBuffers(material, spriteCount);
            DynamicBufferManager.BakeUvBuffer(material, atlasData);
            renderInformation.Add(new RenderInformation(material.material, DynamicBufferManager.GetEntityBuffer(material.material)));
        }
 public static void RecordAnimator(SpriteSheetAnimator animator)
 {
     foreach (SpriteSheetAnimationClip animation in animator.animations)
     {
         KeyValuePair <Material, float4[]> atlasData = SpriteSheetCache.BakeSprites(animation.Sprites, animation.AnimationName);
         SpriteSheetMaterial material = new SpriteSheetMaterial {
             material = atlasData.Key
         };
         DynamicBufferManager.GenerateBuffers(material);
         DynamicBufferManager.BakeUvBuffer(material, atlasData);
         renderInformation.Add(new RenderInformation(material.material, DynamicBufferManager.GetEntityBuffer(material.material)));
     }
 }
Exemplo n.º 7
0
 public RenderInformation(Material material, Entity bufferEntity)
 {
     this.material     = material;
     spriteCount       = SpriteSheetCache.GetLength(material);
     this.bufferEntity = bufferEntity;
     args = new uint[5] {
         0, 0, 0, 0, 0
     };
     argsBuffer = new ComputeBuffer(1, args.Length * sizeof(uint), ComputeBufferType.IndirectArguments);
     // those args are always the same since we always use the same mesh
     args[0]   = (uint)6;
     args[2]   = args[3] = (uint)0;
     updateUvs = true;
 }
Exemplo n.º 8
0
        public static void Play(EntityCommandBuffer buffer, Entity e, BufferHook hook, string animationName = null)
        {
            SpriteSheetAnimator animator = SpriteSheetCache.GetAnimator(e);

            if (string.IsNullOrEmpty(animationName))
            {
                animationName = animator.animations[animator.currentAnimationIndex].name;
            }
            for (int i = 0; i < animator.animations.Length; i++)
            {
                var animation = animator.animations[i];
                if (animation.AnimationName == animationName)
                {
                    SpriteSheetManager.SetAnimation(buffer, e, animation, hook);
                    animator.currentAnimationIndex = i;
                    return;
                }
            }
        }
        public static Entity Instantiate(EntityArchetype archetype, List <IComponentData> componentDatas, string spriteSheetName)
        {
            Entity   e        = EntityManager.CreateEntity(archetype);
            Material material = SpriteSheetCache.GetMaterial(spriteSheetName);
            int      bufferID = DynamicBufferManager.AddDynamicBuffers(DynamicBufferManager.GetEntityBuffer(material), material);

            foreach (IComponentData Idata in componentDatas)
            {
                EntityManager.SetComponentData(e, Idata);
            }

            var spriteSheetMaterial = new SpriteSheetMaterial {
                material = material
            };
            BufferHook bh = new BufferHook {
                bufferID = bufferID, bufferEntityID = DynamicBufferManager.GetEntityBufferID(spriteSheetMaterial)
            };

            EntityManager.SetComponentData(e, bh);
            EntityManager.SetSharedComponentData(e, spriteSheetMaterial);
            return(e);
        }
        // we should only update the index of the changed datas for
        // indexBuffer, matrixBuffer, and colorBuffer inside a bursted
        // job to avoid overhead
        private int UpdateBuffers(int renderIndex)
        {
            SpriteSheetManager.ReleaseBuffer(renderIndex);

            RenderInformation renderInformation = SpriteSheetManager.renderInformation[renderIndex];
            int instanceCount = EntityManager.GetBuffer <SpriteIndexBuffer>(renderInformation.bufferEntity).Length;

            if (instanceCount > 0)
            {
                if (renderInformation.updateUvs)
                {
                    int stride = instanceCount >= 16 ? 16 : 16 * SpriteSheetCache.GetLength(renderInformation.material);
                    SpriteSheetManager.ReleaseUvBuffer(renderIndex);
                    renderInformation.uvBuffer = new ComputeBuffer(instanceCount, stride);
                    renderInformation.uvBuffer.SetData(EntityManager.GetBuffer <UvBuffer>(renderInformation.bufferEntity).Reinterpret <float4>().AsNativeArray());
                    renderInformation.material.SetBuffer("uvBuffer", renderInformation.uvBuffer);
                    renderInformation.updateUvs = false;
                }

                renderInformation.indexBuffer = new ComputeBuffer(instanceCount, sizeof(int));
                renderInformation.indexBuffer.SetData(EntityManager.GetBuffer <SpriteIndexBuffer>(renderInformation.bufferEntity).Reinterpret <int>().AsNativeArray());
                renderInformation.material.SetBuffer("indexBuffer", renderInformation.indexBuffer);

                renderInformation.matrixBuffer = new ComputeBuffer(instanceCount, 16);
                renderInformation.matrixBuffer.SetData(EntityManager.GetBuffer <MatrixBuffer>(renderInformation.bufferEntity).Reinterpret <float4>().AsNativeArray());
                renderInformation.material.SetBuffer("matrixBuffer", renderInformation.matrixBuffer);

                renderInformation.args[1] = (uint)instanceCount;
                renderInformation.argsBuffer.SetData(renderInformation.args);

                renderInformation.colorsBuffer = new ComputeBuffer(instanceCount, 16);
                renderInformation.colorsBuffer.SetData(EntityManager.GetBuffer <SpriteColorBuffer>(renderInformation.bufferEntity).Reinterpret <float4>().AsNativeArray());
                renderInformation.material.SetBuffer("colorsBuffer", renderInformation.colorsBuffer);
            }
            return(instanceCount);
        }