public void Init(Device device, DeviceContext dc, InitInfo info) { D3DApp.GD3DApp.ProgressUpdate.Draw(0, "Initializing terrain"); Info = info; HeightMap = new HeightMap(Info.HeightMapWidth, Info.HeightMapHeight, Info.HeightScale); if (!string.IsNullOrEmpty(Info.HeightMapFilename)) { D3DApp.GD3DApp.ProgressUpdate.Draw(0.1f, "Loading terrain from file"); HeightMap.LoadHeightmap(Info.HeightMapFilename); } else { D3DApp.GD3DApp.ProgressUpdate.Draw(0.1f, "Generating random terrain"); GenerateRandomTerrain(); D3DApp.GD3DApp.ProgressUpdate.Draw(0.50f, "Smoothing terrain"); HeightMap.Smooth(true); } InitTileMap(); D3DApp.GD3DApp.ProgressUpdate.Draw(0.55f, "Building picking quadtree..."); QuadTree = new QuadTree { Root = BuildQuadTree(new Vector2(0, 0), new Vector2((Info.HeightMapWidth - 1), (Info.HeightMapHeight - 1))) }; Renderer.Init(device, dc, this); }
private void AddUIElements() { _panel = new FlowLayoutPanel { Dock = DockStyle.Top, AutoSize = true, FlowDirection = FlowDirection.LeftToRight }; _generateButton = new Button { Text = "Generate Terrain", AutoSize = true }; _generateButton.Click += (sender, args) => { Window.Cursor = Cursors.WaitCursor; Util.ReleaseCom(ref _terrain); _terrain = new Terrain(); var tii = new InitInfo { HeightMapFilename = null, LayerMapFilename0 = "textures/grass.dds", LayerMapFilename1 = "textures/darkdirt.dds", LayerMapFilename2 = "textures/stone.dds", LayerMapFilename3 = "Textures/lightdirt.dds", LayerMapFilename4 = "textures/snow.dds", BlendMapFilename = null, HeightScale = 50.0f, HeightMapWidth = 2049, HeightMapHeight = 2049, CellSpacing = 0.5f, Seed = (int)_txtSeed.Value, NoiseSize1 = (float) _txtNoise1.Value, Persistence1 =(float) _txtPersistence1.Value, Octaves1 = (int) _txtOctaves1.Value, NoiseSize2 = (float) _txtNoise2.Value, Persistence2 = (float) _txtPersistence2.Value, Octaves2 = (int) _txtOctaves2.Value }; _terrain.Init(Device, ImmediateContext, tii); _camera.Height = _terrain.Height; _hmImg.Image = _terrain.HeightMapImg; Window.Cursor = Cursors.Default; }; var labelPadding = new Padding(0, 6, 0, 0); _lblSeed = new Label { Text = "Seed:", AutoSize = true, Padding = labelPadding }; _txtSeed = new NumericUpDown() { Value = 0, AutoSize = true }; _lblNoise1 = new Label { Text = "Noise:", AutoSize = true, Padding = labelPadding }; _txtNoise1 = new NumericUpDown { Value = 1.0m, DecimalPlaces = 2, Minimum = 0m, Maximum = 10m, Increment = 0.1m, AutoSize = true }; _lblPersistence1 = new Label { Text = "Persistence:", AutoSize = true, Padding = labelPadding }; _txtPersistence1 = new NumericUpDown { Value = 0.7m, DecimalPlaces = 2, Minimum = 0m, Maximum = 10m, Increment = 0.1m, AutoSize = true }; _lblOctaves1 = new Label { Text = "Octaves:", AutoSize = true, Padding = labelPadding }; _txtOctaves1 = new NumericUpDown() { Value =7, AutoSize = true, Minimum = 1, Maximum = 20, }; _lblNoise2 = new Label { Text = "Noise:", AutoSize = true, Padding = labelPadding }; _txtNoise2 = new NumericUpDown { Value = 2.5m, DecimalPlaces = 2, Minimum = 0m, Maximum = 10m, Increment = 0.1m, AutoSize = true }; _lblPersistence2 = new Label { Text = "Persistence:", AutoSize = true, Padding = labelPadding }; _txtPersistence2 = new NumericUpDown { Value = 0.8m, DecimalPlaces = 2, Minimum = 0m, Maximum = 10m, Increment = 0.1m, AutoSize = true }; _lblOctaves2 = new Label { Text = "Octaves:", AutoSize = true, Padding = labelPadding }; _txtOctaves2 = new NumericUpDown() { Value = 3, AutoSize = true, Minimum = 1, Maximum = 20 }; _hmImg = new PictureBox() { Image = _terrain.HeightMapImg, MaximumSize = new Size(64,64), MinimumSize = new Size(64,64), SizeMode = PictureBoxSizeMode.StretchImage, BackColor = Color.White }; _panel.Controls.Add(_lblNoise1); _panel.Controls.Add(_txtNoise1); _panel.Controls.Add(_lblPersistence1); _panel.Controls.Add(_txtPersistence1); _panel.Controls.Add(_lblOctaves1); _panel.Controls.Add(_txtOctaves1); _panel.Controls.Add(_lblNoise2); _panel.Controls.Add(_txtNoise2); _panel.Controls.Add(_lblPersistence2); _panel.Controls.Add(_txtPersistence2); _panel.Controls.Add(_lblOctaves2); _panel.Controls.Add(_txtOctaves2); _panel.SetFlowBreak(_txtOctaves2, true); _panel.Controls.Add(_lblSeed); _panel.Controls.Add(_txtSeed); _panel.Controls.Add(_generateButton); _tblLayout = new TableLayoutPanel { Dock = DockStyle.Top, AutoSize = true }; _tblLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); _tblLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); _tblLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); _tblLayout.Controls.Add(_panel, 0,0); _tblLayout.Controls.Add(_hmImg, 1, 0); Window.Controls.Add(_tblLayout); }
public override bool Init() { if (!base.Init()) return false; Effects.InitAll(Device); InputLayouts.InitAll(Device); RenderStates.InitAll(Device); Patch.InitPatchData(Terrain.CellsPerPatch, Device); _sky = new Sky(Device, "Textures/grasscube1024.dds", 5000.0f); var tii = new InitInfo { HeightMapFilename = null, LayerMapFilename0 = "textures/grass.dds", LayerMapFilename1 = "textures/darkdirt.dds", LayerMapFilename2 = "textures/stone.dds", LayerMapFilename3 = "Textures/lightdirt.dds", LayerMapFilename4 = "textures/snow.dds", BlendMapFilename = null, HeightScale = 50.0f, HeightMapWidth = 2049, HeightMapHeight = 2049, CellSpacing = 0.5f, Seed = 0, NoiseSize1 = 1.0f, Persistence1 = 0.7f, Octaves1 = 7, NoiseSize2 = 2.5f, Persistence2 = 0.8f, Octaves2 = 3 }; _terrain = new Terrain(); _terrain.Init(Device, ImmediateContext, tii); _camera.Height = _terrain.Height; AddUIElements(); return true; }
public void Init(Device device, DeviceContext dc, InitInfo info) { D3DApp.GD3DApp.ProgressUpdate.Draw(0, "Initializing terrain"); if (device.FeatureLevel == FeatureLevel.Level_11_0) { _useTessellation = true; } Info = info; NumPatchVertRows = ((Info.HeightMapHeight - 1) / CellsPerPatch) + 1; NumPatchVertCols = ((Info.HeightMapWidth - 1) / CellsPerPatch) + 1; _numPatchVertices = NumPatchVertRows * NumPatchVertCols; _numPatchQuadFaces = (NumPatchVertRows - 1) * (NumPatchVertCols - 1); if (Info.Material.HasValue) { _material = Info.Material.Value; } _heightMap = new HeightMap(Info.HeightMapWidth, Info.HeightMapHeight, Info.HeightScale); if (!string.IsNullOrEmpty(Info.HeightMapFilename)) { D3DApp.GD3DApp.ProgressUpdate.Draw(0.1f, "Loading terrain from file"); _heightMap.LoadHeightmap(Info.HeightMapFilename); } else { D3DApp.GD3DApp.ProgressUpdate.Draw(0.1f, "Generating random terrain"); GenerateRandomTerrain(); } D3DApp.GD3DApp.ProgressUpdate.Draw(0.50f, "Smoothing terrain"); _heightMap.Smooth(true); D3DApp.GD3DApp.ProgressUpdate.Draw(0.75f, "Building terrain patches"); if (_useTessellation) { CalcAllPatchBoundsY(); BuildQuadPatchVB(device); BuildQuadPatchIB(device); } else { BuildPatches(device); } D3DApp.GD3DApp.ProgressUpdate.Draw(0.85f, "Loading textures"); _heightMapSRV = _heightMap.BuildHeightmapSRV(device); var layerFilenames = new List<string> { Info.LayerMapFilename0 ?? "textures/null.bmp", Info.LayerMapFilename1 ?? "textures/null.bmp", Info.LayerMapFilename2 ?? "textures/null.bmp", Info.LayerMapFilename3 ?? "textures/null.bmp", Info.LayerMapFilename4 ?? "textures/null.bmp" }; _layerMapArraySRV = Util.CreateTexture2DArraySRV(device, dc, layerFilenames.ToArray(), Format.R8G8B8A8_UNorm); if (!string.IsNullOrEmpty(Info.BlendMapFilename)) { D3DApp.GD3DApp.ProgressUpdate.Draw(0.95f, "Loading blendmap from file"); _blendMapSRV = ShaderResourceView.FromFile(device, Info.BlendMapFilename); _blendMapSRV.Resource.DebugName = Info.BlendMapFilename; } else { _blendMapSRV = CreateBlendMap(_heightMap, device); } _bvh = new BVH { Root = BuildBvh(new Vector2(0, 0), new Vector2((Info.HeightMapWidth - 1), (Info.HeightMapHeight - 1))) }; if (DebugBvh) { BuildBVHDebugBuffers(device); } D3DApp.GD3DApp.ProgressUpdate.Draw(1.0f, "Terrain initialized"); }
public override bool Init() { if (!base.Init()) return false; Effects.InitAll(Device); InputLayouts.InitAll(Device); RenderStates.InitAll(Device); Patch.InitPatchData(Terrain.CellsPerPatch, Device); _sky = new Sky(Device, "Textures/grasscube1024.dds", 5000.0f); var tii = new InitInfo { HeightMapFilename = null, LayerMapFilename0 = "textures/grass.png", LayerMapFilename1 = "textures/hills.png", LayerMapFilename2 = "textures/stone.png", LayerMapFilename3 = "Textures/lightdirt.dds", LayerMapFilename4 = "textures/snow.png", Material = new Material() { Ambient = Color.LightGray, Diffuse = Color.LightGray, Specular = new Color4(64, 0, 0, 0) }, BlendMapFilename = null, HeightScale = 50.0f, HeightMapWidth = 2049, HeightMapHeight = 2049, CellSpacing = 0.5f, Seed = MathF.Rand(), NoiseSize1 = 3.0f, Persistence1 = 0.7f, Octaves1 = 7, NoiseSize2 = 2.5f, Persistence2 = 0.8f, Octaves2 = 3, }; _terrain = new Terrain(); //_terrain.DebugQuadTree = true; _terrain.Init(Device, ImmediateContext, tii); _camera.Height = _terrain.Height; _camera.SetLens(0.25f * MathF.PI, AspectRatio, 1.0f, 1000.0f); _ssao = new Ssao(Device, ImmediateContext, ClientWidth, ClientHeight, _camera.FovY, _camera.FarZ); _whiteTex = ShaderResourceView.FromFile(Device, "Textures/white.dds"); _sMap = new ShadowMap(Device, SMapSize, SMapSize); _sceneBounds = new BoundingSphere(new Vector3(), MathF.Sqrt(_terrain.Width * _terrain.Width + _terrain.Depth * _terrain.Depth) / 2); _minimap = new Minimap(Device, ImmediateContext, MinimapSize, MinimapSize, _terrain, _camera); _sphereModel = new BasicModel(); _sphereModel.CreateSphere(Device, 0.25f, 10, 10); _sphereModel.Materials[0] = new Material { Ambient = new Color4(63, 0, 0), Diffuse = Color.Red, Specular = new Color4(32, 1.0f, 1.0f, 1.0f) }; _sphereModel.DiffuseMapSRV[0] = _whiteTex; _sphere = new BasicModelInstance(_sphereModel); _unit = new Unit(_sphere, _terrain.GetTile(511, 511), _terrain); FontCache.RegisterFont("bold", 16, "Courier New", FontWeight.Bold); return true; }
public override bool Init() { if ( ! base.Init()) return false; Effects.InitAll(Device); InputLayouts.InitAll(Device); RenderStates.InitAll(Device); _sky = new Sky(Device, "Textures/grasscube1024.dds", 5000.0f); Patch.InitPatchData(Terrain.CellsPerPatch, Device); var tii = new InitInfo { HeightMapFilename = "Textures/terrain.raw", LayerMapFilename0 = "textures/grass.dds", LayerMapFilename1 = "textures/darkdirt.dds", LayerMapFilename2 = "textures/stone.dds", LayerMapFilename3 = "Textures/lightdirt.dds", LayerMapFilename4 = "textures/snow.dds", BlendMapFilename = "textures/blend.dds", HeightScale = 50.0f, HeightMapWidth = 2049, HeightMapHeight = 2049, CellSpacing = 0.5f }; _terrain = new Terrain(); _terrain.Init(Device, ImmediateContext, tii); _camera.Height = _terrain.Height; _txMgr = new TextureManager(); _txMgr.Init(Device); _treeModel = new BasicModel(Device, _txMgr, "Models/tree.x", "Textures"); _treeInstances = new List<BasicModelInstance>(); for (var i = 0; i < NumTrees; i++) { var good = false; var x = MathF.Rand(0, _terrain.Width); var z = MathF.Rand(0, _terrain.Depth); while (!good) { if (_terrain.Height(x, z) < 12.0f) { good = true; } x = MathF.Rand(-_terrain.Width/2, _terrain.Width/2); z = MathF.Rand(-_terrain.Depth/2, _terrain.Depth/2); } var treeInstance = new BasicModelInstance(_treeModel) { World = Matrix.RotationX(MathF.PI / 2) * Matrix.Translation(x, _terrain.Height(x, z), z) }; _treeInstances.Add(treeInstance); } BuildInstancedBuffer(); return true; }
public override bool Init() { if (!base.Init()) return false; Enable4XMsaa = true; Effects.InitAll(Device); InputLayouts.InitAll(Device); RenderStates.InitAll(Device); _sky = new Sky(Device, "Textures/grasscube1024.dds", 5000.0f); var tii = new InitInfo { HeightMapFilename = "Textures/terrain.raw", LayerMapFilename0 = "textures/grass.dds", LayerMapFilename1 = "textures/darkdirt.dds", LayerMapFilename2 = "textures/stone.dds", LayerMapFilename3 = "Textures/lightdirt.dds", LayerMapFilename4 = "textures/snow.dds", BlendMapFilename = "textures/blend.dds", HeightScale = 50.0f, HeightMapWidth = 2049, HeightMapHeight = 2049, CellSpacing = 0.5f }; Patch.InitPatchData(Terrain.CellsPerPatch, Device); _terrain = new Terrain(); _terrain.Init(Device, ImmediateContext, tii); _randomTex = Util.CreateRandomTexture1DSRV(Device); _flareTexSRV = Util.CreateTexture2DArraySRV(Device, ImmediateContext, new[] {"Textures/flare0.dds"}, Format.R8G8B8A8_UNorm); _fire = new ParticleSystem(); _fire.Init(Device, Effects.FireFX, _flareTexSRV, _randomTex, 500); _fire.EmitPosW = new Vector3(0, 1.0f, 120.0f); _rainTexSRV = Util.CreateTexture2DArraySRV(Device, ImmediateContext, new[] {"Textures/raindrop.dds"}, Format.R8G8B8A8_UNorm); _rain = new ParticleSystem(); _rain.Init(Device, Effects.RainFX, _rainTexSRV, _randomTex, 10000); return true; }
public override bool Init() { if (!base.Init()) return false; Effects.InitAll(Device); InputLayouts.InitAll(Device); RenderStates.InitAll(Device); Patch.InitPatchData(Terrain.CellsPerPatch, Device); _sky = new Sky(Device, "Textures/grasscube1024.dds", 5000.0f); var tii = new InitInfo { HeightMapFilename = null, LayerMapFilename0 = "textures/grass.dds", LayerMapFilename1 = "textures/darkdirt.dds", LayerMapFilename2 = "textures/stone.dds", LayerMapFilename3 = "Textures/lightdirt.dds", LayerMapFilename4 = "textures/snow.dds", BlendMapFilename = null, HeightScale = 50.0f, HeightMapWidth = 2049, HeightMapHeight = 2049, CellSpacing = 0.5f, Seed = 0, NoiseSize1 = 3.0f, Persistence1 = 0.7f, Octaves1 = 7, NoiseSize2 = 2.5f, Persistence2 = 0.8f, Octaves2 = 3, }; _terrain = new Terrain(); _terrain.Init(Device, ImmediateContext, tii); _camera.Height = _terrain.Height; AddUIElements(); _camera.SetLens(0.25f * MathF.PI, AspectRatio, 1.0f, 1000.0f); _ssao = new Ssao(Device, ImmediateContext, ClientWidth, ClientHeight, _camera.FovY, _camera.FarZ); _whiteTex = ShaderResourceView.FromFile(Device, "Textures/white.dds"); _sMap = new ShadowMap(Device, SMapSize, SMapSize); _sceneBounds = new BoundingSphere(new Vector3(), MathF.Sqrt(_terrain.Width * _terrain.Width + _terrain.Depth * _terrain.Depth) / 2); _minimap = new Minimap(Device, ImmediateContext, MinimapSize, MinimapSize, _terrain, _camera); return true; }
public override bool Init() { if (!base.Init()) return false; Effects.InitAll(Device); InputLayouts.InitAll(Device); RenderStates.InitAll(Device); Patch.InitPatchData(Terrain.CellsPerPatch, Device); _sky = new Sky(Device, "Textures/grasscube1024.dds", 5000.0f); var tii = new InitInfo { HeightMapFilename = null, LayerMapFilename0 = "textures/grass.dds", LayerMapFilename1 = "textures/darkdirt.dds", LayerMapFilename2 = "textures/stone.dds", LayerMapFilename3 = "Textures/lightdirt.dds", LayerMapFilename4 = "textures/snow.dds", BlendMapFilename = null, HeightScale = 50.0f, HeightMapWidth = 2049, HeightMapHeight = 2049, CellSpacing = 0.5f, Seed = 0, NoiseSize1 = 3.0f, Persistence1 = 0.7f, Octaves1 = 7, NoiseSize2 = 2.5f, Persistence2 = 0.8f, Octaves2 = 3, }; _terrain = new Terrain(); _terrain.Init(Device, ImmediateContext, tii); _camera.Height = _terrain.Height; _camera.SetLens(0.25f * MathF.PI, AspectRatio, 1.0f, 1000.0f); _ssao = new Ssao(Device, ImmediateContext, ClientWidth, ClientHeight, _camera.FovY, _camera.FarZ); _whiteTex = ShaderResourceView.FromFile(Device, "Textures/white.dds"); BuildScreenQuadGeometryBuffers(); _sMap = new ShadowMap(Device, SMapSize, SMapSize); _sceneBounds = new BoundingSphere(new Vector3(), MathF.Sqrt(_terrain.Width * _terrain.Width + _terrain.Depth * _terrain.Depth) / 2); _minimap = new Minimap(Device, ImmediateContext, MinimapSize, MinimapSize, _terrain, _camera); _sphereModel = BasicModel.CreateSphere(Device, 0.25f, 10, 10); _sphereModel.Materials[0] = new Material { Ambient = Color.Red, Diffuse = Color.Red, Specular = new Color4(32, 1.0f, 1.0f, 1.0f) }; _sphereModel.DiffuseMapSRV[0] = _whiteTex; _sphere = new BasicModelInstance {Model = _sphereModel}; _spherePos = new Vector3(float.MaxValue); return true; }