using System; using System.Collections.Generic; using UnityEngine; namespace Parabox.CSG { // Token: 0x02000018 RID: 24 internal class CSG_Plane { // Token: 0x060000B7 RID: 183 RVA: 0x0000DC8B File Offset: 0x0000C08B public CSG_Plane() { this.normal = Vector3.zero; this.w = 0f; } // Token: 0x060000B8 RID: 184 RVA: 0x0000DCA9 File Offset: 0x0000C0A9 public CSG_Plane(Vector3 a, Vector3 b, Vector3 c) { this.normal = Vector3.Cross(b - a, c - a); this.w = Vector3.Dot(this.normal, a); } // Token: 0x060000B9 RID: 185 RVA: 0x0000DCDC File Offset: 0x0000C0DC public bool Valid() { return this.normal.magnitude > 0f; } // Token: 0x060000BA RID: 186 RVA: 0x0000DCF0 File Offset: 0x0000C0F0 public void Flip() { this.normal *= -1f; this.w *= -1f; } // Token: 0x060000BB RID: 187 RVA: 0x0000DD1C File Offset: 0x0000C11C public void SplitPolygon(CSG_Polygon polygon, List coplanarFront, List coplanarBack, List front, List back) { CSG_Plane.EPolygonType epolygonType = CSG_Plane.EPolygonType.Coplanar; List list = new List(); for (int i = 0; i < polygon.vertices.Count; i++) { float num = Vector3.Dot(this.normal, polygon.vertices[i].position) - this.w; CSG_Plane.EPolygonType epolygonType2 = ((num >= -1E-05f) ? ((num <= 1E-05f) ? CSG_Plane.EPolygonType.Coplanar : CSG_Plane.EPolygonType.Front) : CSG_Plane.EPolygonType.Back); epolygonType |= epolygonType2; list.Add(epolygonType2); } switch (epolygonType) { case CSG_Plane.EPolygonType.Coplanar: if (Vector3.Dot(this.normal, polygon.plane.normal) > 0f) { coplanarFront.Add(polygon); } else { coplanarBack.Add(polygon); } break; case CSG_Plane.EPolygonType.Front: front.Add(polygon); break; case CSG_Plane.EPolygonType.Back: back.Add(polygon); break; case CSG_Plane.EPolygonType.Spanning: { List list2 = new List(); List list3 = new List(); for (int j = 0; j < polygon.vertices.Count; j++) { int num2 = (j + 1) % polygon.vertices.Count; CSG_Plane.EPolygonType epolygonType3 = list[j]; CSG_Plane.EPolygonType epolygonType4 = list[num2]; CSG_Vertex csg_Vertex = polygon.vertices[j]; CSG_Vertex csg_Vertex2 = polygon.vertices[num2]; if (epolygonType3 != CSG_Plane.EPolygonType.Back) { list2.Add(csg_Vertex); } if (epolygonType3 != CSG_Plane.EPolygonType.Front) { list3.Add(csg_Vertex); } if ((epolygonType3 | epolygonType4) == CSG_Plane.EPolygonType.Spanning) { float num3 = (this.w - Vector3.Dot(this.normal, csg_Vertex.position)) / Vector3.Dot(this.normal, csg_Vertex2.position - csg_Vertex.position); CSG_Vertex csg_Vertex3 = CSG_Vertex.Interpolate(csg_Vertex, csg_Vertex2, num3); list2.Add(csg_Vertex3); list3.Add(csg_Vertex3); } } if (list2.Count >= 3) { front.Add(new CSG_Polygon(list2)); } if (list3.Count >= 3) { back.Add(new CSG_Polygon(list3)); } break; } } } // Token: 0x04000036 RID: 54 public Vector3 normal; // Token: 0x04000037 RID: 55 public float w; // Token: 0x02000019 RID: 25 [Flags] private enum EPolygonType { // Token: 0x04000039 RID: 57 Coplanar = 0, // Token: 0x0400003A RID: 58 Front = 1, // Token: 0x0400003B RID: 59 Back = 2, // Token: 0x0400003C RID: 60 Spanning = 3 } } }