Exemple #1
0
        private Bitmap mTextureImage; // the bitmap image file.

        /// <summary>
        /// Constructs from parsing the command file.
        /// DO NOT change the parser loop unless you know what you are doing.
        /// </summary>
        /// <param name="parser"></param>
        public RTTextureType_Color(CommandFileParser parser)
        {
            while (!parser.IsEndElement("texture"))
            {
                if (parser.IsElement() && (!parser.IsElement("texture")))
                {
                    if (parser.IsElement("filename"))
                    {
                        String name = parser.ReadString();
                        name = parser.FullPath() + "\\" + name;
                        if (System.IO.File.Exists(name))
                        {
                            mTextureImage = new Bitmap(name, true);
                        }
                        else
                        {
                            parser.ParserError("TextureType_Color filename");
                        }
                    }
                    else
                    {
                        parser.ParserError("TextureType_Color");
                    }
                }
                else
                {
                    parser.ParserRead();
                }
            }
        }
        private Bitmap mTextureImage; // the bitmap image file.

        #endregion Fields

        #region Constructors

        /// <summary>
        /// Constructs from parsing the command file.
        /// DO NOT change the parser loop unless you know what you are doing.
        /// </summary>
        /// <param name="parser"></param>
        public RTTextureType_Bump(CommandFileParser parser)
        {
            mGain = 1.0f;

            while (!parser.IsEndElement("texture"))
            {
                if (parser.IsElement() && (!parser.IsElement("texture")))
                {
                    if (parser.IsElement("filename")) {
                        String name = parser.ReadString();
                        name = parser.FullPath() + "\\" + name;
                        if (System.IO.File.Exists(name))
                            mTextureImage = new Bitmap(name, true);
                        else
                            parser.ParserError("TextureType_Bump filename");
                    }
                    else if (parser.IsElement("gain"))
                        mGain = parser.ReadFloat();
                    else
                        parser.ParserError("TextureType_Bump");
                }
                else
                    parser.ParserRead();
            }
            mInvWidth = 1f / (float)(mTextureImage.Width - 1);
            mInvHeight = 1f / (float)(mTextureImage.Height - 1);
        }
 /// <summary>
 /// Constructor from parser. 
 /// Please DO NOT change the parsing routine unless you know what you are doing).
 /// </summary>
 /// <param name="parser"></param>
 public RTLight(CommandFileParser parser)
 {
     parser.ParserRead();
     while (!parser.IsEndElement("light"))
     {
         if (parser.IsElement() && (!parser.IsElement("light")))
         {
             if (parser.IsElement("type"))
             {
                 String type = parser.ReadString();
                 if (type.Equals("point"))
                     mLight = new RTLightType_Point(parser);
                 else if (type.Equals("directional"))
                     mLight = new RTLightType_Directional(parser);
                 else if (type.Equals("spot"))
                     mLight = new RTLightType_Spot(parser);
                 else
                     parser.ParserError("Light: Unknown light type");
             }
             else
                 parser.ParserError("Light");
         }
         else
             parser.ParserRead();
     }
 }
        private Bitmap mTextureImage; // the bitmap image file.

        #endregion Fields

        #region Constructors

        /// <summary>
        /// Constructs from parsing the command file.
        /// DO NOT change the parser loop unless you know what you are doing.
        /// </summary>
        /// <param name="parser"></param>
        public RTTextureType_Color(CommandFileParser parser)
        {
            while (!parser.IsEndElement("texture"))
            {
                if (parser.IsElement() && (!parser.IsElement("texture")))
                {
                    if (parser.IsElement("filename")) {
                        String name = parser.ReadString();
                        name = parser.FullPath() + "\\" + name;
                        if (System.IO.File.Exists(name))
                            mTextureImage = new Bitmap(name, true);
                        else
                            parser.ParserError("TextureType_Color filename");
                    }
                    else
                        parser.ParserError("TextureType_Color");
                }
                else
                    parser.ParserRead();
            }
        }
        private RTTextureType mTexture; // The actualy texture functionality.

        #endregion Fields

        #region Constructors

        /// <summary>
        /// Constrctus from parsing command file. xlm elements:
        ///     index, type
        /// MUST exist before any other texture type-specific elements!!
        /// </summary>
        /// <param name="parser"></param>
        public RTTexture(CommandFileParser parser)
        {
            parser.ParserRead();
            while (!parser.IsEndElement("texture"))
            {
                if (parser.IsElement() && (!parser.IsElement("texture")))
                {
                    if (parser.IsElement("index")) {
                        int i = parser.ReadInt();
                        SetResourceIndex(i);
                    }
                    else if (parser.IsElement("type")) {
                        String type = parser.ReadString();
                        if (type.Equals("color"))
                            mTexture = new RTTextureType_Color(parser);
                        else if (type.Equals("checker"))
                            mTexture = new RTTextureType_Checker(parser);
                        else if (type.Equals("noise"))
                            mTexture = new RTTextureType_Noise(parser);
                        else if (type.Equals("sine"))
                            mTexture = new RTTextureType_Sine(parser);
                        else if (type.Equals("marble"))
                            mTexture = new RTTextureType_Marble(parser);
                        else if (type.Equals("ramp"))
                            mTexture = new RTTextureType_Ramp(parser);
                        else if (type.Equals("grid"))
                            mTexture = new RTTextureType_Grid(parser);
                        else if (type.Equals("bump"))
                            mTexture = new RTTextureType_Bump(parser);
                        else
                            parser.ParserError("Texture: unknown type");
                    }
                    else
                        parser.ParserError("Texture");
                }
                else
                    parser.ParserRead();
            }
        }
        /// <summary>
        /// Constructs from parsing the command file.
        /// DO NOT change the parser loop unless you know what you are doing.
        /// </summary>
        /// <param name="parser"></param>
        public RTTextureType_Bump(CommandFileParser parser)
        {
            mGain = 1.0f;

            while (!parser.IsEndElement("texture"))
            {
                if (parser.IsElement() && (!parser.IsElement("texture")))
                {
                    if (parser.IsElement("filename"))
                    {
                        String name = parser.ReadString();
                        name = parser.FullPath() + "\\" + name;
                        if (System.IO.File.Exists(name))
                        {
                            mTextureImage = new Bitmap(name, true);
                        }
                        else
                        {
                            parser.ParserError("TextureType_Bump filename");
                        }
                    }
                    else if (parser.IsElement("gain"))
                    {
                        mGain = parser.ReadFloat();
                    }
                    else
                    {
                        parser.ParserError("TextureType_Bump");
                    }
                }
                else
                {
                    parser.ParserRead();
                }
            }
            mInvWidth  = 1f / (float)(mTextureImage.Width - 1);
            mInvHeight = 1f / (float)(mTextureImage.Height - 1);
        }
 /// <summary>
 /// Constructor from parser.
 /// Please DO NOT change the parsing routine unless you know what you are doing).
 /// </summary>
 /// <param name="parser"></param>
 public RTLight(CommandFileParser parser)
 {
     parser.ParserRead();
     while (!parser.IsEndElement("light"))
     {
         if (parser.IsElement() && (!parser.IsElement("light")))
         {
             if (parser.IsElement("type"))
             {
                 String type = parser.ReadString();
                 if (type.Equals("point"))
                 {
                     mLight = new RTLightType_Point(parser);
                 }
                 else if (type.Equals("directional"))
                 {
                     mLight = new RTLightType_Directional(parser);
                 }
                 else if (type.Equals("spot"))
                 {
                     mLight = new RTLightType_Spot(parser);
                 }
                 else
                 {
                     parser.ParserError("Light: Unknown light type");
                 }
             }
             else
             {
                 parser.ParserError("Light");
             }
         }
         else
         {
             parser.ParserRead();
         }
     }
 }
Exemple #8
0
        static public void ParseMeshForTriangles(CommandFileParser parser, ContentManager meshLoader, SceneDatabase sceneDatabase)
        {
            String meshFileName = null;
            int    material     = 0;

            // has xform?
            bool   hasTransform = false;
            Matrix xform        = Matrix.Identity;
            Matrix invT         = Matrix.Identity;

            #region Parse the command file
            parser.ParserRead();
            while (!parser.IsEndElement("mesh"))
            {
                if (parser.IsElement() && (!parser.IsElement("mesh")))
                {
                    if (parser.IsElement("filename"))
                    {
                        meshFileName = parser.ReadString();
                    }
                    else if (parser.IsElement("xform"))
                    {
                        hasTransform = true;
                        xform        = ParseTransform(parser);
                    }
                    else if (parser.IsElement("material"))
                    {
                        material = parser.ReadInt();
                    }
                    else
                    {
                        parser.ParserError("mesh");
                    }
                }
                else
                {
                    parser.ParserRead();
                }
            }
            #endregion

            if (null == meshFileName)
            {
                parser.ParserError("No Mesh filename!");
                return;
            }

            if (hasTransform)
            {
                invT = Matrix.Transpose(Matrix.Invert(xform));
            }

            Model     model             = meshLoader.Load <Model>(meshFileName);
            Byte[]    localVertexBuffer = null;
            Int32[]   localIndexBuffer  = null;
            Vector3[] vertexPosition    = null;
            Vector3[] normalAtVertex    = null;
            Vector2[] uvAtVertex        = null;
            bool      hasPosition       = false;
            bool      hasNormal         = false;
            bool      hasUV             = false;

            foreach (ModelMesh mesh in model.Meshes)
            {
                foreach (ModelMeshPart part in mesh.MeshParts)
                {
                    int numIndices  = part.IndexBuffer.IndexCount;   // total number of localIndexBuffer in the buffer
                    int numVertices = part.VertexBuffer.VertexCount; // total number of vertices in the buffer

                    #region Only need to load/translate these buffers once!
                    // *** REALLY? ***
                    if (null == localIndexBuffer)
                    {
                        vertexPosition = new Vector3[numVertices];
                        normalAtVertex = new Vector3[numVertices];
                        uvAtVertex     = new Vector2[numVertices];

                        localIndexBuffer = LoadIndexBuffer(part);

                        int numBytes = numVertices * part.VertexBuffer.VertexDeclaration.VertexStride;
                        localVertexBuffer = new Byte[numBytes];
                        part.VertexBuffer.GetData <Byte>(localVertexBuffer);

                        VertexElement[] vertexElements = part.VertexBuffer.VertexDeclaration.GetVertexElements();

                        int bufferOffset = 0;
                        #region parse each vertex
                        // now get all the vertices
                        for (int vertCount = 0; vertCount < numVertices; vertCount++)
                        {   // parse through the elements
                            bufferOffset = vertCount * part.VertexBuffer.VertexDeclaration.VertexStride;

                            hasUV = false; // do this for each vertex
                            for (int e = 0; e < vertexElements.Length; e++)
                            {
                                switch (vertexElements[e].VertexElementUsage)
                                {
                                case VertexElementUsage.Position:
                                    hasPosition = true;
                                    // Vertex position
                                    int vertexByteOffset = bufferOffset + vertexElements[e].Offset;
                                    vertexPosition[vertCount].X = BitConverter.ToSingle(localVertexBuffer, vertexByteOffset); vertexByteOffset += 4;
                                    vertexPosition[vertCount].Y = BitConverter.ToSingle(localVertexBuffer, vertexByteOffset); vertexByteOffset += 4;
                                    vertexPosition[vertCount].Z = BitConverter.ToSingle(localVertexBuffer, vertexByteOffset);
                                    break;

                                case VertexElementUsage.Normal:
                                    hasNormal = true;
                                    int normalByteOffset = bufferOffset + vertexElements[e].Offset;
                                    normalAtVertex[vertCount].X = BitConverter.ToSingle(localVertexBuffer, normalByteOffset); normalByteOffset += 4;
                                    normalAtVertex[vertCount].Y = BitConverter.ToSingle(localVertexBuffer, normalByteOffset); normalByteOffset += 4;
                                    normalAtVertex[vertCount].Z = BitConverter.ToSingle(localVertexBuffer, normalByteOffset);
                                    break;

                                case VertexElementUsage.TextureCoordinate:
                                    if (!hasUV)
                                    {      // if more than one defined, will only use the first one
                                        hasUV = true;
                                        int uvByteOffset = bufferOffset + vertexElements[e].Offset;
                                        uvAtVertex[vertCount].X = BitConverter.ToSingle(localVertexBuffer, uvByteOffset); uvByteOffset += 4;
                                        uvAtVertex[vertCount].Y = BitConverter.ToSingle(localVertexBuffer, uvByteOffset);
                                    }
                                    break;
                                    // ignore all other cases
                                } // the switch on usage for parsing
                            }     // for of vertexElements
                        }         // for each vertex
                        #endregion


                        #region compute the transform for each vertex
                        // now do the transform
                        if (hasTransform)
                        {
                            for (int v = 0; v < numVertices; v++)
                            {
                                vertexPosition[v] = Vector3.Transform(vertexPosition[v], xform);
                            }
                            if (hasNormal)
                            {
                                for (int v = 0; v < numVertices; v++)
                                {
                                    normalAtVertex[v] = Vector3.Transform(normalAtVertex[v], invT);
                                    normalAtVertex[v] = Vector3.Normalize(normalAtVertex[v]);
                                }
                            }
                        }
                        #endregion
                    }
                    #endregion

                    // now start working on this particular part ...
                    int startIndex = part.StartIndex;

                    int vertexOffset = part.VertexOffset;

                    // start from part.StartIndex
                    int numTriangles = part.PrimitiveCount;

                    #region create the triangles
                    // now all vertice are stored.
                    // let's create the Triangles
                    for (int nthT = 0; nthT < numTriangles; nthT++)
                    {
                        Vector3[] vertices = new Vector3[3];
                        Vector2[] uv       = new Vector2[3];
                        Vector3[] normals  = null;
                        if (hasNormal)
                        {
                            normals = new Vector3[3];
                        }

                        #region copy vertex info
                        int indexOffset = startIndex + (nthT * 3);
                        for (int i = 0; i < 3; i++)
                        {
                            int index = vertexOffset + localIndexBuffer[indexOffset + i];
                            vertices[i] = vertexPosition[index];
                            uv[i]       = uvAtVertex[index];
                            if (hasNormal)
                            {
                                normals[i] = normalAtVertex[index];
                            }
                        }
                        #endregion

                        // now create the new triangle
                        // watch out for bad triangles!!
                        if (hasPosition)
                        {
                            if (!hasNormal)
                            {
                                normalAtVertex = null;
                            }
                            Vector3 aVec = vertices[1] - vertices[0];
                            if (aVec.LengthSquared() > float.Epsilon)
                            {
                                Vector3 bVec = vertices[2] - vertices[0];
                                if (bVec.LengthSquared() > float.Epsilon)
                                {
                                    RTTriangle t = new RTTriangle(vertices, normals, uv, material);
                                    sceneDatabase.AddGeom(t);
                                }
                            }
                        }
                    }
                    #endregion
                }
            }
        }
        public static void ParseMeshForTriangles(CommandFileParser parser, ContentManager meshLoader, SceneDatabase sceneDatabase)
        {
            String meshFileName = null;
            int material = 0;

            // has xform?
            bool hasTransform = false;
            Matrix xform = Matrix.Identity;
            Matrix invT = Matrix.Identity;

            #region Parse the command file
            parser.ParserRead();
            while (!parser.IsEndElement("mesh"))
            {
                if (parser.IsElement() && (!parser.IsElement("mesh")))
                {
                    if (parser.IsElement("filename"))
                    {
                        meshFileName = parser.ReadString();
                    }
                    else if (parser.IsElement("xform"))
                    {
                        hasTransform = true;
                        xform = ParseTransform(parser);
                    }
                    else if (parser.IsElement("material"))
                        material = parser.ReadInt();
                    else
                        parser.ParserError("mesh");
                }
                else
                    parser.ParserRead();
            }
            #endregion

            if (null == meshFileName)
            {
                parser.ParserError("No Mesh filename!");
                return;
            }

            if (hasTransform)
                invT = Matrix.Transpose(Matrix.Invert(xform));

            Model model = meshLoader.Load<Model>(meshFileName);
            Byte[] localVertexBuffer = null;
            Int32[] localIndexBuffer = null;
            Vector3[] vertexPosition = null;
            Vector3[] normalAtVertex = null;
            Vector2[] uvAtVertex = null;
            bool hasPosition = false;
            bool hasNormal = false;
            bool hasUV = false;

            foreach (ModelMesh mesh in model.Meshes)
            {
                foreach (ModelMeshPart part in mesh.MeshParts)
                {
                    int numIndices = part.IndexBuffer.IndexCount;  // total number of localIndexBuffer in the buffer
                    int numVertices = part.VertexBuffer.VertexCount; // total number of vertices in the buffer

                    #region Only need to load/translate these buffers once!
                    // *** REALLY? ***
                    if (null == localIndexBuffer)
                    {
                        vertexPosition = new Vector3[numVertices];
                        normalAtVertex = new Vector3[numVertices];
                        uvAtVertex = new Vector2[numVertices];

                        localIndexBuffer = LoadIndexBuffer(part);

                        int numBytes = numVertices * part.VertexBuffer.VertexDeclaration.VertexStride;
                        localVertexBuffer = new Byte[numBytes];
                        part.VertexBuffer.GetData<Byte>(localVertexBuffer);

                        VertexElement[] vertexElements = part.VertexBuffer.VertexDeclaration.GetVertexElements();

                        int bufferOffset = 0;
                        #region parse each vertex
                        // now get all the vertices
                        for (int vertCount = 0; vertCount < numVertices; vertCount++)
                        {   // parse through the elements
                            bufferOffset = vertCount * part.VertexBuffer.VertexDeclaration.VertexStride;

                            hasUV = false; // do this for each vertex
                            for (int e = 0; e < vertexElements.Length; e++)
                            {
                                switch (vertexElements[e].VertexElementUsage)
                                {
                                    case VertexElementUsage.Position:
                                        hasPosition = true;
                                        // Vertex position
                                        int vertexByteOffset = bufferOffset + vertexElements[e].Offset;
                                        vertexPosition[vertCount].X = BitConverter.ToSingle(localVertexBuffer, vertexByteOffset); vertexByteOffset += 4;
                                        vertexPosition[vertCount].Y = BitConverter.ToSingle(localVertexBuffer, vertexByteOffset); vertexByteOffset += 4;
                                        vertexPosition[vertCount].Z = BitConverter.ToSingle(localVertexBuffer, vertexByteOffset);
                                        break;
                                    case VertexElementUsage.Normal:
                                        hasNormal = true;
                                        int normalByteOffset = bufferOffset + vertexElements[e].Offset;
                                        normalAtVertex[vertCount].X = BitConverter.ToSingle(localVertexBuffer, normalByteOffset); normalByteOffset += 4;
                                        normalAtVertex[vertCount].Y = BitConverter.ToSingle(localVertexBuffer, normalByteOffset); normalByteOffset += 4;
                                        normalAtVertex[vertCount].Z = BitConverter.ToSingle(localVertexBuffer, normalByteOffset);
                                        break;
                                    case VertexElementUsage.TextureCoordinate:
                                        if (!hasUV)
                                        {  // if more than one defined, will only use the first one
                                            hasUV = true;
                                            int uvByteOffset = bufferOffset + vertexElements[e].Offset;
                                            uvAtVertex[vertCount].X = BitConverter.ToSingle(localVertexBuffer, uvByteOffset); uvByteOffset += 4;
                                            uvAtVertex[vertCount].Y = BitConverter.ToSingle(localVertexBuffer, uvByteOffset);
                                        }
                                        break;
                                    // ignore all other cases
                                } // the switch on usage for parsing
                            } // for of vertexElements
                        } // for each vertex
                        #endregion

                        #region compute the transform for each vertex
                        // now do the transform
                        if (hasTransform)
                        {
                            for (int v = 0; v < numVertices; v++)
                                vertexPosition[v] = Vector3.Transform(vertexPosition[v], xform);
                            if (hasNormal)
                                for (int v = 0; v < numVertices; v++)
                                {
                                    normalAtVertex[v] = Vector3.Transform(normalAtVertex[v], invT);
                                    normalAtVertex[v] = Vector3.Normalize(normalAtVertex[v]);
                                }
                        }
                        #endregion
                    }
                    #endregion

                    // now start working on this particular part ...
                    int startIndex = part.StartIndex;

                    int vertexOffset = part.VertexOffset;

                    // start from part.StartIndex
                    int numTriangles = part.PrimitiveCount;

                    #region create the triangles
                    // now all vertice are stored.
                    // let's create the Triangles
                    for (int nthT = 0; nthT < numTriangles; nthT++)
                    {
                        Vector3[] vertices = new Vector3[3];
                        Vector2[] uv = new Vector2[3];
                        Vector3[] normals = null;
                        if (hasNormal)
                            normals = new Vector3[3];

                        #region copy vertex info
                        int indexOffset = startIndex + (nthT * 3);
                        for (int i = 0; i < 3; i++)
                        {
                            int index = vertexOffset + localIndexBuffer[indexOffset + i];
                            vertices[i] = vertexPosition[index];
                            uv[i] = uvAtVertex[index];
                            if (hasNormal)
                                normals[i] = normalAtVertex[index];
                        }
                        #endregion

                        // now create the new triangle
                        // watch out for bad triangles!!
                        if (hasPosition)
                        {
                            if (!hasNormal)
                                normalAtVertex = null;
                            Vector3 aVec = vertices[1] - vertices[0];
                            if (aVec.LengthSquared() > float.Epsilon)
                            {
                                Vector3 bVec = vertices[2] - vertices[0];
                                if (bVec.LengthSquared() > float.Epsilon)
                                {
                                    RTTriangle t = new RTTriangle(vertices, normals, uv, material);
                                    sceneDatabase.AddGeom(t);
                                }
                            }
                        }
                    }
                    #endregion
                }
            }
        }
        private RTTextureType mTexture; // The actualy texture functionality.

        /// <summary>
        /// Constrctus from parsing command file. xlm elements:
        ///     index, type
        /// MUST exist before any other texture type-specific elements!!
        /// </summary>
        /// <param name="parser"></param>
        public RTTexture(CommandFileParser parser)
        {
            parser.ParserRead();
            while (!parser.IsEndElement("texture"))
            {
                if (parser.IsElement() && (!parser.IsElement("texture")))
                {
                    if (parser.IsElement("index"))
                    {
                        int i = parser.ReadInt();
                        SetResourceIndex(i);
                    }
                    else if (parser.IsElement("type"))
                    {
                        String type = parser.ReadString();
                        if (type.Equals("color"))
                        {
                            mTexture = new RTTextureType_Color(parser);
                        }
                        else if (type.Equals("checker"))
                        {
                            mTexture = new RTTextureType_Checker(parser);
                        }
                        else if (type.Equals("noise"))
                        {
                            mTexture = new RTTextureType_Noise(parser);
                        }
                        else if (type.Equals("sine"))
                        {
                            mTexture = new RTTextureType_Sine(parser);
                        }
                        else if (type.Equals("marble"))
                        {
                            mTexture = new RTTextureType_Marble(parser);
                        }
                        else if (type.Equals("ramp"))
                        {
                            mTexture = new RTTextureType_Ramp(parser);
                        }
                        else if (type.Equals("grid"))
                        {
                            mTexture = new RTTextureType_Grid(parser);
                        }
                        else if (type.Equals("bump"))
                        {
                            mTexture = new RTTextureType_Bump(parser);
                        }
                        else
                        {
                            parser.ParserError("Texture: unknown type");
                        }
                    }
                    else
                    {
                        parser.ParserError("Texture");
                    }
                }
                else
                {
                    parser.ParserRead();
                }
            }
        }