r2mods/ilspy_dump/ror2_csproj/BezierCurveLine.cs

89 lines
2.3 KiB
C#
Raw Permalink Normal View History

2024-10-04 07:26:37 +00:00
using System;
using UnityEngine;
[RequireComponent(typeof(LineRenderer))]
[ExecuteAlways]
public class BezierCurveLine : MonoBehaviour
{
private Vector3[] vertexList = Array.Empty<Vector3>();
private Vector3 p0 = Vector3.zero;
public Vector3 v0 = Vector3.zero;
public Vector3 p1 = Vector3.zero;
public Vector3 v1 = Vector3.zero;
public Transform endTransform;
public bool animateBezierWind;
public Vector3 windMagnitude;
public Vector3 windFrequency;
private Vector3 windPhaseShift;
private Vector3 lastWind;
private Vector3 finalv0;
private Vector3 finalv1;
private float windTime;
public LineRenderer lineRenderer { get; private set; }
private void Awake()
{
lineRenderer = GetComponent<LineRenderer>();
windPhaseShift = UnityEngine.Random.insideUnitSphere * 360f;
Array.Resize(ref vertexList, lineRenderer.positionCount + 1);
UpdateBezier(0f);
}
public void OnEnable()
{
Array.Resize(ref vertexList, lineRenderer.positionCount + 1);
}
private void LateUpdate()
{
UpdateBezier(Time.deltaTime);
}
public void UpdateBezier(float deltaTime)
{
windTime += deltaTime;
p0 = base.transform.position;
if ((bool)endTransform)
{
p1 = endTransform.position;
}
if (animateBezierWind)
{
finalv0 = v0 + new Vector3(Mathf.Sin(MathF.PI / 180f * (windTime * 360f + windPhaseShift.x) * windFrequency.x) * windMagnitude.x, Mathf.Sin(MathF.PI / 180f * (windTime * 360f + windPhaseShift.y) * windFrequency.y) * windMagnitude.y, Mathf.Sin(MathF.PI / 180f * (windTime * 360f + windPhaseShift.z) * windFrequency.z) * windMagnitude.z);
finalv1 = v1 + new Vector3(Mathf.Sin(MathF.PI / 180f * (windTime * 360f + windPhaseShift.x + p1.x) * windFrequency.x) * windMagnitude.x, Mathf.Sin(MathF.PI / 180f * (windTime * 360f + windPhaseShift.y + p1.z) * windFrequency.y) * windMagnitude.y, Mathf.Sin(MathF.PI / 180f * (windTime * 360f + windPhaseShift.z + p1.y) * windFrequency.z) * windMagnitude.z);
}
else
{
finalv0 = v0;
finalv1 = v1;
}
for (int i = 0; i < vertexList.Length; i++)
{
float t = (float)i / (float)(vertexList.Length - 2);
vertexList[i] = EvaluateBezier(t);
}
lineRenderer.SetPositions(vertexList);
}
private Vector3 EvaluateBezier(float t)
{
Vector3 a = Vector3.Lerp(p0, p0 + finalv0, t);
Vector3 b = Vector3.Lerp(p1, p1 + finalv1, 1f - t);
return Vector3.Lerp(a, b, t);
}
}