diff --git a/Vocaluxe/Base/CUtility.cs b/Vocaluxe/Base/CUtility.cs index 4eca0857..4f98fbc4 100644 --- a/Vocaluxe/Base/CUtility.cs +++ b/Vocaluxe/Base/CUtility.cs @@ -14,7 +14,7 @@ using Vocaluxe.Lib.Draw; namespace Vocaluxe.Base { [Flags] - public enum Modifier + public enum EModifier { None, Shift, @@ -22,8 +22,17 @@ namespace Vocaluxe.Base Ctrl } + public enum ESender + { + Mouse, + Keyboard, + WiiMote, + Gamepad + } + public struct KeyEvent { + public ESender Sender; public bool ModALT; public bool ModSHIFT; public bool ModCTRL; @@ -31,10 +40,11 @@ namespace Vocaluxe.Base public bool Handled; public Keys Key; public Char Unicode; - public Modifier Mod; + public EModifier Mod; - public KeyEvent(bool alt, bool shift, bool ctrl, bool pressed, char unicode, Keys key) + public KeyEvent(ESender sender, bool alt, bool shift, bool ctrl, bool pressed, char unicode, Keys key) { + Sender = sender; ModALT = alt; ModSHIFT = shift; ModCTRL = ctrl; @@ -43,21 +53,21 @@ namespace Vocaluxe.Base Key = key; Handled = false; - Modifier mALT = Modifier.None; - Modifier mSHIFT = Modifier.None; - Modifier mCTRL = Modifier.None; + EModifier mALT = EModifier.None; + EModifier mSHIFT = EModifier.None; + EModifier mCTRL = EModifier.None; if (alt) - mALT = Modifier.Alt; + mALT = EModifier.Alt; if (shift) - mSHIFT = Modifier.Shift; + mSHIFT = EModifier.Shift; if (ctrl) - mCTRL = Modifier.Ctrl; + mCTRL = EModifier.Ctrl; if (!alt && !shift && !ctrl) - Mod = Modifier.None; + Mod = EModifier.None; else Mod = mALT | mSHIFT | mCTRL; } @@ -65,6 +75,7 @@ namespace Vocaluxe.Base public struct MouseEvent { + public ESender Sender; public int X; public int Y; public bool LB; //left button click @@ -80,11 +91,12 @@ namespace Vocaluxe.Base public bool ModSHIFT; public bool ModCTRL; - public Modifier Mod; + public EModifier Mod; public int Wheel; - public MouseEvent(bool alt, bool shift, bool ctrl, int x, int y, bool lb, bool ld, bool rb, int wheel, bool lbh, bool rbh, bool mb, bool mbh) + public MouseEvent(ESender sender, bool alt, bool shift, bool ctrl, int x, int y, bool lb, bool ld, bool rb, int wheel, bool lbh, bool rbh, bool mb, bool mbh) { + Sender = sender; X = x; Y = y; LB = lb; @@ -100,21 +112,21 @@ namespace Vocaluxe.Base ModSHIFT = shift; ModCTRL = ctrl; - Modifier mALT = Modifier.None; - Modifier mSHIFT = Modifier.None; - Modifier mCTRL = Modifier.None; + EModifier mALT = EModifier.None; + EModifier mSHIFT = EModifier.None; + EModifier mCTRL = EModifier.None; if (alt) - mALT = Modifier.Alt; + mALT = EModifier.Alt; if (shift) - mSHIFT = Modifier.Shift; + mSHIFT = EModifier.Shift; if (ctrl) - mCTRL = Modifier.Ctrl; + mCTRL = EModifier.Ctrl; if (!alt && !shift && !ctrl) - Mod = Modifier.None; + Mod = EModifier.None; else Mod = mALT | mSHIFT | mCTRL; @@ -223,7 +235,7 @@ namespace Vocaluxe.Base if (!_timer.IsRunning || (_timer.ElapsedMilliseconds > 75) || !KeyRepeat) { - KeyEvent pool = new KeyEvent(alt, shift, ctrl, pressed && (unicode != Char.MinValue), unicode, key); + KeyEvent pool = new KeyEvent(ESender.Keyboard, alt, shift, ctrl, pressed && (unicode != Char.MinValue), unicode, key); lock (_CopyLock) { @@ -360,7 +372,7 @@ namespace Vocaluxe.Base x = (int)((float)x * (float)CSettings.iRenderW / (float)CDraw.GetScreenWidth()); y = (int)((float)y * (float)CSettings.iRenderH / (float)CDraw.GetScreenHeight()); - MouseEvent pool = new MouseEvent(alt, shift, ctrl, x, y, lb, ld, rb, -wheel / 120, lbh, rbh, mb, mbh); + MouseEvent pool = new MouseEvent(ESender.Mouse, alt, shift, ctrl, x, y, lb, ld, rb, -wheel / 120, lbh, rbh, mb, mbh); lock (_CopyLock) { diff --git a/Vocaluxe/Lib/Draw/IDraw.cs b/Vocaluxe/Lib/Draw/IDraw.cs index 9a7bf1d6..7f39b5b0 100644 --- a/Vocaluxe/Lib/Draw/IDraw.cs +++ b/Vocaluxe/Lib/Draw/IDraw.cs @@ -63,6 +63,20 @@ namespace Vocaluxe.Lib.Draw } } + public struct SPoint3f + { + public float X; + public float Y; + public float Z; + } + + public struct SPoint3 + { + public int X; + public int Y; + public int Z; + } + public struct STexture { public int index; diff --git a/Vocaluxe/Menu/CGraphics.cs b/Vocaluxe/Menu/CGraphics.cs index b309938a..797a454e 100644 --- a/Vocaluxe/Menu/CGraphics.cs +++ b/Vocaluxe/Menu/CGraphics.cs @@ -331,6 +331,7 @@ namespace Vocaluxe.Menu CSound.Update(); CBackgroundMusic.Update(); + CInput.Update(); if (CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_DYNAMIC && _CurrentScreen != EScreens.ScreenSing) CSongs.LoadCover(30L, 1); @@ -450,13 +451,21 @@ namespace Vocaluxe.Menu { KeyEvent KeyEvent = new KeyEvent(); MouseEvent MouseEvent = new MouseEvent(); + KeyEvent InputKeyEvent = new KeyEvent(); + MouseEvent InputMouseEvent = new MouseEvent(); bool PopupPlayerControlAllowed = _CurrentScreen != EScreens.ScreenOptionsRecord && _CurrentScreen != EScreens.ScreenSing && _CurrentScreen != EScreens.ScreenSong && _CurrentScreen != EScreens.ScreenCredits; bool Resume = true; - while (keys.PollEvent(ref KeyEvent)) + bool EventsAvailable = false; + bool InputEventsAvailable = CInput.PollKeyEvent(ref InputKeyEvent); + + while ((EventsAvailable = keys.PollEvent(ref KeyEvent)) || InputEventsAvailable) { + if (!EventsAvailable) + KeyEvent = InputKeyEvent; + if (KeyEvent.Key == Keys.Left || KeyEvent.Key == Keys.Right || KeyEvent.Key == Keys.Up || KeyEvent.Key == Keys.Down) { CSettings.MouseInactive(); @@ -495,10 +504,18 @@ namespace Vocaluxe.Menu Resume &= _Screens[(int)_CurrentScreen].HandleInput(KeyEvent); } } + + if (!EventsAvailable) + InputEventsAvailable = CInput.PollKeyEvent(ref InputKeyEvent); } - while (Mouse.PollEvent(ref MouseEvent)) + InputEventsAvailable = CInput.PollMouseEvent(ref InputMouseEvent); + + while ((EventsAvailable = Mouse.PollEvent(ref MouseEvent)) || InputEventsAvailable) { + if (!EventsAvailable) + MouseEvent = InputMouseEvent; + if (MouseEvent.Wheel != 0) { CSettings.MouseActive(); @@ -522,7 +539,10 @@ namespace Vocaluxe.Menu handled = _PopupScreens[(int)_CurrentPopupScreen].HandleMouse(MouseEvent); if (!handled && !_Fading && (_Cursor.IsActive || MouseEvent.LB || MouseEvent.RB || MouseEvent.MB)) - Resume &= _Screens[(int)_CurrentScreen].HandleMouse(MouseEvent); + Resume &= _Screens[(int)_CurrentScreen].HandleMouse(MouseEvent); + + if (!EventsAvailable) + InputEventsAvailable = CInput.PollMouseEvent(ref InputMouseEvent); } return Resume; } diff --git a/Vocaluxe/Menu/CMenu.cs b/Vocaluxe/Menu/CMenu.cs index fd4aed88..a1e2ef51 100644 --- a/Vocaluxe/Menu/CMenu.cs +++ b/Vocaluxe/Menu/CMenu.cs @@ -877,7 +877,7 @@ namespace Vocaluxe.Menu { if (KeyEvent.Key == Keys.Left) { - if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.TSelectSlide && KeyEvent.Mod != Modifier.Shift) + if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.TSelectSlide && KeyEvent.Mod != EModifier.Shift) KeyEvent.Handled = PrevElement(); else KeyEvent.Handled = _NextInteraction(KeyEvent); @@ -885,7 +885,7 @@ namespace Vocaluxe.Menu if (KeyEvent.Key == Keys.Right) { - if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.TSelectSlide && KeyEvent.Mod != Modifier.Shift) + if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.TSelectSlide && KeyEvent.Mod != EModifier.Shift) KeyEvent.Handled = NextElement(); else KeyEvent.Handled = _NextInteraction(KeyEvent); @@ -900,7 +900,7 @@ namespace Vocaluxe.Menu { if (KeyEvent.Key == Keys.Tab) { - if (KeyEvent.Mod == Modifier.Shift) + if (KeyEvent.Mod == EModifier.Shift) PrevInteraction(); else NextInteraction(); @@ -955,40 +955,40 @@ namespace Vocaluxe.Menu break; case Keys.Up: - if (KeyEvent.Mod == Modifier.Ctrl) + if (KeyEvent.Mod == EModifier.Ctrl) MoveElement(0, -1); - if (KeyEvent.Mod == Modifier.Shift) + if (KeyEvent.Mod == EModifier.Shift) ResizeElement(0, 1); break; case Keys.Down: - if (KeyEvent.Mod == Modifier.Ctrl) + if (KeyEvent.Mod == EModifier.Ctrl) MoveElement(0, 1); - if (KeyEvent.Mod == Modifier.Shift) + if (KeyEvent.Mod == EModifier.Shift) ResizeElement(0, -1); break; case Keys.Right: - if (KeyEvent.Mod == Modifier.Ctrl) + if (KeyEvent.Mod == EModifier.Ctrl) MoveElement(1, 0); - if (KeyEvent.Mod == Modifier.Shift) + if (KeyEvent.Mod == EModifier.Shift) ResizeElement(1, 0); - if (KeyEvent.Mod == Modifier.None) + if (KeyEvent.Mod == EModifier.None) NextInteraction(); break; case Keys.Left: - if (KeyEvent.Mod == Modifier.Ctrl) + if (KeyEvent.Mod == EModifier.Ctrl) MoveElement(-1, 0); - if (KeyEvent.Mod == Modifier.Shift) + if (KeyEvent.Mod == EModifier.Shift) ResizeElement(-1, 0); - if (KeyEvent.Mod == Modifier.None) + if (KeyEvent.Mod == EModifier.None) PrevInteraction(); break; } @@ -1005,7 +1005,7 @@ namespace Vocaluxe.Menu int stepX = 0; int stepY = 0; - if ((MouseEvent.Mod & Modifier.Ctrl) == Modifier.Ctrl) + if ((MouseEvent.Mod & EModifier.Ctrl) == EModifier.Ctrl) { _PrevMouseX = MouseEvent.X; _PrevMouseY = MouseEvent.Y; @@ -1039,16 +1039,16 @@ namespace Vocaluxe.Menu { //if (IsMouseOver(MouseEvent.X, _PrevMouseY)) //{ - if (MouseEvent.Mod == Modifier.None) + if (MouseEvent.Mod == EModifier.None) MoveElement(stepX, stepY); - if (MouseEvent.Mod == Modifier.Ctrl) + if (MouseEvent.Mod == EModifier.Ctrl) MoveElement(_MouseDX, _MouseDY); - if (MouseEvent.Mod == Modifier.Shift) + if (MouseEvent.Mod == EModifier.Shift) ResizeElement(stepX, stepY); - if (MouseEvent.Mod == (Modifier.Shift | Modifier.Ctrl)) + if (MouseEvent.Mod == (EModifier.Shift | EModifier.Ctrl)) ResizeElement(_MouseDX, _MouseDY); //} } diff --git a/Vocaluxe/Menu/CObjectInteractions.cs b/Vocaluxe/Menu/CObjectInteractions.cs index f6363187..70a4a726 100644 --- a/Vocaluxe/Menu/CObjectInteractions.cs +++ b/Vocaluxe/Menu/CObjectInteractions.cs @@ -123,7 +123,7 @@ namespace Vocaluxe.Menu { if (KeyEvent.Key == Keys.Left) { - if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.TSelectSlide && KeyEvent.Mod != Modifier.Shift) + if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.TSelectSlide && KeyEvent.Mod != EModifier.Shift) KeyEvent.Handled = PrevElement(); else KeyEvent.Handled = _NextInteraction(KeyEvent); @@ -131,7 +131,7 @@ namespace Vocaluxe.Menu if (KeyEvent.Key == Keys.Right) { - if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.TSelectSlide && KeyEvent.Mod != Modifier.Shift) + if (_Interactions.Count > 0 && _Interactions[_Selection].Type == EType.TSelectSlide && KeyEvent.Mod != EModifier.Shift) KeyEvent.Handled = NextElement(); else KeyEvent.Handled = _NextInteraction(KeyEvent); @@ -146,7 +146,7 @@ namespace Vocaluxe.Menu { if (KeyEvent.Key == Keys.Tab) { - if (KeyEvent.Mod == Modifier.Shift) + if (KeyEvent.Mod == EModifier.Shift) PrevInteraction(); else NextInteraction(); @@ -197,40 +197,40 @@ namespace Vocaluxe.Menu break; case Keys.Up: - if (KeyEvent.Mod == Modifier.Ctrl) + if (KeyEvent.Mod == EModifier.Ctrl) MoveElement(0, -1); - if (KeyEvent.Mod == Modifier.Shift) + if (KeyEvent.Mod == EModifier.Shift) ResizeElement(0, 1); break; case Keys.Down: - if (KeyEvent.Mod == Modifier.Ctrl) + if (KeyEvent.Mod == EModifier.Ctrl) MoveElement(0, 1); - if (KeyEvent.Mod == Modifier.Shift) + if (KeyEvent.Mod == EModifier.Shift) ResizeElement(0, -1); break; case Keys.Right: - if (KeyEvent.Mod == Modifier.Ctrl) + if (KeyEvent.Mod == EModifier.Ctrl) MoveElement(1, 0); - if (KeyEvent.Mod == Modifier.Shift) + if (KeyEvent.Mod == EModifier.Shift) ResizeElement(1, 0); - if (KeyEvent.Mod == Modifier.None) + if (KeyEvent.Mod == EModifier.None) NextInteraction(); break; case Keys.Left: - if (KeyEvent.Mod == Modifier.Ctrl) + if (KeyEvent.Mod == EModifier.Ctrl) MoveElement(-1, 0); - if (KeyEvent.Mod == Modifier.Shift) + if (KeyEvent.Mod == EModifier.Shift) ResizeElement(-1, 0); - if (KeyEvent.Mod == Modifier.None) + if (KeyEvent.Mod == EModifier.None) PrevInteraction(); break; } @@ -247,7 +247,7 @@ namespace Vocaluxe.Menu int stepX = 0; int stepY = 0; - if ((MouseEvent.Mod & Modifier.Ctrl) == Modifier.Ctrl) + if ((MouseEvent.Mod & EModifier.Ctrl) == EModifier.Ctrl) { _PrevMouseX = MouseEvent.X; _PrevMouseY = MouseEvent.Y; @@ -281,16 +281,16 @@ namespace Vocaluxe.Menu { //if (IsMouseOver(MouseEvent.X, _PrevMouseY)) //{ - if (MouseEvent.Mod == Modifier.None) + if (MouseEvent.Mod == EModifier.None) MoveElement(stepX, stepY); - if (MouseEvent.Mod == Modifier.Ctrl) + if (MouseEvent.Mod == EModifier.Ctrl) MoveElement(_MouseDX, _MouseDY); - if (MouseEvent.Mod == Modifier.Shift) + if (MouseEvent.Mod == EModifier.Shift) ResizeElement(stepX, stepY); - if (MouseEvent.Mod == (Modifier.Shift | Modifier.Ctrl)) + if (MouseEvent.Mod == (EModifier.Shift | EModifier.Ctrl)) ResizeElement(_MouseDX, _MouseDY); //} } diff --git a/Vocaluxe/Menu/CPlaylist.cs b/Vocaluxe/Menu/CPlaylist.cs index 575c267e..69dbf8c9 100644 --- a/Vocaluxe/Menu/CPlaylist.cs +++ b/Vocaluxe/Menu/CPlaylist.cs @@ -142,6 +142,11 @@ namespace Vocaluxe.Menu if (!value) { + if (_EditMode == EEditMode.ChangeOrder && ChangeOrderSource != -1 && PlaylistElements.Count > ChangeOrderSource) + { + CPlaylists.Playlists[ActivePlaylistID].DeleteSong(PlaylistElements[ChangeOrderSource].Content); + UpdatePlaylist(); + } ChangeOrderSource = -1; _EditMode = EEditMode.None; } diff --git a/Vocaluxe/Menu/SongMenu/CSongMenuDreidel.cs b/Vocaluxe/Menu/SongMenu/CSongMenuDreidel.cs index 6a4aae66..b417d791 100644 --- a/Vocaluxe/Menu/SongMenu/CSongMenuDreidel.cs +++ b/Vocaluxe/Menu/SongMenu/CSongMenuDreidel.cs @@ -12,6 +12,7 @@ namespace Vocaluxe.Menu.SongMenu { class CSongMenuDreidel : CSongMenuFramework { + /* private SRectF _ScrollRect; private CStatic _CoverBig; private CStatic _TextBG; @@ -29,7 +30,7 @@ namespace Vocaluxe.Menu.SongMenu { return _actualSelection; } - + */ public override void Init() { base.Init(); diff --git a/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs b/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs index 4d9336e1..47710511 100644 --- a/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs +++ b/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs @@ -320,6 +320,7 @@ namespace Vocaluxe.Menu.SongMenu int i = 0; bool sel = false; + int lastselection = _actualSelection; foreach (CStatic tile in _Tiles) { if ((tile.Texture.index != _CoverTexture.index) && CHelper.IsInBounds(tile.Rect, MouseEvent) && !sel) @@ -345,6 +346,9 @@ namespace Vocaluxe.Menu.SongMenu i++; } + if (MouseEvent.Sender == ESender.WiiMote && _actualSelection != lastselection && _actualSelection != -1) + CInput.SetRumble(0.050f); + if (!sel) _actualSelection = -1; diff --git a/Vocaluxe/Program.cs b/Vocaluxe/Program.cs index a7ca0de1..8cd97f60 100644 --- a/Vocaluxe/Program.cs +++ b/Vocaluxe/Program.cs @@ -138,6 +138,11 @@ namespace Vocaluxe Application.DoEvents(); + // Init Input + CLog.StartBenchmark(0, "Init Input"); + CInput.Init(); + CLog.StopBenchmark(0, "Init Input"); + // Init Game; CLog.StartBenchmark(0, "Init Game"); CGame.Init(); @@ -173,6 +178,7 @@ namespace Vocaluxe // Unloading try { + CInput.Close(); CSound.RecordCloseAll(); CSound.CloseAllStreams(); CVideo.VdCloseAll(); diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index 9a0b0e71..9c591620 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.cs @@ -206,11 +206,11 @@ namespace Vocaluxe.Screens //TODO: Delete it! ??? Shouldn't we keep this as shortcut? case Keys.A: - if (!_SearchActive && KeyEvent.Mod == Modifier.None) + if (!_SearchActive && KeyEvent.Mod == EModifier.None) { StartRandomAllSongs(); } - if (KeyEvent.Mod == Modifier.Ctrl) + if (KeyEvent.Mod == EModifier.Ctrl) { StartRandomVisibleSongs(); } @@ -218,7 +218,7 @@ namespace Vocaluxe.Screens //TODO: Delete that from here and from wiki! case Keys.F: - if (KeyEvent.Mod == Modifier.Ctrl) + if (KeyEvent.Mod == EModifier.Ctrl) { if (_SearchActive) { @@ -235,11 +235,11 @@ namespace Vocaluxe.Screens //TODO: We need another key for random! case Keys.R: - if (!_SearchActive && CSongs.Category != -1 && KeyEvent.Mod == Modifier.Ctrl) + if (!_SearchActive && CSongs.Category != -1 && KeyEvent.Mod == EModifier.Ctrl) { SongMenus[htSongMenus(SongMenu)].SetSelectedSong(CSongs.GetRandomSong()); } - else if (CSongs.Category == -1 && KeyEvent.Mod == Modifier.Ctrl) + else if (CSongs.Category == -1 && KeyEvent.Mod == EModifier.Ctrl) { SongMenus[htSongMenus(SongMenu)].SetSelectedCategory(CSongs.GetRandomCategory()); } diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj index 156dd856..6110d5a7 100644 --- a/Vocaluxe/Vocaluxe.csproj +++ b/Vocaluxe/Vocaluxe.csproj @@ -152,7 +152,6 @@ ..\Output\OpenTK.GLControl.dll - @@ -167,6 +166,7 @@ + @@ -189,6 +189,10 @@ Form + + + +