コード例 #1
0
        public static void WriteFile(string fileLocation, InstantGameworksObject objectData)
        {
            Stream       _fileStream   = new FileStream(fileLocation, FileMode.Create, FileAccess.Write, FileShare.None);
            BinaryWriter _binaryWriter = new BinaryWriter(_fileStream);


            _binaryWriter.Write('P'); //indicate beginning of positions array
            _binaryWriter.Write(objectData.Positions.Length);
            foreach (Position position in objectData.Positions)
            {
                _binaryWriter.Write(position.X);
                _binaryWriter.Write(position.Y);
                _binaryWriter.Write(position.Z);
            }

            _binaryWriter.Write('T'); //indicate beginning of texture coordinates array
            _binaryWriter.Write(objectData.TextureCoordinates.Length);
            foreach (TextureCoordinates textCoord in objectData.TextureCoordinates)
            {
                _binaryWriter.Write(textCoord.U);
                _binaryWriter.Write(textCoord.V);
                _binaryWriter.Write(textCoord.W);
            }

            _binaryWriter.Write('N'); //indicate beginning of normals array
            _binaryWriter.Write(objectData.Normals.Length);
            foreach (Position normal in objectData.Normals)
            {
                _binaryWriter.Write(normal.X);
                _binaryWriter.Write(normal.Y);
                _binaryWriter.Write(normal.Z);
            }

            _binaryWriter.Write('F'); //indicate beginning of normals array
            _binaryWriter.Write(objectData.Faces.Length);
            foreach (Face face in objectData.Faces)
            {
                foreach (Vertex vertex in face.Vertices)
                {
                    _binaryWriter.Write(vertex.PositionIndex);
                    _binaryWriter.Write(vertex.TextureCoordinatesIndex);
                    _binaryWriter.Write(vertex.NormalIndex);
                }
            }


            _binaryWriter.Close();
            _fileStream.Close();
        }
コード例 #2
0
        public static InstantGameworksObject ConvertOBJToIGWO(string[] OBJContent)
        {
            InstantGameworksObject _newObject = new InstantGameworksObject();

            List <Position>           _vertexPositions          = new List <Position>();
            List <TextureCoordinates> _vertexTextureCoordinates = new List <TextureCoordinates>();
            List <Position>           _vertexNormals            = new List <Position>();
            List <Face> _faces = new List <Face>();


            // Parse data
            foreach (string line in OBJContent)
            {
                string[] splitLine = line.Split(' ');
                if (line.StartsWith("v "))
                {
                    float x = float.Parse(splitLine[1]);
                    float y = float.Parse(splitLine[2]);
                    float z = float.Parse(splitLine[3]);
                    _vertexPositions.Add(new Position(x, y, z));
                }
                if (line.StartsWith("vn "))
                {
                    float x = float.Parse(splitLine[1]);
                    float y = float.Parse(splitLine[2]);
                    float z = float.Parse(splitLine[3]);
                    _vertexNormals.Add(new Position(x, y, z));
                }
                if (line.StartsWith("vt "))
                {
                    float u = float.Parse(splitLine[1]);
                    float v = float.Parse(splitLine[2]);
                    float w = 0;
                    if (splitLine.Length > 3) //bigger than 'vt u w'
                    {
                        w = float.Parse(splitLine[3]);
                    }
                    _vertexNormals.Add(new Position(u, v, w));
                }
                if (line.StartsWith("f "))
                {
                    Face     thisFace      = new Face();
                    Vertex[] theseVertices = new Vertex[3];
                    for (int i = 1; i < 4; i++)                            // 1st through 3rd index
                    {
                        string[] thisVertexData = splitLine[i].Split('/'); // '5//1' becomes { '5', '', '1' }

                        Vertex thisVertex = new Vertex();
                        thisVertex.PositionIndex = int.Parse(thisVertexData[0]);

                        int textCoordIndex;
                        if (int.TryParse(thisVertexData[1], out textCoordIndex))
                        {
                            thisVertex.TextureCoordinatesIndex = textCoordIndex;
                        }
                        else
                        {
                            thisVertex.TextureCoordinatesIndex = -1;
                        };

                        int normIndex;
                        if (int.TryParse(thisVertexData[2], out normIndex))
                        {
                            thisVertex.NormalIndex = normIndex;
                        }
                        else
                        {
                            thisVertex.NormalIndex = -1;
                        };

                        theseVertices[i - 1] = thisVertex;
                    }
                    thisFace.Vertices = theseVertices;
                    _faces.Add(thisFace);
                }
            }

            _newObject.Positions          = _vertexPositions.ToArray();
            _newObject.TextureCoordinates = _vertexTextureCoordinates.ToArray();
            _newObject.Normals            = _vertexNormals.ToArray();
            _newObject.Faces = _faces.ToArray();


            return(_newObject);
        }
コード例 #3
0
        public static InstantGameworksObject ReadFile(string fileLocation)
        {
            InstantGameworksObject objectData = new InstantGameworksObject();

            Stream       _fileStream   = new FileStream(fileLocation, FileMode.Open, FileAccess.Read, FileShare.Read);
            BinaryReader _binaryReader = new BinaryReader(_fileStream);

            List <Position>           positionData = new List <Position>();
            List <TextureCoordinates> textureData  = new List <TextureCoordinates>();
            List <Position>           normalData   = new List <Position>();
            List <Face> faceData = new List <Face>();

            int arrayLength;

            _binaryReader.ReadChar(); //'P' for position
            arrayLength = _binaryReader.ReadInt32();
            for (int i = 0; i < arrayLength; i++)
            {
                Position newPos = new Position();
                newPos.X = _binaryReader.ReadSingle();
                newPos.Y = _binaryReader.ReadSingle();
                newPos.Z = _binaryReader.ReadSingle();
                positionData.Add(newPos);
            }

            _binaryReader.ReadChar(); //'T' for texture coordinates
            arrayLength = _binaryReader.ReadInt32();
            for (int i = 0; i < arrayLength; i++)
            {
                TextureCoordinates newUVW = new TextureCoordinates();
                newUVW.U = _binaryReader.ReadSingle();
                newUVW.V = _binaryReader.ReadSingle();
                newUVW.W = _binaryReader.ReadSingle();
                textureData.Add(newUVW);
            }

            _binaryReader.ReadChar(); //'N' for normals
            arrayLength = _binaryReader.ReadInt32();
            for (int i = 0; i < arrayLength; i++)
            {
                Position newPos = new Position();
                newPos.X = _binaryReader.ReadSingle();
                newPos.Y = _binaryReader.ReadSingle();
                newPos.Z = _binaryReader.ReadSingle();
                normalData.Add(newPos);
            }

            _binaryReader.ReadChar(); //'F' for face
            arrayLength = _binaryReader.ReadInt32();
            for (int i = 0; i < arrayLength; i++)
            {
                Face newFace = new Face();
                newFace.Vertices = new Vertex[3];
                for (int x = 0; x < 3; x++) //for each vertex
                {
                    Vertex newVertex = new Vertex();
                    newVertex.PositionIndex           = _binaryReader.ReadInt32();
                    newVertex.TextureCoordinatesIndex = _binaryReader.ReadInt32();
                    newVertex.NormalIndex             = _binaryReader.ReadInt32();
                    newFace.Vertices[x] = newVertex;
                }
                faceData.Add(newFace);
            }

            objectData.Positions          = positionData.ToArray();
            objectData.TextureCoordinates = textureData.ToArray();
            objectData.Normals            = normalData.ToArray();
            objectData.Faces = faceData.ToArray();


            _binaryReader.Close();
            _fileStream.Close();

            return(objectData);
        }