Exemplo n.º 1
0
        public BoundingBox(FVLMesh objeto)
        {
            posicionMundo = new Vector4(0.0f, 0.0f, 0.0f, 1.0f);

            if (objeto.VertexList.Count() > 0)
            {
                maxX = objeto.VertexList.First().X;
                maxZ = objeto.VertexList.First().Z;
                minX = objeto.VertexList.First().X;
                minZ = objeto.VertexList.First().Z;
                foreach (Vector3 vertex in objeto.VertexList)
                {
                    if (vertex.X > maxX)
                    {
                        maxX = vertex.X;
                    }
                    else if (vertex.X < minX)
                    {
                        minX = vertex.X;
                    }
                    if (vertex.Z > maxZ)
                    {
                        maxZ = vertex.Z;
                    }
                    else if (vertex.Z < minZ)
                    {
                        minZ = vertex.Z;
                    }
                }
            }
        }
Exemplo n.º 2
0
        public static void parseTexCord(FVLMesh mesh, String[] args)
        {
            Vector2 texCord = new Vector2();

            texCord.X = float.Parse(args[1], System.Globalization.NumberStyles.Float, new System.Globalization.CultureInfo("en-US"));
            texCord.Y = float.Parse(args[2], System.Globalization.NumberStyles.Float, new System.Globalization.CultureInfo("en-US"));
            mesh.AddTexCord(texCord);
        }
Exemplo n.º 3
0
        public static void parseFace(FVLMesh mesh, string line)
        {
            FVLFace face = new FVLFace();

            int    i = 2; // componente 1 = f , comp 2 = ' '
            String vertex;
            String texCord;
            String normal;

            while (i < line.Length)
            {
                vertex  = "";
                texCord = "";
                normal  = "";
                while (i < line.Length && line[i] != ' ' && line[i] != '/')
                {
                    vertex = vertex + line[i];
                    i++;
                }

                if (i < line.Length && line[i] != ' ')
                {
                    i++;
                    if (line[i] != '/')
                    {
                        while (i < line.Length && line[i] != ' ' && line[i] != '/')
                        {
                            texCord = texCord + line[i];
                            i++;
                        }
                    }
                    i++;

                    if (i < line.Length && line[i] != '/')
                    {
                        while (i < line.Length && line[i] != ' ' && line[i] != '/')
                        {
                            normal = normal + line[i];
                            i++;
                        }
                    }
                }

                i++;
                face.AddVertex(Int32.Parse(vertex, NumberStyles.Integer) - 1);
                if (!normal.Equals(""))
                {
                    face.AddNormal(Int32.Parse(normal, NumberStyles.Integer) - 1);
                }
                if (!texCord.Equals(""))
                {
                    face.AddTexCord(Int32.Parse(texCord, NumberStyles.Integer) - 1);
                }
            }

            mesh.AddFace(face);
        }
Exemplo n.º 4
0
        public static void parseNormal(FVLMesh mesh, String[] args)
        {
            Vector3 vertex = new Vector3();

            vertex.X = float.Parse(args[1], System.Globalization.NumberStyles.Float, new System.Globalization.CultureInfo("en-US"));
            vertex.Y = float.Parse(args[2], System.Globalization.NumberStyles.Float, new System.Globalization.CultureInfo("en-US"));
            vertex.Z = float.Parse(args[3], System.Globalization.NumberStyles.Float, new System.Globalization.CultureInfo("en-US"));
            mesh.AddVertexNormal(vertex);
        }
Exemplo n.º 5
0
        public static FVLMesh parseFile(String fileName)
        {
            FVLMesh mesh = new FVLMesh();
            String  line;

            String[] lineSplit;
            String   sender = "ObjFileParser.parseFile: ";

            info(sender, "Opening file: {0}", fileName);
            StreamReader file = new StreamReader(fileName);

            info(sender, "OK. Reading all the lines of the file...");
            line = file.ReadLine();
            while (line != null)
            {
                line = line.Trim();                                   //Saco espacios en blanco.
                if ((line.Length != 0) && (!line[0].Equals(COMMENT))) //Si no es comentario
                {
                    lineSplit = line.Split(SEPARATORS, StringSplitOptions.RemoveEmptyEntries);
                    if (lineSplit[0].Equals(VERTEX))
                    {
                        parseVertex(mesh, lineSplit);
                    }
                    else if (lineSplit[0].Equals(NORMAL))
                    {
                        parseNormal(mesh, lineSplit);
                    }

                    else if (lineSplit[0].Equals(FACE))
                    {
                        parseFace(mesh, line);//HERE!!
                    }

                    else if (lineSplit[0].Equals(TEXCORD))
                    {
                        parseTexCord(mesh, lineSplit);
                    }


                    else
                    {
                        log(sender, "Not supported instruction: {0}", lineSplit[0]);
                    }
                }
                line = file.ReadLine();
            }
            file.Close();
            info(sender, "FINISHED!");
            return(mesh);
        }
Exemplo n.º 6
0
        public static void parseMtl(FVLMesh mesh, String[] args, List <MatConTextura> listaMateriales)
        {
            MatConTextura material;

            foreach (MatConTextura m in listaMateriales)
            {
                if (m.NombreMaterial.Equals(args[1]))
                {
                    material      = m;
                    mesh.Material = material;
                    break;
                }
            }
        }
Exemplo n.º 7
0
        public static void parseVertex(FVLMesh mesh, String[] args, List <Vector3> vertexList)
        {
            String  sender = "ObjFileParser.parseVertex: ";
            Vector3 vertex = new Vector3();

            switch (args.Length)
            {
            case 2:
                log(sender, "Vertex definition must be (x,y,z [,w]). Found only x.");
                vertex.X = float.Parse(args[1], System.Globalization.NumberStyles.Number);
                vertex.Y = 0.0f;
                vertex.Z = 0.0f;
                //vertex.W = 1.0f;
                break;

            case 3:
                log(sender, "Vertex definition must be (x,y,z [,w]). Found only x, y.");
                vertex.X = float.Parse(args[1], CultureInfo.InvariantCulture);
                vertex.Y = float.Parse(args[2], CultureInfo.InvariantCulture);
                vertex.Z = 0.0f;
                //vertex.W = 1.0f;
                break;

            case 4:
                vertex.X = float.Parse(args[1], CultureInfo.InvariantCulture);
                vertex.Y = float.Parse(args[2], CultureInfo.InvariantCulture);
                vertex.Z = float.Parse(args[3], CultureInfo.InvariantCulture);
                //vertex.W = 1.0f;
                break;

            case 5:
                log(sender, "Found (x, y, z, w). Discarding w component.");
                vertex.X = float.Parse(args[1], CultureInfo.InvariantCulture);
                vertex.Y = float.Parse(args[2], CultureInfo.InvariantCulture);
                vertex.Z = float.Parse(args[3], CultureInfo.InvariantCulture);
                //vertex.W = float.Parse(args[4], System.Globalization.NumberStyles.Number);
                break;

            default:
                break;
            }
            mesh.AddVertex(vertex);
            vertexList.Add(vertex);
            //vertexCount++;
        }
Exemplo n.º 8
0
        public static List <FVLMesh> parseFile(String objFileName, String mtlFileName)
        {
            List <FVLMesh> listaMeshes = new List <FVLMesh>();
            FVLMesh        mesh        = new FVLMesh();
            //Lista de todos los f, v, vn y vt del obj
            List <Vector3> vertexList       = new List <Vector3>();
            List <Vector2> texCordList      = new List <Vector2>();
            List <Vector3> vertexNormalList = new List <Vector3>();

            //Parseo el archivo de materiales
            List <MatConTextura> listaMateriales = MtlFileParser.parseFile(mtlFileName);

            String line;

            String[] lineSplit;

            StreamReader file = new StreamReader(objFileName);

            line = file.ReadLine();
            while (line != null)
            {
                line = line.Trim();                                   //Saco espacios en blanco.
                if ((line.Length != 0) && (!line[0].Equals(COMMENT))) //Si no es comentario
                {
                    lineSplit = line.Split(SEPARATORS, StringSplitOptions.RemoveEmptyEntries);
                    if (lineSplit[0].Equals(VERTEX))
                    {
                        parseVertex(mesh, lineSplit, vertexList);
                    }
                    else if (lineSplit[0].Equals(NORMAL))
                    {
                        parseNormal(mesh, lineSplit, vertexNormalList);
                    }

                    else if (lineSplit[0].Equals(FACE))
                    {
                        parseFace(mesh, line);//HERE!!
                    }

                    else if (lineSplit[0].Equals(TEXCORD))
                    {
                        parseTexCord(mesh, lineSplit, texCordList);
                    }

                    else if (lineSplit[0].Equals(USEMTL))
                    {
                        parseMtl(mesh, lineSplit, listaMateriales);
                    }
                    else if (lineSplit[0].Equals(O))
                    {
                        mesh = new FVLMesh();
                        mesh.NombreObjeto = lineSplit[1];
                        //Agrego todos los v, vn y vt a la lista del subobjeto (para que no se desacomoden los indices en el build)
                        foreach (Vector3 vertex in vertexList)
                        {
                            mesh.AddVertex(vertex);
                        }
                        foreach (Vector3 vertexNormal in vertexNormalList)
                        {
                            mesh.AddVertexNormal(vertexNormal);
                        }
                        foreach (Vector2 texCoord in texCordList)
                        {
                            mesh.AddTexCord(texCoord);
                        }

                        listaMeshes.Add(mesh);
                    }
                }
                line = file.ReadLine();
            }
            file.Close();
            return(listaMeshes);
        }