Exemple #1
0
        private void GenerateGrid()
        {
            // Create vertices
            numRows     = 258;
            numCols     = 258;
            numVertices = numRows * numCols;
            numIndices  = 3 * ((numRows - 1) * (numCols - 1) * 2);

            VertexPosTangNormTex[] vertices = new VertexPosTangNormTex[numVertices];

            float spacing   = 100.0f; // Grid is infinitly wide
            float halfWidth = (float)(numRows - 1) * spacing * 0.5f;
            float halfDepth = (float)(numCols - 1) * spacing * 0.5f;
            float du        = 1.0f / (numRows - 1);
            float dv        = 1.0f / (numCols - 1);

            for (int i = 0; i < numRows; i++)
            {
                float z = (halfDepth - i * spacing) * -1.0f;
                for (int j = 0; j < numCols; j++)
                {
                    float x = -halfWidth + j * spacing;
                    float y = 0.0f;

                    vertices[i * numCols + j].pos   = new Vector3(x, y, z);
                    vertices[i * numCols + j].tang  = Vector3.UnitX;
                    vertices[i * numCols + j].norm  = Vector3.UnitY;
                    vertices[i * numCols + j].tex.X = du * j * textureScale;
                    vertices[i * numCols + j].tex.Y = dv * i * textureScale;
                }
            }

            // Create indices
            int[] indices = new int[numIndices];

            int k = 0;

            for (int i = 0; i < numCols - 1; i++)
            {
                for (int j = 0; j < numRows - 1; j++)
                {
                    indices[k]     = i * numRows + j;
                    indices[k + 1] = i * numRows + j + 1;
                    indices[k + 2] = (i + 1) * numRows + j;

                    indices[k + 3] = (i + 1) * numRows + j;
                    indices[k + 4] = i * numRows + j + 1;
                    indices[k + 5] = (i + 1) * numRows + j + 1;

                    k += 6;
                }
            }

            // Create vertex buffer
            vertexBuffer = new VertexBuffer(device, VertexPosTangNormTex.VertexLayout,
                                            numVertices, BufferUsage.WriteOnly);
            vertexBuffer.SetData(vertices);

            // Create index buffer
            indexBuffer = new IndexBuffer(device, IndexElementSize.ThirtyTwoBits,
                                          numIndices, BufferUsage.WriteOnly);
            indexBuffer.SetData(indices);
        }
Exemple #2
0
        private void LoadMeshFromFile(GraphicsDevice device, ContentManager content, string meshFileName)
        {
            subsets = new List <MeshSubset>();

            int numMaterials;
            int numVertices;
            int numTriangles;

            MaterialData[] materials;

            StreamReader fileReader = new StreamReader(meshFileName);

            try
            {
                string   buffer;
                char[]   separator = { ' ' };
                string[] splitLine;

                // Read in file header information
                fileReader.ReadLine();

                // Num Materials
                buffer       = fileReader.ReadLine();
                splitLine    = buffer.Split(separator);
                numMaterials = int.Parse(splitLine[1]);

                // Num Vertices
                buffer      = fileReader.ReadLine();
                splitLine   = buffer.Split(separator);
                numVertices = int.Parse(splitLine[1]);

                // Num Triangles
                buffer       = fileReader.ReadLine();
                splitLine    = buffer.Split(separator);
                numTriangles = int.Parse(splitLine[1]);

                // Read in the material data
                fileReader.ReadLine();
                fileReader.ReadLine();

                materials = new MaterialData[numMaterials];
                int    materialIndex = 0;
                string texturePath   = @"Textures\";
                for (int i = 0; i < numMaterials; i++)
                {
                    materials[materialIndex] = new MaterialData();

                    // Diffuse Map
                    buffer = fileReader.ReadLine();
                    if (buffer != "NO_TEXTURE")
                    {
                        buffer = buffer.Remove(buffer.Length - 4); // Remove the file extension
                        materials[materialIndex].diffuseMap = content.Load <Texture2D>(texturePath + buffer);
                    }
                    else
                    {
                        // This material will render using material colors only
                        materials[materialIndex].useTextures = false;
                    }

                    // Specular Map
                    buffer = fileReader.ReadLine();
                    if (buffer != "NO_TEXTURE")
                    {
                        buffer = buffer.Remove(buffer.Length - 4); // Remove the file extension
                        materials[materialIndex].specularMap = content.Load <Texture2D>(texturePath + buffer);
                    }

                    // Normal Map
                    buffer = fileReader.ReadLine();
                    if (buffer != "NO_TEXTURE")
                    {
                        buffer = buffer.Remove(buffer.Length - 4); // Remove the file extension
                        materials[materialIndex].normalMap = content.Load <Texture2D>(texturePath + buffer);
                    }

                    // Reflectivity
                    buffer = fileReader.ReadLine();
                    string[] reflectivity = buffer.Split(' ');
                    materials[materialIndex].reflectionMaterial =
                        new Vector4(float.Parse(reflectivity[1], CultureInfo.InvariantCulture),
                                    float.Parse(reflectivity[2], CultureInfo.InvariantCulture),
                                    float.Parse(reflectivity[3], CultureInfo.InvariantCulture), 1.0f);

                    // Check for Material data
                    if (fileReader.Peek() == 'D')
                    {
                        // Read Diffuse Material
                        buffer = fileReader.ReadLine();
                        string[] data = buffer.Split(' ');
                        materials[materialIndex].diffuseMaterial =
                            new Vector4(float.Parse(data[1], CultureInfo.InvariantCulture),
                                        float.Parse(data[2], CultureInfo.InvariantCulture),
                                        float.Parse(data[3], CultureInfo.InvariantCulture), 1.0f);
                    }

                    // Check for Material data
                    if (fileReader.Peek() == 'S')
                    {
                        // Read Specular Material
                        buffer = fileReader.ReadLine();
                        string[] data = buffer.Split(' ');
                        materials[materialIndex].specularMaterial =
                            new Vector4(float.Parse(data[1], CultureInfo.InvariantCulture),
                                        float.Parse(data[2], CultureInfo.InvariantCulture),
                                        float.Parse(data[3], CultureInfo.InvariantCulture), 1.0f);
                    }

                    // Check for technique name
                    if (fileReader.Peek() == 'T')
                    {
                        // Read in the name of the technique
                        buffer = fileReader.ReadLine();
                        materials[materialIndex].techniqueName = buffer.Split(' ')[1];
                    }
                    else
                    {
                        // Use default technique name
                        materials[materialIndex].techniqueName = "MeshTech";
                    }

                    fileReader.ReadLine();
                    materialIndex++;
                }

                // Read in vertices
                fileReader.ReadLine();

                VertexPosTangNormTex[] vertices = new VertexPosTangNormTex[numVertices];
                for (int i = 0; i < numVertices; i++)
                {
                    // Position
                    buffer    = fileReader.ReadLine();
                    splitLine = buffer.Split(separator);

                    vertices[i].pos   = new Vector3();
                    vertices[i].pos.X = float.Parse(splitLine[1], CultureInfo.InvariantCulture);
                    vertices[i].pos.Y = float.Parse(splitLine[2], CultureInfo.InvariantCulture);
                    vertices[i].pos.Z = -float.Parse(splitLine[3], CultureInfo.InvariantCulture); // Invert Z-Coord

                    // Tangent
                    buffer    = fileReader.ReadLine();
                    splitLine = buffer.Split(separator);

                    vertices[i].tang   = new Vector3();
                    vertices[i].tang.X = float.Parse(splitLine[1], CultureInfo.InvariantCulture);
                    vertices[i].tang.Y = float.Parse(splitLine[2], CultureInfo.InvariantCulture);
                    vertices[i].tang.Z = -float.Parse(splitLine[3], CultureInfo.InvariantCulture); // Invert Z-Coord

                    // Normal
                    buffer    = fileReader.ReadLine();
                    splitLine = buffer.Split(separator);

                    vertices[i].norm   = new Vector3();
                    vertices[i].norm.X = float.Parse(splitLine[1], CultureInfo.InvariantCulture);
                    vertices[i].norm.Y = float.Parse(splitLine[2], CultureInfo.InvariantCulture);
                    vertices[i].norm.Z = -float.Parse(splitLine[3], CultureInfo.InvariantCulture); // Invert Z-Coord

                    // Texture Coordinates
                    buffer    = fileReader.ReadLine();
                    splitLine = buffer.Split(separator);

                    vertices[i].tex   = new Vector2();
                    vertices[i].tex.X = float.Parse(splitLine[1], CultureInfo.InvariantCulture);
                    vertices[i].tex.Y = float.Parse(splitLine[2], CultureInfo.InvariantCulture);

                    fileReader.ReadLine();
                }

                // Read in the indices
                fileReader.ReadLine();
                Vector4[] indices = new Vector4[numTriangles]; // XYZ- triangle indices, W- Subset index
                for (int i = 0; i < numTriangles; i++)
                {
                    buffer    = fileReader.ReadLine();
                    splitLine = buffer.Split(separator);

                    indices[i]   = new Vector4();
                    indices[i].X = float.Parse(splitLine[0], CultureInfo.InvariantCulture);
                    indices[i].Y = float.Parse(splitLine[1], CultureInfo.InvariantCulture);
                    indices[i].Z = float.Parse(splitLine[2], CultureInfo.InvariantCulture);
                    indices[i].W = float.Parse(splitLine[3], CultureInfo.InvariantCulture);
                }

                // Create the individual subsets
                int subsetID = (int)indices[0].W; // First
                int index    = -1;
                materialIndex = 0;
                for (int i = 0; i < numMaterials; i++)
                {
                    List <VertexPosTangNormTex> vertexList = new List <VertexPosTangNormTex>();

                    // Add all vertices used by this subset to the list
                    try
                    {
                        do
                        {
                            index++;

                            // Get the vertices for this primitive
                            VertexPosTangNormTex v0 = vertices[((int)indices[index].X)];
                            VertexPosTangNormTex v1 = vertices[((int)indices[index].Y)];
                            VertexPosTangNormTex v2 = vertices[((int)indices[index].Z)];
                            subsetID = (int)indices[index].W;

                            // Add the vertices to the list
                            vertexList.Add(v0);
                            vertexList.Add(v1);
                            vertexList.Add(v2);
                        } while(subsetID == (int)indices[index + 1].W);
                    }
                    catch (IndexOutOfRangeException e) {}

                    // Create the subset
                    MeshSubset subset = new MeshSubset(device, vertexList.ToArray());

                    // Set subset textures
                    subset.UseTextures        = materials[materialIndex].useTextures;
                    subset.DiffuseMap         = materials[materialIndex].diffuseMap;
                    subset.SpecularMap        = materials[materialIndex].specularMap;
                    subset.NormalMap          = materials[materialIndex].normalMap;
                    subset.ReflectionMaterial = materials[materialIndex].reflectionMaterial;
                    subset.DiffuseMaterial    = materials[materialIndex].diffuseMaterial;
                    subset.SpecularMaterial   = materials[materialIndex].specularMaterial;
                    subset.TechniqueName      = materials[materialIndex].techniqueName;
                    materialIndex++;

                    // Add the subset to the list
                    subsets.Add(subset);
                }
            }
            catch (IOException)
            {
            }
            finally
            {
                fileReader.Close();
            }
        }