Ejemplo n.º 1
0
        /**
         * Create the VBO for the triangles
         * */
        void CreateTrianglesVBO()
        {
            trianglesVBO.Invalidate();
            List <RenderVertex> renderVertices = new List <RenderVertex>();

            for (int triangleIndex = 0; triangleIndex < mesh.GetNumberOfTriangles(); triangleIndex++)
            {
                Triangle t = mesh.GetTriangle(triangleIndex);
                for (int vertexIndex = 0; vertexIndex < 3; vertexIndex++)
                {
                    Vector3 pos        = mesh.GetVertex(t.GetVertexIndex(vertexIndex));
                    Vector2 textCoords = mesh.GetTextureCoordinate(t.GetTexCoordIndex(vertexIndex));
                    renderVertices.Add(new RenderVertex(pos, t.Normal, color, textCoords));
                }
            }
            trianglesVBO.Setup(renderVertices, PrimitiveType.Triangles);
        }
Ejemplo n.º 2
0
        public static ITriangleMesh Snap(ITriangleMesh mesh, float epsilon)
        {
            Dictionary <int, int> vertexMapping = new Dictionary <int, int>();
            ITriangleMesh         result        = new TriangleMesh();

            for (int i = 0; i < mesh.GetNumberOfVertices(); i++)
            {
                Vector3 vi    = mesh.GetVertex(i);
                bool    found = false;
                for (int j = 0; j < result.GetNumberOfVertices(); j++)
                {
                    Vector3 vj = result.GetVertex(j);
                    if (Vector3.Subtract(vi, vj).Length < epsilon)
                    {
                        vertexMapping[i] = j;
                        found            = true;
                    }
                }
                if (!found)
                {
                    int idx = result.AddVertex(vi);
                    vertexMapping[i] = idx;
                }
            }

            for (int i = 0; i < mesh.GetNumberOfTexCoords(); i++)
            {
                result.AddTextureCoordinate(mesh.GetTextureCoordinate(i));
            }

            for (int i = 0; i < mesh.GetNumberOfTriangles(); i++)
            {
                Triangle t = mesh.GetTriangle(i).Clone();
                t.A = vertexMapping[t.A];
                t.B = vertexMapping[t.B];
                t.C = vertexMapping[t.C];
                result.AddTriangle(t);
            }

            Console.WriteLine("Mesh snapping: " + mesh.GetNumberOfVertices() + " -> " + result.GetNumberOfVertices() + " verts.");
            return(result);
        }
Ejemplo n.º 3
0
        /**
         * Generated the unification of two meshes. Attention: no new mesh is generated, in fact the
         * geometry of mesh2 is added to mesh1.
         */
        public static void Unite(ITriangleMesh mesh1, ITriangleMesh mesh2)
        {
            int numberOfVertsMesh1     = mesh1.GetNumberOfVertices();
            int numberOfTexCoordsMesh1 = mesh1.GetNumberOfTexCoords();

            for (int i = 0; i < mesh2.GetNumberOfVertices(); i++)
            {
                mesh1.AddVertex(mesh2.GetVertex(i));
            }
            for (int i = 0; i < mesh2.GetNumberOfTexCoords(); i++)
            {
                mesh1.AddTextureCoordinate(mesh2.GetTextureCoordinate(i));
            }
            for (int i = 0; i < mesh2.GetNumberOfTriangles(); i++)
            {
                Triangle t = mesh2.GetTriangle(i).Clone();
                t.VertexIndexOffset(numberOfVertsMesh1);
                t.TexCoordsIndexOffset(numberOfTexCoordsMesh1);
                mesh1.AddTriangle(t);
            }
            mesh1.ComputeTriangleNormals();
        }