コード例 #1
0
ファイル: ObjLoader.cs プロジェクト: uzbekdev1/OptixCore
        protected void ParseObjToken(string line, string[] tokens)
        {
            string token           = tokens[0].ToLower();
            int    lastObjTexCoord = 0;

            try
            {
                switch (token)
                {
                case "v":
                {
                    float x = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                    float y = float.Parse(tokens[2], CultureInfo.InvariantCulture);
                    float z = float.Parse(tokens[3], CultureInfo.InvariantCulture);

                    Vector3 p = new Vector3(x * Scale, y * Scale, z * Scale);
                    BBox.AddFloat3(p);

                    Positions.Add(p);
                    break;
                }

                case "vn":
                {
                    if (ParseNormals)
                    {
                        float x = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                        float y = float.Parse(tokens[2], CultureInfo.InvariantCulture);
                        float z = float.Parse(tokens[3], CultureInfo.InvariantCulture);

                        Normals.Add(new Vector3(x, y, z));
                    }
                    break;
                }

                case "vt":
                {
                    float x = float.Parse(tokens[1], CultureInfo.InvariantCulture);
                    float y = float.Parse(tokens[2], CultureInfo.InvariantCulture);

                    //Texcoords.Add(new Vector2(x,y));
                    mCurrentGroup.TexCoords.Add(new Vector2(x, y));
                    break;
                }

                case "f":
                {
                    int delta = 1;
                    int v0 = 0, v1 = 0, v2 = 0;

                    if (tokens.Length >= 10)
                    {
                        //full v, vn, vt indices
                        v0 = int.Parse(tokens[1]);
                        v1 = int.Parse(tokens[4]);
                        v2 = int.Parse(tokens[7]);

                        mCurrentGroup.VIndices.Add(new Int3(v0 - delta, v1 - delta, v2 - delta));

                        v0 = int.Parse(tokens[2]);
                        v1 = int.Parse(tokens[5]);
                        v2 = int.Parse(tokens[8]);

                        mCurrentGroup.TIndices.Add(new Int3(v0 - delta, v1 - delta, v2 - delta));

                        if (ParseNormals)
                        {
                            v0 = int.Parse(tokens[3]);
                            v1 = int.Parse(tokens[6]);
                            v2 = int.Parse(tokens[9]);

                            mCurrentGroup.NIndices.Add(new Int3(v0 - delta, v1 - delta, v2 - delta));
                        }
                    }
                    else if (tokens.Length >= 7)
                    {
                        v0 = int.Parse(tokens[1]);
                        v1 = int.Parse(tokens[3]);
                        v2 = int.Parse(tokens[5]);

                        mCurrentGroup.VIndices.Add(new Int3(v0 - delta, v1 - delta, v2 - delta));

                        v0 = int.Parse(tokens[2]);
                        v1 = int.Parse(tokens[4]);
                        v2 = int.Parse(tokens[6]);

                        if (line.Contains("//"))
                        {
                            if (ParseNormals)
                            {
                                mCurrentGroup.NIndices.Add(new Int3(v0 - delta, v1 - delta, v2 - delta));
                            }
                        }
                        else
                        {
                            mCurrentGroup.TIndices.Add(new Int3(v0 - delta, v1 - delta, v2 - delta));
                        }
                    }
                    else if (tokens.Length >= 4)
                    {
                        //v indices
                        v0 = int.Parse(tokens[1]);
                        v1 = int.Parse(tokens[2]);
                        v2 = int.Parse(tokens[3]);

                        mCurrentGroup.VIndices.Add(new Int3(v0 - delta, v1 - delta, v2 - delta));
                    }

                    break;
                }

                case "g":
                {
                    if (!ParseMaterials)
                    {
                        break;
                    }

                    string name = tokens[1];
                    mCurrentGroupName = name;
                    lastObjTexCoord   = Texcoords.Count;
                    mCurrentGroup     = new ObjGroup(name, name)
                    {
                        mtrl = mCurrentMtrlName
                    };
                    Groups.Add(mCurrentGroup);
                    break;
                }

                case "usemtl":
                {
                    if (!ParseMaterials)
                    {
                        break;
                    }

                    string name = tokens[1];
                    //if (mCurrentGroup != null){ Texcoords.AddRange(NormalizeTexCoords(mCurrentGroup.TexCoords));}
                    //string groupname = mCurrentGroupName + name;

                    //mCurrentGroup = new ObjGroup( groupname, mCurrentGroupName );
                    //Groups.Add( mCurrentGroup );

                    mCurrentMtrlName   = name;
                    mCurrentGroup.mtrl = name;

                    break;
                }

                case "mtllib":
                {
                    if (!ParseMaterials)
                    {
                        break;
                    }

                    mCurrentMtrl = default(ObjMaterial);

                    string name = mDirectory + tokens[1];
                    ParseFile(ParseMtrlToken, name);

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

                default:
                    break;
                }
            }
            catch (Exception ex)
            {
                Trace.WriteLine("Error parsing obj token: " + ex.Message);
            }
        }