public void AddFace(PRTriangle t) { if (!face.Contains(t)) { face.Add(t); } }
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; }