コード例 #1
0
        public OBJMaterial GetOrCreateMaterial(string name)
        {
            for (int i = 0; i < Materials.Count; i++)
            {
                if (Materials[i].Name == name)
                {
                    return(Materials[i]);
                }
            }

            var mat = new OBJMaterial {
                Name = name
            };

            Materials.Add(mat);
            return(mat);
        }
コード例 #2
0
        /// <summary>
        /// When null is given, the default SubObject
        /// </summary>
        /// <param name="mat"></param>
        /// <returns></returns>
        public SubObject GetOrCreateSubObject(OBJMaterial mat)
        {
            if (mat == null)
            {
                return(DefaultSubObject);
            }
            for (int i = 0; i < SubObjects.Count; i++)
            {
                if (SubObjects[i].Material == mat)
                {
                    return(SubObjects[i]);
                }
            }

            SubObject obj = new SubObject();

            SubObjects.Add(obj);

            obj.Material = mat;

            return(obj);
        }
コード例 #3
0
        public void ImportObjFile(Stream fileStream)
        {
            StreamReader textReader = new StreamReader(fileStream);

            Vertices  = new List <Vector3>();
            Normals   = new List <Vector3>();
            TexCoords = new List <Vector3>();
            Groups    = new List <OBJGroup>();

            Materials = new List <OBJMaterial>();

            activeGroup = null;



            Vertices.Add(Vector3.Zero); // Indices following are 1 indexed, so add a dummy element as 0-th index
            Normals.Add(Vector3.Zero);
            TexCoords.Add(Vector3.Zero);


            /*List<Vector3> positions = new List<Vector3>();
             * List<Vector3> normals = new List<Vector3>();
             * List<Vector2> textureCoords = new List<Vector2>();*/


            string line = null;

            while (textReader.Peek() != -1)
            {
                line = textReader.ReadLine();
                //line = line.Replace('.', ',');
                if (line.StartsWith("#"))
                {
                    continue;
                }
                string[] pieces = line.Split(' ');

                string cmd = pieces[0];


                int dataStart = 1;
                while (pieces.Length > dataStart && pieces[dataStart] == "")
                {
                    dataStart++;
                }
                switch (cmd)
                {
                case "v":
                    Vector3 v;
                    v.X = float.Parse(pieces[dataStart + 0], culture.NumberFormat);
                    v.Y = float.Parse(pieces[dataStart + 1], culture.NumberFormat);
                    v.Z = float.Parse(pieces[dataStart + 2], culture.NumberFormat);
                    Vertices.Add(v);
                    break;

                case "vn":
                    Vector3 vn;
                    vn.X = float.Parse(pieces[dataStart + 0], culture.NumberFormat);
                    vn.Y = float.Parse(pieces[dataStart + 1], culture.NumberFormat);
                    vn.Z = float.Parse(pieces[dataStart + 2], culture.NumberFormat);
                    Normals.Add(vn);
                    break;

                case "vt":
                    Vector3 vt;
                    vt.X = float.Parse(pieces[dataStart + 0], culture.NumberFormat);
                    vt.Y = float.Parse(pieces[dataStart + 1], culture.NumberFormat);
                    vt.Z = pieces.Length < 4 ? 0 : float.Parse(pieces[dataStart + 2], culture.NumberFormat);
                    TexCoords.Add(vt);
                    break;

                case "g":

                    activeGroup = getOrCreateGroup(pieces[dataStart]);
                    updateActiveSubObject();

                    /*if (meshPart.AdditionalData.Name != null || meshPart.AdditionalData.Name == "")
                     * {
                     *  meshPart = new EditorMeshPart();
                     *  meshPart.AdditionalData.Name = pieces[1];
                     *  createMeshPart();
                     * }
                     * meshPart = new EditorMeshPart();
                     * meshPart.AdditionalData.Name = pieces[1];*/
                    break;

                case "usemtl":
                    activeMaterial = GetOrCreateMaterial(pieces[dataStart]);
                    updateActiveSubObject();
                    break;

                case "f":
                    Face face = new Face();

                    //TODO: check first index
                    face.V1 = ParseFaceVertex(pieces[dataStart + 0]);
                    face.V2 = ParseFaceVertex(pieces[dataStart + 1]);
                    face.V3 = ParseFaceVertex(pieces[dataStart + 2]);

                    if (activeSubObject == null)
                    {
                        throw new InvalidOperationException(
                                  "A face was found that does not seem to belong to any object??");
                    }

                    activeSubObject.Faces.Add(face);


                    break;

                case "mtllib":
                    Stream matStream;
                    if (materialFileStreams.TryGetValue(pieces[dataStart], out matStream))
                    {
                        importMaterialFile(matStream);
                    }
                    else
                    {
                        Console.WriteLine("OBJ Material Library not found: " + pieces[dataStart]);
                    }

                    break;
                }
            }

            //createMeshPart();


            //return mesh;


            materialFileStreams = new Dictionary <string, Stream>();
        }
コード例 #4
0
        private void importMaterialFile(Stream fileStream)
        {
            StreamReader textReader = new StreamReader(fileStream);

            OBJMaterial readingMaterial = null;


            string line = null;

            while (textReader.Peek() != -1)
            {
                //TODO: remove tabs!!!
                //TODO: make a seperate reader for this kind of file
                line = textReader.ReadLine().Trim(new[] { ' ', '\t' });

                //line = line.Replace('.', ',');
                if (line.StartsWith("#"))
                {
                    continue;
                }
                string[] pieces = line.Split(' ');

                string cmd = pieces[0];


                int dataStart = 1;
                while (pieces.Length > dataStart && pieces[dataStart] == "")
                {
                    dataStart++;
                }
                switch (cmd)
                {
                case "newmtl":
                    readingMaterial = GetOrCreateMaterial(pieces[dataStart]);
                    break;

                case "Ns":
                    if (readingMaterial == null)
                    {
                        throw new InvalidOperationException("File format invalid!");
                    }
                    readingMaterial.SpecularExponent = float.Parse(pieces[dataStart], culture);
                    break;

                case "Ka":
                    if (readingMaterial == null)
                    {
                        throw new InvalidOperationException("File format invalid!");
                    }
                    readingMaterial.AmbientColor = readColor(pieces, dataStart);
                    break;

                case "Kd":
                    if (readingMaterial == null)
                    {
                        throw new InvalidOperationException("File format invalid!");
                    }
                    readingMaterial.DiffuseColor = readColor(pieces, dataStart);
                    break;

                case "Ks":
                    if (readingMaterial == null)
                    {
                        throw new InvalidOperationException("File format invalid!");
                    }
                    readingMaterial.SpecularColor = readColor(pieces, dataStart);
                    break;

                case "map_Ka":
                    if (readingMaterial == null)
                    {
                        throw new InvalidOperationException("File format invalid!");
                    }
                    string pathKa = line.Substring(line.IndexOf("map_Ka") + ("map_Ka").Length).Trim();
                    readingMaterial.AmbientMap = fixFileUrl(pathKa);
                    break;

                case "map_Kd":
                    if (readingMaterial == null)
                    {
                        throw new InvalidOperationException("File format invalid!");
                    }
                    string pathKd = line.Substring(line.IndexOf("map_Kd") + ("map_Kd").Length).Trim();
                    readingMaterial.DiffuseMap = fixFileUrl(pathKd);
                    break;

                case "map_Ks":
                    if (readingMaterial == null)
                    {
                        throw new InvalidOperationException("File format invalid!");
                    }
                    string pathKs = line.Substring(line.IndexOf("map_Ks") + ("map_Ks").Length).Trim();
                    readingMaterial.SpecularMap = fixFileUrl(pathKs);
                    break;

                case "map_bump":
                    if (readingMaterial == null)
                    {
                        throw new InvalidOperationException("File format invalid!");
                    }
                    string pathbump = line.Substring(line.IndexOf("map_bump") + ("map_bump").Length).Trim();
                    readingMaterial.BumpMap = fixFileUrl(pathbump);
                    break;
                }
            }

            //createMeshPart();


            //return mesh;


            materialFileStreams = new Dictionary <string, Stream>();
        }