Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Unity.Collections;
- using Unity.Jobs;
- using Unity.Mathematics;
- using UnityEngine;
- [RequireComponent(typeof(LineRenderer))]
- public class TrajectoryLine : MonoBehaviour
- {
- public int iterations = 100;
- public float lineThickness = 5f;
- public int iterationsToAddPoint;
- public bool scaleWithCamera;
- public Rigidbody2D target;
- public Camera scalingCamera;
- public Rigidbody2D planet;
- public Vector2 periapsisPosition { get; private set; }
- public Vector2 apoapsisPosition { get; private set; }
- public float periapsisAltitude { get; private set; }
- public float apoapsisAltitude { get; private set; }
- LineRenderer lr;
- JobHandle handle;
- NativeList<TrajectoryPoint> result;
- NativeArray<float2> periapsisPos = new NativeArray<float2>(1, Allocator.Persistent);
- NativeArray<float2> apoapsisPos = new NativeArray<float2>(1, Allocator.Persistent);
- NativeArray<float> periapsisAlt = new NativeArray<float>(1, Allocator.Persistent);
- NativeArray<float> apoapsisAlt = new NativeArray<float>(1, Allocator.Persistent);
- void Awake()
- {
- lr = GetComponent<LineRenderer>();
- result = new NativeList<TrajectoryPoint>(Allocator.Persistent);
- }
- void FixedUpdate()
- {
- if (handle != null)
- {
- handle.Complete();
- apoapsisPosition = apoapsisPos[0];
- periapsisPosition = periapsisPos[0];
- apoapsisAltitude = apoapsisAlt[0];
- periapsisAltitude = periapsisAlt[0];
- periapsisAlt[0] = float.MaxValue;
- apoapsisAlt[0] = float.MinValue;
- UpdateLineRenderer();
- }
- ScheduleJob();
- }
- void ScheduleJob()
- {
- result.Clear();
- TrajectoryLineJob job = new TrajectoryLineJob
- {
- result = result,
- position = target.position,
- velocity = target.velocity,
- mass = target.mass,
- periapsisPos = periapsisPos,
- apoapsisPos = apoapsisPos,
- periapsisAlt = periapsisAlt,
- apoapsisAlt = apoapsisAlt,
- iterations = iterations,
- iterationsToAddPoint = iterationsToAddPoint,
- planetPosition = planet.position,
- planetRadius = planet.transform.localScale.x / 2,
- planetMass = planet.mass,
- gravitationalConstant = (float)GravitationalForce.GravitationalConstant,
- deltaTime = Time.fixedDeltaTime
- };
- handle = job.Schedule();
- }
- void UpdateLineRenderer()
- {
- lr.positionCount = 0;
- lr.startWidth = scaleWithCamera ? lineThickness * scalingCamera.orthographicSize : lineThickness;
- lr.endWidth = scaleWithCamera ? lineThickness * scalingCamera.orthographicSize : lineThickness;
- TrajectoryPoint periapsis = new TrajectoryPoint
- {
- altitude = float.MaxValue
- };
- TrajectoryPoint apoapsis = new TrajectoryPoint
- {
- altitude = float.MinValue
- };
- for (int i = 0; i < result.Length; i++)
- {
- lr.positionCount++;
- lr.SetPosition(lr.positionCount - 1, new Vector2(result[i].position.x, result[i].position.y));
- if (result[i].altitude < periapsis.altitude)
- {
- periapsis = result[i];
- }
- if (result[i].altitude > apoapsis.altitude)
- {
- apoapsis = result[i];
- }
- }
- }
- void OnDestroy()
- {
- if (handle != null)
- {
- handle.Complete();
- }
- result.Dispose();
- periapsisPos.Dispose();
- apoapsisPos.Dispose();
- periapsisAlt.Dispose();
- apoapsisAlt.Dispose();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement