60 lines
2.1 KiB
C#
60 lines
2.1 KiB
C#
using UnityEngine;
|
|
|
|
public class RTPTangentSolver
|
|
{
|
|
public static void Solve(Mesh theMesh, bool planetFlag = false)
|
|
{
|
|
int vertexCount = theMesh.vertexCount;
|
|
Vector3[] vertices = theMesh.vertices;
|
|
Vector3[] normals = theMesh.normals;
|
|
Vector2[] uv = theMesh.uv;
|
|
int[] triangles = theMesh.triangles;
|
|
Vector4[] array = new Vector4[vertexCount];
|
|
Vector3[] array2 = new Vector3[vertexCount];
|
|
Vector3[] array3 = new Vector3[vertexCount];
|
|
for (int i = 0; i < triangles.Length; i += 3)
|
|
{
|
|
int num = triangles[i];
|
|
int num2 = triangles[i + 1];
|
|
int num3 = triangles[i + 2];
|
|
Vector3 vector = vertices[num];
|
|
Vector3 vector2 = vertices[num2];
|
|
Vector3 vector3 = vertices[num3];
|
|
Vector2 vector4 = uv[num];
|
|
Vector2 vector5 = uv[num2];
|
|
Vector2 vector6 = uv[num3];
|
|
float num4 = vector2.x - vector.x;
|
|
float num5 = vector3.x - vector.x;
|
|
float num6 = vector2.y - vector.y;
|
|
float num7 = vector3.y - vector.y;
|
|
float num8 = vector2.z - vector.z;
|
|
float num9 = vector3.z - vector.z;
|
|
float num10 = vector5.x - vector4.x;
|
|
float num11 = vector6.x - vector4.x;
|
|
float num12 = vector5.y - vector4.y;
|
|
float num13 = vector6.y - vector4.y;
|
|
float num14 = num10 * num13 - num11 * num12;
|
|
float num15 = ((num14 != 0f) ? (1f / num14) : 0f);
|
|
Vector3 vector7 = new Vector3((num13 * num4 - num12 * num5) * num15, (num13 * num6 - num12 * num7) * num15, (num13 * num8 - num12 * num9) * num15);
|
|
Vector3 vector8 = new Vector3((num10 * num5 - num11 * num4) * num15, (num10 * num7 - num11 * num6) * num15, (num10 * num9 - num11 * num8) * num15);
|
|
array2[num] += vector7;
|
|
array2[num2] += vector7;
|
|
array2[num3] += vector7;
|
|
array3[num] += vector8;
|
|
array3[num2] += vector8;
|
|
array3[num3] += vector8;
|
|
}
|
|
for (int j = 0; j < vertexCount; j++)
|
|
{
|
|
Vector3 normal = ((!planetFlag) ? normals[j] : Vector3.Normalize(vertices[j]));
|
|
Vector3 tangent = array2[j];
|
|
Vector3.OrthoNormalize(ref normal, ref tangent);
|
|
array[j].x = tangent.x;
|
|
array[j].y = tangent.y;
|
|
array[j].z = tangent.z;
|
|
array[j].w = ((!(Vector3.Dot(Vector3.Cross(normal, tangent), array3[j]) < 0f)) ? 1f : (-1f));
|
|
}
|
|
theMesh.tangents = array;
|
|
}
|
|
}
|