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

1139 lines
29 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using ProBuilder2.Common;
using UnityEngine;
// Token: 0x02000034 RID: 52
[AddComponentMenu("")]
[DisallowMultipleComponent]
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
[RequireComponent(typeof(pb_Entity))]
[ExecuteInEditMode]
public class pb_Object : MonoBehaviour
{
// Token: 0x0600015B RID: 347 RVA: 0x000150F4 File Offset: 0x000134F4
private void Awake()
{
if (base.GetComponent<MeshRenderer>().isPartOfStaticBatch)
{
return;
}
Vector3[] array = ((!(this.msh != null)) ? null : this.msh.normals);
if (array == null || array.Length != this.msh.vertexCount || (array.Length > 0 && array[0] == Vector3.zero))
{
if (this._vertices == null)
{
return;
}
this.ToMesh();
this.Refresh(RefreshMask.All);
}
}
// Token: 0x0600015C RID: 348 RVA: 0x00015190 File Offset: 0x00013590
public static pb_Object InitWithObject(pb_Object pb)
{
Vector3[] array = new Vector3[pb.vertexCount];
Array.Copy(pb.vertices, array, pb.vertexCount);
Vector2[] array2 = new Vector2[pb.vertexCount];
Array.Copy(pb.uv, array2, pb.vertexCount);
Color[] array3 = new Color[pb.vertexCount];
Array.Copy(pb.colors, array3, pb.vertexCount);
pb_Face[] array4 = new pb_Face[pb.faces.Length];
for (int i = 0; i < array4.Length; i++)
{
array4[i] = new pb_Face(pb.faces[i]);
}
pb_Object pb_Object = pb_Object.CreateInstanceWithElements(array, array2, array3, array4, pb.GetSharedIndices(), pb.GetSharedIndicesUV());
pb_Object.gameObject.name = pb.gameObject.name + "-clone";
return pb_Object;
}
// Token: 0x0600015D RID: 349 RVA: 0x0001526C File Offset: 0x0001366C
public static pb_Object CreateInstanceWithPoints(Vector3[] vertices)
{
if (vertices.Length % 4 != 0)
{
global::UnityEngine.Debug.LogWarning("Invalid Geometry. Make sure vertices in are pairs of 4 (faces).");
return null;
}
GameObject gameObject = new GameObject();
pb_Object pb_Object = gameObject.AddComponent<pb_Object>();
gameObject.name = "ProBuilder Mesh";
pb_Object.GeometryWithPoints(vertices);
pb_Object.GetComponent<pb_Entity>().SetEntity(EntityType.Detail);
return pb_Object;
}
// Token: 0x0600015E RID: 350 RVA: 0x000152BC File Offset: 0x000136BC
public static pb_Object CreateInstanceWithVerticesFaces(Vector3[] v, pb_Face[] f)
{
GameObject gameObject = new GameObject();
pb_Object pb_Object = gameObject.AddComponent<pb_Object>();
gameObject.name = "ProBuilder Mesh";
pb_Object.GeometryWithVerticesFaces(v, f);
return pb_Object;
}
// Token: 0x0600015F RID: 351 RVA: 0x000152EC File Offset: 0x000136EC
public static pb_Object CreateInstanceWithElements(Vector3[] v, Vector2[] u, Color[] c, pb_Face[] f, pb_IntArray[] si, pb_IntArray[] si_uv)
{
GameObject gameObject = new GameObject();
pb_Object pb_Object = gameObject.AddComponent<pb_Object>();
pb_Object.SetVertices(v);
pb_Object.SetUV(u);
pb_Object.SetColors(c);
pb_Object.SetSharedIndices(si ?? pb_IntArrayUtility.ExtractSharedIndices(v));
pb_Object.SetSharedIndicesUV(si_uv ?? new pb_IntArray[0]);
pb_Object.SetFaces(f);
pb_Object.ToMesh();
pb_Object.Refresh(RefreshMask.All);
pb_Object.GetComponent<pb_Entity>().SetEntity(EntityType.Detail);
return pb_Object;
}
// Token: 0x06000160 RID: 352 RVA: 0x0001536C File Offset: 0x0001376C
public static pb_Object CreateInstanceWithElements(pb_Vertex[] vertices, pb_Face[] faces, pb_IntArray[] si, pb_IntArray[] si_uv)
{
GameObject gameObject = new GameObject();
pb_Object pb_Object = gameObject.AddComponent<pb_Object>();
Vector3[] array;
Color[] array2;
Vector2[] array3;
Vector3[] array4;
Vector4[] array5;
Vector2[] array6;
List<Vector4> list;
List<Vector4> list2;
pb_Vertex.GetArrays(vertices, out array, out array2, out array3, out array4, out array5, out array6, out list, out list2);
pb_Object.SetVertices(array);
pb_Object.SetColors(array2);
pb_Object.SetUV(array3);
if (list != null)
{
pb_Object._uv3 = list;
}
if (list2 != null)
{
pb_Object._uv4 = list2;
}
pb_Object.SetSharedIndices(si ?? pb_IntArrayUtility.ExtractSharedIndices(array));
pb_Object.SetSharedIndicesUV(si_uv ?? new pb_IntArray[0]);
pb_Object.SetFaces(faces);
pb_Object.ToMesh();
pb_Object.Refresh(RefreshMask.All);
pb_Object.GetComponent<pb_Entity>().SetEntity(EntityType.Detail);
return pb_Object;
}
// Token: 0x17000019 RID: 25
// (get) Token: 0x06000161 RID: 353 RVA: 0x0001541D File Offset: 0x0001381D
private pb_Face[] _faces
{
get
{
return this._quads;
}
}
// Token: 0x14000001 RID: 1
// (add) Token: 0x06000162 RID: 354 RVA: 0x00015428 File Offset: 0x00013828
// (remove) Token: 0x06000163 RID: 355 RVA: 0x0001545C File Offset: 0x0001385C
[field: DebuggerBrowsable(DebuggerBrowsableState.Never)]
public static event Action<pb_Object> onDestroyObject;
// Token: 0x1700001A RID: 26
// (get) Token: 0x06000164 RID: 356 RVA: 0x00015490 File Offset: 0x00013890
// (set) Token: 0x06000165 RID: 357 RVA: 0x0001549D File Offset: 0x0001389D
public Mesh msh
{
get
{
return base.GetComponent<MeshFilter>().sharedMesh;
}
set
{
base.gameObject.GetComponent<MeshFilter>().sharedMesh = value;
}
}
// Token: 0x1700001B RID: 27
// (get) Token: 0x06000166 RID: 358 RVA: 0x000154B0 File Offset: 0x000138B0
public pb_Face[] faces
{
get
{
return this._quads;
}
}
// Token: 0x1700001C RID: 28
// (get) Token: 0x06000167 RID: 359 RVA: 0x000154B8 File Offset: 0x000138B8
public pb_Face[] quads
{
get
{
global::UnityEngine.Debug.LogWarning("pb_Quad is deprecated. Please use pb_Face instead.");
return this._quads;
}
}
// Token: 0x1700001D RID: 29
// (get) Token: 0x06000168 RID: 360 RVA: 0x000154CA File Offset: 0x000138CA
public pb_IntArray[] sharedIndices
{
get
{
return this._sharedIndices;
}
}
// Token: 0x1700001E RID: 30
// (get) Token: 0x06000169 RID: 361 RVA: 0x000154D2 File Offset: 0x000138D2
public pb_IntArray[] sharedIndicesUV
{
get
{
return this._sharedIndicesUV;
}
}
// Token: 0x1700001F RID: 31
// (get) Token: 0x0600016A RID: 362 RVA: 0x000154DA File Offset: 0x000138DA
public int id
{
get
{
return base.gameObject.GetInstanceID();
}
}
// Token: 0x17000020 RID: 32
// (get) Token: 0x0600016B RID: 363 RVA: 0x000154E7 File Offset: 0x000138E7
public Vector3[] vertices
{
get
{
return this._vertices;
}
}
// Token: 0x17000021 RID: 33
// (get) Token: 0x0600016C RID: 364 RVA: 0x000154EF File Offset: 0x000138EF
public Color[] colors
{
get
{
return this._colors;
}
}
// Token: 0x17000022 RID: 34
// (get) Token: 0x0600016D RID: 365 RVA: 0x000154F7 File Offset: 0x000138F7
public Vector2[] uv
{
get
{
return this._uv;
}
}
// Token: 0x17000023 RID: 35
// (get) Token: 0x0600016E RID: 366 RVA: 0x000154FF File Offset: 0x000138FF
public bool hasUv3
{
get
{
return this._uv3 != null && this._uv3.Count == this.vertexCount;
}
}
// Token: 0x17000024 RID: 36
// (get) Token: 0x0600016F RID: 367 RVA: 0x00015522 File Offset: 0x00013922
public bool hasUv4
{
get
{
return this._uv4 != null && this._uv4.Count == this.vertexCount;
}
}
// Token: 0x17000025 RID: 37
// (get) Token: 0x06000170 RID: 368 RVA: 0x00015545 File Offset: 0x00013945
public List<Vector4> uv3
{
get
{
return this._uv3;
}
}
// Token: 0x17000026 RID: 38
// (get) Token: 0x06000171 RID: 369 RVA: 0x0001554D File Offset: 0x0001394D
public List<Vector4> uv4
{
get
{
return this._uv4;
}
}
// Token: 0x17000027 RID: 39
// (get) Token: 0x06000172 RID: 370 RVA: 0x00015555 File Offset: 0x00013955
public int faceCount
{
get
{
return (this._faces != null) ? this._faces.Length : 0;
}
}
// Token: 0x17000028 RID: 40
// (get) Token: 0x06000173 RID: 371 RVA: 0x00015570 File Offset: 0x00013970
public int vertexCount
{
get
{
return (this._vertices != null) ? this._vertices.Length : 0;
}
}
// Token: 0x17000029 RID: 41
// (get) Token: 0x06000174 RID: 372 RVA: 0x0001558B File Offset: 0x0001398B
public int triangleCount
{
get
{
int num;
if (this._faces == null)
{
num = 0;
}
else
{
num = this._faces.Sum((pb_Face x) => x.indices.Length);
}
return num;
}
}
// Token: 0x06000175 RID: 373 RVA: 0x000155C8 File Offset: 0x000139C8
public pb_IntArray[] GetSharedIndices()
{
int num = this._sharedIndices.Length;
pb_IntArray[] array = new pb_IntArray[num];
for (int i = 0; i < num; i++)
{
int[] array2 = new int[this._sharedIndices[i].Length];
Array.Copy(this._sharedIndices[i].array, array2, array2.Length);
array[i] = new pb_IntArray(array2);
}
return array;
}
// Token: 0x06000176 RID: 374 RVA: 0x0001562C File Offset: 0x00013A2C
public pb_IntArray[] GetSharedIndicesUV()
{
int num = this._sharedIndicesUV.Length;
pb_IntArray[] array = new pb_IntArray[num];
for (int i = 0; i < num; i++)
{
int[] array2 = new int[this._sharedIndicesUV[i].Length];
Array.Copy(this._sharedIndicesUV[i].array, array2, array2.Length);
array[i] = new pb_IntArray(array2);
}
return array;
}
// Token: 0x1700002A RID: 42
// (get) Token: 0x06000177 RID: 375 RVA: 0x0001568E File Offset: 0x00013A8E
public pb_Face[] SelectedFaces
{
get
{
return this.faces.ValuesWithIndices(this.m_selectedFaces);
}
}
// Token: 0x1700002B RID: 43
// (get) Token: 0x06000178 RID: 376 RVA: 0x000156A1 File Offset: 0x00013AA1
public int SelectedFaceCount
{
get
{
return this.m_selectedFaces.Length;
}
}
// Token: 0x1700002C RID: 44
// (get) Token: 0x06000179 RID: 377 RVA: 0x000156AB File Offset: 0x00013AAB
public int[] SelectedTriangles
{
get
{
return this.m_selectedTriangles;
}
}
// Token: 0x1700002D RID: 45
// (get) Token: 0x0600017A RID: 378 RVA: 0x000156B3 File Offset: 0x00013AB3
public int SelectedTriangleCount
{
get
{
return this.m_selectedTriangles.Length;
}
}
// Token: 0x1700002E RID: 46
// (get) Token: 0x0600017B RID: 379 RVA: 0x000156BD File Offset: 0x00013ABD
public pb_Edge[] SelectedEdges
{
get
{
return this.m_SelectedEdges;
}
}
// Token: 0x1700002F RID: 47
// (get) Token: 0x0600017C RID: 380 RVA: 0x000156C5 File Offset: 0x00013AC5
public int SelectedEdgeCount
{
get
{
return this.m_SelectedEdges.Length;
}
}
// Token: 0x0600017D RID: 381 RVA: 0x000156D0 File Offset: 0x00013AD0
public void AddToFaceSelection(pb_Face face)
{
int num = Array.IndexOf<pb_Face>(this.faces, face);
if (num > -1)
{
this.SetSelectedFaces(this.m_selectedFaces.Add(num));
}
}
// Token: 0x0600017E RID: 382 RVA: 0x00015704 File Offset: 0x00013B04
public void SetSelectedFaces(IEnumerable<pb_Face> selected)
{
List<int> list = new List<int>();
foreach (pb_Face pb_Face in selected)
{
int num = Array.IndexOf<pb_Face>(this.faces, pb_Face);
if (num > -1)
{
list.Add(num);
}
}
this.SetSelectedFaces(list);
}
// Token: 0x0600017F RID: 383 RVA: 0x0001577C File Offset: 0x00013B7C
public void SetSelectedFaces(IEnumerable<int> selected)
{
this.m_selectedFaces = selected.ToArray<int>();
this.m_selectedTriangles = pb_Face.AllTriangles(this.SelectedFaces);
pb_Edge[] array = pb_Edge.AllEdges(this.SelectedFaces);
int num = array.Length;
this.m_SelectedEdges = new pb_Edge[num];
for (int i = 0; i < num; i++)
{
this.m_SelectedEdges[i] = new pb_Edge(array[i]);
}
}
// Token: 0x06000180 RID: 384 RVA: 0x000157E4 File Offset: 0x00013BE4
public void SetSelectedEdges(IEnumerable<pb_Edge> edges)
{
this.m_selectedFaces = new int[0];
this.m_SelectedEdges = edges.Select((pb_Edge x) => new pb_Edge(x)).ToArray<pb_Edge>();
this.m_selectedTriangles = this.m_SelectedEdges.AllTriangles();
}
// Token: 0x06000181 RID: 385 RVA: 0x0001583C File Offset: 0x00013C3C
public void SetSelectedTriangles(int[] tris)
{
this.m_selectedFaces = new int[0];
this.m_SelectedEdges = new pb_Edge[0];
this.m_selectedTriangles = tris ?? new int[0];
}
// Token: 0x06000182 RID: 386 RVA: 0x0001586A File Offset: 0x00013C6A
public void RemoveFromFaceSelectionAtIndex(int index)
{
this.SetSelectedFaces(this.m_selectedFaces.RemoveAt(index));
}
// Token: 0x06000183 RID: 387 RVA: 0x00015880 File Offset: 0x00013C80
public void RemoveFromFaceSelection(pb_Face face)
{
int num = Array.IndexOf<pb_Face>(this.faces, face);
if (num > -1)
{
this.SetSelectedFaces(this.m_selectedFaces.Remove(num));
}
}
// Token: 0x06000184 RID: 388 RVA: 0x000158B3 File Offset: 0x00013CB3
public void ClearSelection()
{
this.m_selectedFaces = new int[0];
this.m_SelectedEdges = new pb_Edge[0];
this.m_selectedTriangles = new int[0];
}
// Token: 0x06000185 RID: 389 RVA: 0x000158D9 File Offset: 0x00013CD9
public void SetVertices(Vector3[] v)
{
this._vertices = v;
}
// Token: 0x06000186 RID: 390 RVA: 0x000158E4 File Offset: 0x00013CE4
public void SetVertices(IList<pb_Vertex> vertices, bool applyMesh = false)
{
Vector3[] array;
Color[] array2;
Vector2[] array3;
Vector3[] array4;
Vector4[] array5;
Vector2[] array6;
List<Vector4> list;
List<Vector4> list2;
pb_Vertex.GetArrays(vertices, out array, out array2, out array3, out array4, out array5, out array6, out list, out list2);
this.SetVertices(array);
this.SetColors(array2);
this.SetUV(array3);
if (list != null)
{
this._uv3 = list;
}
if (list2 != null)
{
this._uv4 = list2;
}
if (applyMesh)
{
Mesh msh = this.msh;
pb_Vertex pb_Vertex = vertices[0];
if (pb_Vertex.hasPosition)
{
msh.vertices = array;
}
if (pb_Vertex.hasColor)
{
msh.colors = array2;
}
if (pb_Vertex.hasUv0)
{
msh.uv = array3;
}
if (pb_Vertex.hasNormal)
{
msh.normals = array4;
}
if (pb_Vertex.hasTangent)
{
msh.tangents = array5;
}
if (pb_Vertex.hasUv2)
{
msh.uv2 = array6;
}
if (pb_Vertex.hasUv3 && list != null)
{
msh.SetUVs(2, list);
}
if (pb_Vertex.hasUv4 && list2 != null)
{
msh.SetUVs(3, list2);
}
}
}
// Token: 0x06000187 RID: 391 RVA: 0x00015A05 File Offset: 0x00013E05
public void SetUV(Vector2[] uvs)
{
this._uv = uvs;
}
// Token: 0x06000188 RID: 392 RVA: 0x00015A10 File Offset: 0x00013E10
public void SetFaces(pb_Face[] _qds)
{
this._quads = _qds.Where((pb_Face x) => x != null).ToArray<pb_Face>();
if (this._quads.Length != _qds.Length)
{
global::UnityEngine.Debug.LogWarning("SetFaces() pruned " + (_qds.Length - this._quads.Length) + " null faces from this object.");
}
}
// Token: 0x06000189 RID: 393 RVA: 0x00015A80 File Offset: 0x00013E80
public void SetSharedIndices(pb_IntArray[] si)
{
this._sharedIndices = si;
}
// Token: 0x0600018A RID: 394 RVA: 0x00015A89 File Offset: 0x00013E89
public void SetSharedIndices(IEnumerable<KeyValuePair<int, int>> si)
{
this._sharedIndices = si.ToSharedIndices();
}
// Token: 0x0600018B RID: 395 RVA: 0x00015A97 File Offset: 0x00013E97
public void SetSharedIndicesUV(pb_IntArray[] si)
{
this._sharedIndicesUV = si;
}
// Token: 0x0600018C RID: 396 RVA: 0x00015AA0 File Offset: 0x00013EA0
public void SetSharedIndicesUV(IEnumerable<KeyValuePair<int, int>> si)
{
this._sharedIndicesUV = si.ToSharedIndices();
}
// Token: 0x0600018D RID: 397 RVA: 0x00015AB0 File Offset: 0x00013EB0
private void GeometryWithPoints(Vector3[] v)
{
pb_Face[] array = new pb_Face[v.Length / 4];
for (int i = 0; i < v.Length; i += 4)
{
array[i / 4] = new pb_Face(new int[]
{
i,
i + 1,
i + 2,
i + 1,
i + 3,
i + 2
}, pb_Constant.DefaultMaterial, new pb_UV(), 0, -1, -1, false);
}
this.SetVertices(v);
this.SetUV(new Vector2[v.Length]);
this.SetColors(pbUtil.FilledArray<Color>(Color.white, v.Length));
this.SetFaces(array);
this.SetSharedIndices(pb_IntArrayUtility.ExtractSharedIndices(v));
this.ToMesh();
this.Refresh(RefreshMask.All);
}
// Token: 0x0600018E RID: 398 RVA: 0x00015B68 File Offset: 0x00013F68
public void GeometryWithVerticesFaces(Vector3[] v, pb_Face[] f)
{
this.SetVertices(v);
this.SetUV(new Vector2[v.Length]);
this.SetFaces(f);
this.SetSharedIndices(pb_IntArrayUtility.ExtractSharedIndices(v));
this.ToMesh();
this.Refresh(RefreshMask.All);
}
// Token: 0x0600018F RID: 399 RVA: 0x00015BA4 File Offset: 0x00013FA4
private void GeometryWithVerticesFacesIndices(Vector3[] v, pb_Face[] f, pb_IntArray[] s)
{
this.SetFaces(f);
this.SetVertices(v);
this.SetUV(new Vector2[v.Length]);
this.SetSharedIndices(s);
if (this.msh != null)
{
global::UnityEngine.Object.DestroyImmediate(this.msh);
}
this.ToMesh();
this.Refresh(RefreshMask.All);
}
// Token: 0x06000190 RID: 400 RVA: 0x00015C04 File Offset: 0x00014004
public MeshRebuildReason Verify()
{
if (this.msh == null)
{
try
{
this.ToMesh();
this.Refresh(RefreshMask.All);
}
catch (Exception ex)
{
global::UnityEngine.Debug.LogError("Failed rebuilding null pb_Object. Cached mesh attributes are invalid or missing.\n" + ex.ToString());
}
return MeshRebuildReason.Null;
}
int num;
int.TryParse(this.msh.name.Replace("pb_Mesh", string.Empty), out num);
if (num != this.id)
{
return MeshRebuildReason.InstanceIDMismatch;
}
return (this.msh.uv2 != null) ? MeshRebuildReason.None : MeshRebuildReason.Lightmap;
}
// Token: 0x06000191 RID: 401 RVA: 0x00015CAC File Offset: 0x000140AC
public void ToMesh()
{
Mesh mesh = this.msh;
if (mesh != null && mesh.vertexCount == this._vertices.Length)
{
mesh = this.msh;
mesh.vertices = this._vertices;
if (this._uv != null)
{
mesh.uv = this._uv;
}
}
else
{
if (mesh == null)
{
mesh = new Mesh();
}
else
{
mesh.Clear();
}
mesh.vertices = this._vertices;
}
mesh.uv2 = null;
int[][] array;
Material[] array2;
mesh.subMeshCount = pb_Face.MeshTriangles(this.faces, out array, out array2);
for (int i = 0; i < array.Length; i++)
{
mesh.SetTriangles(array[i], i);
}
mesh.name = "pb_Mesh" + this.id;
base.GetComponent<MeshFilter>().sharedMesh = mesh;
base.GetComponent<MeshRenderer>().sharedMaterials = array2;
}
// Token: 0x06000192 RID: 402 RVA: 0x00015DA4 File Offset: 0x000141A4
public void MakeUnique()
{
pb_Face[] array = new pb_Face[this._faces.Length];
for (int i = 0; i < array.Length; i++)
{
array[i] = new pb_Face(this._faces[i]);
}
pb_IntArray[] array2 = new pb_IntArray[this._sharedIndices.Length];
Array.Copy(this._sharedIndices, array2, array2.Length);
this.SetSharedIndices(array2);
this.SetFaces(array);
Vector3[] array3 = new Vector3[this.vertexCount];
Array.Copy(this._vertices, array3, this.vertexCount);
this.SetVertices(array3);
if (this._uv != null && this._uv.Length == this.vertexCount)
{
Vector2[] array4 = new Vector2[this.vertexCount];
Array.Copy(this._uv, array4, this.vertexCount);
this.SetUV(array4);
}
this.msh = new Mesh();
this.ToMesh();
this.Refresh(RefreshMask.All);
}
// Token: 0x06000193 RID: 403 RVA: 0x00015E98 File Offset: 0x00014298
public void Refresh(RefreshMask mask = RefreshMask.All)
{
if ((ushort)(mask & RefreshMask.UV) > 0)
{
this.RefreshUV();
}
if ((ushort)(mask & RefreshMask.Colors) > 0)
{
this.RefreshColors();
}
if ((ushort)(mask & RefreshMask.Normals) > 0)
{
this.RefreshNormals();
}
if ((ushort)(mask & RefreshMask.Tangents) > 0)
{
this.RefreshTangents();
}
if ((ushort)(mask & RefreshMask.Collisions) > 0)
{
this.RefreshCollisions();
}
}
// Token: 0x06000194 RID: 404 RVA: 0x00015EF8 File Offset: 0x000142F8
public void RefreshCollisions()
{
Mesh msh = this.msh;
msh.RecalculateBounds();
if (!this.userCollisions && base.GetComponent<Collider>())
{
foreach (Collider collider in base.gameObject.GetComponents<Collider>())
{
Type type = collider.GetType();
if (type == typeof(BoxCollider))
{
((BoxCollider)collider).center = msh.bounds.center;
((BoxCollider)collider).size = msh.bounds.size;
}
else if (type == typeof(SphereCollider))
{
((SphereCollider)collider).center = msh.bounds.center;
((SphereCollider)collider).radius = pb_Math.LargestValue(msh.bounds.extents);
}
else if (type == typeof(CapsuleCollider))
{
((CapsuleCollider)collider).center = msh.bounds.center;
Vector2 vector = new Vector2(msh.bounds.extents.x, msh.bounds.extents.z);
((CapsuleCollider)collider).radius = pb_Math.LargestValue(vector);
((CapsuleCollider)collider).height = msh.bounds.size.y;
}
else if (type == typeof(WheelCollider))
{
((WheelCollider)collider).center = msh.bounds.center;
((WheelCollider)collider).radius = pb_Math.LargestValue(msh.bounds.extents);
}
else if (type == typeof(MeshCollider))
{
base.gameObject.GetComponent<MeshCollider>().sharedMesh = null;
base.gameObject.GetComponent<MeshCollider>().sharedMesh = msh;
}
}
}
}
// Token: 0x06000195 RID: 405 RVA: 0x00016110 File Offset: 0x00014510
public int GetUnusedTextureGroup(int i = 1)
{
while (Array.Exists<pb_Face>(this.faces, (pb_Face element) => element.textureGroup == i))
{
i++;
}
return i;
}
// Token: 0x06000196 RID: 406 RVA: 0x00016160 File Offset: 0x00014560
public int UnusedElementGroup(int i = 1)
{
while (Array.Exists<pb_Face>(this.faces, (pb_Face element) => element.elementGroup == i))
{
i++;
}
return i;
}
// Token: 0x06000197 RID: 407 RVA: 0x000161AF File Offset: 0x000145AF
public void RefreshUV()
{
this.RefreshUV(this.faces);
}
// Token: 0x06000198 RID: 408 RVA: 0x000161C0 File Offset: 0x000145C0
public void GetUVs(int channel, List<Vector4> uvs)
{
uvs.Clear();
switch (channel)
{
default:
{
for (int i = 0; i < this.vertexCount; i++)
{
uvs.Add(this._uv[i]);
}
break;
}
case 1:
if (this.msh != null && this.msh.uv2 != null)
{
Vector2[] uv = this.msh.uv2;
for (int j = 0; j < uv.Length; j++)
{
uvs.Add(uv[j]);
}
}
break;
case 2:
if (this._uv3 != null)
{
uvs.AddRange(this._uv3);
}
break;
case 3:
if (this._uv4 != null)
{
uvs.AddRange(this._uv4);
}
break;
}
}
// Token: 0x06000199 RID: 409 RVA: 0x000162BC File Offset: 0x000146BC
public void SetUVs(int channel, List<Vector4> uvs)
{
switch (channel)
{
case 1:
this.msh.uv2 = uvs.Cast<Vector2>().ToArray<Vector2>();
return;
case 2:
this._uv3 = uvs;
return;
case 3:
this._uv4 = uvs;
return;
}
this._uv = uvs.Cast<Vector2>().ToArray<Vector2>();
}
// Token: 0x0600019A RID: 410 RVA: 0x00016330 File Offset: 0x00014730
public void RefreshUV(IEnumerable<pb_Face> facesToRefresh)
{
Vector2[] uv = this.msh.uv;
Vector2[] array;
if (this._uv != null && this._uv.Length == this.vertexCount)
{
array = this._uv;
}
else if (uv != null && uv.Length == this.vertexCount)
{
array = uv;
}
else
{
foreach (pb_Face pb_Face in this.faces)
{
pb_Face.manualUV = false;
}
facesToRefresh = this.faces;
array = new Vector2[this.vertexCount];
}
int num = -2;
Dictionary<int, List<pb_Face>> dictionary = new Dictionary<int, List<pb_Face>>();
bool flag = false;
foreach (pb_Face pb_Face2 in facesToRefresh)
{
if (pb_Face2.uv.useWorldSpace)
{
flag = true;
}
if (pb_Face2 != null && !pb_Face2.manualUV)
{
List<pb_Face> list;
if (pb_Face2.textureGroup > 0 && dictionary.TryGetValue(pb_Face2.textureGroup, out list))
{
list.Add(pb_Face2);
}
else
{
Dictionary<int, List<pb_Face>> dictionary2 = dictionary;
int num2;
if (pb_Face2.textureGroup > 0)
{
num2 = pb_Face2.textureGroup;
}
else
{
num = (num2 = num) - 1;
}
dictionary2.Add(num2, new List<pb_Face> { pb_Face2 });
}
}
}
if (this.faces.Length != facesToRefresh.Count<pb_Face>())
{
foreach (pb_Face pb_Face3 in this.faces)
{
if (!pb_Face3.manualUV)
{
if (dictionary.ContainsKey(pb_Face3.textureGroup) && !dictionary[pb_Face3.textureGroup].Contains(pb_Face3))
{
dictionary[pb_Face3.textureGroup].Add(pb_Face3);
}
}
}
}
num = 0;
Vector3[] array2 = ((!flag) ? null : base.transform.ToWorldSpace(this.vertices));
foreach (KeyValuePair<int, List<pb_Face>> keyValuePair in dictionary)
{
int[] array3 = pb_Face.AllTrianglesDistinct(keyValuePair.Value).ToArray();
Vector3 vector;
if (keyValuePair.Value.Count > 1)
{
vector = pb_Projection.FindBestPlane(this._vertices, array3).normal;
}
else
{
vector = pb_Math.Normal(this, keyValuePair.Value[0]);
}
if (keyValuePair.Value[0].uv.useWorldSpace)
{
pb_UVUtility.PlanarMap2(array2, array, array3, keyValuePair.Value[0].uv, base.transform.TransformDirection(vector));
}
else
{
pb_UVUtility.PlanarMap2(this.vertices, array, array3, keyValuePair.Value[0].uv, vector);
}
Vector2 localPivot = keyValuePair.Value[0].uv.localPivot;
foreach (pb_Face pb_Face4 in keyValuePair.Value)
{
pb_Face4.uv.localPivot = localPivot;
}
}
this._uv = array;
this.msh.uv = array;
}
// Token: 0x0600019B RID: 411 RVA: 0x00016714 File Offset: 0x00014B14
public void SetFaceMaterial(pb_Face[] quad, Material mat)
{
for (int i = 0; i < quad.Length; i++)
{
quad[i].material = mat;
}
}
// Token: 0x0600019C RID: 412 RVA: 0x0001673E File Offset: 0x00014B3E
public void SetUV2(Vector2[] v)
{
base.GetComponent<MeshFilter>().sharedMesh.uv2 = v;
}
// Token: 0x0600019D RID: 413 RVA: 0x00016754 File Offset: 0x00014B54
public void RefreshColors()
{
Mesh sharedMesh = base.GetComponent<MeshFilter>().sharedMesh;
if (this._colors == null || this._colors.Length != this.vertexCount)
{
this._colors = pbUtil.FilledArray<Color>(Color.white, this.vertexCount);
}
sharedMesh.colors = this._colors;
}
// Token: 0x0600019E RID: 414 RVA: 0x000167AD File Offset: 0x00014BAD
public void SetColors(Color[] InColors)
{
this._colors = ((InColors.Length != this.vertexCount) ? pbUtil.FilledArray<Color>(Color.white, this.vertexCount) : InColors);
}
// Token: 0x0600019F RID: 415 RVA: 0x000167DC File Offset: 0x00014BDC
public void SetFaceColor(pb_Face face, Color color)
{
if (this._colors == null)
{
this._colors = pbUtil.FilledArray<Color>(Color.white, this.vertexCount);
}
foreach (int num in face.distinctIndices)
{
this._colors[num] = color;
}
}
// Token: 0x060001A0 RID: 416 RVA: 0x0001683B File Offset: 0x00014C3B
public void SetTangents(Vector4[] tangents)
{
this._tangents = tangents;
}
// Token: 0x060001A1 RID: 417 RVA: 0x00016844 File Offset: 0x00014C44
public void RefreshNormals()
{
this.msh.RecalculateNormals();
Vector3[] normals = this.msh.normals;
pb_MeshUtility.SmoothNormals(this, ref normals);
base.GetComponent<MeshFilter>().sharedMesh.normals = normals;
}
// Token: 0x060001A2 RID: 418 RVA: 0x00016884 File Offset: 0x00014C84
public void RefreshTangents()
{
Mesh sharedMesh = base.GetComponent<MeshFilter>().sharedMesh;
if (this._tangents != null && this._tangents.Length == this.vertexCount)
{
sharedMesh.tangents = this._tangents;
}
else
{
pb_MeshUtility.GenerateTangent(ref sharedMesh);
}
}
// Token: 0x060001A3 RID: 419 RVA: 0x000168D4 File Offset: 0x00014CD4
public void OnDestroy()
{
if (!this.dontDestroyMeshOnDelete && Application.isEditor && !Application.isPlaying && Time.frameCount > 0)
{
if (pb_Object.onDestroyObject != null)
{
pb_Object.onDestroyObject(this);
}
else
{
global::UnityEngine.Object.DestroyImmediate(base.gameObject.GetComponent<MeshFilter>().sharedMesh, true);
}
}
}
// Token: 0x04000132 RID: 306
[SerializeField]
private pb_Face[] _quads;
// Token: 0x04000133 RID: 307
[SerializeField]
private pb_IntArray[] _sharedIndices;
// Token: 0x04000134 RID: 308
[SerializeField]
private Vector3[] _vertices;
// Token: 0x04000135 RID: 309
[SerializeField]
private Vector2[] _uv;
// Token: 0x04000136 RID: 310
[SerializeField]
private List<Vector4> _uv3;
// Token: 0x04000137 RID: 311
[SerializeField]
private List<Vector4> _uv4;
// Token: 0x04000138 RID: 312
[SerializeField]
private Vector4[] _tangents;
// Token: 0x04000139 RID: 313
[SerializeField]
private pb_IntArray[] _sharedIndicesUV = new pb_IntArray[0];
// Token: 0x0400013A RID: 314
[SerializeField]
private Color[] _colors;
// Token: 0x0400013B RID: 315
public bool userCollisions;
// Token: 0x0400013C RID: 316
public bool isSelectable = true;
// Token: 0x0400013D RID: 317
public pb_UnwrapParameters unwrapParameters = new pb_UnwrapParameters();
// Token: 0x0400013E RID: 318
public string asset_guid;
// Token: 0x04000140 RID: 320
public bool dontDestroyMeshOnDelete;
// Token: 0x04000141 RID: 321
[SerializeField]
private int[] m_selectedFaces = new int[0];
// Token: 0x04000142 RID: 322
[SerializeField]
private pb_Edge[] m_SelectedEdges = new pb_Edge[0];
// Token: 0x04000143 RID: 323
[SerializeField]
private int[] m_selectedTriangles = new int[0];
}