/// <summary>
 /// Creates a <i>VertexBuffer</i> that can be used to draw colored triangles.
 /// </summary>
 /// <param name="device"></param>
 /// <returns></returns>
 public static VertexBuffer CreateColoredTriangleBuffer(Device device)
 {
     return(VertexBuffer.CreateGeneric <TransformedColored>(
                device,
                3,
                Usage.WriteOnly,
                TransformedColored.Format,
                Pool.Managed,
                null));
 }
 /// <summary>
 /// Creates a <i>VertexBuffer</i> that can be used to render a texture on a rectangle.
 /// </summary>
 /// <param name="device"></param>
 /// <returns></returns>
 public static VertexBuffer CreateTexturedBuffer(Device device)
 {
     return(VertexBuffer.CreateGeneric <TransformedTextured>(
                device,
                4,
                Usage.WriteOnly,
                TransformedTextured.Format,
                Pool.Managed,
                null));
 }
Beispiel #3
0
        public SkyFace(string textureName, SkyFaceSide faceSide)
        {
            this.vertexBuffer = VertexBuffer.CreateGeneric <PositionNormalTextured>(
                GameEngine.Device,
                4,
                Usage.WriteOnly,
                PositionNormalTextured.Format,
                Pool.Managed,
                null);

            this.corners = this.vertexBuffer.Lock <PositionNormalTextured>(0, 0, LockFlags.None);
            PositionNormalTextured[] data = new PositionNormalTextured[4];

            switch (faceSide)
            {
            case SkyFaceSide.Top:
                //Y always 100;
                //back x -100; front X +100;
                //back Z -100; front Z +100
                data[0].X  = -100f;
                data[0].Y  = 100f;
                data[0].Z  = -100f;
                data[0].U  = 0f;
                data[0].V  = 1f;
                data[0].Nx = 0f;
                data[0].Ny = -1f;
                data[0].Nz = 0f;
                data[1].X  = 100f;
                data[1].Y  = 100f;
                data[1].Z  = -100f;
                data[1].U  = 0f;
                data[1].V  = 0f;
                data[1].Nx = 0f;
                data[1].Ny = -1f;
                data[1].Nz = 0f;
                data[2].X  = -100f;
                data[2].Y  = 100f;
                data[2].Z  = 100f;
                data[2].U  = 1f;
                data[2].V  = 1f;
                data[2].Nx = 0;
                data[2].Ny = -1f;
                data[2].Nz = 0f;
                data[3].X  = 100f;
                data[2].Y  = 100f;
                data[3].Z  = 100f;
                data[3].U  = 1f;
                data[3].V  = 0f;
                data[3].Nx = 0f;
                data[3].Ny = -1f;
                data[3].Nz = 0f;
                break;

            case SkyFaceSide.Bottom:
                data[0].X  = -100.0f;    // nw
                data[0].Y  = -100.0f;
                data[0].Z  = 100.0f;
                data[0].U  = 0.0f;
                data[0].V  = 0.0f;
                data[0].Nx = 0.0f;
                data[0].Ny = 1.0f;
                data[0].Nz = 0.0f;
                data[1].X  = 100.0f;    // ne
                data[1].Y  = -100.0f;
                data[1].Z  = 100.0f;
                data[1].U  = 1.0f;
                data[1].V  = 1.0f;
                data[1].Nx = 0.0f;
                data[1].Ny = 1.0f;
                data[1].Nz = 0.0f;
                data[2].X  = -100.0f;    // sw
                data[2].Y  = -100.0f;
                data[2].Z  = -100.0f;
                data[2].U  = 1.0f;
                data[2].V  = 0.0f;
                data[2].Nx = 0.0f;
                data[2].Ny = 1.0f;
                data[2].Nz = 0.0f;
                data[3].X  = 100.0f;    // se
                data[3].Y  = -100.0f;
                data[3].Z  = -100.0f;
                data[3].U  = 0.0f;
                data[3].V  = 1.0f;
                data[3].Nx = 0.0f;
                data[3].Ny = 1.0f;
                data[3].Nz = 0.0f;
                break;

            case SkyFaceSide.Left:
                data[0].X  = -100.0f;    // upper south
                data[0].Y  = 100.0f;
                data[0].Z  = -100.0f;
                data[0].U  = 0.0f;
                data[0].V  = 0.0f;
                data[0].Nx = 1.0f;
                data[0].Ny = 0.0f;
                data[0].Nz = 0.0f;
                data[1].X  = -100.0f;    // upper north
                data[1].Y  = 100.0f;
                data[1].Z  = 100.0f;
                data[1].U  = 1.0f;
                data[1].V  = 0.0f;
                data[1].Nx = 1.0f;
                data[1].Ny = 0.0f;
                data[1].Nz = 0.0f;
                data[2].X  = -100.0f;    // lower south
                data[2].Y  = -100.0f;
                data[2].Z  = -100.0f;
                data[2].U  = 0.0f;
                data[2].V  = 1.0f;
                data[2].Nx = 1.0f;
                data[2].Ny = 0.0f;
                data[2].Nz = 0.0f;
                data[3].X  = -100.0f;    // lower north
                data[3].Y  = -100.0f;
                data[3].Z  = 100.0f;
                data[3].U  = 1.0f;
                data[3].V  = 1.0f;
                data[3].Nx = 1.0f;
                data[3].Ny = 0.0f;
                data[3].Nz = 0.0f;
                break;

            case SkyFaceSide.Right:
                data[0].X  = 100.0f;    // upper ne
                data[0].Y  = 100.0f;
                data[0].Z  = 100.0f;
                data[0].U  = 0.0f;
                data[0].V  = 0.0f;
                data[0].Nx = -1.0f;
                data[0].Ny = 0.0f;
                data[0].Nz = 0.0f;
                data[1].X  = 100.0f;    // upper se
                data[1].Y  = 100.0f;
                data[1].Z  = -100.0f;
                data[1].U  = 1.0f;
                data[1].V  = 0.0f;
                data[1].Nx = -1.0f;
                data[1].Ny = 0.0f;
                data[1].Nz = 0.0f;
                data[2].X  = 100.0f;    // lower ne
                data[2].Y  = -100.0f;
                data[2].Z  = 100.0f;
                data[2].U  = 0.0f;
                data[2].V  = 1.0f;
                data[2].Nx = -1.0f;
                data[2].Ny = 0.0f;
                data[2].Nz = 0.0f;
                data[3].X  = 100.0f;    // lower se
                data[3].Y  = -100.0f;
                data[3].Z  = -100.0f;
                data[3].U  = 1.0f;
                data[3].V  = 1.0f;
                data[3].Nx = -1.0f;
                data[3].Ny = 0.0f;
                data[3].Nz = 0.0f;
                break;

            case SkyFaceSide.Front:
                data[0].X  = -100.0f;    // upper nw
                data[0].Y  = 100.0f;
                data[0].Z  = 100.0f;
                data[0].U  = 0.0f;
                data[0].V  = 0.0f;
                data[0].Nx = 0.0f;
                data[0].Ny = 0.0f;
                data[0].Nz = -1.0f;
                data[1].X  = 100.0f;    // upper ne
                data[1].Y  = 100.0f;
                data[1].Z  = 100.0f;
                data[1].U  = 1.0f;
                data[1].V  = 0.0f;
                data[1].Nx = 0.0f;
                data[1].Ny = 0.0f;
                data[1].Nz = -1.0f;
                data[2].X  = -100.0f;    // lower nw
                data[2].Y  = -100.0f;
                data[2].Z  = 100.0f;
                data[2].U  = 0.0f;
                data[2].V  = 1.0f;
                data[2].Nx = 0.0f;
                data[2].Ny = 0.0f;
                data[2].Nz = -1.0f;
                data[3].X  = 100.0f;    // lower ne
                data[3].Y  = -100.0f;
                data[3].Z  = 100.0f;
                data[3].U  = 1.0f;
                data[3].V  = 1.0f;
                data[3].Nx = 0.0f;
                data[3].Ny = 0.0f;
                data[3].Nz = -1.0f;
                break;

            case SkyFaceSide.Back:
                data[0].X  = 100.0f;    // upper se
                data[0].Y  = 100.0f;
                data[0].Z  = -100.0f;
                data[0].U  = 0.0f;
                data[0].V  = 0.0f;
                data[0].Nx = 0.0f;
                data[0].Ny = 0.0f;
                data[0].Nz = -1.0f;
                data[1].X  = -100.0f;    // upper sw
                data[1].Y  = 100.0f;
                data[1].Z  = -100.0f;
                data[1].U  = 1.0f;
                data[1].V  = 0.0f;
                data[1].Nx = 0.0f;
                data[1].Ny = 0.0f;
                data[1].Nz = -1.0f;
                data[2].X  = 100.0f;    // lower se
                data[2].Y  = -100.0f;
                data[2].Z  = -100.0f;
                data[2].U  = 0.0f;
                data[2].V  = 1.0f;
                data[2].Nx = 0.0f;
                data[2].Ny = 0.0f;
                data[2].Nz = -1.0f;
                data[3].X  = -100.0f;    // lower sw
                data[3].Y  = -100.0f;
                data[3].Z  = -100.0f;
                data[3].U  = 1.0f;
                data[3].V  = 1.0f;
                data[3].Nx = 0.0f;
                data[3].Ny = 0.0f;
                data[3].Nz = -1.0f;
                break;
            }

            this.corners.Write(data);
            this.vertexBuffer.Unlock();
            this.texture = new Texture(GameEngine.Device, textureName);
            this.valid   = true;
        }
Beispiel #4
0
        /// <summary>
        /// Builds up and initializes all the texture information for the map.
        /// </summary>
        public void Load(Tileset tileset)
        {
            long   totalQuads    = this.width * this.height;
            double scaledPercent = 0;
            double nonScaledPercent;

            nonScaledPercent = 0;
            int      alt;
            GridCell cell;

            for (int x = 0; x < this.width; x++)
            {
                for (int y = 0; y < this.height; y++)
                {
                    this.elevations[x, y].X = x * this.spacing;
                    this.elevations[x, y].Z = y * this.spacing;
                    cell = this.grid.GetCell(new Point(x, y));
                    alt  = 0; // cell.Altitude;
                    if (alt < 0 && !cell.IsDry)
                    {
                        alt = 0;
                    }
                    this.elevations[x, y].Y = alt; // this.grid.GetCell(new Point(x, y)).Altitude;
                }

                nonScaledPercent += (double)this.height / totalQuads;
                scaledPercent     = (nonScaledPercent * 33);
                OnLoadProgressChanged(new StatusChangedEventArgs("Loading Elevation Data...", (int)scaledPercent));
            }

            for (int x = 0; x < this.width; x++)
            {
                for (int y = 0; y < this.height; y++)
                {
                    this.terrainQuads[x, y] = new TerrainQuad(
                        "Quad" + x + "-" + y,
                        this.elevations[x, y],
                        this.elevations[x + 1, y],
                        this.elevations[x, y + 1],
                        this.elevations[x + 1, y + 1]);
                    cell = this.grid.GetCell(new Point(x, y));
                    this.terrainQuads[x, y].Texture = (Texture)tileset.TerrainTiles[cell.Terrain.Name].TileImage;
                    GameEngine.TopQuadTreeNode.AddObject(this.terrainQuads[x, y]);
                }
                nonScaledPercent += (double)this.height / totalQuads;
                scaledPercent     = nonScaledPercent * 33;
                OnLoadProgressChanged(new StatusChangedEventArgs("Loading Terrain Quads...", (int)scaledPercent));
            }

            for (int x = 1; x < this.width - 1; x++)
            {
                for (int y = 1; y < this.height - 1; y++)
                {
                    Vector3 southWestNormal =
                        this.terrainQuads[x, y].FaceNormals + this.terrainQuads[x - 1, y - 1].FaceNormals +
                        this.terrainQuads[x - 1, y].FaceNormals + this.terrainQuads[x, y - 1].FaceNormals;
                    this.terrainQuads[x, y].SetCornerNormal(0, southWestNormal);

                    Vector3 southEastNormal =
                        this.terrainQuads[x, y].FaceNormals + this.terrainQuads[x, y - 1].FaceNormals +
                        this.terrainQuads[x + 1, y].FaceNormals + this.terrainQuads[x + 1, y - 1].FaceNormals;
                    this.terrainQuads[x, y].SetCornerNormal(1, southEastNormal);

                    Vector3 northWestNormal =
                        terrainQuads[x, y].FaceNormals + this.terrainQuads[x - 1, y].FaceNormals +
                        this.terrainQuads[x - 1, y + 1].FaceNormals + this.terrainQuads[x, y + 1].FaceNormals;
                    this.terrainQuads[x, y].SetCornerNormal(2, northWestNormal);

                    Vector3 northEastNormal =
                        this.terrainQuads[x, y].FaceNormals + this.terrainQuads[x, y + 1].FaceNormals +
                        this.terrainQuads[x + 1, y + 1].FaceNormals + this.terrainQuads[x + 1, y].FaceNormals;
                    this.terrainQuads[x, y].SetCornerNormal(3, northEastNormal);
                }
                nonScaledPercent += (double)this.height / totalQuads;
                scaledPercent     = nonScaledPercent * 33;
                OnLoadProgressChanged(new StatusChangedEventArgs("Setting Normal Vectors...", (int)scaledPercent));
            }

            this.vertexBuffer = VertexBuffer.CreateGeneric <PositionNormalTextured>(
                GameEngine.Device,
                numVertices,
                Usage.WriteOnly,
                PositionNormalTextured.Format,
                Pool.Default,
                null);
        }