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(); }
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; } }
public static float AverageScale(this LocalToParent ltp) { var scale = ltp.Scale(); return(math.csum(scale) / 3); }
public static quaternion LocalRotation(this LocalToParent ltp) { return(new quaternion(ltp.Value)); }
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]); }