public static void Intersect(WorkingModel first, WorkingModel second, List<TrianglePair> pairs) { first.Intersect(second, pairs, false); second.Intersect(first, pairs, true); first.FindCuts(); second.FindCuts(); }
public static void Intersect(WorkingModel first, WorkingModel second, List <TrianglePair> pairs) { first.Intersect(second, pairs, false); second.Intersect(first, pairs, true); first.FindCuts(); second.FindCuts(); }
// my edges versus the flat of other model's triangles public void Intersect(WorkingModel other, List <TrianglePair> pairs, bool reversed) { List <WorkingEdge> edges = new List <WorkingEdge>(); List <int> triangleToEdgeIndex = new List <int>(); foreach (WorkingTriangle tri in triangles) { for (int i = 0; i < 3; i++) { int index = edges.FindIndex((edge) => edge.Equals(tri.edges[i])); if (index == -1) { triangleToEdgeIndex.Add(edges.Count); edges.Add(tri.edges[i]); } else { triangleToEdgeIndex.Add(index); } } } List <int[]> pairsAlreadyHandled = new List <int[]>(); foreach (TrianglePair pair in pairs) { int a = originalTriangleIndices.IndexOf(reversed ? pair.b : pair.a); int b = other.originalTriangleIndices.IndexOf(reversed ? pair.a : pair.b); WorkingTriangle aTri = triangles[a]; WorkingTriangle bTri = other.triangles[b]; for (int i = 0; i < 3; i++) { int edgeIndex = a * 3 + i; int[] matchup = new int[] { edgeIndex, b }; if (!pairsAlreadyHandled.Exists((item) => item[0] == matchup[0] && item[1] == matchup[1])) { aTri.edges[i].Intersect(bTri); pairsAlreadyHandled.Add(matchup); } } } }
// my edges versus the flat of other model's triangles public void Intersect(WorkingModel other, List<TrianglePair> pairs, bool reversed) { List<WorkingEdge> edges = new List<WorkingEdge>(); List<int> triangleToEdgeIndex = new List<int>(); foreach (WorkingTriangle tri in triangles) for (int i = 0; i < 3; i++) { int index = edges.FindIndex((edge) => edge.Equals(tri.edges[i])); if (index == -1) { triangleToEdgeIndex.Add(edges.Count); edges.Add(tri.edges[i]); } else triangleToEdgeIndex.Add(index); } List<int[]> pairsAlreadyHandled = new List<int[]>(); foreach (TrianglePair pair in pairs) { int a = originalTriangleIndices.IndexOf(reversed ? pair.b : pair.a); int b = other.originalTriangleIndices.IndexOf(reversed ? pair.a : pair.b); WorkingTriangle aTri = triangles[a]; WorkingTriangle bTri = other.triangles[b]; for (int i = 0; i < 3; i++) { int edgeIndex = a * 3 + i; int[] matchup = new int[] { edgeIndex, b }; if (!pairsAlreadyHandled.Exists((item) => item[0] == matchup[0] && item[1] == matchup[1])) { aTri.edges[i].Intersect(bTri); pairsAlreadyHandled.Add(matchup); } } } }
public WorkingModel ToWorkingModel(int id, List<int> keptTriangles) { WorkingModel model = new WorkingModel(); model.objID = id; List<int> vertexIndices = new List<int>(); List<int> useVerts = new List<int>(); // get all the triangles and their vertices foreach (int triangleIndex in keptTriangles) { WorkingTriangle triangle = new WorkingTriangle(); triangle.objID = id; triangle.triID = triangleIndex; for (int i = 0; i < 3; i++) { int vi = t_v[triangleIndex, i]; int useIndex = vertexIndices.IndexOf(vi); VertexPosition vpos; if (useIndex == -1) { useVerts.Add(vertexIndices.Count); vertexIndices.Add(vi); Vec3 pos = verts[vi]; vpos = new VertexPosition { xyz = new Vec3 { x = pos.x, y = pos.y, z = pos.z } }; model.vertexPositions.Add(vpos); } else { useVerts.Add(useIndex); Vec3 pos = verts[vi]; vpos = model.vertexPositions[useIndex]; } WorkingVertex wvert = new WorkingVertex(); wvert.position = vpos; wvert.vinfo[0] = new VInfoReference { objID = id, index = triangleIndex * 3 + i, weight = 1.0 }; wvert.vinfo[1] = new VInfoReference { objID = id, index = -1, weight = 0.0 }; wvert.vinfo[2] = new VInfoReference { objID = id, index = -1, weight = 0.0 }; triangle.verts[i] = wvert; } model.triangles.Add(triangle); model.originalTriangleIndices.Add(triangleIndex); } // now get all the edges between them foreach (WorkingTriangle tri in model.triangles) { for (int i = 0; i < 3; i++) { // if a triangle hasn't got an edge, give it one, and find the matching triangle if (tri.edges[i] == null) { WorkingEdge edge = tri.edges[i] = new WorkingEdge(); edge.verts[0] = tri.verts[i]; edge.verts[1] = tri.verts[(i + 1) % 3]; edge.triangles[0] = tri; foreach(WorkingTriangle other in model.triangles) { if(other != tri) { for (int j = 0; j < 3; j++) { // if another triangle has an edge, it's got a matching triangle, and our triangle can't be their match if (other.edges[j] != null) continue; if ((other.verts[j] == edge.verts[0] && other.verts[(j + 1) % 3] == edge.verts[1]) || (other.verts[j] == edge.verts[1] && other.verts[(j + 1) % 3] == edge.verts[0])) { edge.triangles[1] = other; other.edges[j] = edge; break; } } } } } } } return model; }
// Function that transforms stuff and does interpolation for vertices that were created in the middles of faces // TODO: replace with a generic user-vertex-info function public static BasicModelVert WorkingVertexToBMV(Vec3 position, VInfoReference[] vinfos, BasicModelData input_model, Mat4 input_xform, WorkingModel working_model) { Vec3 normal = Vec3.Zero; Vec2 uv = Vec2.Zero; foreach (VInfoReference vinfo in vinfos) { int index = vinfo.index; if (index != -1) { int tri = index / 3; int vert = index % 3; double weight = vinfo.weight; int normal_index = (int)(vert == 0 ? input_model.a_norm[tri] : vert == 1 ? input_model.b_norm[tri] : input_model.c_norm[tri]); normal += weight * input_xform.TransformVec3(new Vec3 { x = input_model.nx[normal_index], y = input_model.ny[normal_index], z = input_model.nz[normal_index] }, 0.0); int uv_index = (int)(vert == 0 ? input_model.a_uv[tri] : vert == 1 ? input_model.b_uv[tri] : input_model.c_uv[tri]); uv += weight * new Vec2 { x = input_model.u[uv_index], y = input_model.v[uv_index] }; } } return new BasicModelVert { position = position, normal = Vec3.Normalize(normal), uv = uv }; }