Files
2026-02-21 16:45:37 +08:00

554 lines
13 KiB
C#

using System.Collections.Generic;
using UnityEngine;
[AddComponentMenu("MegaShapes/Page Mesh")]
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class MegaMeshPage : MonoBehaviour
{
public float Width = 1f;
public float Length = 1.41f;
public float Height = 0.1f;
public int WidthSegs = 10;
public int LengthSegs = 10;
public int HeightSegs = 1;
public bool genUVs = true;
public float rotate;
public bool PivotBase;
public bool PivotEdge = true;
public bool tangents;
public bool optimize;
[ContextMenu("Help")]
public void Help()
{
Application.OpenURL("http://www.west-racing.com/mf/?page_id=853");
}
private void Reset()
{
Rebuild();
}
public void Rebuild()
{
MeshFilter component = GetComponent<MeshFilter>();
if (!(component != null))
{
return;
}
Mesh mesh = component.sharedMesh;
if (mesh == null)
{
mesh = (component.sharedMesh = new Mesh());
}
if (mesh != null)
{
BuildMesh(mesh);
MegaModifyObject component2 = GetComponent<MegaModifyObject>();
if (component2 != null)
{
component2.MeshUpdated();
}
}
}
private static void MakeQuad1(List<int> f, int a, int b, int c, int d)
{
f.Add(a);
f.Add(b);
f.Add(c);
f.Add(c);
f.Add(d);
f.Add(a);
}
private int MaxComponent(Vector3 v)
{
if (Mathf.Abs(v.x) > Mathf.Abs(v.y))
{
if (Mathf.Abs(v.x) > Mathf.Abs(v.z))
{
return 0;
}
return 2;
}
if (Mathf.Abs(v.y) > Mathf.Abs(v.z))
{
return 1;
}
return 2;
}
private void BuildMesh(Mesh mesh)
{
Width = Mathf.Clamp(Width, 0f, float.MaxValue);
Length = Mathf.Clamp(Length, 0f, float.MaxValue);
Height = Mathf.Clamp(Height, 0f, float.MaxValue);
LengthSegs = Mathf.Clamp(LengthSegs, 1, 200);
HeightSegs = Mathf.Clamp(HeightSegs, 1, 200);
WidthSegs = Mathf.Clamp(WidthSegs, 1, 200);
Vector3 vector = new Vector3(Width, Height, Length) / 2f;
Vector3 vector2 = -vector;
if (PivotBase)
{
vector2.y = 0f;
vector.y = Height;
}
if (PivotEdge)
{
vector2.x = 0f;
vector.x = Width;
}
float num = Width / (float)WidthSegs;
float num2 = Height / (float)HeightSegs;
float num3 = Length / (float)LengthSegs;
Vector3 item = vector2;
List<Vector3> list = new List<Vector3>();
List<Vector2> list2 = new List<Vector2>();
List<int> list3 = new List<int>();
List<int> list4 = new List<int>();
List<int> list5 = new List<int>();
Vector2 zero = Vector2.zero;
if (Width > 0f && Length > 0f)
{
Matrix4x4 matrix4x = Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(0f, rotate, 0f), Vector3.one);
Vector3 point = Vector3.zero;
item.y = vector.y;
for (int i = 0; i <= LengthSegs; i++)
{
item.x = vector2.x;
for (int j = 0; j <= WidthSegs; j++)
{
list.Add(item);
if (genUVs)
{
zero.x = (item.x - vector2.x) / Width;
zero.y = (item.z + vector.z) / Length;
point.x = zero.x - 0.5f;
point.y = 0f;
point.z = zero.y - 0.5f;
point = matrix4x.MultiplyPoint3x4(point);
zero.x = 0.5f + point.x;
zero.y = 0.5f + point.z;
list2.Add(zero);
}
item.x += num;
}
item.z += num3;
}
for (int k = 0; k < LengthSegs; k++)
{
int num4 = k * (WidthSegs + 1);
for (int l = 0; l < WidthSegs; l++)
{
MakeQuad1(list3, num4, num4 + WidthSegs + 1, num4 + WidthSegs + 2, num4 + 1);
num4++;
}
}
int count = list.Count;
item.y = vector2.y;
item.z = vector2.z;
for (int m = 0; m <= LengthSegs; m++)
{
item.x = vector2.x;
for (int n = 0; n <= WidthSegs; n++)
{
list.Add(item);
if (genUVs)
{
zero.x = 1f - (item.x + vector.x) / Width;
zero.y = (item.z + vector.z) / Length;
point.x = zero.x - 0.5f;
point.y = 0f;
point.z = zero.y - 0.5f;
point = matrix4x.MultiplyPoint3x4(point);
zero.x = 0.5f + point.x;
zero.y = 0.5f + point.z;
list2.Add(zero);
}
item.x += num;
}
item.z += num3;
}
for (int num5 = 0; num5 < LengthSegs; num5++)
{
int num6 = num5 * (WidthSegs + 1) + count;
for (int num7 = 0; num7 < WidthSegs; num7++)
{
MakeQuad1(list4, num6, num6 + 1, num6 + WidthSegs + 2, num6 + WidthSegs + 1);
num6++;
}
}
}
if (Width > 0f && Height > 0f)
{
int count2 = list.Count;
item.z = vector2.z;
item.y = vector2.y;
for (int num8 = 0; num8 <= HeightSegs; num8++)
{
item.x = vector2.x;
for (int num9 = 0; num9 <= WidthSegs; num9++)
{
list.Add(item);
if (genUVs)
{
zero.x = (item.x + vector.x) / Width;
zero.y = (item.y + vector.y) / Height;
list2.Add(zero);
}
item.x += num;
}
item.y += num2;
}
for (int num10 = 0; num10 < HeightSegs; num10++)
{
int num11 = num10 * (WidthSegs + 1) + count2;
for (int num12 = 0; num12 < WidthSegs; num12++)
{
MakeQuad1(list5, num11, num11 + WidthSegs + 1, num11 + WidthSegs + 2, num11 + 1);
num11++;
}
}
count2 = list.Count;
item.z = vector.z;
item.y = vector2.y;
for (int num13 = 0; num13 <= HeightSegs; num13++)
{
item.x = vector2.x;
for (int num14 = 0; num14 <= WidthSegs; num14++)
{
list.Add(item);
if (genUVs)
{
zero.x = (item.x + vector.x) / Width;
zero.y = (item.y + vector.y) / Height;
list2.Add(zero);
}
item.x += num;
}
item.y += num2;
}
for (int num15 = 0; num15 < HeightSegs; num15++)
{
int num16 = num15 * (WidthSegs + 1) + count2;
for (int num17 = 0; num17 < WidthSegs; num17++)
{
MakeQuad1(list5, num16, num16 + 1, num16 + WidthSegs + 2, num16 + WidthSegs + 1);
num16++;
}
}
}
if (Length > 0f && Height > 0f)
{
int count3 = list.Count;
item.x = vector.x;
item.y = vector2.y;
for (int num18 = 0; num18 <= HeightSegs; num18++)
{
item.z = vector2.z;
for (int num19 = 0; num19 <= LengthSegs; num19++)
{
list.Add(item);
if (genUVs)
{
zero.x = (item.z + vector.z) / Length;
zero.y = (item.y + vector.y) / Height;
list2.Add(zero);
}
item.z += num3;
}
item.y += num2;
}
for (int num20 = 0; num20 < HeightSegs; num20++)
{
int num21 = num20 * (LengthSegs + 1) + count3;
for (int num22 = 0; num22 < LengthSegs; num22++)
{
MakeQuad1(list5, num21, num21 + LengthSegs + 1, num21 + LengthSegs + 2, num21 + 1);
num21++;
}
}
count3 = list.Count;
item.x = vector2.x;
item.y = vector2.y;
for (int num23 = 0; num23 <= HeightSegs; num23++)
{
item.z = vector2.z;
for (int num24 = 0; num24 <= LengthSegs; num24++)
{
list.Add(item);
if (genUVs)
{
zero.x = (item.z + vector.z) / Length;
zero.y = (item.y + vector.y) / Height;
list2.Add(zero);
}
item.z += num3;
}
item.y += num2;
}
for (int num25 = 0; num25 < HeightSegs; num25++)
{
int num26 = num25 * (LengthSegs + 1) + count3;
for (int num27 = 0; num27 < LengthSegs; num27++)
{
MakeQuad1(list5, num26, num26 + 1, num26 + LengthSegs + 2, num26 + LengthSegs + 1);
num26++;
}
}
}
mesh.Clear();
mesh.subMeshCount = 3;
mesh.vertices = list.ToArray();
mesh.uv = list2.ToArray();
mesh.SetTriangles(list3.ToArray(), 0);
mesh.SetTriangles(list4.ToArray(), 1);
mesh.SetTriangles(list5.ToArray(), 2);
mesh.RecalculateNormals();
if (tangents)
{
MegaUtils.BuildTangents(mesh);
}
if (optimize)
{
}
mesh.RecalculateBounds();
}
private void BuildMeshOld(Mesh mesh)
{
Width = Mathf.Clamp(Width, 0f, float.MaxValue);
Length = Mathf.Clamp(Length, 0f, float.MaxValue);
Height = Mathf.Clamp(Height, 0f, float.MaxValue);
LengthSegs = Mathf.Clamp(LengthSegs, 1, 200);
HeightSegs = Mathf.Clamp(HeightSegs, 1, 200);
WidthSegs = Mathf.Clamp(WidthSegs, 1, 200);
Vector3 vector = new Vector3(Width, Height, Length) / 2f;
Vector3 vector2 = -vector;
if (PivotBase)
{
vector2.y = 0f;
vector.y = Height;
}
if (PivotEdge)
{
vector2.x = 0f;
vector.x = Width;
}
float num = Width / (float)WidthSegs;
float num2 = Height / (float)HeightSegs;
float num3 = Length / (float)LengthSegs;
Vector3 item = vector2;
List<Vector3> list = new List<Vector3>();
List<Vector2> list2 = new List<Vector2>();
List<int> list3 = new List<int>();
List<int> list4 = new List<int>();
List<int> list5 = new List<int>();
Vector2 zero = Vector2.zero;
if (Width > 0f && Length > 0f)
{
item.y = vector.y;
for (int i = 0; i <= LengthSegs; i++)
{
item.x = vector2.x;
for (int j = 0; j <= WidthSegs; j++)
{
list.Add(item);
if (genUVs)
{
zero.x = (item.x + vector.x) / Width;
zero.y = (item.z + vector.z) / Length;
list2.Add(zero);
}
item.x += num;
}
item.z += num3;
}
for (int k = 0; k < LengthSegs; k++)
{
int num4 = k * (WidthSegs + 1);
for (int l = 0; l < WidthSegs; l++)
{
MakeQuad1(list3, num4, num4 + WidthSegs + 1, num4 + WidthSegs + 2, num4 + 1);
num4++;
}
}
int count = list.Count;
item.y = vector2.y;
item.z = vector2.z;
for (int m = 0; m <= LengthSegs; m++)
{
item.x = vector2.x;
for (int n = 0; n <= WidthSegs; n++)
{
list.Add(item);
if (genUVs)
{
zero.x = 1f - (item.x + vector.x) / Width;
zero.y = (item.z + vector.z) / Length;
list2.Add(zero);
}
item.x += num;
}
item.z += num3;
}
for (int num5 = 0; num5 < LengthSegs; num5++)
{
int num6 = num5 * (WidthSegs + 1) + count;
for (int num7 = 0; num7 < WidthSegs; num7++)
{
MakeQuad1(list4, num6, num6 + 1, num6 + WidthSegs + 2, num6 + WidthSegs + 1);
num6++;
}
}
}
if (Width > 0f && Height > 0f)
{
int count2 = list.Count;
item.z = vector2.z;
item.y = vector2.y;
for (int num8 = 0; num8 <= HeightSegs; num8++)
{
item.x = vector2.x;
for (int num9 = 0; num9 <= WidthSegs; num9++)
{
list.Add(item);
if (genUVs)
{
zero.x = (item.x + vector.x) / Width;
zero.y = (item.y + vector.y) / Height;
list2.Add(zero);
}
item.x += num;
}
item.y += num2;
}
for (int num10 = 0; num10 < HeightSegs; num10++)
{
int num11 = num10 * (WidthSegs + 1) + count2;
for (int num12 = 0; num12 < WidthSegs; num12++)
{
MakeQuad1(list5, num11, num11 + WidthSegs + 1, num11 + WidthSegs + 2, num11 + 1);
num11++;
}
}
count2 = list.Count;
item.z = vector.z;
item.y = vector2.y;
for (int num13 = 0; num13 <= HeightSegs; num13++)
{
item.x = vector2.x;
for (int num14 = 0; num14 <= WidthSegs; num14++)
{
list.Add(item);
if (genUVs)
{
zero.x = (item.x + vector.x) / Width;
zero.y = (item.y + vector.y) / Height;
list2.Add(zero);
}
item.x += num;
}
item.y += num2;
}
for (int num15 = 0; num15 < HeightSegs; num15++)
{
int num16 = num15 * (WidthSegs + 1) + count2;
for (int num17 = 0; num17 < WidthSegs; num17++)
{
MakeQuad1(list5, num16, num16 + 1, num16 + WidthSegs + 2, num16 + WidthSegs + 1);
num16++;
}
}
}
if (Length > 0f && Height > 0f)
{
int count3 = list.Count;
item.x = vector.x;
item.y = vector2.y;
for (int num18 = 0; num18 <= HeightSegs; num18++)
{
item.z = vector2.z;
for (int num19 = 0; num19 <= LengthSegs; num19++)
{
list.Add(item);
if (genUVs)
{
zero.x = (item.z + vector.z) / Length;
zero.y = (item.y + vector.y) / Height;
list2.Add(zero);
}
item.z += num3;
}
item.y += num2;
}
for (int num20 = 0; num20 < HeightSegs; num20++)
{
int num21 = num20 * (LengthSegs + 1) + count3;
for (int num22 = 0; num22 < LengthSegs; num22++)
{
MakeQuad1(list5, num21, num21 + LengthSegs + 1, num21 + LengthSegs + 2, num21 + 1);
num21++;
}
}
count3 = list.Count;
item.x = vector2.x;
item.y = vector2.y;
for (int num23 = 0; num23 <= HeightSegs; num23++)
{
item.z = vector2.z;
for (int num24 = 0; num24 <= LengthSegs; num24++)
{
list.Add(item);
if (genUVs)
{
zero.x = (item.z + vector.z) / Length;
zero.y = (item.y + vector.y) / Height;
list2.Add(zero);
}
item.z += num3;
}
item.y += num2;
}
for (int num25 = 0; num25 < HeightSegs; num25++)
{
int num26 = num25 * (LengthSegs + 1) + count3;
for (int num27 = 0; num27 < LengthSegs; num27++)
{
MakeQuad1(list5, num26, num26 + 1, num26 + LengthSegs + 2, num26 + LengthSegs + 1);
num26++;
}
}
}
mesh.Clear();
mesh.subMeshCount = 3;
mesh.vertices = list.ToArray();
mesh.uv = list2.ToArray();
mesh.SetTriangles(list3.ToArray(), 0);
mesh.SetTriangles(list4.ToArray(), 1);
mesh.SetTriangles(list5.ToArray(), 2);
mesh.RecalculateNormals();
if (tangents)
{
MegaUtils.BuildTangents(mesh);
}
if (optimize)
{
}
mesh.RecalculateBounds();
}
}