diff --git a/Output/Languages/Deutsch.xml b/Output/Languages/Deutsch.xml index be0b28c6..ecb1c632 100644 --- a/Output/Languages/Deutsch.xml +++ b/Output/Languages/Deutsch.xml @@ -88,6 +88,10 @@ Eigene Musik und Hintergrundmusik Keine eigene Musik Nur eigene Musik + + Alle + Nur Namen und Avatar + Keine Laden @@ -101,11 +105,17 @@ Profile Spielerauswahl - 1 Spieler - 2 Spieler - 3 Spieler - Warnung: Dem Spieler %v ist kein Mikrofon zugeordnet! - Warnung: Den Spielern %v sind keine Mikrofone zugeordnet! + Spieler + 1 Spieler + 2 Spieler + 3 Spieler + 4 Spieler + 5 Spieler + 6 Spieler + Warnung: Dem Spieler %v ist kein Mikrofon zugeordnet! + Warnung: Den Spielern %v sind keine Mikrofone zugeordnet! + Warnung: Dem Spieler %v ist kein Profil zugeordnet! + Warnung: Den Spielern %v sind keine Profile zugeordnet! Songauswahl Suche: @@ -174,11 +184,13 @@ Noten-Linien anzeigen Ton-Helfer anzeigen Aussehen des Timers + Spieler-Infos ein/ausblenden Cover Ladeverhalten Videoeinstellungen Video-Hintergründe Video-Vorschau Videos während des Singens + Videos der Hintergrundmusik diff --git a/Output/Languages/English.xml b/Output/Languages/English.xml index 50a87ba8..e40c62d2 100644 --- a/Output/Languages/English.xml +++ b/Output/Languages/English.xml @@ -88,6 +88,10 @@ Own Music and Background Music No own Music Only own Music + + All + Only names and avatars + Nothing Loading @@ -101,11 +105,17 @@ Profiles Player Selection - 1 Player - 2 Player - 3 Player - Warning: There is no mic assigned to player %v! - Warning: There are no mics assigned to players %v! + Player + 1 Player + 2 Player + 3 Player + 4 Player + 5 Player + 6 Player + Warning: There is no mic assigned to player %v! + Warning: There are no mics assigned to players %v! + Warning: There is no profile assigned to player %v! + Warning: There are no profiles assigned to players %v! Song Selection Search: @@ -174,11 +184,13 @@ Show Note-Lines Show Tone-Helper Timer-Look + Fade player-info Cover Loading Behavior Video Options Video Backgrounds Video Preview Videos while singing + Display current backgroundmusic video diff --git a/Output/Languages/French.xml b/Output/Languages/French.xml index 2c2f7944..f60e82a3 100644 --- a/Output/Languages/French.xml +++ b/Output/Languages/French.xml @@ -101,11 +101,17 @@ Profils Sélection des joueurs - 1 joueur - 2 joueurs - 3 joueurs - Attention: Aucun micro n'est assigné au joueur %v! - Attention: Aucun micro n'est assigné aux joueurs %v! + Joueur + 1 joueur + 2 joueurs + 3 joueurs + 4 joueurs + 5 joueurs + 6 joueurs + Attention: Aucun micro n'est assigné au joueur %v! + Attention: Aucun micro n'est assigné aux joueurs %v! + Attention: Aucun profil n'est assigné au joueur %v! + Attention: Aucun profils n'est assigné aux joueurs %v! Choix de la chanson Rechercher: @@ -180,5 +186,6 @@ Vidéo en arrière plan Prévisualisation des Vidéos Vidéos pendant que l'on chante + Afficher la vidéo de la musique de fond diff --git a/Output/Languages/Spanish.xml b/Output/Languages/Spanish.xml index d304e24c..483e30a3 100644 --- a/Output/Languages/Spanish.xml +++ b/Output/Languages/Spanish.xml @@ -101,11 +101,17 @@ Perfiles Selección de Jugadores - Jugador 1 - Jugador 2 - Jugador 3 - Advertencia: ¡No hay micrófonos asignados al jugador %v! - Advertencia: ¡No hay micrófonos asignados a los jugadores %v! + Jugador + Jugador 1 + Jugador 2 + Jugador 3 + Jugador 4 + Jugador 5 + Jugador 6 + Advertencia: ¡No hay micrófonos asignados al jugador %v! + Advertencia: ¡No hay micrófonos asignados a los jugadores %v! + Advertencia: ¡No hay perfil asignados al jugador %v! + Advertencia: ¡No hay perfiles asignados a los jugadores %v! Selección de Canciones Buscar: @@ -180,5 +186,6 @@ Videos de Fondo Previsualización del Video Videos al Cantar + TODO: Display current backgroundmusic video diff --git a/Output/Themes/Ambient/NextIcon.png b/Output/Themes/Ambient/NextIcon.png new file mode 100644 index 00000000..fb6bf6c4 Binary files /dev/null and b/Output/Themes/Ambient/NextIcon.png differ diff --git a/Output/Themes/Ambient/PauseIcon.png b/Output/Themes/Ambient/PauseIcon.png new file mode 100644 index 00000000..6f9c8870 Binary files /dev/null and b/Output/Themes/Ambient/PauseIcon.png differ diff --git a/Output/Themes/Ambient/PlayIcon.png b/Output/Themes/Ambient/PlayIcon.png new file mode 100644 index 00000000..5f34140b Binary files /dev/null and b/Output/Themes/Ambient/PlayIcon.png differ diff --git a/Output/Themes/Ambient/PlayerSelector.png b/Output/Themes/Ambient/PlayerSelector.png new file mode 100644 index 00000000..c57ab300 Binary files /dev/null and b/Output/Themes/Ambient/PlayerSelector.png differ diff --git a/Output/Themes/Ambient/PreviousIcon.png b/Output/Themes/Ambient/PreviousIcon.png new file mode 100644 index 00000000..9a92bf23 Binary files /dev/null and b/Output/Themes/Ambient/PreviousIcon.png differ diff --git a/Output/Themes/Ambient/RepeatIcon.png b/Output/Themes/Ambient/RepeatIcon.png new file mode 100644 index 00000000..6675a41a Binary files /dev/null and b/Output/Themes/Ambient/RepeatIcon.png differ diff --git a/Output/Themes/Ambient/Resources/NextIcon.psd b/Output/Themes/Ambient/Resources/NextIcon.psd new file mode 100644 index 00000000..a6af8829 Binary files /dev/null and b/Output/Themes/Ambient/Resources/NextIcon.psd differ diff --git a/Output/Themes/Ambient/Resources/PauseIcon.psd b/Output/Themes/Ambient/Resources/PauseIcon.psd new file mode 100644 index 00000000..2046e471 Binary files /dev/null and b/Output/Themes/Ambient/Resources/PauseIcon.psd differ diff --git a/Output/Themes/Ambient/Resources/PlayIcon.psd b/Output/Themes/Ambient/Resources/PlayIcon.psd new file mode 100644 index 00000000..ba63fc5c Binary files /dev/null and b/Output/Themes/Ambient/Resources/PlayIcon.psd differ diff --git a/Output/Themes/Ambient/Resources/PreviousIcon.psd b/Output/Themes/Ambient/Resources/PreviousIcon.psd new file mode 100644 index 00000000..0e5756eb Binary files /dev/null and b/Output/Themes/Ambient/Resources/PreviousIcon.psd differ diff --git a/Output/Themes/Ambient/Resources/RepeatIcon.psd b/Output/Themes/Ambient/Resources/RepeatIcon.psd new file mode 100644 index 00000000..cd1a0637 Binary files /dev/null and b/Output/Themes/Ambient/Resources/RepeatIcon.psd differ diff --git a/Output/Themes/Ambient/Screens/PopupScreenPlayerControl.xml b/Output/Themes/Ambient/Screens/PopupScreenPlayerControl.xml new file mode 100644 index 00000000..df19d2c3 --- /dev/null +++ b/Output/Themes/Ambient/Screens/PopupScreenPlayerControl.xml @@ -0,0 +1,442 @@ + + + + 1 + + + Menu + + 49 + 0 + 0,00 + 1181 + 50 + + + Visible + + + + + + + CoverBackground + + 50 + 0 + 0,00 + 50 + 50 + + + Visible + + + + + + + PreviousIcon + + PreviousIcon + + 125 + 0 + 0,00 + 50 + 50 + + + ButtonColor + + + ButtonSColor + + + 75 + 2 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Normal + + + + + + + + + + + + + PlayIcon + + PlayIcon + + 200 + 5 + 0,00 + 40 + 40 + + + ButtonColor + + + ButtonSColor + + + 75 + 2 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Normal + + + + + + + + + + + + + PauseIcon + + PauseIcon + + 200 + 5 + 0,00 + 40 + 40 + + + ButtonColor + + + ButtonSColor + + + 75 + 2 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Normal + + + + + + + + + + + + + NextIcon + + NextIcon + + 265 + 0 + 0,00 + 50 + 50 + + + ButtonColor + + + ButtonSColor + + + 190 + 25 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Normal + + + + + + + + + + + + + RepeatIcon + + RepeatIcon + + 330 + 0 + 0,00 + 50 + 50 + + + ButtonColor + + + ButtonSColor + + + 405 + 25 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Normal + + + + + + + + + + + + + VideoIcon + + VideoIcon + + 405 + 0 + 0,00 + 50 + 50 + + + ButtonColor + + + ButtonSColor + + + 315 + 0 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Normal + + + + + + + + + + + + + VideoIcon + + VideoIcon + + 480 + 0 + 0,00 + 50 + 50 + + + ButtonColor + + + ButtonSColor + + + 315 + 0 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Normal + + + + + + + + + + + + + DuetIcon + + DuetIcon + + 555 + 0 + 0,00 + 50 + 50 + + + ButtonColor + + + ButtonSColor + + + 380 + 0 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + + + Normal + + + + + + + + + + + + + 630 + 0 + + 0,00 + + 50 + + 650 + + + StaticColor + + + TextSColor + + Left + + + + Outline + + + + + + + + \ No newline at end of file diff --git a/Output/Themes/Ambient/Screens/ScreenNames.xml b/Output/Themes/Ambient/Screens/ScreenNames.xml index 20a2026b..a16e4651 100644 --- a/Output/Themes/Ambient/Screens/ScreenNames.xml +++ b/Output/Themes/Ambient/Screens/ScreenNames.xml @@ -1,7 +1,7 @@  - 1 + 2 Video @@ -29,12 +29,204 @@ - + + + PlayerSelector + + 15 + 100 + -2,00 + 118 + 118 + + + Player1 + + + + + + + PlayerSelector + + 15 + 255 + -2,00 + 118 + 118 + + + Player2 + + + + + + + PlayerSelector + + 15 + 410 + -2,00 + 118 + 118 + + + Player3 + + + + + + + PlayerSelector + + 1147 + 100 + -2,00 + 118 + 118 + + + Player4 + + + + + + + PlayerSelector + + 1147 + 255 + -2,00 + 118 + 118 + + + Player5 + + + + + + + PlayerSelector + + 1147 + 410 + -2,00 + 118 + 118 + + + Player6 + + + + + + + Invisible + + 20 + 105 + -3,00 + 108 + 108 + + + Visible + + + + + + + Invisible + + 20 + 260 + -3,00 + 108 + 108 + + + Visible + + + + + + + Invisible + + 20 + 415 + -3,00 + 108 + 108 + + + Visible + + + + + + + Invisible + + 1152 + 105 + -3,00 + 108 + 108 + + + Visible + + + + + + + Invisible + + 1152 + 260 + -3,00 + 108 + 108 + + + Visible + + + + + + + Invisible + + 1152 + 415 + -3,00 + 108 + 108 + + + Visible + + + + + Invisible 145 - 660 + 663 0,00 990 50 @@ -44,7 +236,23 @@ - + + + + Invisible + + 145 + 715 + 0,00 + 990 + 50 + + + StaticWarningColor + + + + 640 @@ -72,10 +280,10 @@ - + 640 - 612 + 615 0,00 @@ -99,7 +307,197 @@ - + + + + 640 + 650 + + 0,00 + + 32 + + 970 + + + TextWarningColor + + + TextWarningColor + + Center + + + + Outline + + + + + + + + + 74 + 219 + + 0,00 + + 20 + + + + Player1 + + + TextSColor + + Center + + + + Outline + + + + + + + + + 74 + 374 + + 0,00 + + 20 + + + + Player2 + + + TextSColor + + Center + + + + Outline + + + + + + + + + 74 + 529 + + 0,00 + + 20 + + + + Player3 + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1206 + 219 + + 0,00 + + 20 + + + + Player4 + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1206 + 374 + + 0,00 + + 20 + + + + Player5 + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1206 + 529 + + 0,00 + + 20 + + + + Player6 + + + TextSColor + + Center + + + + Outline + + + + + + Button @@ -107,7 +505,7 @@ Button 145 - 600 + 603 0,00 150 50 @@ -162,7 +560,7 @@ Button 985 - 600 + 603 0,00 150 50 @@ -210,148 +608,7 @@ 26 - - - Button - - Button - - 145 - 150 - 0,00 - 150 - 50 - - - ButtonColor - - - ButtonSColor - - - 75 - 10 - - 32 - - 142 - - - ButtonTextSColor - - - ButtonTextSColor - - Center - - - - Outline - - TR_SCREENNAMES_BUTTON_1PLAYER - - - - - - - - - - - Button - - Button - - 145 - 315 - 0,00 - 150 - 50 - - - ButtonColor - - - ButtonSColor - - - 75 - 10 - - 32 - - 142 - - - ButtonTextSColor - - - ButtonTextSColor - - Center - - - - Outline - - TR_SCREENNAMES_BUTTON_2PLAYER - - - - - - - - - - - Button - - Button - - 145 - 480 - 0,00 - 150 - 50 - - - ButtonColor - - - ButtonSColor - - - 75 - 10 - - 32 - - 142 - - - ButtonTextSColor - - - ButtonTextSColor - - Center - - - - Outline - - TR_SCREENNAMES_BUTTON_3PLAYER - - - - - - - - - + Invisible @@ -367,32 +624,32 @@ SelectSlidePlayer - 305 - 100 + 70 + 548 0,00 - 905 - 150 + 1140 + 45 - 305 - 155 + 75 + 553 0,00 40 40 - 1180 - 155 + 1170 + 553 0,00 40 40 - Player1Dim + SelectSlideColor - Player1Dim + SelectSlideSColor - Player1 + SelectSlideHColor ArrowColor @@ -404,7 +661,7 @@ TextColor - Player1 + TextSColor 32,00 @@ -415,136 +672,49 @@ Bold 6 - - - - Invisible - - SelectSlideArrowLeft - - SelectSlideArrowRight - - SelectSlidePlayer - - SelectSlideArrowLeft - - SelectSlideArrowRight - - SelectSlidePlayer - - 305 - 265 + + + + 172 + 127 0,00 - 905 - 150 - - 305 - 320 - 0,00 - 40 - 40 - - 1180 - 320 - 0,00 - 40 - 40 - + 945 + 393 + + CoverTile + - Player2Dim - - - Player2Dim - - - Player2 - - - ArrowColor - - - ArrowSColor - - - TextColor - - - Player2 - - 32,00 - - 186,00 - - Outline - - Bold - - 6 - - - - Invisible - - SelectSlideArrowLeft - - SelectSlideArrowRight - - SelectSlidePlayer - - SelectSlideArrowLeft - - SelectSlideArrowRight - - SelectSlidePlayer - - 305 - 430 - 0,00 - 905 - 150 - - 305 - 485 - 0,00 - 40 - 40 - - 1180 - 485 - 0,00 - 40 - 40 - - - Player3Dim - - - Player3Dim - - - Player3 - - - ArrowColor - - - ArrowSColor - - - TextColor - - - Player3 - - 32,00 - - 186,00 - - Outline - - Bold - - 6 - + 1,00 + 1,00 + 1,00 + 0,20 + + PlayerSelector + + + + 100 + 100 + + 8 + 3 + + 20,71 + 30,00 + + + + 2,0 + + Outline + + TextColor + + + + 20 + + + - \ No newline at end of file + diff --git a/Output/Themes/Ambient/Screens/ScreenOptionsRecord.xml b/Output/Themes/Ambient/Screens/ScreenOptionsRecord.xml index 0e43d77c..06cbccf2 100644 --- a/Output/Themes/Ambient/Screens/ScreenOptionsRecord.xml +++ b/Output/Themes/Ambient/Screens/ScreenOptionsRecord.xml @@ -704,7 +704,7 @@ Bold - 4 + 7 @@ -769,7 +769,7 @@ Bold - 4 + 7 diff --git a/Output/Themes/Ambient/Screens/ScreenOptionsTheme.xml b/Output/Themes/Ambient/Screens/ScreenOptionsTheme.xml index ac972646..55ed1267 100644 --- a/Output/Themes/Ambient/Screens/ScreenOptionsTheme.xml +++ b/Output/Themes/Ambient/Screens/ScreenOptionsTheme.xml @@ -1,7 +1,7 @@  - 2 + 3 Video @@ -141,6 +141,22 @@ + + + Invisible + + 50 + 520 + 0,00 + 460 + 50 + + + StaticColor + + + + 640 @@ -352,11 +368,38 @@ Outline - TR_SCREENOTHEME_COVERLOADING + TR_SCREENOTHEME_FADEINFO + + + 75 + 525 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Left + + + + Outline + + TR_SCREENOTHEME_COVERLOADING + + + + Button @@ -802,7 +845,7 @@ 2 - + Invisible @@ -865,7 +908,72 @@ Bold + 2 + + + + Invisible + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 500 + 520 + 0,00 + 700 + 50 + + 505 + 525 + 0,00 + 40 + 40 + + 1170 + 525 + 0,00 + 40 + 40 + + + SelectSlideColor + + + SelectSlideSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 32,00 + + 616,00 + + Outline + + Bold + 1 - \ No newline at end of file + diff --git a/Output/Themes/Ambient/Screens/ScreenOptionsVideo.xml b/Output/Themes/Ambient/Screens/ScreenOptionsVideo.xml index c74bdfd3..9d8b1bc1 100644 --- a/Output/Themes/Ambient/Screens/ScreenOptionsVideo.xml +++ b/Output/Themes/Ambient/Screens/ScreenOptionsVideo.xml @@ -1,7 +1,7 @@  - 1 + 2 Video @@ -185,6 +185,33 @@ + + + 75 + 285 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Left + + + + Normal + + TR_SCREENO_VIDEO_VIDEOSTOBACKGROUND + + + + Button @@ -435,5 +462,70 @@ 3 + + + Invisible + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 500 + 280 + 0,00 + 700 + 50 + + 505 + 225 + 0,00 + 40 + 40 + + 1170 + 225 + 0,00 + 40 + 40 + + + SelectSlideColor + + + SelectSlideSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 32,00 + + 205,33 + + Normal + + Bold + + 3 + \ No newline at end of file diff --git a/Output/Themes/Ambient/Screens/ScreenScore.xml b/Output/Themes/Ambient/Screens/ScreenScore.xml index 1673c63e..b026c327 100644 --- a/Output/Themes/Ambient/Screens/ScreenScore.xml +++ b/Output/Themes/Ambient/Screens/ScreenScore.xml @@ -1,7 +1,7 @@  - 1 + 2 Video @@ -378,6 +378,831 @@ 40 + + + PointsBarBG + + 190 + 180 + 0,00 + 160 + 220 + + + 0,00 + 0,00 + 1,00 + 0,75 + + + + + + + PointsBar + + 190 + 180 + 0,00 + 160 + 0 + + + Player1 + + + + + + + + + 190 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 422 + 180 + 0,00 + 160 + 220 + + + 1,00 + 0,00 + 0,00 + 0,75 + + + + + + + PointsBar + + 422 + 180 + 0,00 + 160 + 0 + + + Player2 + + + + + + + + + 422 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 654 + 180 + 0,00 + 160 + 220 + + + 0,00 + 1,00 + 0,00 + 0,75 + + + + + + + PointsBar + + 654 + 180 + 0,00 + 160 + 0 + + + Player3 + + + + + + + + + 654 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 886 + 180 + 0,00 + 160 + 220 + + + 0,50 + 0,00 + 1,00 + 0,75 + + + + + + + PointsBar + + 886 + 180 + 0,00 + 160 + 0 + + + Player4 + + + + + + + + + 886 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 144 + 180 + 0,00 + 160 + 220 + + + 0,00 + 0,00 + 1,00 + 0,75 + + + + + + + PointsBar + + 144 + 180 + 0,00 + 160 + 0 + + + Player1 + + + + + + + + + 144 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 352 + 180 + 0,00 + 160 + 220 + + + 1,00 + 0,00 + 0,00 + 0,75 + + + + + + + PointsBar + + 352 + 180 + 0,00 + 160 + 0 + + + Player2 + + + + + + + + + 352 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 560 + 180 + 0,00 + 160 + 220 + + + 0,00 + 1,00 + 0,00 + 0,75 + + + + + + + PointsBar + + 560 + 180 + 0,00 + 160 + 0 + + + Player3 + + + + + + + + + 560 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 768 + 180 + 0,00 + 160 + 220 + + + 0,50 + 0,00 + 1,00 + 0,75 + + + + + + + PointsBar + + 768 + 180 + 0,00 + 160 + 0 + + + Player4 + + + + + + + + + 768 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 976 + 180 + 0,00 + 160 + 220 + + + 1,000 + 0,800 + 0,000 + 0,75 + + + + + + + PointsBar + + 976 + 180 + 0,00 + 160 + 0 + + + Player5 + + + + + + + + + 976 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 45 + 180 + 0,00 + 160 + 220 + + + 0,00 + 0,00 + 1,00 + 0,75 + + + + + + + PointsBar + + 45 + 180 + 0,00 + 160 + 0 + + + Player1 + + + + + + + + + 45 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 253 + 180 + 0,00 + 160 + 220 + + + 1,00 + 0,00 + 0,00 + 0,75 + + + + + + + PointsBar + + 253 + 180 + 0,00 + 160 + 0 + + + Player2 + + + + + + + + + 253 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 461 + 180 + 0,00 + 160 + 220 + + + 0,00 + 1,00 + 0,00 + 0,75 + + + + + + + PointsBar + + 461 + 180 + 0,00 + 160 + 0 + + + Player3 + + + + + + + + + 461 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 669 + 180 + 0,00 + 160 + 220 + + + 0,50 + 0,00 + 1,00 + 0,75 + + + + + + + PointsBar + + 669 + 180 + 0,00 + 160 + 0 + + + Player4 + + + + + + + + + 669 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 877 + 180 + 0,00 + 160 + 220 + + + 1,000 + 0,800 + 0,000 + 0,75 + + + + + + + PointsBar + + 877 + 180 + 0,00 + 160 + 0 + + + Player5 + + + + + + + + + 877 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + + + + PointsBarBG + + 1085 + 180 + 0,00 + 160 + 220 + + + 1,00 + 0,00 + 0,50 + 0,75 + + + + + + + PointsBar + + 1085 + 180 + 0,00 + 160 + 0 + + + Player6 + + + + + + + + + 1085 + 410 + 0,00 + 160 + 160 + + + Visible + + + + + 15 + 40 + + 60 @@ -1080,5 +1905,1673 @@ + + + 270 + 630 + + 0,00 + + 44 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 270 + 140 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 270 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 270 + 670 + + 0,00 + + 28 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 502 + 630 + + 0,00 + + 44 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 502 + 140 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 502 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 502 + 670 + + 0,00 + + 28 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 734 + 630 + + 0,00 + + 44 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 734 + 140 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 734 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 734 + 670 + + 0,00 + + 28 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 966 + 630 + + 0,00 + + 44 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 966 + 140 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 966 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 966 + 670 + + 0,00 + + 28 + + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 224 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 224 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 224 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 224 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 432 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 432 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 432 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 432 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 640 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 640 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 640 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 640 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 848 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 848 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 848 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 848 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1056 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1056 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1056 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1056 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 125 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 125 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 125 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 125 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 333 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 333 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 333 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 333 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 541 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 541 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 541 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 541 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 749 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 749 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 749 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 749 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 957 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 957 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 957 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 957 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1165 + 630 + + 0,00 + + 44 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1165 + 140 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1165 + 105 + + 0,00 + + 32 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + + + + 1165 + 670 + + 0,00 + + 28 + + 160 + + + StaticColor + + + TextSColor + + Center + + + + Outline + + + + + + - \ No newline at end of file + diff --git a/Output/Themes/Ambient/Screens/ScreenSing.xml b/Output/Themes/Ambient/Screens/ScreenSing.xml index 5c85960a..5a9c9359 100644 --- a/Output/Themes/Ambient/Screens/ScreenSing.xml +++ b/Output/Themes/Ambient/Screens/ScreenSing.xml @@ -1,7 +1,7 @@  - 3 + 4 None @@ -49,7 +49,7 @@ Lyrics 40 - 15 + 7 -0,75 1200 93 @@ -65,7 +65,7 @@ Lyrics 40 - 15 + 7 -0,75 1200 93 @@ -183,7 +183,7 @@ LyricHelper 40 - 20 + 12 -1,00 45 45 @@ -202,7 +202,7 @@ LyricHelper 40 - 20 + 12 -1,00 45 45 @@ -222,7 +222,7 @@ 0 0 - -1,10 + -2,10 1280 720 @@ -232,9 +232,408 @@ + + + Invisible + + 40 + 360 + -0,75 + 190 + 190 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 160 + -0,75 + 165 + 165 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 360 + -0,75 + 165 + 165 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 111 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 274 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 442 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 160 + -0,75 + 165 + 165 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 360 + -0,75 + 165 + 165 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 1103 + 160 + -0,75 + 165 + 165 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 1103 + 360 + -0,75 + 165 + 165 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 111 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 274 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 442 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 1103 + 160 + -0,75 + 165 + 165 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 1103 + 360 + -0,75 + 165 + 165 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 111 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 274 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 40 + 442 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 1103 + 111 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 1103 + 274 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + + + + Invisible + + 1103 + 442 + -0,75 + 140 + 140 + + + 1,000 + 1,000 + 1,000 + 0,400 + + + + - Score + Invisible 1150 350 @@ -250,7 +649,7 @@ - Score + Invisible 1150 150 @@ -266,7 +665,7 @@ - Score + Invisible 1150 350 @@ -282,7 +681,7 @@ - Score + Invisible 1150 10 @@ -298,7 +697,7 @@ - Score + Invisible 1150 210 @@ -314,7 +713,7 @@ - Score + Invisible 1150 410 @@ -328,6 +727,246 @@ + + + Invisible + + 528 + 150 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 528 + 350 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 1150 + 150 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 1150 + 350 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 528 + 10 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 528 + 210 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 528 + 410 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 1150 + 150 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 1150 + 350 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 528 + 10 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 528 + 210 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 528 + 410 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 1150 + 10 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 1150 + 210 + -0,75 + 100 + 50 + + + StaticColor + + + + + + + Invisible + + 1150 + 410 + -0,75 + 100 + 50 + + + StaticColor + + + + 640 @@ -388,7 +1027,7 @@ 640 170 - -1,11 + -2,11 100 @@ -412,21 +1051,21 @@ - 1200 + 1240 355 -1,00 - 40 + 198 - Player1 + Player1Dim2 TextSColor - Center + Right @@ -439,21 +1078,21 @@ - 1200 + 1240 155 -1,00 - 40 + 173 - Player1 + Player1Dim2 Player1 - Center + Right @@ -466,21 +1105,21 @@ - 1200 + 1240 355 -1,00 - 40 + 173 - Player2 + Player2Dim2 Player2 - Center + Right @@ -493,16 +1132,97 @@ - 1200 - 15 + 1240 + 106 -1,00 - 40 + 148 - Player1 + Player1Dim2 + + + Player1 + + Right + + + + Normal + + + + + + + + + 1240 + 269 + + -1,00 + + 148 + + + + Player2Dim2 + + + Player2 + + Right + + + + Normal + + + + + + + + + 1240 + 437 + + -1,00 + + 148 + + + + Player3Dim2 + + + Player3 + + Right + + + + Normal + + + + + + + + + 324 + 155 + + -1,00 + + 173 + + + + Player1Dim2 Player1 @@ -517,19 +1237,19 @@ - - + + - 1200 - 215 + 324 + 355 -1,00 - 40 + 173 - Player2 + Player2Dim2 Player2 @@ -544,19 +1264,19 @@ - - + + - 1200 - 415 + 967 + 155 -1,00 - 40 + 173 - Player3 + Player3Dim2 Player3 @@ -571,7 +1291,961 @@ - + + + + 967 + 355 + + -1,00 + + 173 + + + + Player4Dim2 + + + Player4 + + Center + + + + Normal + + + + + + + + + 324 + 106 + + -1,00 + + 148 + + + + Player1Dim2 + + + Player1 + + Center + + + + Normal + + + + + + + + + 324 + 269 + + -1,00 + + 148 + + + + Player2Dim2 + + + Player2 + + Center + + + + Normal + + + + + + + + + 324 + 437 + + -1,00 + + 148 + + + + Player3Dim2 + + + Player3 + + Center + + + + Normal + + + + + + + + + 967 + 155 + + -1,00 + + 173 + + + + Player4Dim2 + + + Player4 + + Center + + + + Normal + + + + + + + + + 967 + 355 + + -1,00 + + 173 + + + + Player5Dim2 + + + Player5 + + Center + + + + Normal + + + + + + + + + 324 + 106 + + -1,00 + + 148 + + + + Player1Dim2 + + + Player1 + + Center + + + + Normal + + + + + + + + + 324 + 269 + + -1,00 + + 148 + + + + Player2Dim2 + + + Player2 + + Center + + + + Normal + + + + + + + + + 324 + 437 + + -1,00 + + 148 + + + + Player3Dim2 + + + Player3 + + Center + + + + Normal + + + + + + + + + 967 + 106 + + -1,00 + + 148 + + + + Player4Dim2 + + + Player4 + + Center + + + + Normal + + + + + + + + + 967 + 269 + + -1,00 + + 148 + + + + Player5Dim2 + + + Player5 + + Center + + + + Normal + + + + + + + + + 967 + 437 + + -1,00 + + 148 + + + + Player6Dim2 + + + Player6 + + Center + + + + Normal + + + + + + + + + 110 + 513 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + TextSColor + + Center + + + + Outline + + + + + + + + + 110 + 288 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player1 + + Center + + + + Outline + + + + + + + + + 110 + 488 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player2 + + Center + + + + Outline + + + + + + + + + 110 + 219 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player1 + + Center + + + + Outline + + + + + + + + + 110 + 382 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player2 + + Center + + + + Outline + + + + + + + + + 110 + 550 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player3 + + Center + + + + Outline + + + + + + + + + 110 + 288 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player1 + + Center + + + + Outline + + + + + + + + + 110 + 488 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player2 + + Center + + + + Outline + + + + + + + + + 1173 + 288 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player3 + + Center + + + + Outline + + + + + + + + + 1173 + 488 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player4 + + Center + + + + Outline + + + + + + + + + 110 + 219 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player1 + + Center + + + + Outline + + + + + + + + + 110 + 382 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player2 + + Center + + + + Outline + + + + + + + + + 110 + 550 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player3 + + Center + + + + Outline + + + + + + + + + 1173 + 288 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player4 + + Center + + + + Outline + + + + + + + + + 1173 + 488 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player5 + + Center + + + + Outline + + + + + + + + + 110 + 219 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player1 + + Center + + + + Outline + + + + + + + + + 110 + 382 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player2 + + Center + + + + Outline + + + + + + + + + 110 + 550 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player3 + + Center + + + + Outline + + + + + + + + + 1173 + 219 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player4 + + Center + + + + Outline + + + + + + + + + 1173 + 382 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player5 + + Center + + + + Outline + + + + + + + + + 1173 + 550 + + -1,00 + + 28 + + + + 1,000 + 1,000 + 1,000 + 0,400 + + + Player6 + + Center + + + + Outline + + + + + + Button @@ -580,7 +2254,7 @@ 670 300 - -1,11 + -2,11 150 50 @@ -635,7 +2309,7 @@ 460 300 - -1,11 + -2,11 150 50 @@ -713,7 +2387,7 @@ 637 - 20 + 12 -1,00 1200 50 @@ -727,7 +2401,7 @@ 637 - 62 + 54 -1,00 1200 45 @@ -741,7 +2415,7 @@ 637 - 20 + 12 -1,00 1200 50 @@ -755,7 +2429,7 @@ 637 - 62 + 54 -1,00 1200 45 @@ -791,35 +2465,110 @@ 35 350 - -0,50 + -1,50 1210 200 35 150 - -0,50 + -1,50 1210 175 35 350 - -0,50 + -1,50 1210 175 35 - 10 - -0,50 + 105 + -1,50 1210 150 35 - 210 - -0,50 + 268 + -1,50 1210 150 35 - 410 - -0,50 + 436 + -1,50 1210 150 + 35 + 150 + -1,50 + 578 + 175 + 35 + 350 + -1,50 + 578 + 175 + 678 + 150 + -1,50 + 578 + 175 + 678 + 350 + -1,50 + 578 + 175 + 35 + 105 + -1,50 + 578 + 150 + 35 + 268 + -1,50 + 578 + 150 + 35 + 436 + -1,50 + 578 + 150 + 678 + 150 + -1,50 + 578 + 175 + 678 + 350 + -1,50 + 578 + 175 + 35 + 105 + -1,50 + 578 + 150 + 35 + 268 + -1,50 + 578 + 150 + 35 + 436 + -1,50 + 578 + 150 + 678 + 105 + -1,50 + 578 + 150 + 678 + 268 + -1,50 + 578 + 150 + 678 + 436 + -1,50 + 578 + 150 - \ No newline at end of file + diff --git a/Output/Themes/Ambient/Skin Blue.xml b/Output/Themes/Ambient/Skin Blue.xml index 7f5b16ab..3369f76b 100644 --- a/Output/Themes/Ambient/Skin Blue.xml +++ b/Output/Themes/Ambient/Skin Blue.xml @@ -33,9 +33,9 @@ 1,000 - 0,000 - 0,500 - 1,000 + 1,000 + 0,800 + 0,000 1,000 @@ -71,9 +71,9 @@ 0,500 - 0,000 - 0,500 - 1,000 + 1,000 + 0,800 + 0,000 0,500 @@ -82,6 +82,42 @@ 0,500 0,500 + + 0,000 + 0,000 + 1,000 + 0,400 + + + 1,000 + 0,000 + 0,000 + 0,400 + + + 0,000 + 1,000 + 0,000 + 0,400 + + + 0,500 + 0,000 + 1,000 + 0,400 + + + 1,000 + 0,800 + 0,000 + 0,400 + + + 1,000 + 0,000 + 0,500 + 0,400 + 0,000 0,000 @@ -266,6 +302,12 @@ MedleyCalcIcon.png MedleyTagIcon.png Invisible.png + PlayerSelector.png + PreviousIcon.png + NextIcon.png + PlayIcon.png + PauseIcon.png + RepeatIcon.png [Blue]BG_Video.mp4 @@ -273,4 +315,4 @@ [Blue]IntroMid.mp4 [Blue]IntroOut.mp4 - \ No newline at end of file + diff --git a/Output/Themes/Ambient/Skin Green.xml b/Output/Themes/Ambient/Skin Green.xml index bee2b2ba..46bfead0 100644 --- a/Output/Themes/Ambient/Skin Green.xml +++ b/Output/Themes/Ambient/Skin Green.xml @@ -33,9 +33,9 @@ 1,000 - 0,000 - 0,500 - 1,000 + 1,000 + 0,800 + 0,000 1,000 @@ -71,9 +71,9 @@ 0,500 - 0,000 - 0,500 - 1,000 + 1,000 + 0,800 + 0,000 0,500 @@ -82,6 +82,42 @@ 0,500 0,500 + + 0,000 + 0,000 + 1,000 + 0,400 + + + 1,000 + 0,000 + 0,000 + 0,400 + + + 0,000 + 1,000 + 0,000 + 0,400 + + + 0,500 + 0,000 + 1,000 + 0,400 + + + 1,000 + 0,800 + 0,000 + 0,400 + + + 1,000 + 0,000 + 0,500 + 0,400 + 0,000 0,000 @@ -266,6 +302,12 @@ MedleyCalcIcon.png MedleyTagIcon.png Invisible.png + PlayerSelector.png + PreviousIcon.png + NextIcon.png + PlayIcon.png + PauseIcon.png + RepeatIcon.png [Green]BG_Video.mp4 @@ -273,4 +315,4 @@ [Green]IntroMid.mp4 [Green]IntroOut.mp4 - \ No newline at end of file + diff --git a/Output/Themes/Ambient/Skin Red.xml b/Output/Themes/Ambient/Skin Red.xml index 42b71d2c..cf07c56a 100644 --- a/Output/Themes/Ambient/Skin Red.xml +++ b/Output/Themes/Ambient/Skin Red.xml @@ -33,9 +33,9 @@ 1,000 - 0,000 - 0,500 - 1,000 + 1,000 + 0,800 + 0,000 1,000 @@ -71,9 +71,9 @@ 0,500 - 0,000 - 0,500 - 1,000 + 1,000 + 0,800 + 0,000 0,500 @@ -82,6 +82,42 @@ 0,500 0,500 + + 0,000 + 0,000 + 1,000 + 0,400 + + + 1,000 + 0,000 + 0,000 + 0,400 + + + 0,000 + 1,000 + 0,000 + 0,400 + + + 0,500 + 0,000 + 1,000 + 0,400 + + + 1,000 + 0,800 + 0,000 + 0,400 + + + 1,000 + 0,000 + 0,500 + 0,400 + 0,000 0,000 @@ -266,6 +302,12 @@ MedleyCalcIcon.png MedleyTagIcon.png Invisible.png + PlayerSelector.png + PreviousIcon.png + NextIcon.png + PlayIcon.png + PauseIcon.png + RepeatIcon.png [Red]BG_Video.mp4 @@ -273,4 +315,4 @@ [Red]IntroMid.mp4 [Red]IntroOut.mp4 - \ No newline at end of file + diff --git a/Output/Themes/Ambient/Skin Yellow.xml b/Output/Themes/Ambient/Skin Yellow.xml index 1207b7fe..e89cb753 100644 --- a/Output/Themes/Ambient/Skin Yellow.xml +++ b/Output/Themes/Ambient/Skin Yellow.xml @@ -33,9 +33,9 @@ 1,000 - 0,000 - 0,500 - 1,000 + 1,000 + 0,800 + 0,000 1,000 @@ -71,9 +71,9 @@ 0,500 - 0,000 - 0,500 - 1,000 + 1,000 + 0,800 + 0,000 0,500 @@ -82,6 +82,42 @@ 0,500 0,500 + + 0,000 + 0,000 + 1,000 + 0,400 + + + 1,000 + 0,000 + 0,000 + 0,400 + + + 0,000 + 1,000 + 0,000 + 0,400 + + + 0,500 + 0,000 + 1,000 + 0,400 + + + 1,000 + 0,800 + 0,000 + 0,400 + + + 1,000 + 0,000 + 0,500 + 0,400 + 0,000 0,000 @@ -266,6 +302,12 @@ MedleyCalcIcon.png MedleyTagIcon.png Invisible.png + PlayerSelector.png + PreviousIcon.png + NextIcon.png + PlayIcon.png + PauseIcon.png + RepeatIcon.png [Yellow]BG_Video.mp4 @@ -273,4 +315,4 @@ [Yellow]IntroMid.mp4 [Yellow]IntroOut.mp4 - \ No newline at end of file + diff --git a/Output/Themes/Changelog/Changelog_ScreenNames.txt b/Output/Themes/Changelog/Changelog_ScreenNames.txt new file mode 100644 index 00000000..47d04016 --- /dev/null +++ b/Output/Themes/Changelog/Changelog_ScreenNames.txt @@ -0,0 +1,22 @@ +SceenNames + +++++++++++ +Version 2: + +Add: + +A new Theme-element for name-selecting. + + (One Static for each player): Static wich is used as drop-area + (One Static for each player): Static wich shows the avatar of selected player + (One Text for each player): Text wich shows name of selected player + + + + +Rename: + to + to + +Remove: +, , , , , diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsTheme.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsTheme.txt index a2423088..a8c28341 100644 --- a/Output/Themes/Changelog/Changelog_ScreenOptionsTheme.txt +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsTheme.txt @@ -1,5 +1,12 @@ ScreenOptionsTheme +++++++++++ +Version 3: + +Add: + +and some texts and statics for description (Text9 and Static9) +"TR_SCREENOTHEME_FADEINFO" ++++++++++ Version 2: diff --git a/Output/Themes/Changelog/Changelog_ScreenOptionsVideo.txt b/Output/Themes/Changelog/Changelog_ScreenOptionsVideo.txt new file mode 100644 index 00000000..a6898ab5 --- /dev/null +++ b/Output/Themes/Changelog/Changelog_ScreenOptionsVideo.txt @@ -0,0 +1,10 @@ +ScreenOptionsTheme + +++++++++++ +Version 2: + +Add: + +and some texts and statics for description (Text5) +"TR_SCREENO_VIDEO_VIDEOSTOBACKGROUND" +++++++++++ \ No newline at end of file diff --git a/Output/Themes/Changelog/Changelog_ScreenScore.txt b/Output/Themes/Changelog/Changelog_ScreenScore.txt new file mode 100644 index 00000000..d050d838 --- /dev/null +++ b/Output/Themes/Changelog/Changelog_ScreenScore.txt @@ -0,0 +1,7 @@ +ScreenScore + +++++++++++ +Version 2: + +Add: Elements for up to 6 players! (Texts and statics!) +++++++++++ \ No newline at end of file diff --git a/Output/Themes/Changelog/Changelog_ScreenSing.txt b/Output/Themes/Changelog/Changelog_ScreenSing.txt index a1ea71f3..22c5fa99 100644 --- a/Output/Themes/Changelog/Changelog_ScreenSing.txt +++ b/Output/Themes/Changelog/Changelog_ScreenSing.txt @@ -1,5 +1,14 @@ ScreenSing +++++++++++ +Version 4: +Added Elements for 6-player-singing! + +Add: + (One for each player for each player-number> + (One for each player for each player-number> + + ++++++++++ Version 3: diff --git a/Output/x64/acinerella.dll b/Output/x64/acinerella.dll index 4fa95785..a386c4f5 100644 Binary files a/Output/x64/acinerella.dll and b/Output/x64/acinerella.dll differ diff --git a/Output/x64/avcodec-54.dll b/Output/x64/avcodec-54.dll index 37ff648d..c41c69e1 100644 Binary files a/Output/x64/avcodec-54.dll and b/Output/x64/avcodec-54.dll differ diff --git a/Output/x64/avformat-54.dll b/Output/x64/avformat-54.dll index 406d4c1f..043f2a4e 100644 Binary files a/Output/x64/avformat-54.dll and b/Output/x64/avformat-54.dll differ diff --git a/Output/x64/avutil-51.dll b/Output/x64/avutil-51.dll index 638b40c5..fcf5552e 100644 Binary files a/Output/x64/avutil-51.dll and b/Output/x64/avutil-51.dll differ diff --git a/Output/x64/swscale-2.dll b/Output/x64/swscale-2.dll index 2649979b..3a5e5f1e 100644 Binary files a/Output/x64/swscale-2.dll and b/Output/x64/swscale-2.dll differ diff --git a/Output/x86/acinerella.dll b/Output/x86/acinerella.dll index 29a05b55..77b069fa 100644 Binary files a/Output/x86/acinerella.dll and b/Output/x86/acinerella.dll differ diff --git a/Output/x86/avcodec-54.dll b/Output/x86/avcodec-54.dll index 1d56751b..a2e1af29 100644 Binary files a/Output/x86/avcodec-54.dll and b/Output/x86/avcodec-54.dll differ diff --git a/Output/x86/avformat-54.dll b/Output/x86/avformat-54.dll index 76385c1e..063b9dc8 100644 Binary files a/Output/x86/avformat-54.dll and b/Output/x86/avformat-54.dll differ diff --git a/Output/x86/avutil-51.dll b/Output/x86/avutil-51.dll index 6117ea73..fe871cc1 100644 Binary files a/Output/x86/avutil-51.dll and b/Output/x86/avutil-51.dll differ diff --git a/Output/x86/libacinerella.so b/Output/x86/libacinerella.so deleted file mode 100644 index eb9aa580..00000000 Binary files a/Output/x86/libacinerella.so and /dev/null differ diff --git a/Output/x86/swscale-2.dll b/Output/x86/swscale-2.dll index 50d699f1..1fb3876c 100644 Binary files a/Output/x86/swscale-2.dll and b/Output/x86/swscale-2.dll differ diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs index 403a64f9..31acd203 100644 --- a/Vocaluxe/Base/CBackgroundMusic.cs +++ b/Vocaluxe/Base/CBackgroundMusic.cs @@ -6,6 +6,9 @@ using System.IO; using Vocaluxe.Base; using System.Diagnostics; using Vocaluxe.Lib.Song; +using Vocaluxe.Lib.Draw; +using System.Drawing; +using Vocaluxe.Menu; namespace Vocaluxe.Base { @@ -13,31 +16,149 @@ namespace Vocaluxe.Base { private static CHelper Helper = new CHelper(); private static int _CurrentMusicStream = -1; - private static string _CurrentMusicFilePath = String.Empty; - - private static List _AllFileNames = new List(); - private static List _NotPlayedFileNames = new List(); - private static List _BGMusicFileNames = new List(); + private static int _PreviousMusicIndex = 0; + private static PlaylistElement _CurrentPlaylistElement = new PlaylistElement(); + + private static List _AllFileNames = new List(); + private static List _NotPlayedFileNames = new List(); + private static List _BGMusicFileNames = new List(); + private static List _PreviousFileNames = new List(); + + private static int _Video = -1; + private static STexture _CurrentVideoTexture = new STexture(-1); + private static Stopwatch _FadeTimer = new Stopwatch(); + private static bool _VideoEnabled; private static bool _OwnMusicAdded; private static bool _BackgroundMusicAdded; private static bool _Playing; + private static bool _Disabled; + private static bool _CanSing; + + public static bool VideoEnabled + { + get + { + return _VideoEnabled; + } + set + { + if (_VideoEnabled && value) + return; + if (!_VideoEnabled && !value) + return; + if(_VideoEnabled && !value) + ToggleVideo(); + if (!_VideoEnabled && value) + ToggleVideo(); + _VideoEnabled = value; + } + } + + public static bool CanSing + { + get + { + return _CanSing; + } + + set + { + _CanSing = value; + } + } + + public static bool Disabled + { + get + { + return _Disabled; + } + set + { + _Disabled = value; + if (_Disabled) + Pause(); + else + Play(); + } + } + + public static int SongID + { + get + { + return _CurrentPlaylistElement._SongID; + } + } + + public static bool Duet + { + get + { + return _CurrentPlaylistElement.Duet; + } + } + + public static bool SongHasVideo + { + get + { + return File.Exists(_CurrentPlaylistElement.VideoFilePath); + } + } + + public static bool Playing + { + get + { + return _Playing; + } + } + + public static string ArtistAndTitle + { + get + { + return _CurrentPlaylistElement.Artist + " - " + _CurrentPlaylistElement.Title; + } + } + + public static STexture Cover + { + get + { + return _CurrentPlaylistElement.Cover; + } + } public static void Init() { - _BGMusicFileNames.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.mp3", true, true)); - _BGMusicFileNames.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.wav", true, true)); - _BGMusicFileNames.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.ogg", true, true)); - _BGMusicFileNames.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.wma", true, true)); + List templist = new List(); + + foreach(string ending in CSettings.MusicFileTypes) + { + templist.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, ending, true, true)); + } + + foreach (string path in templist) + { + _BGMusicFileNames.Add(new PlaylistElement(path)); + } if(CConfig.BackgroundMusicSource != EBackgroundMusicSource.TR_CONFIG_ONLY_OWN_MUSIC) AddBackgroundMusic(); + if (CConfig.VideoBackgrounds == EOffOn.TR_CONFIG_ON) + _VideoEnabled = true; _Playing = false; } public static void Play() { + if (_Playing) + return; + if (CConfig.BackgroundMusic == EOffOn.TR_CONFIG_ON) { if (_AllFileNames.Count > 0) @@ -46,24 +167,48 @@ namespace Vocaluxe.Base { CSound.Fade(_CurrentMusicStream, CConfig.BackgroundMusicVolume, CSettings.BackgroundMusicFadeTime); CSound.Play(_CurrentMusicStream); + if (_VideoEnabled && _Video != -1) + CVideo.VdResume(_Video); _Playing = true; } else Next(); + + if (!IsBackgroundFile(_CurrentPlaylistElement)) + _CanSing = true; + else + _CanSing = false; } } } public static void Stop() { + if (!_Playing) + return; + + if (_VideoEnabled && _Video != -1) + { + CVideo.VdClose(_Video); + CDraw.RemoveTexture(ref _CurrentVideoTexture); + _Video = -1; + } CSound.FadeAndStop(_CurrentMusicStream, 0f, CSettings.BackgroundMusicFadeTime); - _CurrentMusicFilePath = String.Empty; + _CurrentPlaylistElement = new PlaylistElement(); _Playing = false; } public static void Pause() { + if (!_Playing) + return; + + if (_VideoEnabled && _Video != -1) + { + CVideo.VdPause(_Video); + CVideo.VdSkip(_Video, CSound.GetPosition(_CurrentMusicStream) + CSettings.BackgroundMusicFadeTime, _CurrentPlaylistElement.VideoGap); + } CSound.FadeAndPause(_CurrentMusicStream, 0f, CSettings.BackgroundMusicFadeTime); _Playing = false; } @@ -83,15 +228,28 @@ namespace Vocaluxe.Base { if (_AllFileNames.Count > 0) { - Stop(); + if (_PreviousMusicIndex == _PreviousFileNames.Count - 1 || _PreviousFileNames.Count == 0) //We are not currently in the previous list + { + Stop(); + if (_NotPlayedFileNames.Count == 0) + _NotPlayedFileNames.AddRange(_AllFileNames); - if (_NotPlayedFileNames.Count == 0) - _NotPlayedFileNames.AddRange(_AllFileNames); + _CurrentPlaylistElement = _NotPlayedFileNames[CGame.Rand.Next(_NotPlayedFileNames.Count)]; + _NotPlayedFileNames.Remove(_CurrentPlaylistElement); - _CurrentMusicFilePath = _NotPlayedFileNames[CGame.Rand.Next(_NotPlayedFileNames.Count)]; - _NotPlayedFileNames.Remove(_CurrentMusicFilePath); + _PreviousFileNames.Add(_CurrentPlaylistElement); + _PreviousMusicIndex = _PreviousFileNames.Count - 1; + } + else if(_PreviousFileNames.Count > 0) //We are in the previous list + { + Stop(); + _PreviousMusicIndex++; - _CurrentMusicStream = CSound.Load(_CurrentMusicFilePath); + _CurrentPlaylistElement = _PreviousFileNames[_PreviousMusicIndex]; + } + _CurrentMusicStream = CSound.Load(_CurrentPlaylistElement.MusicFilePath); + if (_VideoEnabled) + LoadVideo(); CSound.SetStreamVolume(_CurrentMusicStream, 0f); Play(); } @@ -99,6 +257,36 @@ namespace Vocaluxe.Base Stop(); } + public static void Previous() + { + if (_PreviousFileNames.Count > 0 || _PreviousMusicIndex >= 0) + { + Stop(); + + _PreviousMusicIndex--; + if (_PreviousMusicIndex < 0) + _PreviousMusicIndex = 0; //No previous songs left, so play the first + + _CurrentPlaylistElement = _PreviousFileNames[_PreviousMusicIndex]; + + _CurrentMusicStream = CSound.Load(_CurrentPlaylistElement.MusicFilePath); + if (_VideoEnabled) + LoadVideo(); + CSound.SetStreamVolume(_CurrentMusicStream, 0f); + Play(); + } + } + + public static void Repeat() + { + if (_AllFileNames.Count > 0 && _CurrentMusicStream != -1) + { + CSound.SetPosition(_CurrentMusicStream, 0); + if (_VideoEnabled && _Video != -1) + CVideo.VdSkip(_Video, 0f, _CurrentPlaylistElement.VideoGap); + } + } + public static void ApplyVolume() { CSound.SetStreamVolume(_CurrentMusicStream, CConfig.BackgroundMusicVolume); @@ -110,8 +298,8 @@ namespace Vocaluxe.Base { foreach (CSong song in CSongs.AllSongs) { - _AllFileNames.Add(song.GetMP3()); - _NotPlayedFileNames.Add(song.GetMP3()); + _AllFileNames.Add(new PlaylistElement(song)); + _NotPlayedFileNames.Add(new PlaylistElement(song)); } } _OwnMusicAdded = true; @@ -128,7 +316,7 @@ namespace Vocaluxe.Base _NotPlayedFileNames.AddRange(_BGMusicFileNames); } - if (IsPlaying() && !IsBackgroundFile(_CurrentMusicFilePath) || _AllFileNames.Count == 0) + if (Playing && !IsBackgroundFile(_CurrentPlaylistElement) || _AllFileNames.Count == 0) Next(); _OwnMusicAdded = false; @@ -153,7 +341,7 @@ namespace Vocaluxe.Base AddOwnMusic(); _BackgroundMusicAdded = false; - if (IsPlaying() && IsBackgroundFile(_CurrentMusicFilePath) || _AllFileNames.Count == 0) + if (Playing && IsBackgroundFile(_CurrentPlaylistElement) || _AllFileNames.Count == 0) Next(); } } @@ -207,19 +395,232 @@ namespace Vocaluxe.Base CConfig.SaveConfig(); } - public static bool IsPlaying() + public static void ToggleVideo() { - return CSound.IsPlaying(_CurrentMusicStream); + if (_Video != -1) + { + if (_VideoEnabled) + { + _VideoEnabled = false; + CVideo.VdClose(_Video); + _Video = -1; + CDraw.RemoveTexture(ref _CurrentVideoTexture); + return; + } + if (CVideo.VdFinished(_Video)) + { + CVideo.VdClose(_Video); + CDraw.RemoveTexture(ref _CurrentVideoTexture); + _Video = -1; + return; + } + } + else + LoadVideo(); } - private static bool IsBackgroundFile(string FilePath) + public static STexture GetVideoTexture() { - foreach (string file in _BGMusicFileNames) + if (_Video != -1) { - if (file == FilePath) + float vtime = 0f; + CVideo.VdGetFrame(_Video, ref _CurrentVideoTexture, CSound.GetPosition(_CurrentMusicStream), ref vtime); + if (_FadeTimer.ElapsedMilliseconds <= 3000L) + { + _CurrentVideoTexture.color.A = (_FadeTimer.ElapsedMilliseconds / 3000f); + } + else + { + _CurrentVideoTexture.color.A = 1f; + _FadeTimer.Stop(); + } + return _CurrentVideoTexture; + } + return new STexture(-1); + } + + private static bool IsBackgroundFile(PlaylistElement element) + { + foreach (PlaylistElement elements in _BGMusicFileNames) + { + if (elements.MusicFilePath == element.MusicFilePath) return true; } return false; } + + private static void LoadVideo() + { + if (_Video == -1) + { + _Video = CVideo.VdLoad(_CurrentPlaylistElement.VideoFilePath); + CVideo.VdSkip(_Video, 0f, _CurrentPlaylistElement.VideoGap); + _VideoEnabled = true; + _FadeTimer.Reset(); + _FadeTimer.Start(); + } + } + } +} + +class PlaylistElement +{ + public int _SongID; + private string _MusicFilePath; + + public string MusicFilePath + { + get + { + if (_SongID >= 0) + { + CSong song = CSongs.GetSong(_SongID); + if (song != null) + return song.GetMP3(); + else + { + _SongID = -1; + CLog.LogError("Song not found"); + } + } + return _MusicFilePath; + } + + set + { + _MusicFilePath = value; + } + } + + public string VideoFilePath + { + get + { + if (_SongID >= 0) + { + CSong song = CSongs.GetSong(_SongID); + if (song != null) + return song.GetVideo(); + else + { + _SongID = -1; + CLog.LogError("Song not found"); + } + } + return string.Empty; + } + } + + public string Title + { + get + { + if (_SongID >= 0) + { + CSong song = CSongs.GetSong(_SongID); + if (song != null) + return song.Title; + else + { + _SongID = -1; + CLog.LogError("Song not found"); + } + } + return "Unknown"; + } + } + + public string Artist + { + get + { + if (_SongID >= 0) + { + CSong song = CSongs.GetSong(_SongID); + if (song != null) + return song.Artist; + else + { + _SongID = -1; + CLog.LogError("Song not found"); + } + } + return "Unknown"; + } + } + + public STexture Cover + { + get + { + if (_SongID >= 0) + { + CSong song = CSongs.GetSong(_SongID); + if (song != null) + return song.CoverTextureSmall; + else + { + _SongID = -1; + CLog.LogError("Song not found"); + } + } + return CCover.NoCover; + } + } + + public float VideoGap + { + get + { + if (_SongID >= 0) + { + CSong song = CSongs.GetSong(_SongID); + if (song != null) + return song.VideoGap; + else + { + _SongID = -1; + CLog.LogError("Song not found"); + } + } + return 0; + } + } + + public bool Duet + { + get + { + if (_SongID >= 0) + { + CSong song = CSongs.GetSong(_SongID); + if (song != null) + return song.IsDuet; + else + { + _SongID = -1; + CLog.LogError("Song not found"); + } + } + return false; + } + } + + public PlaylistElement(CSong song) + { + MusicFilePath = string.Empty; + _SongID = song.ID; + } + + public PlaylistElement(string FilePath) + { + MusicFilePath = FilePath; + _SongID = -1; + } + + public PlaylistElement() + { + MusicFilePath = string.Empty; + _SongID = -1; } } diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs index 02ad6565..95cd1dcb 100644 --- a/Vocaluxe/Base/CConfig.cs +++ b/Vocaluxe/Base/CConfig.cs @@ -87,7 +87,8 @@ namespace Vocaluxe.Base public enum ERecordLib { - PortAudio + PortAudio, + DirectSound } public enum EVideoDecoder @@ -152,6 +153,29 @@ namespace Vocaluxe.Base TR_CONFIG_ONLY_OWN_MUSIC } + public enum EPlayerInfo + { + TR_CONFIG_PLAYERINFO_BOTH, + TR_CONFIG_PLAYERINFO_NAME, + TR_CONFIG_PLAYERINFO_AVATAR, + TR_CONFIG_PLAYERINFO_OFF + } + + public enum EFadePlayerInfo + { + TR_CONFIG_FADEPLAYERINFO_ALL, + TR_CONFIG_FADEPLAYERINFO_INFO, + TR_CONFIG_FADEPLAYERINFO_OFF + } + + public enum ELyricStyle + { + Fill, + Jump, + Slide, + Zoom + } + #endregion Enums static class CConfig @@ -185,7 +209,10 @@ namespace Vocaluxe.Base public static EOffOn DrawNoteLines = EOffOn.TR_CONFIG_ON; public static EOffOn DrawToneHelper = EOffOn.TR_CONFIG_ON; public static ETimerLook TimerLook = ETimerLook.TR_CONFIG_TIMERLOOK_EXPANDED; + public static EPlayerInfo PlayerInfo = EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH; + public static EFadePlayerInfo FadePlayerInfo = EFadePlayerInfo.TR_CONFIG_FADEPLAYERINFO_OFF; public static ECoverLoading CoverLoading = ECoverLoading.TR_CONFIG_COVERLOADING_ATSTART; + public static ELyricStyle LyricStyle = ELyricStyle.Slide; // Sound public static EPlaybackLib PlayBackLib = EPlaybackLib.PortAudio; @@ -206,16 +233,18 @@ namespace Vocaluxe.Base public static EOffOn Tabs = EOffOn.TR_CONFIG_OFF; public static string Language = "English"; public static EOffOn LyricsOnTop = EOffOn.TR_CONFIG_OFF; + public static string[] Players = new string[CSettings.MaxNumPlayer]; // Video public static EVideoDecoder VideoDecoder = EVideoDecoder.FFmpeg; public static EOffOn VideoBackgrounds = EOffOn.TR_CONFIG_ON; public static EOffOn VideoPreview = EOffOn.TR_CONFIG_ON; public static EOffOn VideosInSongs = EOffOn.TR_CONFIG_ON; + public static EOffOn VideosToBackground = EOffOn.TR_CONFIG_OFF; // Record public static SMicConfig[] MicConfig; - public static int MicDelay = 200; //[ms] + public static int MicDelay = 300; //[ms] //Lists to save parameters and values private static List _Params = new List(); @@ -300,7 +329,10 @@ namespace Vocaluxe.Base CHelper.TryGetEnumValueFromXML("//root/Theme/DrawNoteLines", navigator, ref DrawNoteLines); CHelper.TryGetEnumValueFromXML("//root/Theme/DrawToneHelper", navigator, ref DrawToneHelper); CHelper.TryGetEnumValueFromXML("//root/Theme/TimerLook", navigator, ref TimerLook); + CHelper.TryGetEnumValueFromXML("//root/Theme/PlayerInfo", navigator, ref PlayerInfo); + CHelper.TryGetEnumValueFromXML("//root/Theme/FadePlayerInfo", navigator, ref FadePlayerInfo); CHelper.TryGetEnumValueFromXML("//root/Theme/CoverLoading", navigator, ref CoverLoading); + CHelper.TryGetEnumValueFromXML("//root/Theme/LyricStyle", navigator, ref LyricStyle); #endregion Theme #region Sound @@ -370,6 +402,12 @@ namespace Vocaluxe.Base } CLanguage.SetLanguage(Language); + //Read players from config + for (i = 1; i <= CSettings.MaxNumPlayer; i++) + { + CHelper.GetValueFromXML("//root/Game/Players/Player" + i.ToString(), navigator, ref Players[i-1], string.Empty); + } + #endregion Game #region Video @@ -377,6 +415,7 @@ namespace Vocaluxe.Base CHelper.TryGetEnumValueFromXML("//root/Video/VideoBackgrounds", navigator, ref VideoBackgrounds); CHelper.TryGetEnumValueFromXML("//root/Video/VideoPreview", navigator, ref VideoPreview); CHelper.TryGetEnumValueFromXML("//root/Video/VideosInSongs", navigator, ref VideosInSongs); + CHelper.TryGetEnumValueFromXML("//root/Video/VideosToBackground", navigator, ref VideosToBackground); #endregion Video #region Record @@ -496,9 +535,18 @@ namespace Vocaluxe.Base writer.WriteComment("Look of timer:" + ListStrings(Enum.GetNames(typeof(ETimerLook)))); writer.WriteElementString("TimerLook", Enum.GetName(typeof(ETimerLook), TimerLook)); + writer.WriteComment("Information about players on SingScreen:" + ListStrings(Enum.GetNames(typeof(EPlayerInfo)))); + writer.WriteElementString("PlayerInfo", Enum.GetName(typeof(EPlayerInfo), PlayerInfo)); + + writer.WriteComment("Fade player-information with lyrics and notebars:" + ListStrings(Enum.GetNames(typeof(EFadePlayerInfo)))); + writer.WriteElementString("FadePlayerInfo", Enum.GetName(typeof(EFadePlayerInfo), FadePlayerInfo)); + writer.WriteComment("Cover Loading:" + ListStrings(Enum.GetNames(typeof(ECoverLoading)))); writer.WriteElementString("CoverLoading", Enum.GetName(typeof(ECoverLoading), CoverLoading)); + writer.WriteComment("Lyric Style:" + ListStrings(Enum.GetNames(typeof(ELyricStyle)))); + writer.WriteElementString("LyricStyle", Enum.GetName(typeof(ELyricStyle), LyricStyle)); + writer.WriteEndElement(); #endregion Theme @@ -577,6 +625,14 @@ namespace Vocaluxe.Base writer.WriteComment("Lyrics also on Top of screen: " + ListStrings(Enum.GetNames(typeof(EOffOn)))); writer.WriteElementString("LyricsOnTop", Enum.GetName(typeof(EOffOn), LyricsOnTop)); + writer.WriteComment("Default profile for players 1..." + CSettings.MaxNumPlayer.ToString() + ":"); + writer.WriteStartElement("Players"); + for (int i = 1; i <= CSettings.MaxNumPlayer; i++) + { + writer.WriteElementString("Player" + i.ToString(), Path.GetFileName(Players[i - 1])); + } + writer.WriteEndElement(); + writer.WriteEndElement(); #endregion Game @@ -595,6 +651,9 @@ namespace Vocaluxe.Base writer.WriteComment("Show Videos while singing: " + ListStrings(Enum.GetNames(typeof(EOffOn)))); writer.WriteElementString("VideosInSongs", Enum.GetName(typeof(EOffOn), VideosInSongs)); + writer.WriteComment("Show backgroundmusic videos as background: " + ListStrings(Enum.GetNames(typeof(EOffOn)))); + writer.WriteElementString("VideosToBackground", Enum.GetName(typeof(EOffOn), VideosToBackground)); + writer.WriteEndElement(); #endregion Video @@ -945,6 +1004,33 @@ namespace Vocaluxe.Base return _Result; } + /// + /// Use saved players from config now for games + /// + public static void UsePlayers() + { + for (int i = 0; i < CProfiles.Profiles.Length; i++) + { + for (int j = 0; j < CSettings.MaxNumPlayer; j++) + { + if (Players[j] != string.Empty) + { + if (Path.GetFileName(CProfiles.Profiles[i].ProfileFile) == Players[j] && CProfiles.Profiles[i].Active == EOffOn.TR_CONFIG_ON) + { + //Update Game-infos with player + CGame.Player[j].Name = CProfiles.Profiles[i].PlayerName; + CGame.Player[j].Difficulty = CProfiles.Profiles[i].Difficulty; + CGame.Player[j].ProfileID = i; + } + } + else + { + CGame.Player[j].ProfileID = -1; + } + } + } + } + } diff --git a/Vocaluxe/Base/CDataBase.cs b/Vocaluxe/Base/CDataBase.cs index e1040bf8..53ef0cc8 100644 --- a/Vocaluxe/Base/CDataBase.cs +++ b/Vocaluxe/Base/CDataBase.cs @@ -797,10 +797,16 @@ namespace Vocaluxe.Base data.id = Sqlite3.sqlite3_column_int(Stmt, 0); byte[] bytes = Sqlite3.sqlite3_column_rawbytes(Stmt, 1); - data.str1 = UTF8.GetString(Encoding.Convert(CP1252, UTF8, bytes)); + if (bytes != null) + data.str1 = UTF8.GetString(Encoding.Convert(CP1252, UTF8, bytes)); + else + data.str1 = "Someone"; bytes = Sqlite3.sqlite3_column_rawbytes(Stmt, 2); - data.str2 = UTF8.GetString(Encoding.Convert(CP1252, UTF8, bytes)); + if (bytes != null) + data.str2 = UTF8.GetString(Encoding.Convert(CP1252, UTF8, bytes)); + else + data.str2 = "Someone"; songs.Add(data); } @@ -832,7 +838,10 @@ namespace Vocaluxe.Base data.id = Sqlite3.sqlite3_column_int(Stmt, 0); byte[] bytes = Sqlite3.sqlite3_column_rawbytes(Stmt, 1); - data.str1 = UTF8.GetString(Encoding.Convert(CP1252, UTF8, bytes)); + if (bytes != null) + data.str1 = UTF8.GetString(Encoding.Convert(CP1252, UTF8, bytes)); + else + data.str1 = "Someone"; if (dateExists) data.ticks = UnixTimeToTicks(Sqlite3.sqlite3_column_int(Stmt, 2)); diff --git a/Vocaluxe/Base/CDraw.cs b/Vocaluxe/Base/CDraw.cs index 0f6d9e60..180ee03b 100644 --- a/Vocaluxe/Base/CDraw.cs +++ b/Vocaluxe/Base/CDraw.cs @@ -239,6 +239,19 @@ namespace Vocaluxe.Base _Draw.DrawTexture(Texture, rect, color, begin, end); } + public static void DrawTexture(CStatic StaticBounds, STexture Texture, EAspect Aspect) + { + RectangleF bounds = new RectangleF(StaticBounds.Rect.X, StaticBounds.Rect.Y, StaticBounds.Rect.W, StaticBounds.Rect.H); + RectangleF rect = new RectangleF(0f, 0f, Texture.width, Texture.height); + + if (rect.Height <= 0f) + return; + + CHelper.SetRect(bounds, ref rect, rect.Width / rect.Height, Aspect); + DrawTexture(Texture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, StaticBounds.Rect.Z), + Texture.color, new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f), false); + } + public static void DrawTextureReflection(STexture Texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) { _Draw.DrawTextureReflection(Texture, rect, color, bounds, space, height); diff --git a/Vocaluxe/Base/CGame.cs b/Vocaluxe/Base/CGame.cs index 9c2b6c7d..f0cf4245 100644 --- a/Vocaluxe/Base/CGame.cs +++ b/Vocaluxe/Base/CGame.cs @@ -16,6 +16,8 @@ namespace Vocaluxe.Base public string Name; public EGameDifficulty Difficulty; public double Points; + public double PointsLineBonus; + public double PointsGoldenNotes; public int NoteDiff; public int LineNr; public List SingLine; @@ -102,6 +104,8 @@ namespace Vocaluxe.Base _GameMode.Init(); _Player = new SPlayer[CSettings.MaxNumPlayer]; ResetPlayer(); + + CConfig.UsePlayers(); } public static void SetGameMode(EGameMode Mode) @@ -213,6 +217,8 @@ namespace Vocaluxe.Base for (int i = 0; i < _Player.Length; i++) { _Player[i].Points = 0f; + _Player[i].PointsLineBonus = 0f; + _Player[i].PointsGoldenNotes = 0f; _Player[i].LineNr = 0; _Player[i].NoteDiff = 0; _Player[i].SingLine = new List(); @@ -242,7 +248,12 @@ namespace Vocaluxe.Base _MidBeatD = -0.5f + GetBeatFromTime(Time, song.BPM, song.Gap + CConfig.MicDelay/1000f); _CurrentBeatD = (int)Math.Floor(_MidBeatD); - if (_OldBeatD == _CurrentBeatD) + for (int p = 0; p < _NumPlayer; p++) + { + CSound.AnalyzeBuffer(p); + } + + if (_OldBeatD >= _CurrentBeatD) return; for (int p = 0; p < _NumPlayer; p++) @@ -298,7 +309,6 @@ namespace Vocaluxe.Base } } - CSound.AnalyzeBuffer(p); if (notes[Note].PointsForBeat > 0 && (CSound.RecordToneValid(p) || DEBUG_HIT)) { int Tone = notes[Note].Tone; @@ -317,8 +327,12 @@ namespace Vocaluxe.Base if (_Player[p].NoteDiff <= (2 - (int)_Player[p].Difficulty)) { // valid - CSound.RecordSetTone(p, Tone); - _Player[p].Points += (CSettings.MaxScore - CSettings.LinebonusScore) * (double)notes[Note].PointsForBeat / (double)song.Notes.GetLines(_Player[p].LineNr).Points; + //CSound.RecordSetTone(p, Tone); + double points = (CSettings.MaxScore - CSettings.LinebonusScore) * (double)notes[Note].PointsForBeat / (double)song.Notes.GetLines(_Player[p].LineNr).Points; + if (notes[Note].NoteType == ENoteType.Golden) + _Player[p].PointsGoldenNotes += points; + + _Player[p].Points += points; // update player notes (sung notes) if (_Player[p].SingLine[Line].NoteCount > 0) @@ -338,11 +352,6 @@ namespace Vocaluxe.Base _Player[p].SingLine[Line].LastNote.IsPerfect(notes[Note]); _Player[p].SingLine[Line].IsPerfect(lines[Line]); - - if (_Player[p].SingLine[Line].PerfectLine) - { - _Player[p].Points += CSettings.LinebonusScore * (double)lines[Line].Points / (double)song.Notes.GetPoints(_Player[p].LineNr); - } } else { @@ -350,7 +359,7 @@ namespace Vocaluxe.Base { CNote nt = _Player[p].SingLine[Line].LastNote; if (nt.EndBeat + 1 != beat || nt.Hit) - _Player[p].SingLine[Line].AddNote(new CNote(beat, 1, TonePlayer, String.Empty, false, notes[Note].NoteType)); + _Player[p].SingLine[Line].AddNote(new CNote(beat, 1, TonePlayer, String.Empty, false, ENoteType.Freestyle)); else { if (nt.Tone == TonePlayer && nt.EndBeat + 1 == beat) @@ -359,17 +368,41 @@ namespace Vocaluxe.Base } else { - _Player[p].SingLine[Line].AddNote(new CNote(beat, 1, TonePlayer, String.Empty, false, notes[Note].NoteType)); + _Player[p].SingLine[Line].AddNote(new CNote(beat, 1, TonePlayer, String.Empty, false, ENoteType.Freestyle)); } } } else { - _Player[p].SingLine[Line].AddNote(new CNote(beat, 1, TonePlayer, String.Empty, false, notes[Note].NoteType)); + _Player[p].SingLine[Line].AddNote(new CNote(beat, 1, TonePlayer, String.Empty, false, ENoteType.Freestyle)); } } } + + // Line Bonus + int NumLinesWithPoints = song.Notes.GetNumLinesWithPoints(_Player[p].LineNr); + if (Note == lines[Line].NoteCount - 1 && NumLinesWithPoints > 0) + { + if (notes[Note].EndBeat == beat && lines[Line].Points > 0f) + { + double factor = (double)_Player[p].SingLine[Line].Points / (double)lines[Line].Points; + if (factor < 0.4) + factor = 0.0; + else if (factor > 0.9) + factor = 1.0; + else + { + factor -= 0.4; + factor *= 2; + factor *= factor; + } + + double points = CSettings.LinebonusScore * factor * 1f / NumLinesWithPoints; + _Player[p].Points += points; + _Player[p].PointsLineBonus += points; + } + } } } diff --git a/Vocaluxe/Base/CSettings.cs b/Vocaluxe/Base/CSettings.cs index 7be8e342..4183d586 100644 --- a/Vocaluxe/Base/CSettings.cs +++ b/Vocaluxe/Base/CSettings.cs @@ -40,14 +40,14 @@ namespace Vocaluxe.Base public static EGameState GameState = EGameState.Start; public const string sProgramName = "Vocaluxe"; - public const string sProgramCodeName = "Rising Star"; + public const string sProgramCodeName = "Test"; public const int iVersionMajor = 0; - public const int iVersionMinor = 1; // milestones - public const int iVersionSub = 0; // steps + public const int iVersionMinor = 2; // milestones + public const int iVersionSub = 0; // patches public const ERevision VersionRevision = ERevision.Alpha; - public const int iBuild = 60; // Increase on every published version! Never Reset! + public const int iBuild = 66; // Increase on every published version! Never Reset! public const int iDatabaseHighscoreVersion = 1; public const int iDatabaseCoverVersion = 1; @@ -103,7 +103,7 @@ namespace Vocaluxe.Base public static int MouseMoveDiffMin = 2; public const float MouseMoveOffTime = 3f; - public const int MaxNumPlayer = 3; + public const int MaxNumPlayer = 6; public const int MaxScore = 10000; public const int LinebonusScore = 1000; public const int MinScoreForDB = 100; @@ -120,6 +120,11 @@ namespace Vocaluxe.Base public static bool TabNavigation = false; public const float BackgroundMusicFadeTime = 0.5f; + + public static List MusicFileTypes = new List() + { + "*.mp3","*.wma","*.ogg","*.wav" + }; public static string GetVersionText() { diff --git a/Vocaluxe/Base/CSound.cs b/Vocaluxe/Base/CSound.cs index e7956ecb..71c6fd59 100644 --- a/Vocaluxe/Base/CSound.cs +++ b/Vocaluxe/Base/CSound.cs @@ -181,6 +181,9 @@ namespace Vocaluxe.Base case ERecordLib.PortAudio: _Record = new CPortAudioRecord(); break; + case ERecordLib.DirectSound: + _Record = new CDirectSoundRecord(); + break; default: _Record = new CPortAudioRecord(); @@ -237,6 +240,16 @@ namespace Vocaluxe.Base return _Record.GetMaxVolume(Player); } + public static int NumHalfTones(int Player) + { + return _Record.NumHalfTones(Player); + } + + public static float[] ToneWeigth(int Player) + { + return _Record.ToneWeigth(Player); + } + public static SRecordDevice[] RecordGetDevices() { SRecordDevice[] devices = _Record.RecordDevices(); @@ -281,9 +294,10 @@ namespace Vocaluxe.Base class CBuffer { - private const double BaseToneFreq = 65.4064; - private const int NumHalfTones = 47; + private const double _BaseToneFreq = 65.4064; + private const int _NumHalfTones = 47; + private float[] _ToneWeigth; private Int16[] _AnalysisBuffer = new Int16[4096]; private Object _AnalysisBufferLock = new Object(); @@ -291,37 +305,71 @@ namespace Vocaluxe.Base private int _Tone = 0; private int _ToneAbs = 0; private double _MaxVolume = 0.0; - private bool _NewSamples = false; + private bool _NewSamples; private MemoryStream _Stream; // full buffer + public CBuffer() + { + _ToneWeigth = new float[_NumHalfTones]; + _Stream = new MemoryStream(); + _NewSamples = false; + } + + public int NumHalfTones + { + get { return _NumHalfTones; } + } + public int ToneAbs { - get { return _ToneAbs; } + get + { + lock (_AnalysisBufferLock) + { + return _ToneAbs; + } + } } public int Tone { - get { return _Tone; } - set { _Tone = value; } + get + { + lock (_AnalysisBufferLock) + { + return _Tone; + } + } + set + { + lock (_AnalysisBufferLock) + { + _Tone = value; + } + } } public float MaxVolume { get { - return (float)_MaxVolume; + lock (_AnalysisBufferLock) + { + return (float)_MaxVolume; + } } } public bool ToneValid { - get { return _ToneValid; } - } - - public CBuffer() - { - _Stream = new MemoryStream(); + get + { + lock (_AnalysisBufferLock) + { + return _ToneValid; + } + } } public long Length @@ -334,6 +382,17 @@ namespace Vocaluxe.Base get { return _Stream.ToArray(); } } + public float[] ToneWeigth + { + get + { + lock (_AnalysisBufferLock) + { + return _ToneWeigth; + } + } + } + public void Reset() { _Stream.SetLength(0L); @@ -359,39 +418,8 @@ namespace Vocaluxe.Base //if (assigned(fVoiceStream)) then //fVoiceStream.WriteData(Buffer, BufferSize); - int BufferOffset = 0; - int SampleCount = (int)Math.Floor(buffer.Length / 2.0); - - if (SampleCount > _AnalysisBuffer.Length) - { - BufferOffset = (SampleCount - _AnalysisBuffer.Length) * 2; - SampleCount = _AnalysisBuffer.Length; - } - lock (_AnalysisBufferLock) { - try - { - // move old samples to the beginning of the array (if necessary) - for (int i = 0; i < _AnalysisBuffer.Length - SampleCount; i++) - { - _AnalysisBuffer[i] = _AnalysisBuffer[i + SampleCount]; - } - - byte[] b = new byte[2]; - // copy new samples to analysis buffer - for (int i = 0; i < SampleCount; i++) - { - b[0] = buffer[BufferOffset + i * 2]; - b[1] = buffer[BufferOffset + i * 2 + 1]; - - _AnalysisBuffer[_AnalysisBuffer.Length - SampleCount + i] = BitConverter.ToInt16(b, 0); - } - } - catch (Exception) - { - - } Add(buffer); _NewSamples = true; } @@ -399,69 +427,98 @@ namespace Vocaluxe.Base public void AnalyzeBuffer() { + if (!_NewSamples) + return; + lock (_AnalysisBufferLock) { - if (!_NewSamples) - return; - - try + int len = _AnalysisBuffer.Length * 2; + if (_Stream.Length >= len) { - // find maximum volume - _MaxVolume = 0; - for (int i = 0; i < _AnalysisBuffer.Length/4; i++) - { - float Volume = Math.Abs((float)_AnalysisBuffer[i]) / (float)Int16.MaxValue; - if (Volume > MaxVolume) - _MaxVolume = Volume; - } + byte[] buf = new byte[len]; + _Stream.Position -= len; + _Stream.Read(buf, 0, len); - if (_MaxVolume >= 0.2f) + byte[] b = new byte[2]; + for (int i = 0; i < _AnalysisBuffer.Length; i++) { - // analyse the current voice pitch - AnalyzeByAutocorrelation(); - _ToneValid = true; - } - else - _ToneValid = false; + b[0] = buf[i * 2]; + b[1] = buf[i * 2 + 1]; - _NewSamples = false; + _AnalysisBuffer[i] = BitConverter.ToInt16(b, 0); + } } - catch (Exception) + _NewSamples = false; + } + + try + { + // find maximum volume + _MaxVolume = 0; + for (int i = 0; i < _AnalysisBuffer.Length / 4; i++) { - + float Volume = Math.Abs((float)_AnalysisBuffer[i]) / (float)Int16.MaxValue; + if (Volume > MaxVolume) + _MaxVolume = Volume; } + + if (_MaxVolume >= 0.02f) + AnalyzeByAutocorrelation(true); + else + AnalyzeByAutocorrelation(false); + + } + catch (Exception) + { + } } - private void AnalyzeByAutocorrelation() + private void AnalyzeByAutocorrelation(bool valid) { const double HalftoneBase = 1.05946309436; // 2^(1/12) -> HalftoneBase^12 = 2 (one octave) // prepare to analyze double MaxWeight = -1.0; - int MaxTone = 0; + double MinWeight = 1.0; + int MaxTone = -1; + float[] Weigth = new float[_NumHalfTones]; // analyze halftones // Note: at the lowest tone (~65Hz) and a buffer-size of 4096 // at 44.1 (or 48kHz) only 6 (or 5) samples are compared, this might be // too few samples -> use a bigger buffer-size - for (int ToneIndex = 0; ToneIndex < NumHalfTones; ToneIndex++) + for (int ToneIndex = 0; ToneIndex < _NumHalfTones; ToneIndex++) { - double CurFreq = BaseToneFreq * Math.Pow(HalftoneBase, ToneIndex); + double CurFreq = _BaseToneFreq * Math.Pow(HalftoneBase, ToneIndex); double CurWeight = AnalyzeAutocorrelationFreq(CurFreq); - // TODO: prefer higher frequencies (use >= or use downto) - if (CurWeight > MaxWeight /* && (Math.Abs(ToneIndex - _ToneAbs) < 5 || _ToneAbs == 0)*/) + if (CurWeight > MaxWeight) { - // this frequency has a higher weight MaxWeight = CurWeight; MaxTone = ToneIndex; } + + if (CurWeight < MinWeight) + MinWeight = CurWeight; + + Weigth[ToneIndex] = (float)CurWeight; } - _ToneAbs = MaxTone; - _Tone = MaxTone % 12; + if (valid && MaxWeight - MinWeight > 0.01) + { + for (int i = 0; i < Weigth.Length; i++) + { + _ToneWeigth[i] = Weigth[i]; + } + + _ToneAbs = MaxTone; + _Tone = MaxTone % 12; + _ToneValid = true; + } + else + _ToneValid = false; } private double AnalyzeAutocorrelationFreq(double Freq) diff --git a/Vocaluxe/Base/CVideo.cs b/Vocaluxe/Base/CVideo.cs index 496e76b1..718222b4 100644 --- a/Vocaluxe/Base/CVideo.cs +++ b/Vocaluxe/Base/CVideo.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; using System.Text; using Vocaluxe.Lib.Draw; @@ -95,4 +97,100 @@ namespace Vocaluxe.Base #endregion VideoDecoder } + + class VideoPlayer + { + private STexture _VideoTexture; + private int _VideoStream; + private Stopwatch _VideoTimer; + private bool _Finished; + private bool _Loaded; + + public bool IsFinished + { + get { return _Finished || !_Loaded; } + } + + public bool Loop + { + set { CVideo.VdSetLoop(_VideoStream, value); } + } + + public VideoPlayer() + { + _VideoTimer = new Stopwatch(); + _VideoTexture = new STexture(-1); + _Finished = false; + _Loaded = false; + } + + public void Load(string VideoName) + { + _VideoStream = CVideo.VdLoad(CTheme.GetVideoFilePath(VideoName)); + _Loaded = true; + } + + public void Start() + { + _VideoTimer.Reset(); + _Finished = false; + //CVideo.VdSkip(_VideoStream, 0f, 0f); + _VideoTimer.Start(); + } + + public void Pause() + { + _VideoTimer.Stop(); + } + + public void Resume() + { + _VideoTimer.Start(); + } + + public void Draw() + { + if (!_Finished) + { + + float VideoTime = _VideoTimer.ElapsedMilliseconds / 1000f; + _Finished = CVideo.VdFinished(_VideoStream); + + STexture tex = new STexture(-1); + tex.height = 0f; + CVideo.VdGetFrame(_VideoStream, ref tex, VideoTime, ref VideoTime); + + if (tex.height > 0) + { + CDraw.RemoveTexture(ref _VideoTexture); + _VideoTexture = tex; + } + } + RectangleF bounds = new RectangleF(0f, 0f, CSettings.iRenderW, CSettings.iRenderH); + RectangleF rect = new RectangleF(0f, 0f, _VideoTexture.width, _VideoTexture.height); + CHelper.SetRect(bounds, ref rect, rect.Width / rect.Height, EAspect.Crop); + + CDraw.DrawTexture(_VideoTexture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, CSettings.zFar / 4)); + } + + public void PreLoad() + { + float VideoTime = 0f; + while (_VideoTexture.index == -1 && VideoTime < 1f) + { + float dummy = 0f; + CVideo.VdGetFrame(_VideoStream, ref _VideoTexture, 0, ref dummy); + VideoTime += 0.05f; + } + } + + public void Close() + { + CVideo.VdClose(_VideoStream); + CDraw.RemoveTexture(ref _VideoTexture); + _Loaded = false; + _Finished = false; + _VideoTimer.Reset(); + } + } } diff --git a/Vocaluxe/GameModes/CGameMode.cs b/Vocaluxe/GameModes/CGameMode.cs index 80e19118..b1dede96 100644 --- a/Vocaluxe/GameModes/CGameMode.cs +++ b/Vocaluxe/GameModes/CGameMode.cs @@ -22,7 +22,9 @@ namespace Vocaluxe.GameModes _Rounds[round, player].ProfileID = Player[player].ProfileID; _Rounds[round, player].Name = Player[player].Name; _Rounds[round, player].Difficulty = Player[player].Difficulty; - _Rounds[round, player].Points = 0; + _Rounds[round, player].Points = 0f; + _Rounds[round, player].PointsGoldenNotes = 0f; + _Rounds[round, player].PointsLineBonus = 0f; _Rounds[round, player].Medley = false; _Rounds[round, player].Duet = false; _Rounds[round, player].SongFinished = false; @@ -38,6 +40,8 @@ namespace Vocaluxe.GameModes _Rounds[Round, player].SongID = SongID; _Rounds[Round, player].LineNr = Player[player].LineNr; _Rounds[Round, player].Points = Player[player].Points; + _Rounds[Round, player].PointsGoldenNotes = Player[player].PointsGoldenNotes; + _Rounds[Round, player].PointsLineBonus = Player[player].PointsLineBonus; _Rounds[Round, player].Medley = Medley; _Rounds[Round, player].Duet = Duet; _Rounds[Round, player].DateTicks = DateTicks; @@ -68,6 +72,8 @@ namespace Vocaluxe.GameModes { player[p].Name = _Rounds[Round, p].Name; player[p].Points = _Rounds[Round, p].Points; + player[p].PointsGoldenNotes = _Rounds[Round, p].PointsGoldenNotes; + player[p].PointsLineBonus = _Rounds[Round, p].PointsLineBonus; player[p].SongID = _Rounds[Round, p].SongID; player[p].LineNr = _Rounds[Round, p].LineNr; player[p].Difficulty = _Rounds[Round, p].Difficulty; diff --git a/Vocaluxe/Lib/Song/CNotes.cs b/Vocaluxe/Lib/Song/CNotes.cs index cda4cc48..d38dc820 100644 --- a/Vocaluxe/Lib/Song/CNotes.cs +++ b/Vocaluxe/Lib/Song/CNotes.cs @@ -45,6 +45,14 @@ namespace Vocaluxe.Lib.Song return _Lines[Index].Points; } + public int GetNumLinesWithPoints(int Index) + { + if (Index >= _Lines.Count) + return 0; + + return _Lines[Index].NumLinesWithPoints; + } + public void AddLines(CLines Lines) { _Lines.Add(Lines); @@ -614,6 +622,20 @@ namespace Vocaluxe.Lib.Song } } + public int NumLinesWithPoints + { + get + { + int num = 0; + foreach (CLine line in _Lines) + { + if (line.Points > 0f) + num++; + } + return num; + } + } + #region Methods public void AddLine(CLine Line) { diff --git a/Vocaluxe/Lib/Song/CSong.cs b/Vocaluxe/Lib/Song/CSong.cs index 7a5da546..e906c285 100644 --- a/Vocaluxe/Lib/Song/CSong.cs +++ b/Vocaluxe/Lib/Song/CSong.cs @@ -224,6 +224,11 @@ namespace Vocaluxe.Lib.Song return Path.Combine(Folder, MP3FileName); } + public string GetVideo() + { + return Path.Combine(Folder, VideoFileName); + } + public bool ReadTXTSong(string FilePath) { if (!File.Exists(FilePath)) @@ -557,9 +562,9 @@ namespace Vocaluxe.Lib.Song TempC = (char)sr.Read(); } while ((TempC.CompareTo(':') != 0) && (TempC.CompareTo('F') != 0) && (TempC.CompareTo('*') != 0) && (TempC.CompareTo('P') != 0)); - FileLineNo++; while (!sr.EndOfStream && (TempC.CompareTo('E') != 0)) { + FileLineNo++; if (TempC.CompareTo('P') == 0) { char chr = (char)sr.Read(); @@ -634,7 +639,7 @@ namespace Vocaluxe.Lib.Song { c = sr.Read(); TempC = (char)c; - } while ((TempC.CompareTo('E') != 0) && !sr.EndOfStream && (c == 19 || c == 16 || c == 13)); + } while ((TempC.CompareTo('E') != 0) && !sr.EndOfStream && (c == 19 || c == 16 || c == 13 || c==10)); } foreach(CLines lines in this.Notes.Lines) { diff --git a/Vocaluxe/Lib/Sound/CDirectSoundRecord.cs b/Vocaluxe/Lib/Sound/CDirectSoundRecord.cs new file mode 100644 index 00000000..c8abe845 --- /dev/null +++ b/Vocaluxe/Lib/Sound/CDirectSoundRecord.cs @@ -0,0 +1,437 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using SlimDX.DirectSound; +using SlimDX.Multimedia; +using Vocaluxe.Base; + +namespace Vocaluxe.Lib.Sound +{ + class CDirectSoundRecord : IRecord + { + private bool _initialized = false; + private List _Devices = null; + private SRecordDevice[] _DeviceConfig = null; + private List _Sources = null; + + private CBuffer[] _Buffer; + + public CDirectSoundRecord() + { + _Buffer = new CBuffer[CSettings.MaxNumPlayer]; + for (int i = 0; i < _Buffer.Length; i++) + { + _Buffer[i] = new CBuffer(); + } + + Init(); + } + + public bool Init() + { + DeviceCollection devices = DirectSoundCapture.GetDevices(); + _Devices = new List(); + _Sources = new List(); + + int id = 0; + foreach (DeviceInformation dev in devices) + { + DirectSoundCapture ds = new DirectSoundCapture(dev.DriverGuid); + + SRecordDevice device = new SRecordDevice(); + device.Driver = dev.DriverGuid.ToString(); + device.ID = id; + device.Name = dev.Description; + device.Inputs = new List(); + + SInput inp = new SInput(); + inp.Name = "Default"; + inp.Channels = ds.Capabilities.Channels; + + if (inp.Channels > 2) + inp.Channels = 2; //more are not supported in vocaluxe + + device.Inputs.Add(inp); + _Devices.Add(device); + + id++; + ds.Dispose(); + } + + _DeviceConfig = _Devices.ToArray(); + _initialized = true; + + return true; + } + + public void CloseAll() + { + if (_initialized) + { + foreach (SoundCardSource source in _Sources) + { + source.Stop(); + source.Dispose(); + } + _initialized = false; + } + //System.IO.File.WriteAllBytes("test0.raw", _Buffer[0].Buffer); + } + + public bool Start(SRecordDevice[] DeviceConfig) + { + if (!_initialized) + return false; + + for (int i = 0; i < _Buffer.Length; i++) + { + _Buffer[i].Reset(); + } + + _DeviceConfig = DeviceConfig; + bool[] active = new bool[DeviceConfig.Length]; + Guid[] guid = new Guid[DeviceConfig.Length]; + short[] channels = new short[DeviceConfig.Length]; + for (int dev = 0; dev < DeviceConfig.Length; dev++) + { + active[dev] = false; + for (int inp = 0; inp < DeviceConfig[dev].Inputs.Count; inp++) + { + if (DeviceConfig[dev].Inputs[inp].PlayerChannel1 > 0 || + DeviceConfig[dev].Inputs[inp].PlayerChannel2 > 0) + active[dev] = true; + guid[dev] = new Guid(DeviceConfig[dev].Driver); + channels[dev] = (short)DeviceConfig[dev].Inputs[0].Channels; + } + } + + for (int i = 0; i < _Devices.Count; i++) + { + if (active[i]) + { + SoundCardSource source = new SoundCardSource(guid[i], channels[i]); + source.SampleRateKHz = 44.1; + source.SampleDataReady += this.OnDataReady; + source.Start(); + + _Sources.Add(source); + + } + } + + _DeviceConfig = DeviceConfig; + return true; + } + + public bool Stop() + { + if (!_initialized) + return false; + + foreach (SoundCardSource source in _Sources) + { + source.Stop(); + } + return true; + } + public void AnalyzeBuffer(int Player) + { + if (!_initialized) + return; + + _Buffer[Player].AnalyzeBuffer(); + } + + public int GetToneAbs(int Player) + { + if (!_initialized) + return 0; + + return _Buffer[Player].ToneAbs; + } + + public int GetTone(int Player) + { + if (!_initialized) + return 0; + + return _Buffer[Player].Tone; + } + + public void SetTone(int Player, int Tone) + { + if (!_initialized) + return; + + _Buffer[Player].Tone = Tone; + } + + public float GetMaxVolume(int Player) + { + if (!_initialized) + return 0f; + + return _Buffer[Player].MaxVolume; + } + + public bool ToneValid(int Player) + { + if (!_initialized) + return false; + + return _Buffer[Player].ToneValid; + } + + public SRecordDevice[] RecordDevices() + { + if (!_initialized) + return null; + + if (_Devices.Count == 0) + return null; + + return _Devices.ToArray(); + } + + public int NumHalfTones(int Player) + { + if (!_initialized) + return 0; + + return _Buffer[Player].NumHalfTones; + } + + public float[] ToneWeigth(int Player) + { + if (!_initialized) + return null; + + return _Buffer[Player].ToneWeigth; + } + + private void OnDataReady(object sender, SampleDataEventArgs e) + { + if (_initialized) + { + byte[] _leftBuffer = new byte[e.Data.Length / 2]; + byte[] _rightBuffer = new byte[e.Data.Length / 2]; + + //[]: Sample, L: Left channel R: Right channel + //[LR][LR][LR][LR][LR][LR] + //The data is interleaved and needs to be demultiplexed + for (int i = 0; i < e.Data.Length / 2; i++) + { + _leftBuffer[i] = e.Data[i * 2 - (i % 2)]; + _rightBuffer[i] = e.Data[i * 2 - (i % 2) + 2]; + } + + for (int i = 0; i < _DeviceConfig.Length; i++) + { + if (_DeviceConfig[i].Driver == e.Guid.ToString()) + { + if (_DeviceConfig[i].Inputs[0].PlayerChannel1 > 0) + _Buffer[_DeviceConfig[i].Inputs[0].PlayerChannel1 - 1].ProcessNewBuffer(_leftBuffer); + + if (_DeviceConfig[i].Inputs[0].PlayerChannel2 > 0) + _Buffer[_DeviceConfig[i].Inputs[0].PlayerChannel2 - 1].ProcessNewBuffer(_rightBuffer); + } + } + } + } + + public class SampleDataEventArgs : EventArgs + { + public SampleDataEventArgs(byte[] data, Guid guid) + { + this.Data = data; + this.Guid = guid; + } + + public byte[] Data { get; private set; } + public Guid Guid { get; private set; } + } + + public class SoundCardSource : IDisposable + { + private volatile bool running; + private int bufferSize; + private CaptureBuffer buffer; + private CaptureBufferDescription bufferDescription; + private DirectSoundCapture captureDevice; + private WaveFormat waveFormat; + private Thread captureThread; + private List notifications; + private int bufferPortionCount; + private int bufferPortionSize; + private WaitHandle[] waitHandles; + private double sampleRate; + private Guid guid; + private short channels; + + public SoundCardSource(Guid guid, short channels) + { + this.guid = guid; + this.channels = channels; + this.waveFormat = new WaveFormat(); + this.SampleRateKHz = 44.1; + this.bufferSize = 2048; + } + + public event EventHandler SampleDataReady = delegate { }; + + public double SampleRateKHz + { + get + { + return this.sampleRate; + } + + set + { + this.sampleRate = value; + + if (this.running) + { + this.Restart(); + } + } + } + + public void Start() + { + if (this.running) + { + throw new InvalidOperationException(); + } + + if (this.captureDevice == null) + { + this.captureDevice = new DirectSoundCapture(guid); + } + + this.waveFormat.FormatTag = WaveFormatTag.Pcm; // Change to WaveFormatTag.IeeeFloat for float + this.waveFormat.BitsPerSample = 16; // Set this to 32 for float + this.waveFormat.BlockAlignment = (short)(channels * (waveFormat.BitsPerSample / 8)); + this.waveFormat.Channels = this.channels; + this.waveFormat.SamplesPerSecond = (int)(this.SampleRateKHz * 1000D); + this.waveFormat.AverageBytesPerSecond = + this.waveFormat.SamplesPerSecond * + this.waveFormat.BlockAlignment; + + this.bufferPortionCount = 2; + + this.bufferDescription.BufferBytes = this.bufferSize * sizeof(short) * bufferPortionCount * this.channels; + this.bufferDescription.Format = this.waveFormat; + this.bufferDescription.WaveMapped = false; + + this.buffer = new CaptureBuffer(this.captureDevice, this.bufferDescription); + + this.bufferPortionSize = this.buffer.SizeInBytes / this.bufferPortionCount; + this.notifications = new List(); + + for (int i = 0; i < this.bufferPortionCount; i++) + { + NotificationPosition notification = new NotificationPosition(); + notification.Offset = this.bufferPortionCount - 1 + (bufferPortionSize * i); + notification.Event = new AutoResetEvent(false); + this.notifications.Add(notification); + } + + this.buffer.SetNotificationPositions(this.notifications.ToArray()); + this.waitHandles = new WaitHandle[this.notifications.Count]; + + for (int i = 0; i < this.notifications.Count; i++) + { + this.waitHandles[i] = this.notifications[i].Event; + } + + this.captureThread = new Thread(new ThreadStart(this.CaptureThread)); + this.captureThread.IsBackground = true; + + this.running = true; + this.captureThread.Start(); + } + + public void Stop() + { + this.running = false; + + if (this.captureThread != null) + { + this.captureThread.Join(); + this.captureThread = null; + } + + if (this.buffer != null) + { + this.buffer.Dispose(); + this.buffer = null; + } + + if (this.notifications != null) + { + for (int i = 0; i < this.notifications.Count; i++) + { + this.notifications[i].Event.Close(); + } + + this.notifications.Clear(); + this.notifications = null; + } + } + + public void Restart() + { + this.Stop(); + this.Start(); + } + + private void CaptureThread() + { + int bufferPortionSamples = this.bufferPortionSize / sizeof(byte); + + // Buffer type must match this.waveFormat.FormatTag and this.waveFormat.BitsPerSample + byte[] bufferPortion = new byte[bufferPortionSamples]; + int bufferPortionIndex; + + this.buffer.Start(true); + + while (this.running) + { + bufferPortionIndex = WaitHandle.WaitAny(this.waitHandles); + + this.buffer.Read( + bufferPortion, + 0, + bufferPortionSamples, + bufferPortionSize * Math.Abs((bufferPortionIndex - 1) % bufferPortionCount)); + + this.SampleDataReady(this, new SampleDataEventArgs(bufferPortion, guid)); + } + + this.buffer.Stop(); + } + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + this.Stop(); + + if (this.captureDevice != null) + { + this.captureDevice.Dispose(); + this.captureDevice = null; + } + } + } + } + + } +} diff --git a/Vocaluxe/Lib/Sound/CPortAudioPlay.cs b/Vocaluxe/Lib/Sound/CPortAudioPlay.cs index ad2122f0..6c7ebc7c 100644 --- a/Vocaluxe/Lib/Sound/CPortAudioPlay.cs +++ b/Vocaluxe/Lib/Sound/CPortAudioPlay.cs @@ -422,10 +422,10 @@ namespace Vocaluxe.Lib.Sound private Thread _DecoderThread; - AutoResetEvent EventDecode = new AutoResetEvent(false); + private AutoResetEvent EventDecode = new AutoResetEvent(false); - Object MutexData = new Object(); - Object MutexSyncSignals = new Object(); + private Object _LockData = new Object(); + private Object _LockSyncSignals = new Object(); public PortAudioStream() { @@ -456,7 +456,7 @@ namespace Vocaluxe.Lib.Sound { get { - lock (MutexData) + lock (_LockData) { return _NoMoreData && _data.BytesNotRead == 0L; } @@ -468,7 +468,7 @@ namespace Vocaluxe.Lib.Sound get { return _Volume * 100f; } set { - lock (MutexData) + lock (_LockData) { _Volume = value / 100f; if (_Volume < 0f) @@ -484,7 +484,7 @@ namespace Vocaluxe.Lib.Sound { get { - lock (MutexData) + lock (_LockData) { if (Finished) _SyncTimer.Pause(); @@ -500,7 +500,7 @@ namespace Vocaluxe.Lib.Sound set { _Paused = value; - lock (MutexSyncSignals) + lock (_LockData) { if (_Paused) _SyncTimer.Pause(); @@ -615,12 +615,13 @@ namespace Vocaluxe.Lib.Sound outputParams.sampleFormat = PortAudio.PaSampleFormat.paInt16; outputParams.suggestedLatency = _outputDeviceInfo.defaultLowOutputLatency; + uint bufsize = (uint)CConfig.AudioBufferSize; errorCheck("OpenDefaultStream", PortAudio.Pa_OpenStream( out _Ptr, IntPtr.Zero, ref outputParams, format.SamplesPerSecond, - (uint)CConfig.AudioBufferSize, + bufsize, PortAudio.PaStreamFlags.paNoFlag, _paStreamCallback, data)); @@ -645,7 +646,7 @@ namespace Vocaluxe.Lib.Sound public bool Skip(float Time) { - lock (MutexSyncSignals) + lock (_LockSyncSignals) { _SetStart = Time; _SetSkip = true; @@ -658,7 +659,7 @@ namespace Vocaluxe.Lib.Sound #region Threading private void DoSkip() { - lock (MutexData) + lock (_LockData) { _Decoder.SetPosition(_Start); _CurrentTime = _Start; @@ -677,7 +678,7 @@ namespace Vocaluxe.Lib.Sound { if (EventDecode.WaitOne(10)) { - lock (MutexSyncSignals) + lock (_LockSyncSignals) { if (_SetSkip) { @@ -724,7 +725,7 @@ namespace Vocaluxe.Lib.Sound byte[] Buffer; bool DoIt = false; - lock (MutexData) + lock (_LockData) { if (!_skip && BUFSIZE - 10000L > _data.BytesNotRead) DoIt = true; @@ -739,7 +740,7 @@ namespace Vocaluxe.Lib.Sound { if (_Loop) { - lock (MutexSyncSignals) + lock (_LockSyncSignals) { _CurrentTime = 0f; _Start = 0f; @@ -754,7 +755,7 @@ namespace Vocaluxe.Lib.Sound return; } - lock (MutexData) + lock (_LockData) { _data.Write(Buffer); _TimeCode = Timecode; @@ -804,7 +805,7 @@ namespace Vocaluxe.Lib.Sound return PortAudio.PaStreamCallbackResult.paContinue; } - lock (MutexData) + lock (_LockData) { if (_NoMoreData || _data.BytesNotRead >= buf.Length) { diff --git a/Vocaluxe/Lib/Sound/CPortAudioRecord.cs b/Vocaluxe/Lib/Sound/CPortAudioRecord.cs index 87bff1ab..884886cb 100644 --- a/Vocaluxe/Lib/Sound/CPortAudioRecord.cs +++ b/Vocaluxe/Lib/Sound/CPortAudioRecord.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using System.Text; @@ -90,6 +91,7 @@ namespace Vocaluxe.Lib.Sound CLog.LogError("Error initializing PortAudio: " + e.Message); return false; } + return true; } @@ -103,6 +105,15 @@ namespace Vocaluxe.Lib.Sound if (!_initialized) return false; + if (DeviceConfig == null) + return false; + + if (_recHandle == null) + return false; + + if (_recHandle.Length == 0) + return false; + for (int i = 0; i < _Buffer.Length; i++) { _Buffer[i].Reset(); @@ -142,7 +153,7 @@ namespace Vocaluxe.Lib.Sound ref inputParams, IntPtr.Zero, 44100, - PortAudio.paFramesPerBufferUnspecified, + 882, PortAudio.PaStreamFlags.paNoFlag, _myRecProc, new IntPtr(i)))) @@ -152,7 +163,6 @@ namespace Vocaluxe.Lib.Sound return false; } } - return result; } @@ -240,6 +250,22 @@ namespace Vocaluxe.Lib.Sound return _Buffer[Player].ToneValid; } + public int NumHalfTones(int Player) + { + if (!_initialized) + return 0; + + return _Buffer[Player].NumHalfTones; + } + + public float[] ToneWeigth(int Player) + { + if (!_initialized) + return null; + + return _Buffer[Player].ToneWeigth; + } + public SRecordDevice[] RecordDevices() { if (!_initialized) diff --git a/Vocaluxe/Lib/Sound/IRecord.cs b/Vocaluxe/Lib/Sound/IRecord.cs index e4b9cc2b..3b664a71 100644 --- a/Vocaluxe/Lib/Sound/IRecord.cs +++ b/Vocaluxe/Lib/Sound/IRecord.cs @@ -51,6 +51,8 @@ namespace Vocaluxe.Lib.Sound void SetTone(int Player, int Tone); float GetMaxVolume(int Player); bool ToneValid(int Player); + int NumHalfTones(int Player); + float[] ToneWeigth(int Player); SRecordDevice[] RecordDevices(); } diff --git a/Vocaluxe/Lib/Video/Acinerella/acinerella.c b/Vocaluxe/Lib/Video/Acinerella/acinerella.c index c5b23ef7..3550bc07 100644 --- a/Vocaluxe/Lib/Video/Acinerella/acinerella.c +++ b/Vocaluxe/Lib/Video/Acinerella/acinerella.c @@ -167,21 +167,6 @@ static int64_t io_seek(void *opaque, int64_t pos, int whence) return -1; } -//uint64_t global_video_pkt_pts = AV_NOPTS_VALUE; - -int ac_get_buffer(struct AVCodecContext *c, AVFrame *pic) { - int ret = avcodec_default_get_buffer(c, pic); - uint64_t *pts = av_malloc(sizeof(uint64_t)); - *pts = AV_NOPTS_VALUE; - pic->opaque = pts; - return ret; -} - -void ac_release_buffer(struct AVCodecContext *c, AVFrame *pic){ - if (pic) av_freep(&pic->opaque); - avcodec_default_release_buffer(c, pic); -} - lp_ac_proberesult CALL_CONVT ac_probe_input_buffer( void* buf, int bufsize, @@ -533,7 +518,10 @@ void* ac_create_video_decoder(lp_ac_instance pacInstance, lp_ac_stream_info info if (!(pDecoder->pCodec = avcodec_find_decoder(pDecoder->pCodecCtx->codec_id))) { return NULL; //Codec could not have been found } - + + pDecoder->pCodecCtx->thread_count = 1; //this is for HT CPUs, it should be + // tested if there is a better solution + //Open codec if (avcodec_open2(pDecoder->pCodecCtx, pDecoder->pCodec, NULL) < 0) { return NULL; //Codec could not have been opened @@ -635,36 +623,34 @@ double ac_sync_video(lp_ac_package pPackage, lp_ac_decoder pDec, AVFrame *src_fr return pts; } -int ac_decode_video_package(lp_ac_package pPackage, lp_ac_video_decoder pDecoder, lp_ac_decoder pDec) { - if (((lp_ac_package_data)pPackage)->ffpackage.size <= 0) - return 0; - +int ac_decode_video_package(lp_ac_package pPackage, lp_ac_video_decoder pDecoder, lp_ac_decoder pDec) +{ int finished = 0; double pts = 0; + int len = 0; + + AVPacket pkt_tmp = ((lp_ac_package_data)pPackage)->ffpackage; + + while (pkt_tmp.size > 0) { + len = avcodec_decode_video2( + pDecoder->pCodecCtx, pDecoder->pFrame, + &finished, &pkt_tmp); + + if (len < 0) { + return 0; + } + pkt_tmp.size -= len; + pkt_tmp.data += len; + } + + /* avcodec_decode_video2( pDecoder->pCodecCtx, pDecoder->pFrame, &finished, &(((lp_ac_package_data)pPackage)->ffpackage)); + */ - if (finished) { - if(((lp_ac_package_data)pPackage)->ffpackage.dts == AV_NOPTS_VALUE && - *(uint64_t*)pDecoder->pFrame->opaque != AV_NOPTS_VALUE ){ - pts = *(uint64_t*)pDecoder->pFrame->opaque; - } else if(((lp_ac_package_data)pPackage)->ffpackage.dts != AV_NOPTS_VALUE){ - pts = ((lp_ac_package_data)pPackage)->ffpackage.dts; - } else { - pts = 0; - } - - if(((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->start_time != AV_NOPTS_VALUE){ - pts -= ((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->start_time; - } - - pts *= av_q2d(((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->time_base); - - pts = ac_sync_video(pPackage, pDec, pDecoder->pFrame, pts); - pDec->timecode = pts; - + if (finished != 0) { pDecoder->pSwsCtx = sws_getCachedContext(pDecoder->pSwsCtx, pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height, pDecoder->pCodecCtx->pix_fmt, pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height, convert_pix_format(pDecoder->decoder.pacInstance->output_format), @@ -678,6 +664,24 @@ int ac_decode_video_package(lp_ac_package pPackage, lp_ac_video_decoder pDecoder pDecoder->pCodecCtx->height, pDecoder->pFrameRGB->data, pDecoder->pFrameRGB->linesize); + + + if(pkt_tmp.dts == AV_NOPTS_VALUE && + *(uint64_t*)pDecoder->pFrame->opaque != AV_NOPTS_VALUE ){ + pts = *(uint64_t*)pDecoder->pFrame->opaque; + } else if(pkt_tmp.dts != AV_NOPTS_VALUE){ + pts = pkt_tmp.dts; + } + + if(((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->start_time != AV_NOPTS_VALUE){ + pts -= ((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->start_time; + } + + pts *= av_q2d(((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->time_base); + + pts = ac_sync_video(pPackage, pDec, pDecoder->pFrame, pts); + pDec->timecode = pts; + return 1; } return 0; @@ -795,11 +799,23 @@ int CALL_CONVT ac_drop_decode_package(lp_ac_package pPackage, lp_ac_decoder pDec int ac_drop_decode_video_package(lp_ac_package pPackage, lp_ac_video_decoder pDecoder, lp_ac_decoder pDec) { int finished; double pts; + int len = 0; - avcodec_decode_video2( - pDecoder->pCodecCtx, pDecoder->pFrame, &finished, - &(((lp_ac_package_data)pPackage)->ffpackage)); + AVPacket pkt_tmp = ((lp_ac_package_data)pPackage)->ffpackage; + + while (pkt_tmp.size > 0) { + len = avcodec_decode_video2( + pDecoder->pCodecCtx, pDecoder->pFrame, + &finished, &pkt_tmp); + + if (len < 0) { + return 0; + } + pkt_tmp.size -= len; + pkt_tmp.data += len; + } + if (finished) { pts=0; //global_video_pkt_pts = ((lp_ac_package_data)pPackage)->ffpackage.pts; @@ -860,11 +876,12 @@ int CALL_CONVT ac_get_frame(lp_ac_instance pacInstance, lp_ac_decoder pDecoder) lp_ac_package pPackage = ac_read_package(pacInstance); int done = 0; + int pcount = 0; while(done == 0 && pPackage != NULL){ if (((lp_ac_package_data)pPackage)->package.stream_index == pDecoder->stream_index){ done = ac_decode_package(pPackage, pDecoder); ac_free_package(pPackage); - + pcount++; if (done == 0) pPackage = ac_read_package(pacInstance); } else { @@ -876,7 +893,7 @@ int CALL_CONVT ac_get_frame(lp_ac_instance pacInstance, lp_ac_decoder pDecoder) if (done == 0) return 0; else - return 1; + return pcount; } int CALL_CONVT ac_skip_frames(lp_ac_instance pacInstance, lp_ac_decoder pDecoder, int num) { diff --git a/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs b/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs index 4756ae06..a9cacb6d 100644 --- a/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs +++ b/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs @@ -258,8 +258,9 @@ namespace Vocaluxe.Lib.Video private bool _terminated = false; private Thread _thread; - AutoResetEvent EventDecode = new AutoResetEvent(false); + //AutoResetEvent EventDecode = new AutoResetEvent(false); SFrameBuffer[] _FrameBuffer = new SFrameBuffer[5]; + private bool _NewFrame = false; Object MutexFramebuffer = new Object(); Object MutexSyncSignals = new Object(); @@ -359,7 +360,7 @@ namespace Vocaluxe.Lib.Video UploadNewFrame(ref frame); - EventDecode.Set(); + //EventDecode.Set(); return true; } @@ -367,11 +368,11 @@ namespace Vocaluxe.Lib.Video { lock (MutexSyncSignals) { - _SetTime = Time; - VideoTime = _CurrentVideoTime; + _SetTime = Time; } UploadNewFrame(ref frame); - EventDecode.Set(); + VideoTime = _CurrentVideoTime; + //EventDecode.Set(); return true; } return false; @@ -387,7 +388,7 @@ namespace Vocaluxe.Lib.Video _NoMoreFrames = false; _Finished = false; } - EventDecode.Set(); + //EventDecode.Set(); return true; } @@ -441,17 +442,18 @@ namespace Vocaluxe.Lib.Video _BufferFull = false; _skip = false; - EventDecode.Set(); + _NewFrame = false; + //EventDecode.Set(); } private void Execute() { DoOpen(); - EventDecode.Set(); + //EventDecode.Set(); while (!_terminated) { - if (EventDecode.WaitOne(10)) + //if (EventDecode.WaitOne(10)) { lock (MutexSyncSignals) { @@ -468,11 +470,12 @@ namespace Vocaluxe.Lib.Video if (_skip) DoSkip(); - if (!_BufferFull) + if (!_NewFrame) DoDecode(); - if (_BufferFull) - Copy(); + if (_NewFrame) + Copy(); + Thread.Sleep(1); } } @@ -555,7 +558,7 @@ namespace Vocaluxe.Lib.Video { const int FRAMEDROPCOUNT = 4; - if (!_FileOpened) + if (!_FileOpened || _NewFrame) return; if (_Paused || _NoMoreFrames || _BufferFull) @@ -641,12 +644,18 @@ namespace Vocaluxe.Lib.Video } return; } - - Copy(); + else + { + _NewFrame = true; + Copy(); + } } private void Copy() { + if (!_NewFrame) + return; + int num = -1; lock (MutexFramebuffer) @@ -687,11 +696,13 @@ namespace Vocaluxe.Lib.Video if (numfull < _FrameBuffer.Length) _BufferFull = false; + + _NewFrame = false; } } - if (!_BufferFull) - EventDecode.Set(); + //if (!_BufferFull) + // EventDecode.Set(); } private void UploadNewFrame(ref STexture frame) @@ -720,7 +731,7 @@ namespace Vocaluxe.Lib.Video _CurrentVideoTime = _FrameBuffer[num].time; } _Finished = false; - EventDecode.Set(); + //EventDecode.Set(); } else { @@ -739,7 +750,7 @@ namespace Vocaluxe.Lib.Video { float td = _SetTime + _VideoSkipTime - _FrameBuffer[i].time; - if (td > _VideoTimeBase * 2) + if (td > _VideoTimeBase * 2f) { _FrameBuffer[i].displayed = true; } @@ -754,6 +765,7 @@ namespace Vocaluxe.Lib.Video if (Result != -1) { _FrameBuffer[Result].displayed = true; + _BufferFull = false; } return Result; diff --git a/Vocaluxe/Menu/CBackground.cs b/Vocaluxe/Menu/CBackground.cs index c6adfa33..cedc4eb5 100644 --- a/Vocaluxe/Menu/CBackground.cs +++ b/Vocaluxe/Menu/CBackground.cs @@ -137,8 +137,16 @@ namespace Vocaluxe.Menu public bool Draw() { bool ok = false; - if (_Theme.Type == EBackgroundTypes.Video && CConfig.VideoBackgrounds == EOffOn.TR_CONFIG_ON) + if (_Theme.Type == EBackgroundTypes.Video && CConfig.VideoBackgrounds == EOffOn.TR_CONFIG_ON && CConfig.VideosToBackground == EOffOn.TR_CONFIG_ON && CBackgroundMusic.Playing && CBackgroundMusic.SongHasVideo && CBackgroundMusic.VideoEnabled && !CBackgroundMusic.Disabled) + { + Pause(); + ok = DrawBackgroundMusicVideo(); + } + else if (_Theme.Type == EBackgroundTypes.Video && CConfig.VideoBackgrounds == EOffOn.TR_CONFIG_ON) + { + Resume(); ok = DrawVideo(); + } if (_Theme.TextureName != String.Empty && (_Theme.Type == EBackgroundTypes.Texture || @@ -206,6 +214,21 @@ namespace Vocaluxe.Menu } return false; } + + private bool DrawBackgroundMusicVideo() + { + STexture VideoTexture = CBackgroundMusic.GetVideoTexture(); + if (VideoTexture.height > 0) + { + RectangleF bounds = new RectangleF(0f, 0f, CSettings.iRenderW, CSettings.iRenderH); + RectangleF rect = new RectangleF(0f, 0f, VideoTexture.width, VideoTexture.height); + CHelper.SetRect(bounds, ref rect, rect.Width / rect.Height, EAspect.Crop); + + CDraw.DrawTexture(VideoTexture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, CSettings.zFar / 4)); + return true; + } + return false; + } #endregion internal #region ThemeEdit diff --git a/Vocaluxe/Menu/CButton.cs b/Vocaluxe/Menu/CButton.cs index 0341bf03..d4b5d231 100644 --- a/Vocaluxe/Menu/CButton.cs +++ b/Vocaluxe/Menu/CButton.cs @@ -41,6 +41,7 @@ namespace Vocaluxe.Menu public float SReflectionHeight; private bool _Selected; + public bool Pressed; public bool Selected { get { return _Selected; } @@ -234,7 +235,8 @@ namespace Vocaluxe.Menu return; STexture texture = new STexture(-1); - if (!Selected) + + if (!Selected && !Pressed) { texture = CTheme.GetSkinTexture(_Theme.TextureName); CDraw.DrawTexture(texture, Rect, Color); diff --git a/Vocaluxe/Menu/CGraphics.cs b/Vocaluxe/Menu/CGraphics.cs index cd3148de..ac7fa531 100644 --- a/Vocaluxe/Menu/CGraphics.cs +++ b/Vocaluxe/Menu/CGraphics.cs @@ -36,6 +36,13 @@ namespace Vocaluxe.Menu ScreenNull = -1 } + enum EPopupScreens + { + PopupPlayerControl = 0, + + NoPopup = -1 + } + class CCursor { private Stopwatch _CursorFadingTimer; @@ -185,11 +192,12 @@ namespace Vocaluxe.Menu private static float _GlobalAlpha; private static float _ZOffset; - private static EScreens ActualScreen; - private static EScreens NextScreen; + private static EScreens _CurrentScreen; + private static EScreens _NextScreen; + private static EPopupScreens _CurrentPopupScreen; - private static List ScreenList = new List(); - private static CMenu[] Screens; + private static List _Screens = new List(); + private static List _PopupScreens = new List(); public static float GlobalAlpha { @@ -206,28 +214,31 @@ namespace Vocaluxe.Menu { // Add Screens, must be the same order as in EScreens! CLog.StartBenchmark(1, "Build Screen List"); - ScreenList.Add(new CScreenTest()); - ScreenList.Add(new CScreenLoad()); - ScreenList.Add(new CScreenMain()); - ScreenList.Add(new CScreenSong()); - ScreenList.Add(new CScreenOptions()); - ScreenList.Add(new CScreenSing()); - ScreenList.Add(new CScreenProfiles()); - ScreenList.Add(new CScreenScore()); - ScreenList.Add(new CScreenHighscore()); - ScreenList.Add(new CScreenOptionsGame()); - ScreenList.Add(new CScreenOptionsSound()); - ScreenList.Add(new CScreenOptionsRecord()); - ScreenList.Add(new CScreenOptionsVideo()); - ScreenList.Add(new CScreenOptionsTheme()); - ScreenList.Add(new CScreenNames()); - ScreenList.Add(new CScreenCredits()); - CLog.StopBenchmark(1, "Build Screen List"); - Screens = ScreenList.ToArray(); + _Screens.Add(new CScreenTest()); + _Screens.Add(new CScreenLoad()); + _Screens.Add(new CScreenMain()); + _Screens.Add(new CScreenSong()); + _Screens.Add(new CScreenOptions()); + _Screens.Add(new CScreenSing()); + _Screens.Add(new CScreenProfiles()); + _Screens.Add(new CScreenScore()); + _Screens.Add(new CScreenHighscore()); + _Screens.Add(new CScreenOptionsGame()); + _Screens.Add(new CScreenOptionsSound()); + _Screens.Add(new CScreenOptionsRecord()); + _Screens.Add(new CScreenOptionsVideo()); + _Screens.Add(new CScreenOptionsTheme()); + _Screens.Add(new CScreenNames()); + _Screens.Add(new CScreenCredits()); + + _PopupScreens.Add(new CPopupScreenPlayerControl()); + + CLog.StopBenchmark(1, "Build Screen List"); - ActualScreen = EScreens.ScreenLoad; - NextScreen = EScreens.ScreenNull; + _CurrentScreen = EScreens.ScreenLoad; + _NextScreen = EScreens.ScreenNull; + _CurrentPopupScreen = EPopupScreens.NoPopup; _FadingTimer = new Stopwatch(); _GlobalAlpha = 1f; @@ -247,50 +258,65 @@ namespace Vocaluxe.Menu CTheme.Cursor.h, CSettings.zNear); - for (int i = 0; i < Screens.Length; i++) + for (int i = 0; i < _Screens.Count; i++) { CLog.StartBenchmark(1, "Load Theme " + Enum.GetNames(typeof(EScreens))[i]); - Screens[i].LoadTheme(); + _Screens[i].LoadTheme(); CLog.StopBenchmark(1, "Load Theme " + Enum.GetNames(typeof(EScreens))[i]); } + + for (int i = 0; i < _PopupScreens.Count; i++) + { + _PopupScreens[i].LoadTheme(); + } } public static void ReloadTheme() { ReloadCursor(); - for (int i = 0; i < Screens.Length; i++) + for (int i = 0; i < _Screens.Count; i++) { - Screens[i].ReloadTheme(); + _Screens[i].ReloadTheme(); } + + for (int i = 0; i < _PopupScreens.Count; i++) + { + _PopupScreens[i].ReloadTheme(); + } } public static void ReloadSkin() { ReloadCursor(); - for (int i = 0; i < Screens.Length; i++) + for (int i = 0; i < _Screens.Count; i++) { - Screens[i].ReloadTextures(); + _Screens[i].ReloadTextures(); } + + for (int i = 0; i < _PopupScreens.Count; i++) + { + _PopupScreens[i].ReloadTextures(); + } } public static void SaveTheme() { CTheme.SaveTheme(); - for (int i = 0; i < Screens.Length; i++) + for (int i = 0; i < _Screens.Count; i++) { - Screens[i].SaveTheme(); + _Screens[i].SaveTheme(); } + + for (int i = 0; i < _PopupScreens.Count; i++) + { + _PopupScreens[i].SaveTheme(); + } } public static void InitFirstScreen() { - Screens[(int)ActualScreen].OnShow(); - Screens[(int)ActualScreen].OnShowFinish(); - } - - public static CMenu GetScreen(int Index) - { - return Screens[Index]; + _Screens[(int)_CurrentScreen].OnShow(); + _Screens[(int)_CurrentScreen].OnShowFinish(); } public static bool UpdateGameLogic(CKeys Keys, CMouse Mouse) @@ -304,7 +330,7 @@ namespace Vocaluxe.Menu CSound.Update(); CBackgroundMusic.Update(); - if (CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_DYNAMIC && ActualScreen != EScreens.ScreenSing) + if (CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_DYNAMIC && _CurrentScreen != EScreens.ScreenSing) CSongs.LoadCover(30L, 1); if (CSettings.GameState != EGameState.EditTheme) @@ -323,12 +349,13 @@ namespace Vocaluxe.Menu public static bool Draw() { - if ((NextScreen != EScreens.ScreenNull) && !_Fading) + if ((_NextScreen != EScreens.ScreenNull) && !_Fading) { _Fading = true; _FadingTimer.Reset(); _FadingTimer.Start(); - Screens[(int)NextScreen].OnShow(); + _Screens[(int)_NextScreen].OnShow(); + HidePopup(EPopupScreens.PopupPlayerControl); } if (_Fading) @@ -345,30 +372,38 @@ namespace Vocaluxe.Menu _GlobalAlpha = 1f;// -factor / 100f; _ZOffset = CSettings.zFar/2; - Screens[(int)ActualScreen].Draw(); + _Screens[(int)_CurrentScreen].Draw(); _GlobalAlpha = factor; _ZOffset = 0f; - Screens[(int)NextScreen].Draw(); + _Screens[(int)_NextScreen].Draw(); _GlobalAlpha = 1f; } else { - Screens[(int)ActualScreen].OnClose(); - ActualScreen = NextScreen; - NextScreen = EScreens.ScreenNull; - Screens[(int)ActualScreen].OnShowFinish(); - Screens[(int)ActualScreen].ProcessMouseMove(_Cursor.X, _Cursor.Y); - Screens[(int)ActualScreen].Draw(); + _Screens[(int)_CurrentScreen].OnClose(); + _CurrentScreen = _NextScreen; + _NextScreen = EScreens.ScreenNull; + if(CBackgroundMusic.Playing) + CBackgroundMusic.Play(); + _Screens[(int)_CurrentScreen].OnShowFinish(); + _Screens[(int)_CurrentScreen].ProcessMouseMove(_Cursor.X, _Cursor.Y); + _Screens[(int)_CurrentScreen].Draw(); _Fading = false; _FadingTimer.Stop(); } } else { - Screens[(int)ActualScreen].Draw(); + _Screens[(int)_CurrentScreen].Draw(); } + + for (int i = 0; i < _PopupScreens.Count; i++) + { + _PopupScreens[i].Draw(); + } + _Cursor.Draw(); DrawDebugInfos(); @@ -377,7 +412,23 @@ namespace Vocaluxe.Menu public static void FadeTo(EScreens Screen) { - NextScreen = Screen; + _NextScreen = Screen; + } + + public static void ShowPopup(EPopupScreens PopupScreen) + { + _PopupScreens[(int)PopupScreen].OnShow(); + _PopupScreens[(int)PopupScreen].OnShowFinish(); + _CurrentPopupScreen = PopupScreen; + } + + public static void HidePopup(EPopupScreens PopupScreen) + { + if (_CurrentPopupScreen != PopupScreen) + return; + + _PopupScreens[(int)PopupScreen].OnClose(); + _CurrentPopupScreen = EPopupScreens.NoPopup; } public static void HideCursor() @@ -398,6 +449,8 @@ namespace Vocaluxe.Menu KeyEvent KeyEvent = new KeyEvent(); MouseEvent MouseEvent = new MouseEvent(); + bool PopupPlayerControlAllowed = _CurrentScreen != EScreens.ScreenOptionsRecord && _CurrentScreen != EScreens.ScreenSing && _CurrentScreen != EScreens.ScreenSong; + bool Resume = true; while (keys.PollEvent(ref KeyEvent)) { @@ -406,6 +459,14 @@ namespace Vocaluxe.Menu CSettings.MouseInacive(); _Cursor.FadeOut(); } + + if (PopupPlayerControlAllowed && KeyEvent.Key == Keys.Tab) + { + if (_CurrentPopupScreen == EPopupScreens.NoPopup) + ShowPopup(EPopupScreens.PopupPlayerControl); + else + HidePopup(EPopupScreens.PopupPlayerControl); + } if (KeyEvent.ModSHIFT && (KeyEvent.Key == Keys.F1)) { @@ -422,7 +483,14 @@ namespace Vocaluxe.Menu else { if (!_Fading) - Resume &= Screens[(int)ActualScreen].HandleInput(KeyEvent); + { + bool handled = false; + if (_CurrentPopupScreen != EPopupScreens.NoPopup) + handled = _PopupScreens[(int)_CurrentPopupScreen].HandleInput(KeyEvent); + + if (!handled) + Resume &= _Screens[(int)_CurrentScreen].HandleInput(KeyEvent); + } } } @@ -436,8 +504,22 @@ namespace Vocaluxe.Menu UpdateMousePosition(MouseEvent.X, MouseEvent.Y); - if (!_Fading && (_Cursor.IsActive || MouseEvent.LB || MouseEvent.RB)) - Resume &= Screens[(int)ActualScreen].HandleMouse(MouseEvent); + bool isOverPopupPlayerControl = CHelper.IsInBounds(_PopupScreens[(int)EPopupScreens.PopupPlayerControl].ScreenArea, MouseEvent); + if (PopupPlayerControlAllowed && isOverPopupPlayerControl) + { + if (_CurrentPopupScreen == EPopupScreens.NoPopup) + ShowPopup(EPopupScreens.PopupPlayerControl); + } + + if (!isOverPopupPlayerControl && _CurrentPopupScreen == EPopupScreens.PopupPlayerControl) + HidePopup(EPopupScreens.PopupPlayerControl); + + bool handled = false; + if (_CurrentPopupScreen != EPopupScreens.NoPopup) + handled = _PopupScreens[(int)_CurrentPopupScreen].HandleMouse(MouseEvent); + + if (!handled && !_Fading && (_Cursor.IsActive || MouseEvent.LB || MouseEvent.RB)) + Resume &= _Screens[(int)_CurrentScreen].HandleMouse(MouseEvent); } return Resume; } @@ -452,7 +534,7 @@ namespace Vocaluxe.Menu if (KeyEvent.ModSHIFT && (KeyEvent.Key == Keys.F1)) { CSettings.GameState = EGameState.Normal; - Screens[(int)ActualScreen].NextInteraction(); + _Screens[(int)_CurrentScreen].NextInteraction(); } else if (KeyEvent.ModALT && (KeyEvent.Key == Keys.Enter)) { @@ -465,14 +547,14 @@ namespace Vocaluxe.Menu else { if (!_Fading) - Screens[(int)ActualScreen].HandleInputThemeEditor(KeyEvent); + _Screens[(int)_CurrentScreen].HandleInputThemeEditor(KeyEvent); } } while (Mouse.PollEvent(ref MouseEvent)) { if (!_Fading) - Screens[(int)ActualScreen].HandleMouseThemeEditor(MouseEvent); + _Screens[(int)_CurrentScreen].HandleMouseThemeEditor(MouseEvent); UpdateMousePosition(MouseEvent.X, MouseEvent.Y); } @@ -486,7 +568,9 @@ namespace Vocaluxe.Menu private static bool Update() { - return Screens[(int)ActualScreen].UpdateGame(); + if (_CurrentPopupScreen != EPopupScreens.NoPopup) + _PopupScreens[(int)_CurrentPopupScreen].UpdateGame(); + return _Screens[(int)_CurrentScreen].UpdateGame(); } private static void DrawDebugInfos() diff --git a/Vocaluxe/Menu/CInteraction.cs b/Vocaluxe/Menu/CInteraction.cs index 87cae837..5e21fdd9 100644 --- a/Vocaluxe/Menu/CInteraction.cs +++ b/Vocaluxe/Menu/CInteraction.cs @@ -13,7 +13,8 @@ namespace Vocaluxe.Menu TStatic, TSongMenu, TLyric, - TSingNote + TSingNote, + TNameSelection } class CInteraction diff --git a/Vocaluxe/Menu/CLyric.cs b/Vocaluxe/Menu/CLyric.cs index 8a70e0ab..de71cb05 100644 --- a/Vocaluxe/Menu/CLyric.cs +++ b/Vocaluxe/Menu/CLyric.cs @@ -11,14 +11,6 @@ using Vocaluxe.Lib.Song; namespace Vocaluxe.Menu { - enum ELyricStyle - { - Fill, - Jump, - Slide, - Zoom - } - struct SNote { public string Text; @@ -84,6 +76,12 @@ namespace Vocaluxe.Menu } } + public ELyricStyle LyricStyle + { + get { return _Style; } + set { _Style = value; } + } + public CLyric() { _Theme = new SThemeLyrics(); @@ -100,7 +98,7 @@ namespace Vocaluxe.Menu _Notes = new List(); _Text = new CText(); - _Style = ELyricStyle.Slide; + _Style = ELyricStyle.Fill; } public bool LoadTheme(string XmlPath, string ElementName, XPathNavigator navigator, int SkinIndex) @@ -319,32 +317,36 @@ namespace Vocaluxe.Menu } int zoom_note = -1; + int end_beat = -1; float zoomx = 0f; - int current_note = -1; - foreach (SNote note in _Notes) + for (int note = 0; note < _Notes.Count; note++) { - current_note++; - _Text.X = x; _Text.Style = EStyle.Bold; - _Text.Text = note.Text; + _Text.Text = _Notes[note].Text; RectangleF rect = CDraw.GetTextBounds(_Text); - if (note.Type == ENoteType.Freestyle) + if (_Notes[note].Type == ENoteType.Freestyle) _Text.Style = EStyle.BoldItalic; - if (CurrentBeat >= note.StartBeat) + if (CurrentBeat >= _Notes[note].StartBeat) { - if (CurrentBeat <= note.EndBeat) + bool last = note == _Notes.Count -1; + int endbeat = _Notes[note].EndBeat; + if (note < _Notes.Count -1) + endbeat = _Notes[note + 1].StartBeat - 1; + + if (CurrentBeat <= endbeat) { - zoom_note = current_note; + zoom_note = note; + end_beat = endbeat; zoomx = _Text.X; } else { // already passed - if (current_note == last_note) + if (note == last_note) _Text.Color = ColorProcessed; else _Text.Color = Color; @@ -378,9 +380,11 @@ namespace Vocaluxe.Menu RectangleF rect = CDraw.GetTextBounds(_Text); - float diff = _Notes[zoom_note].EndBeat - _Notes[zoom_note].StartBeat; + float diff = end_beat - _Notes[zoom_note].StartBeat; + if (diff <= 0f) + diff = 1f; - float p = (CurrentBeat - _Notes[zoom_note].StartBeat) / _Notes[zoom_note].Duration; + float p = (CurrentBeat - _Notes[zoom_note].StartBeat) / diff; if (p > 1f) p = 1f; diff --git a/Vocaluxe/Menu/CMenu.cs b/Vocaluxe/Menu/CMenu.cs index 282fb865..eb870b8c 100644 --- a/Vocaluxe/Menu/CMenu.cs +++ b/Vocaluxe/Menu/CMenu.cs @@ -16,6 +16,12 @@ using Vocaluxe.Menu.SongMenu; namespace Vocaluxe.Menu { + struct ZSort + { + public int ID; + public float z; + } + abstract class CMenu { private List _Interactions; @@ -29,6 +35,7 @@ namespace Vocaluxe.Menu private List _SongMenus; private List _Lyrics; private List _SingNotes; + private List _NameSelections; private Hashtable _htBackgrounds; private Hashtable _htStatics; @@ -38,6 +45,7 @@ namespace Vocaluxe.Menu private Hashtable _htLyrics; private Hashtable _htSelectSlides; private Hashtable _htSingNotes; + private Hashtable _htNameSelections; private int _PrevMouseX; @@ -58,6 +66,14 @@ namespace Vocaluxe.Menu protected string[] _ThemeLyrics; protected string[] _ThemeSelectSlides; protected string[] _ThemeSingNotes; + protected string[] _ThemeNameSelections; + + protected SRectF _ScreenArea; + + public SRectF ScreenArea + { + get { return _ScreenArea; } + } public int ThemeScreenVersion { @@ -82,6 +98,7 @@ namespace Vocaluxe.Menu _SongMenus = new List(); _Lyrics = new List(); _SingNotes = new List(); + _NameSelections = new List(); _htBackgrounds = new Hashtable(); _htStatics = new Hashtable(); @@ -91,6 +108,7 @@ namespace Vocaluxe.Menu _htLyrics = new Hashtable(); _htSelectSlides = new Hashtable(); _htSingNotes = new Hashtable(); + _htNameSelections = new Hashtable(); _PrevMouseX = 0; _PrevMouseY = 0; @@ -99,6 +117,7 @@ namespace Vocaluxe.Menu _MouseDY = 0; _Active = false; + _ScreenArea = new SRectF(0f, 0f, CSettings.iRenderW, CSettings.iRenderH, 0f); _ThemeName = String.Empty; _ThemeBackgrounds = null; @@ -109,6 +128,7 @@ namespace Vocaluxe.Menu _ThemeLyrics = null; _ThemeSelectSlides = null; _ThemeSingNotes = null; + _ThemeNameSelections = null; } #region ThemeHandler @@ -275,6 +295,22 @@ namespace Vocaluxe.Menu } } } + + if (_ThemeNameSelections != null) + { + for (int i = 0; i < _ThemeNameSelections.Length; i++) + { + CNameSelection nsel = new CNameSelection(); + if (nsel.LoadTheme("//root/" + _ThemeName, _ThemeNameSelections[i], navigator, SkinIndex)) + { + _htNameSelections.Add(_ThemeNameSelections[i], AddNameSelection(nsel)); + } + else + { + CLog.LogError("Can't load NameSelection \"" + _ThemeNameSelections[i] + "\" in screen " + _ThemeName); + } + } + } } else { @@ -344,6 +380,12 @@ namespace Vocaluxe.Menu _SingNotes[i].SaveTheme(writer); } + // NameSelections + for (int i = 0; i < _NameSelections.Count; i++) + { + _NameSelections[i].SaveTheme(writer); + } + writer.WriteEndElement(); // End of File @@ -395,6 +437,11 @@ namespace Vocaluxe.Menu { sn.ReloadTextures(); } + + foreach (CNameSelection ns in _NameSelections) + { + ns.ReloadTextures(); + } } public virtual void UnloadTextures() @@ -438,6 +485,13 @@ namespace Vocaluxe.Menu { sn.UnloadTextures(); } + + foreach (CNameSelection ns in _NameSelections) + { + ns.UnloadTextures(); + } + + } public virtual void ReloadTheme() @@ -488,6 +542,11 @@ namespace Vocaluxe.Menu { return _SingNotes; } + + public List GetNameSelections() + { + return _NameSelections; + } #endregion GetLists #region ElementHandler @@ -555,6 +614,14 @@ namespace Vocaluxe.Menu return _SingNotes.ToArray(); } } + + public CNameSelection[] NameSelections + { + get + { + return _NameSelections.ToArray(); + } + } #endregion Get Arrays #region Hashtables @@ -661,6 +728,19 @@ namespace Vocaluxe.Menu throw; } } + + public int htNameSelections(string key) + { + try + { + return (int)_htNameSelections[key]; + } + catch (Exception) + { + CLog.LogError("Can't find NameSelection Element \"" + key + "\" in Screen " + _ThemeName); + throw; + } + } #endregion Hashtables #endregion ElementHandler @@ -862,13 +942,12 @@ namespace Vocaluxe.Menu { ResumeBG(); _Active = true; - CBackgroundMusic.Play(); } public virtual void OnClose() { PauseBG(); - CBackgroundMusic.Pause(); + _Active = false; } #endregion MenuHandler @@ -906,22 +985,38 @@ namespace Vocaluxe.Menu public void DrawFG() { - foreach (CStatic stat in _Statics) - stat.Draw(); + if (_Interactions.Count <= 0) + return; + + List items = new List(); - foreach (CSingNotes sn in _SingNotes) + for (int i = 0; i < _Interactions.Count; i++) { - // TODO!!!!! + if (_IsVisible(i) && ( + _Interactions[i].Type == EType.TButton || + _Interactions[i].Type == EType.TSelectSlide || + _Interactions[i].Type == EType.TStatic || + _Interactions[i].Type == EType.TNameSelection || + _Interactions[i].Type == EType.TText)) + { + ZSort zs = new ZSort(); + zs.ID = i; + zs.z = _GetZValue(i); + items.Add(zs); + } } - foreach (CButton button in _Buttons) - button.Draw(); + if (items.Count <= 0) + return; - foreach (CSelectSlide slide in _SelectSlides) - slide.Draw(); + + items.Sort(delegate(ZSort s1, ZSort s2) { return (s2.z.CompareTo(s1.z)); }); + + for (int i = 0; i < items.Count; i++) + { + _DrawInteraction(items[i].ID); + } - foreach (CText text in _Texts) - text.Draw(); } #endregion Drawing @@ -929,58 +1024,65 @@ namespace Vocaluxe.Menu public int AddBackground(CBackground bg) { _Backgrounds.Add(bg); - AddInteraction(_Backgrounds.Count - 1, EType.TBackground); + _AddInteraction(_Backgrounds.Count - 1, EType.TBackground); return _Backgrounds.Count - 1; } public int AddButton(CButton button) { _Buttons.Add(button); - AddInteraction(_Buttons.Count - 1, EType.TButton); + _AddInteraction(_Buttons.Count - 1, EType.TButton); return _Buttons.Count - 1; } public int AddSelectSlide(CSelectSlide slide) { _SelectSlides.Add(slide); - AddInteraction(_SelectSlides.Count - 1, EType.TSelectSlide); + _AddInteraction(_SelectSlides.Count - 1, EType.TSelectSlide); return _SelectSlides.Count - 1; } public int AddStatic(CStatic stat) { _Statics.Add(stat); - AddInteraction(_Statics.Count - 1, EType.TStatic); + _AddInteraction(_Statics.Count - 1, EType.TStatic); return _Statics.Count - 1; } public int AddText(CText text) { _Texts.Add(text); - AddInteraction(_Texts.Count - 1, EType.TText); + _AddInteraction(_Texts.Count - 1, EType.TText); return _Texts.Count - 1; } public int AddSongMenu(CSongMenu songmenu) { _SongMenus.Add(songmenu); - AddInteraction(_SongMenus.Count - 1, EType.TSongMenu); + _AddInteraction(_SongMenus.Count - 1, EType.TSongMenu); return _SongMenus.Count - 1; } public int AddLyric(CLyric lyric) { _Lyrics.Add(lyric); - AddInteraction(_Lyrics.Count - 1, EType.TLyric); + _AddInteraction(_Lyrics.Count - 1, EType.TLyric); return _Lyrics.Count - 1; } public int AddSingNote(CSingNotes sn) { _SingNotes.Add(sn); - AddInteraction(_SingNotes.Count - 1, EType.TSingNote); + _AddInteraction(_SingNotes.Count - 1, EType.TSingNote); return _SingNotes.Count - 1; } + + public int AddNameSelection(CNameSelection ns) + { + _NameSelections.Add(ns); + _AddInteraction(_NameSelections.Count - 1, EType.TNameSelection); + return _NameSelections.Count - 1; + } #endregion Elements #region InteractionHandling @@ -1125,6 +1227,10 @@ namespace Vocaluxe.Menu if (CHelper.IsInBounds(_Lyrics[interact.Num].Rect, x, y)) return true; break; + case EType.TNameSelection: + if (CHelper.IsInBounds(_NameSelections[interact.Num].Rect, x, y)) + return true; + break; } return false; } @@ -1145,10 +1251,41 @@ namespace Vocaluxe.Menu return _Texts[interact.Num].Z; case EType.TLyric: return _Lyrics[interact.Num].Rect.Z; + case EType.TNameSelection: + return _NameSelections[interact.Num].Rect.Z; } return CSettings.zFar; } + private float _GetZValue(int interaction) + { + switch (_Interactions[interaction].Type) + { + case EType.TButton: + return _Buttons[_Interactions[interaction].Num].Rect.Z; + + case EType.TSelectSlide: + return _SelectSlides[_Interactions[interaction].Num].Rect.Z; + + case EType.TStatic: + return _Statics[_Interactions[interaction].Num].Rect.Z; + + case EType.TText: + return _Texts[_Interactions[interaction].Num].Z; + + case EType.TSongMenu: + return _SongMenus[_Interactions[interaction].Num].Rect.Z; + + case EType.TLyric: + return _Lyrics[_Interactions[interaction].Num].Rect.Z; + + case EType.TNameSelection: + return _NameSelections[_Interactions[interaction].Num].Rect.Z; + } + + return CSettings.zFar; + } + private void _NextInteraction() { _UnsetSelected(); @@ -1459,6 +1596,9 @@ namespace Vocaluxe.Menu case EType.TLyric: _Lyrics[_Interactions[_Selection].Num].Selected = true; break; + case EType.TNameSelection: + _NameSelections[_Interactions[_Selection].Num].Selected = true; + break; } } @@ -1484,6 +1624,9 @@ namespace Vocaluxe.Menu case EType.TLyric: _Lyrics[_Interactions[_Selection].Num].Selected = false; break; + case EType.TNameSelection: + _NameSelections[_Interactions[_Selection].Num].Selected = false; + break; } } @@ -1512,6 +1655,9 @@ namespace Vocaluxe.Menu case EType.TLyric: //_Lyrics[_Interactions[selection].Num].Selected = true; break; + case EType.TNameSelection: + //_NameSelections[_Interactions[selection].Num].Selected = true; + break; } } @@ -1540,6 +1686,9 @@ namespace Vocaluxe.Menu case EType.TLyric: //_Lyrics[_Interactions[selection].Num].Selected = false; break; + case EType.TNameSelection: + //_NameSelections[_Interactions[selection].Num].Selected = false; + break; } } @@ -1567,7 +1716,6 @@ namespace Vocaluxe.Menu private bool _IsVisible(int interaction) { - bool Result = false; switch (_Interactions[interaction].Type) { case EType.TButton: @@ -1587,9 +1735,12 @@ namespace Vocaluxe.Menu case EType.TLyric: return _Lyrics[_Interactions[interaction].Num].Visible; + + case EType.TNameSelection: + return _NameSelections[_Interactions[interaction].Num].Visible; } - return Result; + return false; } private SRectF _GetRect(int interaction) @@ -1614,12 +1765,15 @@ namespace Vocaluxe.Menu case EType.TLyric: return _Lyrics[_Interactions[interaction].Num].Rect; + + case EType.TNameSelection: + return _NameSelections[_Interactions[interaction].Num].Rect; } return Result; } - private void AddInteraction(int num, EType type) + private void _AddInteraction(int num, EType type) { _Interactions.Add(new CInteraction(num, type)); if (!_Interactions[_Selection].ThemeEditorOnly) @@ -1628,6 +1782,41 @@ namespace Vocaluxe.Menu _NextInteraction(); } + private void _DrawInteraction(int interaction) + { + switch (_Interactions[interaction].Type) + { + case EType.TButton: + _Buttons[_Interactions[interaction].Num].Draw(); + break; + + case EType.TSelectSlide: + _SelectSlides[_Interactions[interaction].Num].Draw(); + break; + + case EType.TStatic: + _Statics[_Interactions[interaction].Num].Draw(); + break; + + case EType.TText: + _Texts[_Interactions[interaction].Num].Draw(); + break; + + case EType.TSongMenu: + _SongMenus[_Interactions[interaction].Num].Draw(); + break; + + case EType.TNameSelection: + _NameSelections[_Interactions[interaction].Num].Draw(); + break; + + //TODO: + //case EType.TLyric: + // _Lyrics[_Interactions[interaction].Num].Draw(0); + // break; + } + } + #endregion InteractionHandling #region Theme Handling @@ -1660,6 +1849,10 @@ namespace Vocaluxe.Menu case EType.TLyric: _Lyrics[_Interactions[_Selection].Num].MoveElement(stepX, stepY); break; + + case EType.TNameSelection: + _NameSelections[_Interactions[_Selection].Num].MoveElement(stepX, stepY); + break; } } } @@ -1693,6 +1886,10 @@ namespace Vocaluxe.Menu case EType.TLyric: _Lyrics[_Interactions[_Selection].Num].ResizeElement(stepW, stepH); break; + + case EType.TNameSelection: + _NameSelections[_Interactions[_Selection].Num].ResizeElement(stepW, stepH); + break; } } } diff --git a/Vocaluxe/Menu/CNameSelection.cs b/Vocaluxe/Menu/CNameSelection.cs new file mode 100644 index 00000000..b11d65c4 --- /dev/null +++ b/Vocaluxe/Menu/CNameSelection.cs @@ -0,0 +1,539 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Xml; +using System.Xml.XPath; +using System.Windows.Forms; + +using Vocaluxe.Base; +using Vocaluxe.Lib.Draw; + +namespace Vocaluxe.Menu +{ + struct SThemeNameSelection + { + public string Name; + public string TextureEmptyTileName; + public string ColorEmptyTileName; + public string TextureTileSelectedName; + public float NameSpace; + public float NameHeight; + public string NameFont; + public EStyle NameStyle; + public SColorF NameColor; + public string NameColorName; + } + + class CNameSelection : IMenuElement + { + + class CTile + { + public int PlayerNr; + public CStatic Avatar; + public CText Name; + + public CTile() + { + } + + public CTile(CStatic av, CText tex, int pl) + { + Avatar = av; + Name = tex; + PlayerNr = pl; + } + } + + private SThemeNameSelection _Theme; + private bool _ThemeLoaded; + + public bool Selected = false; + public bool Visible = true; + + public SRectF Rect; + private List _Tiles; + + private STexture _TextureEmptyTile; + private STexture _TextureTileSelected; + + public SColorF ColorEmptyTile; + + private int _NumW; + private int _NumH; + + private float _SpaceW; + private float _SpaceH; + + private int _TileW; + private int _TileH; + + public int _Offset = 0; + private int _actualSelection = -1; + public int Selection = -1; + + int _player = -1; + + private List VisibleProfiles; + + private CStatic PlayerSelector; + + + public CNameSelection() + { + _Theme = new SThemeNameSelection(); + + _Tiles = new List(); + VisibleProfiles = new List(); + } + + public void Init() + { + _Tiles.Clear(); + for (int i = 0; i < _NumH; i++) + { + for (int j = 0; j < _NumW; j++) + { + SRectF rect = new SRectF(Rect.X + j * (_TileW + _SpaceW), Rect.Y + i * (_TileH + _SpaceH), _TileW, _TileH, Rect.Z); + CStatic tileStatic = new CStatic(_TextureEmptyTile, ColorEmptyTile, rect); + CText tileText = new CText(rect.X + rect.W / 2, rect.Y + rect.H + _Theme.NameSpace, rect.Z, _Theme.NameHeight, rect.W, EAlignment.Center, _Theme.NameStyle, _Theme.NameFont, _Theme.NameColor, ""); + _Tiles.Add(new CTile(tileStatic, tileText, -1)); + } + } + + PlayerSelector = new CStatic(); + PlayerSelector.Texture = _TextureTileSelected; + PlayerSelector.Rect = new SRectF(0, 0, (_TileW + 6), (_TileH + 6), (Rect.Z - 0.5f)); + PlayerSelector.Visible = false; + + UpdateVisibleProfiles(); + + UpdateList(0); + } + + public bool LoadTheme(string XmlPath, string ElementName, XPathNavigator navigator, int SkinIndex) + { + string item = XmlPath + "/" + ElementName; + _ThemeLoaded = true; + + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/X", navigator, ref Rect.X); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Y", navigator, ref Rect.Y); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Z", navigator, ref Rect.Z); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/W", navigator, ref Rect.W); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/H", navigator, ref Rect.H); + + _ThemeLoaded &= CHelper.GetValueFromXML(item + "/SkinEmptyTile", navigator, ref _Theme.TextureEmptyTileName, String.Empty); + + if (CHelper.GetValueFromXML(item + "/ColorEmptyTile", navigator, ref _Theme.ColorEmptyTileName, String.Empty)) + { + _ThemeLoaded &= CTheme.GetColor(_Theme.ColorEmptyTileName, SkinIndex, ref ColorEmptyTile); + } + else + { + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/R", navigator, ref ColorEmptyTile.R); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/G", navigator, ref ColorEmptyTile.G); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/B", navigator, ref ColorEmptyTile.B); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/A", navigator, ref ColorEmptyTile.A); + } + + _ThemeLoaded &= CHelper.GetValueFromXML(item + "/SkinTileSelected", navigator, ref _Theme.TextureTileSelectedName, String.Empty); + + _ThemeLoaded &= CHelper.TryGetIntValueFromXML(item + "/Tiles/W", navigator, ref _TileW); + _ThemeLoaded &= CHelper.TryGetIntValueFromXML(item + "/Tiles/H", navigator, ref _TileH); + _ThemeLoaded &= CHelper.TryGetIntValueFromXML(item + "/Tiles/NumW", navigator, ref _NumW); + _ThemeLoaded &= CHelper.TryGetIntValueFromXML(item + "/Tiles/NumH", navigator, ref _NumH); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/SpaceW", navigator, ref _SpaceW); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/SpaceH", navigator, ref _SpaceH); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/Space", navigator, ref _Theme.NameSpace); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/H", navigator, ref _Theme.NameHeight); + _ThemeLoaded &= CHelper.GetValueFromXML(item + "/Tiles/Name/Font", navigator, ref _Theme.NameFont, "Normal"); + _ThemeLoaded &= CHelper.TryGetEnumValueFromXML(item + "/Tiles/Name/Style", navigator, ref _Theme.NameStyle); + if (CHelper.GetValueFromXML(item + "/Tiles/Name/Color", navigator, ref _Theme.NameColorName, String.Empty)) + { + _ThemeLoaded &= CTheme.GetColor(_Theme.NameColorName, SkinIndex, ref _Theme.NameColor); + } + else + { + if (CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/R", navigator, ref _Theme.NameColor.R)) + { + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/G", navigator, ref _Theme.NameColor.G); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/B", navigator, ref _Theme.NameColor.B); + _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Tiles/Name/A", navigator, ref _Theme.NameColor.A); + } + } + + + if (_ThemeLoaded) + { + _Theme.Name = ElementName; + LoadTextures(); + } + return _ThemeLoaded; + } + + public bool SaveTheme(XmlWriter writer) + { + if (_ThemeLoaded) + { + writer.WriteStartElement(_Theme.Name); + + writer.WriteComment(", , , , : NameSelection position, width and height"); + writer.WriteElementString("X", Rect.X.ToString("#0")); + writer.WriteElementString("Y", Rect.Y.ToString("#0")); + writer.WriteElementString("Z", Rect.Z.ToString("#0.00")); + writer.WriteElementString("W", Rect.W.ToString("#0")); + writer.WriteElementString("H", Rect.H.ToString("#0")); + + writer.WriteComment(": Texture name"); + writer.WriteElementString("SkinEmptyTile", _Theme.TextureEmptyTileName); + + writer.WriteComment(": Static color from ColorScheme (high priority)"); + writer.WriteComment("or , , , (lower priority)"); + if (_Theme.ColorEmptyTileName != String.Empty) + { + writer.WriteElementString("ColorEmptyTile", _Theme.ColorEmptyTileName); + } + else + { + writer.WriteElementString("R", ColorEmptyTile.R.ToString("#0.00")); + writer.WriteElementString("G", ColorEmptyTile.G.ToString("#0.00")); + writer.WriteElementString("B", ColorEmptyTile.B.ToString("#0.00")); + writer.WriteElementString("A", ColorEmptyTile.A.ToString("#0.00")); + } + + writer.WriteComment(": Texture name"); + writer.WriteElementString("SkinTileSelected", _Theme.TextureTileSelectedName); + + writer.WriteComment(": Options for tiles"); + writer.WriteStartElement("Tiles"); + writer.WriteComment(", : Width and height of tile"); + writer.WriteElementString("W", _TileW.ToString()); + writer.WriteElementString("H", _TileH.ToString()); + writer.WriteComment(", : Number of tiles"); + writer.WriteElementString("NumW", _NumW.ToString()); + writer.WriteElementString("NumH", _NumH.ToString()); + writer.WriteComment(", : Space between tiles"); + writer.WriteElementString("SpaceW", _SpaceW.ToString("#0.00")); + writer.WriteElementString("SpaceH", _SpaceH.ToString("#0.00")); + writer.WriteComment(": Options for player-name"); + writer.WriteStartElement("Name"); + writer.WriteComment(": Space between name and tile"); + writer.WriteElementString("Space", _Theme.NameSpace.ToString("#0.0")); + writer.WriteComment(": Text font name"); + writer.WriteElementString("Font", _Theme.NameFont); + writer.WriteComment(": Text color from ColorScheme (high priority)"); + if (_Theme.NameColorName != String.Empty) + { + writer.WriteElementString("Color", _Theme.NameColorName); + } + else + { + writer.WriteElementString("R", _Theme.NameColor.R.ToString("#0.00")); + writer.WriteElementString("G", _Theme.NameColor.G.ToString("#0.00")); + writer.WriteElementString("B", _Theme.NameColor.B.ToString("#0.00")); + writer.WriteElementString("A", _Theme.NameColor.A.ToString("#0.00")); + } + writer.WriteComment("