Пример #1
0
    public Mesh BuildMeshFromConwayPoly(bool forceTwosided)
    {
        //var originalFaceSides = KisTriangulate();

        var target        = new Mesh();
        var meshTriangles = new List <int>();
        var meshVertices  = new List <Vector3>();
        var meshNormals   = new List <Vector3>();
        var meshColors    = new List <Color32>();

        var hasNaked = _conwayPoly.HasNaked();

        hasNaked = false;          // TODO



//		for (int i = 0; i < conway.Faces.Count; i++)
//		{
//			if (conway.Faces[i].Sides > 3)
//			{
//				conway.Faces.Triangulate(i, false);
//			}
//		}



        // Strip down to Face-Vertex structure
        var points      = _conwayPoly.ListVerticesByPoints();
        var faceIndices = _conwayPoly.ListFacesByVertexIndices();

        // Add faces
        int index = 0;

        for (var i = 0; i < faceIndices.Length; i++)
        {
            var faceIndex  = faceIndices[i];
            var face       = _conwayPoly.Faces[i];
            var faceNormal = face.Normal;

            Color32 color;
            switch (ColorMethod)
            {
            case AppearancePreset.ColorMethods.ByRole:
                color = faceColors[(int)_conwayPoly.FaceRoles[i]];
                break;

            case AppearancePreset.ColorMethods.BySides:
                color = faceColors[face.Sides % faceColors.Length];
                break;

            default:
                color = Color.red;
                break;
            }

            if (face.Sides > 3)
            {
                for (var edgeIndex = 0; edgeIndex < faceIndex.Count; edgeIndex++)
                {
                    meshVertices.Add(face.Centroid);
                    meshTriangles.Add(index++);
                    meshVertices.Add(points[faceIndex[edgeIndex]]);
                    meshTriangles.Add(index++);
                    meshVertices.Add(points[faceIndex[(edgeIndex + 1) % face.Sides]]);
                    meshTriangles.Add(index++);

                    meshNormals.AddRange(Enumerable.Repeat(faceNormal, 3));
                    meshColors.AddRange(Enumerable.Repeat(color, 3));
                }
            }
            else
            {
                meshVertices.Add(points[faceIndex[0]]);
                meshTriangles.Add(index++);
                meshVertices.Add(points[faceIndex[1]]);
                meshTriangles.Add(index++);
                meshVertices.Add(points[faceIndex[2]]);
                meshTriangles.Add(index++);

                meshNormals.AddRange(Enumerable.Repeat(faceNormal, 3));
                meshColors.AddRange(Enumerable.Repeat(color, 3));
            }


            if (hasNaked || forceTwosided)
            {
                if (faceIndex.Count > 3)
                {
                    for (var edgeIndex = 0; edgeIndex < faceIndex.Count; edgeIndex++)
                    {
                        meshVertices.Add(face.Centroid);
                        meshTriangles.Add(index++);
                        meshVertices.Add(points[faceIndex[(edgeIndex + 1) % face.Sides]]);
                        meshTriangles.Add(index++);
                        meshVertices.Add(points[faceIndex[edgeIndex]]);
                        meshTriangles.Add(index++);

                        meshNormals.AddRange(Enumerable.Repeat(faceNormal, 3));
                        meshColors.AddRange(Enumerable.Repeat(color, 3));
                    }
                }
                else
                {
                    meshVertices.Add(points[faceIndex[0]]);
                    meshTriangles.Add(index++);
                    meshVertices.Add(points[faceIndex[2]]);
                    meshTriangles.Add(index++);
                    meshVertices.Add(points[faceIndex[1]]);
                    meshTriangles.Add(index++);

                    meshNormals.AddRange(Enumerable.Repeat(-faceNormal, faceIndex.Count));
                    meshColors.AddRange(Enumerable.Repeat(color, faceIndex.Count));
                }
            }
        }

        target.vertices  = meshVertices.ToArray();
        target.normals   = meshNormals.ToArray();
        target.triangles = meshTriangles.ToArray();
        target.colors32  = meshColors.ToArray();

        if (hasNaked || forceTwosided)
        {
            target.RecalculateNormals();
        }

        return(target);
    }