Exemple #1
0
        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);
        }
Exemple #2
0
        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}";
        }