Example #1
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}";
        }