Files
2026-06-04 11:42:34 +02:00

287 lines
9.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace ProBuilder2.Common
{
// Token: 0x0200003B RID: 59
public static class pb_Projection
{
// Token: 0x060001DE RID: 478 RVA: 0x00017AD5 File Offset: 0x00015ED5
public static Vector2[] PlanarProject(IList<Vector3> verts, Vector3 planeNormal)
{
return pb_Projection.PlanarProject(verts.ToArray<Vector3>(), planeNormal, pb_Projection.VectorToProjectionAxis(planeNormal), null);
}
// Token: 0x060001DF RID: 479 RVA: 0x00017AEC File Offset: 0x00015EEC
public static Vector2[] PlanarProject(pb_Object pb, pb_Face face)
{
Vector3 vector = pb_Math.Normal(pb, face);
return pb_Projection.PlanarProject(pb.vertices, vector, pb_Projection.VectorToProjectionAxis(vector), face.indices);
}
// Token: 0x060001E0 RID: 480 RVA: 0x00017B1C File Offset: 0x00015F1C
public static Vector2[] PlanarProject(IList<pb_Vertex> vertices, IList<int> indices)
{
int count = indices.Count;
Vector3[] array = new Vector3[count];
for (int i = 0; i < count; i++)
{
array[i] = vertices[indices[i]].position;
}
Vector3 vector = pb_Math.Normal(vertices, indices);
ProjectionAxis projectionAxis = pb_Projection.VectorToProjectionAxis(vector);
return pb_Projection.PlanarProject(array, vector, projectionAxis, null);
}
// Token: 0x060001E1 RID: 481 RVA: 0x00017B84 File Offset: 0x00015F84
public static Vector2[] PlanarProject(Vector3[] verts, Vector3 planeNormal, ProjectionAxis projectionAxis, int[] indices = null)
{
int num = ((indices != null && indices.Length >= 1) ? indices.Length : verts.Length);
Vector2[] array = new Vector2[num];
Vector3 vector = Vector3.zero;
switch (projectionAxis)
{
case ProjectionAxis.X:
case ProjectionAxis.X_Negative:
vector = Vector3.up;
break;
case ProjectionAxis.Y:
case ProjectionAxis.Y_Negative:
vector = Vector3.forward;
break;
case ProjectionAxis.Z:
case ProjectionAxis.Z_Negative:
vector = Vector3.up;
break;
}
Vector3 vector2 = Vector3.Cross(planeNormal, vector);
vector2.Normalize();
Vector3 vector3 = Vector3.Cross(vector2, planeNormal);
vector3.Normalize();
for (int i = 0; i < num; i++)
{
int num2 = ((indices == null) ? i : indices[i]);
float num3 = Vector3.Dot(vector2, verts[num2]);
float num4 = Vector3.Dot(vector3, verts[num2]);
array[i] = new Vector2(num3, num4);
}
return array;
}
// Token: 0x060001E2 RID: 482 RVA: 0x00017C88 File Offset: 0x00016088
public static void PlanarProject(Vector3[] verts, Vector2[] uvs, int[] indices, Vector3 planeNormal, ProjectionAxis projectionAxis)
{
Vector3 vector;
switch (projectionAxis)
{
case ProjectionAxis.X:
case ProjectionAxis.X_Negative:
vector = Vector3.up;
break;
case ProjectionAxis.Y:
case ProjectionAxis.Y_Negative:
vector = Vector3.forward;
break;
case ProjectionAxis.Z:
case ProjectionAxis.Z_Negative:
vector = Vector3.up;
break;
default:
vector = Vector3.up;
break;
}
pb_Math.Cross(planeNormal, vector, ref pb_Projection.t_uaxis.x, ref pb_Projection.t_uaxis.y, ref pb_Projection.t_uaxis.z);
pb_Projection.t_uaxis.Normalize();
pb_Math.Cross(pb_Projection.t_uaxis, planeNormal, ref pb_Projection.t_vaxis.x, ref pb_Projection.t_vaxis.y, ref pb_Projection.t_vaxis.z);
pb_Projection.t_vaxis.Normalize();
int num = indices.Length;
for (int i = 0; i < num; i++)
{
int num2 = indices[i];
uvs[num2].x = Vector3.Dot(pb_Projection.t_uaxis, verts[num2]);
uvs[num2].y = Vector3.Dot(pb_Projection.t_vaxis, verts[num2]);
}
}
// Token: 0x060001E3 RID: 483 RVA: 0x00017DA8 File Offset: 0x000161A8
public static Vector2[] SphericalProject(IList<Vector3> vertices, IList<int> indices = null)
{
int num = ((indices != null) ? indices.Count : vertices.Count);
Vector2[] array = new Vector2[num];
Vector3 vector = pb_Math.Average(vertices, indices);
for (int i = 0; i < num; i++)
{
int num2 = ((indices != null) ? indices[i] : i);
Vector3 vector2 = vertices[num2] - vector;
vector2.Normalize();
array[i].x = 0.5f + Mathf.Atan2(vector2.z, vector2.x) / 6.2831855f;
array[i].y = 0.5f - Mathf.Asin(vector2.y) / 3.1415927f;
}
return array;
}
// Token: 0x060001E4 RID: 484 RVA: 0x00017E6C File Offset: 0x0001626C
public static IList<Vector2> Sort(IList<Vector2> verts, SortMethod method = SortMethod.CounterClockwise)
{
Vector2 vector = pb_Math.Average(verts, null);
Vector2 up = Vector2.up;
int count = verts.Count;
List<pb_Tuple<float, Vector2>> list = new List<pb_Tuple<float, Vector2>>(count);
for (int i = 0; i < count; i++)
{
list.Add(new pb_Tuple<float, Vector2>(pb_Math.SignedAngle(up, verts[i] - vector), verts[i]));
}
list.Sort((pb_Tuple<float, Vector2> a, pb_Tuple<float, Vector2> b) => (a.Item1 >= b.Item1) ? 1 : (-1));
IList<Vector2> list2 = list.Select((pb_Tuple<float, Vector2> x) => x.Item2).ToList<Vector2>();
if (method == SortMethod.Clockwise)
{
list2.Reverse<Vector2>();
}
return list2;
}
// Token: 0x060001E5 RID: 485 RVA: 0x00017F30 File Offset: 0x00016330
public static Vector3 ProjectionAxisToVector(ProjectionAxis axis)
{
switch (axis)
{
case ProjectionAxis.X:
return Vector3.right;
case ProjectionAxis.Y:
return Vector3.up;
case ProjectionAxis.Z:
return Vector3.forward;
case ProjectionAxis.X_Negative:
return -Vector3.right;
case ProjectionAxis.Y_Negative:
return -Vector3.up;
case ProjectionAxis.Z_Negative:
return -Vector3.forward;
default:
return Vector3.zero;
}
}
// Token: 0x060001E6 RID: 486 RVA: 0x00017F98 File Offset: 0x00016398
public static ProjectionAxis VectorToProjectionAxis(Vector3 plane)
{
if (Mathf.Abs(plane.x) > Mathf.Abs(plane.y) && Mathf.Abs(plane.x) > Mathf.Abs(plane.z))
{
return (plane.x <= 0f) ? ProjectionAxis.X_Negative : ProjectionAxis.X;
}
if (Mathf.Abs(plane.y) > Mathf.Abs(plane.z))
{
return (plane.y <= 0f) ? ProjectionAxis.Y_Negative : ProjectionAxis.Y;
}
return (plane.z <= 0f) ? ProjectionAxis.Z_Negative : ProjectionAxis.Z;
}
// Token: 0x060001E7 RID: 487 RVA: 0x00018048 File Offset: 0x00016448
public static Plane FindBestPlane<T>(IList<T> points, Func<T, Vector3> selector, IList<int> indices = null)
{
float num = 0f;
float num2 = 0f;
float num3 = 0f;
float num4 = 0f;
float num5 = 0f;
float num6 = 0f;
bool flag = indices != null && indices.Count > 0;
int num7 = ((!flag) ? points.Count : indices.Count);
Vector3 vector = points.Average(selector, indices);
for (int i = 0; i < num7; i++)
{
Vector3 vector2 = selector(points[(!flag) ? i : indices[i]]) - vector;
num += vector2.x * vector2.x;
num2 += vector2.x * vector2.y;
num3 += vector2.x * vector2.z;
num4 += vector2.y * vector2.y;
num5 += vector2.y * vector2.z;
num6 += vector2.z * vector2.z;
}
float num8 = num4 * num6 - num5 * num5;
float num9 = num * num6 - num3 * num3;
float num10 = num * num4 - num2 * num2;
Vector3 vector3;
if (num8 > num9 && num8 > num10)
{
vector3 = new Vector3(1f, (num3 * num5 - num2 * num6) / num8, (num2 * num5 - num3 * num4) / num8);
}
else if (num9 > num10)
{
vector3 = new Vector3((num5 * num3 - num2 * num6) / num9, 1f, (num2 * num3 - num5 * num) / num9);
}
else
{
vector3 = new Vector3((num5 * num2 - num3 * num4) / num10, (num3 * num2 - num5 * num) / num10, 1f);
}
vector3.Normalize();
return new Plane(vector3, vector);
}
// Token: 0x060001E8 RID: 488 RVA: 0x00018224 File Offset: 0x00016624
public static Plane FindBestPlane(Vector3[] points, int[] indices = null)
{
float num = 0f;
float num2 = 0f;
float num3 = 0f;
float num4 = 0f;
float num5 = 0f;
float num6 = 0f;
bool flag = indices != null && indices.Length > 0;
int num7 = ((!flag) ? points.Length : indices.Length);
Vector3 zero = Vector3.zero;
Vector3 zero2 = Vector3.zero;
for (int i = 0; i < num7; i++)
{
zero.x += points[(!flag) ? i : indices[i]].x;
zero.y += points[(!flag) ? i : indices[i]].y;
zero.z += points[(!flag) ? i : indices[i]].z;
}
zero.x /= (float)num7;
zero.y /= (float)num7;
zero.z /= (float)num7;
for (int j = 0; j < num7; j++)
{
Vector3 vector = points[(!flag) ? j : indices[j]] - zero;
num += vector.x * vector.x;
num2 += vector.x * vector.y;
num3 += vector.x * vector.z;
num4 += vector.y * vector.y;
num5 += vector.y * vector.z;
num6 += vector.z * vector.z;
}
float num8 = num4 * num6 - num5 * num5;
float num9 = num * num6 - num3 * num3;
float num10 = num * num4 - num2 * num2;
if (num8 > num9 && num8 > num10)
{
zero2.x = 1f;
zero2.y = (num3 * num5 - num2 * num6) / num8;
zero2.z = (num2 * num5 - num3 * num4) / num8;
}
else if (num9 > num10)
{
zero2.x = (num5 * num3 - num2 * num6) / num9;
zero2.y = 1f;
zero2.z = (num2 * num3 - num5 * num) / num9;
}
else
{
zero2.x = (num5 * num2 - num3 * num4) / num10;
zero2.y = (num3 * num2 - num5 * num) / num10;
zero2.z = 1f;
}
zero2.Normalize();
return new Plane(zero2, zero);
}
// Token: 0x0400016B RID: 363
private static Vector3 t_uaxis = Vector3.zero;
// Token: 0x0400016C RID: 364
private static Vector3 t_vaxis = Vector3.zero;
}
}