/// <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)); }
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; }
/// <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); }