Example #1
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
 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();
 }
Example #5
0
 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();
 }