Files
HauntedBloodlines/Assets/Obi/Samples/Cloth/SampleResources/Scripts/RaycastLasers.cs
2025-05-29 22:31:40 +03:00

61 lines
2.0 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using Obi;
public class RaycastLasers : MonoBehaviour
{
public ObiSolver solver;
public LineRenderer[] lasers;
List<Ray> rays = new List<Ray>();
void Update()
{
rays.Clear();
for (int i = 0; i < lasers.Length; ++i)
{
lasers[i].useWorldSpace = true;
lasers[i].positionCount = 2;
lasers[i].SetPosition(0, lasers[i].transform.position);
rays.Add(new Ray(lasers[i].transform.position, lasers[i].transform.up));
}
int filter = ObiUtils.MakeFilter(ObiUtils.CollideWithEverything, 0);
var results = solver.Raycast(rays, filter);
if (results != null)
{
for (int i = 0; i < results.Length; ++i)
{
lasers[i].SetPosition(1, rays[i].GetPoint(results[i].distance));
if (results[i].simplexIndex >= 0)
{
int simplexStartA = solver.simplexCounts.GetSimplexStartAndSize(results[i].simplexIndex, out int simplexSizeA);
// Debug draw the simplex we hit (assuming it's a triangle):
if (simplexSizeA == 3)
{
Vector3 pos1 = solver.positions[solver.simplices[simplexStartA]];
Vector3 pos2 = solver.positions[solver.simplices[simplexStartA + 1]];
Vector3 pos3 = solver.positions[solver.simplices[simplexStartA + 2]];
Debug.DrawLine(pos1, pos2, Color.yellow);
Debug.DrawLine(pos2, pos3, Color.yellow);
Debug.DrawLine(pos3, pos1, Color.yellow);
}
lasers[i].startColor = Color.red;
lasers[i].endColor = Color.red;
}
else
{
lasers[i].startColor = Color.blue;
lasers[i].endColor = Color.blue;
}
}
}
}
}