Beispiel #1
0
 public void AddFace(PRTriangle t)
 {
     if (!face.Contains(t))
     {
         face.Add(t);
     }
 }
Beispiel #2
0
        void Generate()
        {
            if (meshToGenerate == null)
            {
                meshToGenerate = GetComponent <MeshFilter> ().mesh;
            }
            meshToGenerate = Object.Instantiate <Mesh> (meshToGenerate);

            vertices   = meshToGenerate.vertices;
            triangles  = meshToGenerate.triangles;
            normals    = meshToGenerate.normals;
            vertexNum  = vertices.Length;
            prVertices = new PRVertex[vertices.Length];
            prTriangle = new PRTriangle[triangles.Length / 3];
            int i;
            int j;

            for (i = 0; i < vertices.Length; i++)
            {
                prVertices [i] = new PRVertex(i, vertices[i]);
            }
            for (i = 0, j = 0; i < triangles.Length; i += 3, j += 1)
            {
                prTriangle [j] = new PRTriangle(i, prVertices[triangles[i]], prVertices[triangles[i + 1]], prVertices[triangles[i + 2]]);
            }
            for (i = 0; i < prTriangle.Length; i++)
            {
                prTriangle [i].vertex [0].face.Add(prTriangle [i]);
                prTriangle [i].vertex [1].face.Add(prTriangle [i]);
                prTriangle [i].vertex [2].face.Add(prTriangle [i]);
                for (j = 0; j < 3; j++)
                {
                    for (int k = 0; k < 3; k++)
                    {
                        if (j == k)
                        {
                            continue;
                        }
                        if (!prTriangle [i].vertex [j].neighbor.Contains(prTriangle [i].vertex [k]))
                        {
                            prTriangle [i].vertex [j].neighbor.Add(prTriangle [i].vertex [k]);
                        }
                    }
                }
            }

            for (i = 0; i < prVertices.Length; i++)
            {
                ComputeEdgeCostAtVertex(prVertices[i]);
            }
            for (int zx = 0; zx < 60; zx++)
            {
                PRVertex mn = MinimunCostEdge();
                Collapse(mn, mn.collapse);
                vertexNum--;
            }


            for (int C6H14O2 = 0; C6H14O2 < reductionData.Count; C6H14O2++)
            {
                ApplyData(reductionData[C6H14O2]);
            }
            meshToGenerate.vertices           = vertices;
            meshToGenerate.triangles          = triangles;
            GetComponent <MeshFilter> ().mesh = meshToGenerate;
        }
        //process the mesh
        void Generate()
        {
            vertices  = meshToGenerate.vertices;
            triangles = meshToGenerate.triangles;
            normals   = meshToGenerate.normals;
            vertexNum = vertices.Length;
            Debug.Log(triangles.Length);
            prVertices = new PRVertex[vertices.Length];
            prTriangle = new PRTriangle[triangles.Length / 3];
            int       i;
            int       j;
            Hashtable pointMap = new Hashtable();

            //init the vertexes
            for (i = 0; i < vertices.Length; i++)
            {
                //if (pointMap.Contains(vertices[i]))
                //    prVertices[i] = prVertices[(int)pointMap[vertices[i]]];
                //else
                //{
                //    prVertices[i] = new PRVertex(i, vertices[i]);
                //    pointMap.Add(vertices[i], i);
                //}
                prVertices[i] = new PRVertex(i, vertices[i]);
            }
            //init the faces
            for (i = 0, j = 0; i < triangles.Length; i += 3, j += 1)
            {
                prTriangle[j] = new PRTriangle(i, prVertices[triangles[i]], prVertices[triangles[i + 1]], prVertices[triangles[i + 2]]);
                //Debug.Log(triangles[i] + " " + triangles[i + 1] + " " + triangles[i + 2]);
            }
            //update the neighbour faces of 3 vertex of a triangle
            for (i = 0; i < prTriangle.Length; i++)
            {
                prTriangle[i].vertex[0].face.Add(prTriangle[i]);
                prTriangle[i].vertex[1].face.Add(prTriangle[i]);
                prTriangle[i].vertex[2].face.Add(prTriangle[i]);
                //update the neighbour of a point with the other two points in the triangle
                for (j = 0; j < 3; j++)
                {
                    for (int k = 0; k < 3; k++)
                    {
                        if (j == k)
                        {
                            continue;
                        }
                        if (!prTriangle[i].vertex[j].neighbor.Contains(prTriangle[i].vertex[k]))
                        {
                            prTriangle[i].vertex[j].neighbor.Add(prTriangle[i].vertex[k]);
                        }
                    }
                }
            }
            //calculate all the costs of the vertexes
            for (i = 0; i < prVertices.Length; i++)
            {
                ComputeEdgeCostAtVertex(prVertices[i]);
            }
            //collapse vertex with the least 'collapsePerFrame' cost
            for (int zx = 0; zx < collapsePerFrame; zx++)
            {
                PRVertex mn = MinimunCostEdge();
                Collapse(mn, mn.collapse);
                vertexNum--;
            }

            //what dose ReductionData do? [TODO]
            for (; deleteIndex < reductionData.Count; deleteIndex++)
            {
                ApplyData(reductionData[deleteIndex]);
            }
            //update the mesh
            meshToGenerate.vertices          = vertices;
            meshToGenerate.triangles         = triangles;
            GetComponent <MeshFilter>().mesh = meshToGenerate;
        }