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