示例#1
0
            protected internal MTLParser(string fileName)
            {
                mMtrls = new Dictionary<string, ObjMaterial>();
                mCurrentMtrl = default(ObjMaterial);

                ParseFile(ParseMtrlToken, fileName);

                if (mCurrentMtrlName != null)
                {
                    mMtrls.Add(mCurrentMtrlName, mCurrentMtrl);
                }
                mCurrentMtrlName = null;

            }
示例#2
0
            protected void ParseMtrlToken(string line, string[] tokens)
            {
                string token = tokens[0].ToLower();
                try
                {
                    if (string.IsNullOrWhiteSpace(line.Substring(token.Length)))
                        return;

                    switch (token)
                    {
                        case "newmtl":
                            {
                                if (mCurrentMtrlName != null)
                                {
                                    mMtrls.Add(mCurrentMtrlName, mCurrentMtrl);
                                }

                                mCurrentMtrlName = tokens[1];
                                mCurrentMtrl = new ObjMaterial();
                                break;
                            }
                        case "ns":
                            {
                                mCurrentMtrl.Ns = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                                break;
                            }
                        case "ni":
                            {
                                mCurrentMtrl.Ni = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                                break;
                            }
                        case "d":
                            {
                                mCurrentMtrl.d = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                                break;
                            }
                        case "tr":
                            {
                                mCurrentMtrl.Tr = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                                break;
                            }
                        case "illum":
                            {
                                mCurrentMtrl.illum = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                                break;
                            }
                        case "tf":
                            {
                                float x = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                                float y = float.Parse(tokens[2], CultureInfo.InvariantCulture);
                                float z = float.Parse(tokens[3], CultureInfo.InvariantCulture);
                                mCurrentMtrl.Tf = new Vector(x, y, z);
                                break;
                            }
                        case "ka":
                            {
                                float x = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                                float y = float.Parse(tokens[2], CultureInfo.InvariantCulture);
                                float z = float.Parse(tokens[3], CultureInfo.InvariantCulture);
                                mCurrentMtrl.Ka = new Vector(x, y, z);
                                break;
                            }
                        case "kd":
                            {
                                float x = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                                float y = float.Parse(tokens[2], CultureInfo.InvariantCulture);
                                float z = float.Parse(tokens[3], CultureInfo.InvariantCulture);
                                mCurrentMtrl.Kd = new Vector(x, y, z);
                                break;
                            }
                        case "ks":
                            {
                                float x = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                                float y = float.Parse(tokens[2], CultureInfo.InvariantCulture);
                                float z = float.Parse(tokens[3], CultureInfo.InvariantCulture);
                                mCurrentMtrl.Ks = new Vector(x, y, z);
                                break;
                            }
                        case "ke":
                            {
                                float x = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                                float y = float.Parse(tokens[2], CultureInfo.InvariantCulture);
                                float z = float.Parse(tokens[3], CultureInfo.InvariantCulture);
                                mCurrentMtrl.Ke = new Vector(x, y, z);
                                break;
                            }
                        case "map_d":
                        case "map_opacity":
                            {
                                var fileName = ProcessTexture(line.Substring(token.Length), tokens);
                                mCurrentMtrl.AlphaMap = fileName ?? tokens.Except(new[] { tokens.First() }).Aggregate((a, b) => a + ' ' + b);
                                break;
                            }
                        //case "map_ka":
                        //    {
                        //        var fileName = ProcessTexture(line.Substring(token.Length), tokens);
                        //        mCurrentMtrl.KdMap = fileName ?? tokens.Except(new[] { tokens.First() }).Aggregate((a, b) => a + ' ' + b);
                        //        break;
                        //    }
                        case "map_kd":
                            {
                                mCurrentMtrl.KdMap = Path.GetFileName(ProcessTexture(line.Substring(token.Length), tokens) ?? tokens.Except(new[] { tokens.First() }).Aggregate((a, b) => a + ' ' + b));
                                break;
                            }
                        case "map_refl":
                        case "map_ks":
                            {
                                mCurrentMtrl.KsMap = ProcessTexture(line.Substring(token.Length), tokens) ?? tokens.Except(new[] { tokens.First() }).Aggregate((a, b) => a + ' ' + b);
                                break;
                            }
                        case "decal":
                            {
                                mCurrentMtrl.DataMap = ProcessTexture(line.Substring(token.Length), tokens) ?? tokens.Except(new[] { tokens.First() }).Aggregate((a, b) => a + ' ' + b);
                                break;
                            }
                        case "bump":
                        case "map_bump":
                            {
                                //tokens.Last();
                                mCurrentMtrl.BumpMap = Path.GetFileName(ProcessTexture(line.Substring(token.Length), tokens) ?? tokens.Except(new[] { tokens.First() }).Aggregate((a, b) => a + ' ' + b));
                                break;
                            }
                        default:
                            break;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error parsing mtrl token: " + token);
                    Console.WriteLine(ex.Message + ex.StackTrace);
                }
            }
示例#3
0
        private static MaterialInfo CreateMaterial(string name, ObjMaterial material)
        {
            try
            {
                var res = new MaterialInfo()
                    {
                        Ka = material.Ka,
                        Kd = material.Kd,
                        Ks = material.Ks,
                        Ke = material.Ke,
                        Exponent = material.Ns,
                        Name = name
                    };
                if (!string.IsNullOrWhiteSpace(material.KaMap))
                {
                    res.Specular = new ImageTextureInfo()
                        {
                            FilePath = material.KaMap,
                            Name = Path.GetFileName(material.KaMap)
                        };
                }
                if (!string.IsNullOrWhiteSpace(material.KdMap))
                {
                    res.Diffuse = new ImageTextureInfo()
                        {
                            FilePath = material.KdMap,
                            Name = Path.GetFileName(material.KdMap)
                        };
                }

                if (!string.IsNullOrWhiteSpace(material.KsMap))
                {
                    res.Specular = new ImageTextureInfo()
                        {
                            FilePath = material.KsMap,
                            Name = Path.GetFileName(material.KsMap)
                        };
                }

                if (!string.IsNullOrWhiteSpace(material.BumpMap))
                {
                    res.BumpMap = new ImageTextureInfo()
                        {
                            FilePath = material.BumpMap,
                            Name = Path.GetFileName(material.BumpMap)
                        };
                }
                if (!string.IsNullOrWhiteSpace(material.AlphaMap))
                {
                    res.Alpha = new ImageTextureInfo()
                    {
                        FilePath = material.AlphaMap,
                        Name = Path.GetFileName(material.AlphaMap)
                    };
                }
                if (!string.IsNullOrWhiteSpace(material.NormalMap))
                {
                    res.NormalMap = new ImageTextureInfo()
                    {
                        FilePath = material.NormalMap,
                        Name = Path.GetFileName(material.NormalMap)
                    };
                }
                if (!string.IsNullOrWhiteSpace(material.DataMap))
                {
                    res.DataFile = material.DataMap;
                }
                return res;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }