public void DrawTerrainAsset(TerrainBlock asset) { SamplerState s = new SamplerState(); effect.View = viewMatrix; effect.Projection = projectionMatrix; s.AddressU = TextureAddressMode.Wrap; s.AddressV = TextureAddressMode.Wrap; Game.GraphicsDevice.SamplerStates[0] = s; Game.GraphicsDevice.RasterizerState = new RasterizerState() { CullMode = CullMode.None }; //effect.FogEnabled = true; //effect.FogStart = 120f; //effect.FogEnd = 150f; //effect.FogColor = Color.CornflowerBlue.ToVector3(); effect.TextureEnabled = true; effect.Texture = asset.GetTexture(); effect.EnableDefaultLighting(); effect.AmbientLightColor = new Vector3(0.5f, 0.5f, 0.5f); foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); game.GraphicsDevice.SetVertexBuffer(asset.GetVertexBuffer()); game.GraphicsDevice.Indices = asset.GetIndexBuffer(); game.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, asset.GetVerticesLength(), 0, asset.GetIndicesLength() / 3); } //base.Draw(gameTime); }
private TerrainBlock[] AdjustJoinVertices(TerrainBlock[] terrainSegments) { for (int sD = 0; sD < segmentsDown; sD++) { for (int sA = 0; sA < segmentsAcross; sA++) { TerrainBlock currentBlock = terrainSegments[(sD * sA) + sA]; if(sA == 0) {/*left hand edge piece*/ if (sD == 0) {/*top left corner*/ } else if (sD == segmentsDown - 1) {/*bottom left corner*/ } else {/*left edge*/ } } else if (sA == segmentsAcross - 1) { /*right hand edge piece*/ if (sD == 0) {/*top right corner*/ } else if (sD == segmentsDown - 1) {/*bottom right corner*/ } else {/*right edge*/ } } else { if (sD == 0) { /*top edge piece*/} else if (sD == segmentsDown - 1) { /*bottom edge piece*/} else { /* middle piece*/ } } } } return terrainSegments; }
//Splits a large height map texture into a variety of smaller ones. //Size is defined by TerrainBlock and should be limited to the maximum drawable verticies in one pass private TerrainBlock[] splitMap(Texture2D heightMap) { segmentsAcross = heightMap.Width / TerrainBlock.BLOCK_VERT_WIDTH; segmentsDown = heightMap.Height / TerrainBlock.BLOCK_VERT_WIDTH; TerrainBlock[] terrainBlocks = new TerrainBlock[segmentsAcross * segmentsDown]; for (int sD = 0; sD < segmentsDown; sD++) { for (int sA = 0; sA < segmentsAcross; sA++) { Color[] sectionHeightMapData = new Color[TerrainBlock.BLOCK_VERT_WIDTH * TerrainBlock.BLOCK_VERT_WIDTH]; int offsetX =0 , offsetY = 0; if (sA > 0) offsetX = 1; if (sD > 0) offsetY = 1; heightMap.GetData<Color>(0, new Rectangle((sA * TerrainBlock.BLOCK_VERT_WIDTH)-offsetX, (sD * TerrainBlock.BLOCK_VERT_WIDTH)-offsetY, TerrainBlock.BLOCK_VERT_WIDTH, TerrainBlock.BLOCK_VERT_WIDTH), sectionHeightMapData, 0, TerrainBlock.BLOCK_VERT_WIDTH * TerrainBlock.BLOCK_VERT_WIDTH); Texture2D mapSegment = new Texture2D(game.GraphicsDevice, TerrainBlock.BLOCK_VERT_WIDTH, TerrainBlock.BLOCK_VERT_WIDTH); mapSegment.SetData<Color>(sectionHeightMapData); terrainBlocks[sD * segmentsAcross + sA] = new TerrainBlock(game,mapSegment); terrainBlocks[sD * segmentsAcross + sA].Initialize(); terrainBlocks[sD * segmentsAcross + sA].InitalizeTerrain(new Vector3(sA*TerrainBlock.REAL_BLOCK_WIDTH, 0, sD*TerrainBlock.REAL_BLOCK_WIDTH)); } } return terrainBlocks; }