예제 #1
0
        private OBJGroup getOrCreateGroup(string name)
        {
            for (int i = 0; i < Groups.Count; i++)
            {
                if (Groups[i].Name == name)
                {
                    return(Groups[i]);
                }
            }
            var group = new OBJGroup(name);

            Groups.Add(group);
            return(group);
        }
        private MeshCollisionData.TriangleMeshData createTriangleMeshForGroup(ObjImporter importer, OBJGroup group)
        {
            var positions = new List <Vector3>();


            for (int j = 0; j < group.SubObjects.Count; j++)
            {
                var subObj = group.SubObjects[j];

                addPositionsFromSubObject(importer, subObj, positions);
            }

            int[] indices = createIndices(positions.Count * 3);

            var tm = new MeshCollisionData.TriangleMeshData();

            tm.Positions = positions.ToArray();
            tm.Indices   = indices;
            return(tm);
        }
예제 #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>();
        }