コード例 #1
0
ファイル: OBJFileReader.cs プロジェクト: polytronicgr/Demo
        public static void readOBJ(string filename, ref List <OBJFileReader.OBJFace> faces, ref List <Vector3> positions, ref List <Vector3> normals, ref List <Vector2> texCoords, ref MaterialManager.Material material)
        {
            // Sections
            // . normals
            // . texcoords
            // . verts
            // . faces


            StreamReader sourceFile = new StreamReader(filename);

            string line;

            do
            {
                line = sourceFile.ReadLine();
                if (line == null)
                {
                    break;
                }

                if (line.Contains("#"))
                {
                    // comment
                }
                else if (line.Contains("mtllib"))
                {
                    // material
                    // Read material properties from file
                    OBJFileReader.readMaterialFile(line, ref material);
                }
                else if (line.Contains("usemtl"))
                {
                    // material, what material to use.
                }
                else if (line.Contains("vn"))
                {
                    normals.Add(readNormal(line));
                }
                else if (line.Contains("vt"))
                {
                    texCoords.Add(readVector2(line));
                }
                else if (line.Contains("v"))
                {
                    positions.Add(readPos(line));
                }
                else if (line.Contains("f"))
                {
                    OBJFileReader.readFaces(line, ref faces);
                }
            } while (line != null);


            sourceFile.Close();
        }
コード例 #2
0
        // Reads on .obs file
        static public Mesh CreateFromFile(string filename)
        {
            List <OBJFileReader.OBJFace> faces = new List <OBJFileReader.OBJFace>();

            List <Vector3> positions = new List <Vector3>();
            List <Vector3> normals   = new List <Vector3>();
            List <Vector2> texCoords = new List <Vector2>();

            MaterialManager.Material meshMaterial = null;

            OBJFileReader.readOBJ(filename, ref faces, ref positions, ref normals, ref texCoords, ref meshMaterial);

            // Create positions
            List <PosNorTexVertex> vertices = new List <PosNorTexVertex>(positions.Count);

            Console.WriteLine("Mesh read from " + filename);

            foreach (OBJFileReader.OBJFace face in faces)
            {
                vertices.Add(new PosNorTexVertex(positions[(int)face.positionIndex - 1], normals[(int)face.normalIndex - 1], texCoords[(int)face.texCoordIndex - 1]));
            }

            return(new Mesh(vertices, meshMaterial));
        }
コード例 #3
0
ファイル: OBJFileReader.cs プロジェクト: polytronicgr/Demo
 static Vector3 readNormal(string normalLine)
 {
     // vn # # #
     return(OBJFileReader.readVector3(normalLine));
 }
コード例 #4
0
ファイル: OBJFileReader.cs プロジェクト: polytronicgr/Demo
 static Vector3 readPos(string posLine)
 {
     return(OBJFileReader.readVector3(posLine));
 }
コード例 #5
0
ファイル: MaterialManager.cs プロジェクト: polytronicgr/Demo
        public static Material loadMaterial(string materialFileName)
        {
            string       fullPath   = dataDir + materialFileName;
            StreamReader sourceFile = new StreamReader(fullPath);

            string   line;
            string   materialName  = null;
            bool     existingFound = false;
            Material newMaterial   = null;

            char[] space = { ' ' };

            // First check if we already have this material
            do
            {
                line = sourceFile.ReadLine();
                if (line == null)
                {
                    break;
                }
                else if (line.Contains("newmtl"))
                {
                    materialName = line.Split(space)[1];
                    break;
                }
            }while (line != null);


            newMaterial = getMaterialByName(materialName);

            if (newMaterial != null)
            {
                sourceFile.Close();
                return(newMaterial);
            }
            else
            {
                newMaterial = new Material();
                newMaterial.materialName = materialName;
            }

            // Read rest of the file

            // use . as separator instead of system default
            System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;

            do
            {
                line = sourceFile.ReadLine();
                if (line == null)
                {
                    break;
                }

                if (line.Contains("#"))
                {
                    // comment
                }
                else if (line.Contains("map_Kd"))
                {
                    // map_Kd filename.png
                    newMaterial.textureName    = line.Split(space)[1];
                    newMaterial.textureGLIndex = loadTexture(newMaterial.textureName);
                }
                else if (line.Contains("illum"))
                {
                    newMaterial.illumination = Single.Parse(line.Split(space)[1], nfi);
                }
                else if (line.Contains("Ka"))
                {
                    newMaterial.alpha = OBJFileReader.readVector3(line);
                }
                else if (line.Contains("Kd"))
                {
                    newMaterial.diffuse = OBJFileReader.readVector3(line);
                }
                else if (line.Contains("Ks"))
                {
                    newMaterial.specular = OBJFileReader.readVector3(line);
                }
            } while (line != null);


            sourceFile.Close();

            materials.Add(newMaterial);

            return(newMaterial);
        }