public static void Generate(int subdivisionsCount, float radius, Vector3 viewCenter, float viewAngle, out List <Vector3> outVerts, out List <int> outIndices) { middlePointsCache.Clear(); outVerts = new List <Vector3>(); IcosahedronGenerator.GenerateIcosahedron(outVerts, tris, radius, viewCenter, viewAngle); for (int i = 0; i < subdivisionsCount; i++) { newTris.Clear(); int j = 0; for (int count = tris.Count; j < count; j++) { TriangleIndices triangleIndices = tris[j]; int middlePoint = GetMiddlePoint(triangleIndices.v1, triangleIndices.v2, outVerts, radius); int middlePoint2 = GetMiddlePoint(triangleIndices.v2, triangleIndices.v3, outVerts, radius); int middlePoint3 = GetMiddlePoint(triangleIndices.v3, triangleIndices.v1, outVerts, radius); newTris.Add(new TriangleIndices(triangleIndices.v1, middlePoint, middlePoint3)); newTris.Add(new TriangleIndices(triangleIndices.v2, middlePoint2, middlePoint)); newTris.Add(new TriangleIndices(triangleIndices.v3, middlePoint3, middlePoint2)); newTris.Add(new TriangleIndices(middlePoint, middlePoint2, middlePoint3)); } tris.Clear(); tris.AddRange(newTris); } MeshUtility.RemoveVertices(outVerts, tris, (Vector3 x) => !MeshUtility.Visible(x, radius, viewCenter, viewAngle)); outIndices = new List <int>(); int k = 0; for (int count2 = tris.Count; k < count2; k++) { TriangleIndices triangleIndices2 = tris[k]; outIndices.Add(triangleIndices2.v1); outIndices.Add(triangleIndices2.v2); outIndices.Add(triangleIndices2.v3); } }
public static void GenerateIcosahedron(List <Vector3> outVerts, List <TriangleIndices> outTris, float radius, Vector3 viewCenter, float viewAngle) { float num = (float)((1.0 + Mathf.Sqrt(5f)) / 2.0); outVerts.Clear(); outVerts.Add(new Vector3(-1f, num, 0f).normalized *radius); outVerts.Add(new Vector3(1f, num, 0f).normalized *radius); outVerts.Add(new Vector3(-1f, (float)(0.0 - num), 0f).normalized *radius); outVerts.Add(new Vector3(1f, (float)(0.0 - num), 0f).normalized *radius); outVerts.Add(new Vector3(0f, -1f, num).normalized *radius); outVerts.Add(new Vector3(0f, 1f, num).normalized *radius); outVerts.Add(new Vector3(0f, -1f, (float)(0.0 - num)).normalized *radius); outVerts.Add(new Vector3(0f, 1f, (float)(0.0 - num)).normalized *radius); outVerts.Add(new Vector3(num, 0f, -1f).normalized *radius); outVerts.Add(new Vector3(num, 0f, 1f).normalized *radius); outVerts.Add(new Vector3((float)(0.0 - num), 0f, -1f).normalized *radius); outVerts.Add(new Vector3((float)(0.0 - num), 0f, 1f).normalized *radius); outTris.Clear(); int i = 0; int num2 = IcosahedronGenerator.IcosahedronTris.Length; for (; i < num2; i++) { TriangleIndices item = IcosahedronGenerator.IcosahedronTris[i]; if (IcosahedronGenerator.IcosahedronFaceNeeded(item.v1, item.v2, item.v3, outVerts, radius, viewCenter, viewAngle)) { outTris.Add(item); } } MeshUtility.RemoveUnusedVertices(outVerts, outTris); }
public static void GenerateIcosahedron(List <Vector3> outVerts, List <TriangleIndices> outTris, float radius, Vector3 viewCenter, float viewAngle) { float num = (1f + Mathf.Sqrt(5f)) / 2f; outVerts.Clear(); Vector3 vector = new Vector3(-1f, num, 0f); outVerts.Add(vector.normalized * radius); Vector3 vector2 = new Vector3(1f, num, 0f); outVerts.Add(vector2.normalized * radius); Vector3 vector3 = new Vector3(-1f, -num, 0f); outVerts.Add(vector3.normalized * radius); Vector3 vector4 = new Vector3(1f, -num, 0f); outVerts.Add(vector4.normalized * radius); Vector3 vector5 = new Vector3(0f, -1f, num); outVerts.Add(vector5.normalized * radius); Vector3 vector6 = new Vector3(0f, 1f, num); outVerts.Add(vector6.normalized * radius); Vector3 vector7 = new Vector3(0f, -1f, -num); outVerts.Add(vector7.normalized * radius); Vector3 vector8 = new Vector3(0f, 1f, -num); outVerts.Add(vector8.normalized * radius); Vector3 vector9 = new Vector3(num, 0f, -1f); outVerts.Add(vector9.normalized * radius); Vector3 vector10 = new Vector3(num, 0f, 1f); outVerts.Add(vector10.normalized * radius); Vector3 vector11 = new Vector3(-num, 0f, -1f); outVerts.Add(vector11.normalized * radius); Vector3 vector12 = new Vector3(-num, 0f, 1f); outVerts.Add(vector12.normalized * radius); outTris.Clear(); int i = 0; int num2 = IcosahedronGenerator.IcosahedronTris.Length; while (i < num2) { TriangleIndices item = IcosahedronGenerator.IcosahedronTris[i]; if (IcosahedronGenerator.IcosahedronFaceNeeded(item.v1, item.v2, item.v3, outVerts, radius, viewCenter, viewAngle)) { outTris.Add(item); } i++; } MeshUtility.RemoveUnusedVertices(outVerts, outTris); }
private static void DoGenerate() { ClearOrCreateMeshStaticData(); CreateTileInfoStaticData(); IcosahedronGenerator.GenerateIcosahedron(verts, tris, radius, viewCenter, viewAngle); for (int i = 0; i < subdivisionsCount + 1; i++) { Subdivide(i == subdivisionsCount); } CalculateTileNeighbors(); ClearAndDeallocateWorkingLists(); }
private static void DoGenerate() { PlanetShapeGenerator.ClearOrCreateMeshStaticData(); PlanetShapeGenerator.CreateTileInfoStaticData(); IcosahedronGenerator.GenerateIcosahedron(PlanetShapeGenerator.verts, PlanetShapeGenerator.tris, PlanetShapeGenerator.radius, PlanetShapeGenerator.viewCenter, PlanetShapeGenerator.viewAngle); for (int i = 0; i < PlanetShapeGenerator.subdivisionsCount + 1; i++) { bool lastPass = i == PlanetShapeGenerator.subdivisionsCount; PlanetShapeGenerator.Subdivide(lastPass); } PlanetShapeGenerator.CalculateTileNeighbors(); PlanetShapeGenerator.ClearAndDeallocateWorkingLists(); }