protected override void OnUpdate()
        {
            var ltws    = GetComponentDataFromEntity <LocalToWorld>(true);
            var parents = GetComponentDataFromEntity <Parent>(true);

            Entities.ForEach((Entity e, ref PingPongPositions c0, ref Translation c2, ref LocalToParent c3,
                              in MaterialPropertyIndex c1) => {
                var x = c2.Value.x;

                if (math.distance(x, c0.Target) <= 0.2f)
                {
                    c0.Target = c0.AdjustedWidth;
                }

                if (math.distance(x, c0.Target) <= 0.2f)
                {
                    c0.Target = -c0.AdjustedWidth;
                }

                x = math.lerp(x, c0.Target, Time.DeltaTime);

                var matrix     = float4x4.TRS(new float3(x, 0, 0), quaternion.identity, new float3(1));
                var localSpace = new LocalToParent {
                    Value = matrix
                };

                var root     = HierarchyUtils.GetRoot(e, parents);
                var batch    = EntityManager.GetComponentData <MaterialPropertyBatch>(root);
                var property = batch.Value[c1.Value];
                property.SetVector(ShaderIDConstants.Translation, new float4(localSpace.Position, 0));

                c3 = localSpace;
                c2 = new Translation {
                    Value = localSpace.Position
                };
            }).WithoutBurst().Run();
        }
Ejemplo n.º 2
0
            public void Execute(ArchetypeChunk chunk, int index, int entityOffset)
            {
                var localToParentAcessor = chunk.GetNativeArray(localToParentType);
                var animationAcessor     = chunk.GetNativeArray(splineAnimationType);
                var justSpawnedAcessor   = default(NativeArray <JustSpawned>);

                if (chunk.Has(justSpawnedType))
                {
                    justSpawnedAcessor = chunk.GetNativeArray(justSpawnedType);
                }

                for (int i = 0; i < chunk.Count; i++)
                {
                    SplineAnimationSpeed anim = animationAcessor[i];
                    var elements = elementAcessor[anim.spline];
                    var segments = segmentAcessor[anim.spline];
                    if (anim.index >= elements.Length)
                    {
                        continue;
                    }

                    float move = anim.speed * deltaTime;
                    if (justSpawnedAcessor.IsCreated)
                    {
                        move = anim.speed * justSpawnedAcessor[i].deltaTime;
                    }
                    float         left;
                    SplineSegment segment = segments[anim.segIndex];
                    while (move >= (left = (segment.end - anim.t) / (segment.end - segment.start) * segment.length))
                    {
                        move -= left;
                        if (++anim.segIndex >= segments.Length || segments[anim.segIndex].start == 0)
                        {
                            if (anim.isLoop)
                            {
                                if (++anim.index >= elements.Length)
                                {
                                    anim.index    = 0;
                                    anim.segIndex = 0;
                                }
                            }
                            else
                            {
                                if (++anim.index >= elements.Length - 1)
                                {
                                    anim.index    = elements.Length;
                                    anim.segIndex = 0;
                                    anim.t        = 0;
                                    break;
                                }
                            }
                        }
                        segment = segments[anim.segIndex];
                        anim.t  = segment.start;
                    }

                    if (anim.index >= elements.Length)
                    {
                        SplineElement last = elements[elements.Length - 1];
                        localToParentAcessor[i] = new LocalToParent {
                            Value = math.float4x4(last.rotation, last.point)
                        };
                    }
                    else
                    {
                        anim.t += (move / segment.length) * (segment.end - segment.start);
                        SplineElement start    = elements[anim.index];
                        SplineElement end      = anim.index < elements.Length - 1 ? elements[anim.index + 1] : elements[0];
                        float3        position = Bezier.GetPoint(start.point, start.point + start.forward, end.point + end.backward, end.point, anim.t);
                        quaternion    rotation = math.nlerp(start.rotation, end.rotation, anim.t);
                        localToParentAcessor[i] = new LocalToParent {
                            Value = math.float4x4(rotation, position)
                        };
                    }
                    animationAcessor[i] = anim;
                }
            }
Ejemplo n.º 3
0
        public static float AverageScale(this LocalToParent ltp)
        {
            var scale = ltp.Scale();

            return(math.csum(scale) / 3);
        }
Ejemplo n.º 4
0
 public static quaternion LocalRotation(this LocalToParent ltp)
 {
     return(new quaternion(ltp.Value));
 }
Ejemplo n.º 5
0
        public static float3 Scale(this LocalToParent ltp)
        {
            var m = ltp.Value;

            return(new float3(m.c0[0], m.c1[1], m.c2[2]) / m.c3[3]);
        }