Пример #1
0
            public void StartCrossfade(SnapshotMeshFrameData fromFrame, SnapshotMeshFrameData toFrame)
            {
                Reset(false);
                isReset        = false;
                this.fromFrame = fromFrame;
                this.toFrame   = toFrame;
                int vertexLength = fromFrame.verts.Length;

                if (positionJobs == null)
                {
                    positionJobs = AllocatedArray <LerpVector3Job> .Get(framesNeeded);
                }
                if (boundsJobs == null)
                {
                    boundsJobs = AllocatedArray <CalculateBoundsJob> .Get(framesNeeded);
                }
                if (positionJobHandles == null)
                {
                    positionJobHandles = AllocatedArray <JobHandle> .Get(framesNeeded);
                }
                if (boundsJobHandles == null)
                {
                    boundsJobHandles = AllocatedArray <JobHandle> .Get(framesNeeded);
                }
                if (output == null)
                {
                    output = AllocatedArray <NativeArray <Vector3> > .Get(framesNeeded);
                }

                from = new NativeArray <Vector3>(vertexLength, Allocator.Persistent);
                to   = new NativeArray <Vector3>(vertexLength, Allocator.Persistent);
                from.CopyFrom(fromFrame.verts);
                to.CopyFrom(toFrame.verts);

                for (int i = 0; i < framesNeeded; i++)
                {
                    output[i] = new NativeArray <Vector3>(vertexLength, Allocator.Persistent);
                    float delta   = i / (float)framesNeeded;
                    var   lerpJob = new LerpVector3Job()
                    {
                        from   = from,
                        to     = to,
                        output = output[i],
                        delta  = delta
                    };
                    positionJobs[i]       = lerpJob;
                    positionJobHandles[i] = lerpJob.Schedule(vertexLength, 64);

                    var boundsJob = new CalculateBoundsJob()
                    {
                        positions = output[i]
                    };
                    boundsJobs[i]       = boundsJob;
                    boundsJobHandles[i] = boundsJob.Schedule(positionJobHandles[i]);
                }
            }
Пример #2
0
        protected override void OnUpdate()
        {
            var entityLength = m_ComponentGroup.CalculateLength();

            var worldToLocalArray     = new NativeArray <float4x4>(entityLength, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);
            var rootLocalToWorldArray = new NativeArray <float4x4>(entityLength, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);
            var boundsArray           = new NativeArray <Bounds>(entityLength, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);

            var counter = 0;

            Entities.ForEach((Entity entity, SpriteSkin spriteSkin) =>
            {
                if (spriteSkin.isValid && spriteSkin.spriteRenderer.enabled)
                {
                    worldToLocalArray[counter]     = spriteSkin.transform.worldToLocalMatrix;
                    rootLocalToWorldArray[counter] = spriteSkin.rootBone.localToWorldMatrix;

                    var unityBounds      = spriteSkin.bounds;
                    boundsArray[counter] = new Bounds()
                    {
                        center  = new float4(unityBounds.center, 1),
                        extents = new float4(unityBounds.extents, 0),
                    };
                }
                counter++;
            });

            var jobHandle = new CalculateBoundsJob()
            {
                worldToLocalArray     = worldToLocalArray,
                rootLocalToWorldArray = rootLocalToWorldArray,
                boundsArray           = boundsArray
            }.Schedule(entityLength, 32);

            jobHandle.Complete();

            counter = 0;
            Entities.With(m_ComponentGroup).ForEach((Entity entity, SpriteSkin spriteSkin) =>
            {
                if (spriteSkin.isValid && spriteSkin.spriteRenderer.enabled)
                {
                    var center     = boundsArray[counter].center;
                    var extents    = boundsArray[counter].extents;
                    var bounds     = new UnityEngine.Bounds();
                    bounds.center  = new Vector3(center.x, center.y, center.z);
                    bounds.extents = new Vector3(extents.x, extents.y, extents.z);
                    InternalEngineBridge.SetLocalAABB(spriteSkin.spriteRenderer, bounds);
                }
                counter++;
            });

            boundsArray.Dispose();
            return;
        }
Пример #3
0
        protected override void OnUpdate()
        {
            List <SpriteSkin>      spriteSkinComponents = new List <SpriteSkin>();
            List <SpriteComponent> spriteComponents     = new List <SpriteComponent>();

            Entities.ForEach((SpriteSkin spriteSkin) => { spriteSkinComponents.Add(spriteSkin); });
            Entities.ForEach((SpriteComponent sprite) => { spriteComponents.Add(sprite); });
            var worldToLocalArray     = new NativeArray <float4x4>(spriteSkinComponents.Count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);
            var rootLocalToWorldArray = new NativeArray <float4x4>(spriteSkinComponents.Count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);
            var boundsArray           = new NativeArray <Bounds>(spriteSkinComponents.Count, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);

            for (var i = 0; i < spriteSkinComponents.Count; ++i)
            {
                var spriteSkin = spriteSkinComponents[i];
                var sprite     = spriteComponents[i].Value;

                if (spriteSkin == null || sprite == null)
                {
                    continue;
                }

                worldToLocalArray[i]     = spriteSkin.transform.worldToLocalMatrix;
                rootLocalToWorldArray[i] = spriteSkin.rootBone.localToWorldMatrix;

                var unityBounds = spriteSkin.bounds;
                boundsArray[i] = new Bounds()
                {
                    center  = new float4(unityBounds.center, 1),
                    extents = new float4(unityBounds.extents, 0),
                };
            }

            var jobHandle = new CalculateBoundsJob()
            {
                worldToLocalArray     = worldToLocalArray,
                rootLocalToWorldArray = rootLocalToWorldArray,
                boundsArray           = boundsArray
            }.Schedule(spriteSkinComponents.Count, 32);

            jobHandle.Complete();

            for (var i = 0; i < spriteSkinComponents.Count; ++i)
            {
                var spriteSkin = spriteSkinComponents[i];
                var sprite     = spriteComponents[i].Value;

                if (spriteSkin == null || sprite == null)
                {
                    continue;
                }

                var center  = boundsArray[i].center;
                var extents = boundsArray[i].extents;
                var bounds  = new UnityEngine.Bounds();
                bounds.center  = new Vector3(center.x, center.y, center.z);
                bounds.extents = new Vector3(extents.x, extents.y, extents.z);
                InternalEngineBridge.SetLocalAABB(spriteSkin.spriteRenderer, bounds);
            }

            boundsArray.Dispose();
            return;
        }