ThrowBall/Assets/Plugins/RayFire/Scripts/Classes/Cluster/RFTriangle.cs

73 lines
2.1 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace RayFire
{
public class RFTriangle
{
public float area;
public Vector3 normal;
public Vector3 pos;
static int[] triangles;
static Vector3[] vertices;
static Vector3[] normals;
// Constructor
RFTriangle (float Area, Vector3 Normal, Vector3 Pos)
{
area = Area;
normal = Normal;
pos = Pos;
}
// Set mesh triangles
public static void SetTriangles (RFShard shard)
{
// Check if triangles already calculated
if (shard.tris != null)
return;
// Cached Vars
triangles = shard.mf.sharedMesh.triangles;
vertices = shard.mf.sharedMesh.vertices;
normals = shard.mf.sharedMesh.normals;
// Collect tris
int v1, v2, v3;
Vector3 p1, p2, p3, cross, pos;
shard.tris = new List<RFTriangle>();
for (int i = 0; i < triangles.Length; i += 3)
{
// Vertex indexes
v1 = triangles[i];
v2 = triangles[i + 1];
v3 = triangles[i + 2];
// Get vertices position and area
p1 = shard.tm.TransformPoint (vertices[v1]);
p2 = shard.tm.TransformPoint (vertices[v2]);
p3 = shard.tm.TransformPoint (vertices[v3]);
cross = Vector3.Cross (p1 - p2, p1 - p3);
// Set position
pos = (p1 + p2 + p3) / 3f;
// Create triangle and collect it
shard.tris.Add (new RFTriangle ((cross.magnitude * 0.5f), normals[v1], pos));
}
triangles = null;
vertices = null;
normals = null;
}
// Clear
public static void Clear(RFShard shard)
{
if (shard.tris != null)
shard.tris.Clear();
shard.tris = null;
}
}
}