public static bool Load(string name, TerrainRenderer terrain, AssetRenderer assets) { var path = getMapPath(name); if (!File.Exists(path)) { return(false); } using (var stream = File.Open(path, FileMode.Open)) using (var decompressedStream = new GZipStream(stream, CompressionMode.Decompress)) { var binarySerializer = Binary.Create(); MapData = binarySerializer.Read <MapDataContainer>(decompressedStream); } terrain.HeightMap.Heights = MapData.TerrainElevations; terrain.Update(); terrain.HeightMap.Update(); terrain.SplatMap.Refresh(); assets.Refresh(terrain); return(true); }
protected override void OnUpdateFrame(FrameEventArgs e) { var mouse = Mouse.GetCursorState(); State.Mouse.Set(PointToClient(new Point(mouse.X, mouse.Y)), mouse); State.Time.Set(e.Time); var uiIntersect = ui.Update(); if (Focused && Ui.State.Focused == null) { if (State.Mouse.ScrollDelta > 0) { camera.Zoom(-0.2f); } if (State.Mouse.ScrollDelta < 0) { camera.Zoom(0.2f); } if (mouse.MiddleButton == ButtonState.Pressed || State.Keyboard.Key[Key.ShiftLeft]) { camera.Rotate(State.Mouse.Delta); } if (State.Keyboard.Key[Key.W]) { camera.Move(new Vector3(0.0f, 0.0f, 1.0f)); } if (State.Keyboard.Key[Key.S]) { camera.Move(new Vector3(0.0f, 0.0f, -1.0f)); } if (State.Keyboard.Key[Key.A]) { camera.Move(new Vector3(1.0f, 0.0f, 0.0f)); } if (State.Keyboard.Key[Key.D]) { camera.Move(new Vector3(-1.0f, 0.0f, 0.0f)); } if (State.Keyboard.Key[Key.Up]) { light.Rotation.Y += 0.01f; } if (State.Keyboard.Key[Key.Down]) { light.Rotation.Y -= 0.01f; } if (State.Keyboard.Key[Key.Left]) { light.Rotation.X += 0.01f; } if (State.Keyboard.Key[Key.Right]) { light.Rotation.X -= 0.01f; } } camera.Update((float)e.Time); light.Update(); shadows.Update(camera, light); terrain.Update(); if (!uiIntersect) { switch (State.SelectedTool) { case UiKeys.Terrain.ElevationTool: if (mouse.LeftButton == ButtonState.Pressed) { terrain.HeightMap.Sculpt(State.TerrainMousePosition, 0.1f); assets.Refresh(terrain); } else if (mouse.RightButton == ButtonState.Pressed) { terrain.HeightMap.Sculpt(State.TerrainMousePosition, -0.1f); assets.Refresh(terrain); } break; case UiKeys.Terrain.SmudgeTool: if (mouse.LeftButton == ButtonState.Pressed) { terrain.HeightMap.Smudge(State.TerrainMousePosition); assets.Refresh(terrain); } break; case UiKeys.SplatMap.AutoPaint: if (mouse.LeftButton == ButtonState.Pressed) { terrain.SplatMap.AutoPaint(terrain.HeightMap, terrain.NormalMap, State.TerrainMousePosition); } break; case UiKeys.SplatMap.Paint: if (mouse.LeftButton == ButtonState.Pressed) { terrain.SplatMap.Paint(State.TerrainMousePosition, byte.Parse(State.SelectedToolData)); } break; case UiKeys.Assets.Asset: if (mouse.LeftButton == ButtonState.Pressed && !Ui.State.MouseRepeat) { assets.Add(State.TerrainMousePosition.Xz, terrain, State.SelectedToolData); } break; case UiKeys.Assets.Erase: if (mouse.LeftButton == ButtonState.Pressed) { assets.Remove(State.TerrainMousePosition.Xz, terrain); } break; } } else if (Ui.State.MousePressed) { switch (Ui.State.Hover?.Key) { case UiKeys.Terrain.LevelRaise: terrain.HeightMap.ChangeSettings(0.1f, 1.0f); assets.Refresh(terrain); break; case UiKeys.Terrain.LevelLower: terrain.HeightMap.ChangeSettings(-0.1f, 1.0f); assets.Refresh(terrain); break; case UiKeys.Terrain.StrengthIncrease: terrain.HeightMap.ChangeSettings(0.0f, 1.02f); assets.Refresh(terrain); break; case UiKeys.Terrain.StrengthDecrease: terrain.HeightMap.ChangeSettings(0.0f, 0.98f); assets.Refresh(terrain); break; case UiKeys.SplatMap.AutoPaintGlobal: ui.ShowModal(new ConfirmModal("Auto Paint?", "This action will overwrite all current textures!", () => { terrain.SplatMap.AutoPaint(terrain.HeightMap, terrain.NormalMap); ui.CloseModals(); })); break; } } Title = $"Larx (Vsync: {VSync}) - FPS: {State.Time.FPS}"; }