diff --git a/Output/Themes/Ambient/Screens/ScreenSing.xml b/Output/Themes/Ambient/Screens/ScreenSing.xml
index ed9bcb15..5c5f39ba 100644
--- a/Output/Themes/Ambient/Screens/ScreenSing.xml
+++ b/Output/Themes/Ambient/Screens/ScreenSing.xml
@@ -2,7 +2,7 @@
ScreenSing
- 7
+ 8
@@ -167,7 +167,7 @@
-2.1
-
+
@@ -178,7 +178,7 @@
-0.75
-
+
1
@@ -194,7 +194,7 @@
-0.75
-
+
@@ -205,7 +205,7 @@
-0.75
-
+
1
@@ -221,7 +221,7 @@
-0.75
-
+
@@ -232,7 +232,7 @@
-0.75
-
+
1
@@ -248,7 +248,7 @@
-0.75
-
+
@@ -259,7 +259,7 @@
-0.75
-
+
1
@@ -275,7 +275,7 @@
-0.75
-
+
@@ -286,7 +286,7 @@
-0.75
-
+
1
@@ -302,7 +302,7 @@
-0.75
-
+
@@ -313,7 +313,7 @@
-0.75
-
+
1
@@ -329,7 +329,7 @@
-0.75
-
+
@@ -340,7 +340,7 @@
-0.75
-
+
1
@@ -356,7 +356,7 @@
-0.75
-
+
@@ -367,7 +367,7 @@
-0.75
-
+
1
@@ -383,7 +383,7 @@
-0.75
-
+
@@ -394,7 +394,7 @@
-0.75
-
+
1
@@ -410,7 +410,7 @@
-0.75
-
+
@@ -421,7 +421,7 @@
-0.75
-
+
1
@@ -437,7 +437,7 @@
-0.75
-
+
@@ -448,7 +448,7 @@
-0.75
-
+
1
@@ -464,7 +464,7 @@
-0.75
-
+
@@ -475,7 +475,7 @@
-0.75
-
+
1
@@ -491,7 +491,7 @@
-0.75
-
+
@@ -502,7 +502,7 @@
-0.75
-
+
1
@@ -518,7 +518,7 @@
-0.75
-
+
@@ -529,7 +529,7 @@
-0.75
-
+
1
@@ -545,7 +545,7 @@
-0.75
-
+
@@ -556,7 +556,7 @@
-0.75
-
+
1
@@ -572,7 +572,7 @@
-0.75
-
+
@@ -583,7 +583,7 @@
-0.75
-
+
1
@@ -599,7 +599,7 @@
-0.75
-
+
@@ -610,7 +610,7 @@
-0.75
-
+
1
@@ -626,7 +626,7 @@
-0.75
-
+
@@ -637,7 +637,7 @@
-0.75
-
+
1
@@ -653,7 +653,7 @@
-0.75
-
+
@@ -664,7 +664,7 @@
-0.75
-
+
1
@@ -680,7 +680,7 @@
-0.75
-
+
@@ -691,7 +691,7 @@
-0.75
-
+
1
@@ -707,7 +707,7 @@
-0.75
-
+
@@ -718,7 +718,7 @@
-0.75
-
+
1
@@ -734,6 +734,2841 @@
-0.75
+
+
+
+
+ 2430
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 360
+ 190
+ 190
+ -0.75
+
+
+
+
+
+
+ 2430
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 2430
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 2430
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 2430
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 2430
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 1808
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 1808
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 2430
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2383
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 2430
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2383
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 1808
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 1808
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 1808
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 2430
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2383
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 2430
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2383
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 1808
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 1808
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 1808
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 1320
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 2430
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2383
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 2430
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2383
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 2430
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2383
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3710
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 360
+ 190
+ 190
+ -0.75
+
+
+
+
+
+
+ 3710
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 3710
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 3710
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3710
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3710
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3088
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 3088
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 3710
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3663
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 3710
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3663
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 3088
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3088
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3088
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3710
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3663
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 3710
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3663
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 3088
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3088
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3088
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 2600
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3710
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3663
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3710
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3663
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 3710
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3663
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4990
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 360
+ 190
+ 190
+ -0.75
+
+
+
+
+
+
+ 4990
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 4990
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 4990
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4990
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4990
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4368
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 4368
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 4990
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 4943
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 4990
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 4943
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 4368
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4368
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4368
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4990
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 4943
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 4990
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 4943
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 4368
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4368
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4368
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 3880
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4990
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 4943
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4990
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 4943
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 4990
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 4943
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6270
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 360
+ 190
+ 190
+ -0.75
+
+
+
+
+
+
+ 6270
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 6270
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 6270
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6270
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6270
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 5648
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 5648
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 6270
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6223
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 6270
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6223
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 5648
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 5648
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 5648
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6270
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6223
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 6270
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6223
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 5648
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 5648
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 5648
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 5160
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6270
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6223
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6270
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6223
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6270
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6223
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 7550
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 360
+ 190
+ 190
+ -0.75
+
+
+
+
+
+
+ 7550
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 7550
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 7550
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 7550
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 7550
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6928
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 6928
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 7550
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 7503
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 7550
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 7503
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 6928
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6928
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6928
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 7550
+ 150
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 7503
+ 160
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 7550
+ 350
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 7503
+ 360
+ 165
+ 165
+ -0.75
+
+
+
+
+
+
+ 6928
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6928
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 6928
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 6440
+ 442
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 7550
+ 10
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 7503
+ 111
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 7550
+ 210
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 7503
+ 274
+ 140
+ 140
+ -0.75
+
+
+
+
+
+
+ 7550
+ 410
+ 100
+ 50
+ -0.75
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ 7503
+ 442
+ 140
+ 140
+ -0.75
+
+
@@ -820,7 +3655,8 @@
Outline
-
+
+
1240
355
-1
@@ -834,7 +3670,7 @@
Normal
-
+
110
513
-1
@@ -853,7 +3689,7 @@
Outline
-
+
1240
155
-1
@@ -867,7 +3703,7 @@
Normal
-
+
110
288
-1
@@ -886,7 +3722,7 @@
Outline
-
+
1240
355
-1
@@ -900,7 +3736,7 @@
Normal
-
+
110
488
-1
@@ -919,7 +3755,7 @@
Outline
-
+
1240
106
-1
@@ -933,7 +3769,7 @@
Normal
-
+
110
219
-1
@@ -952,7 +3788,7 @@
Outline
-
+
1240
269
-1
@@ -966,7 +3802,7 @@
Normal
-
+
110
382
-1
@@ -985,7 +3821,7 @@
Outline
-
+
1240
437
-1
@@ -999,7 +3835,7 @@
Normal
-
+
110
550
-1
@@ -1018,7 +3854,7 @@
Outline
-
+
324
155
-1
@@ -1032,7 +3868,7 @@
Normal
-
+
110
288
-1
@@ -1051,7 +3887,7 @@
Outline
-
+
324
355
-1
@@ -1065,7 +3901,7 @@
Normal
-
+
110
488
-1
@@ -1084,7 +3920,7 @@
Outline
-
+
967
155
-1
@@ -1098,7 +3934,7 @@
Normal
-
+
1173
288
-1
@@ -1117,7 +3953,7 @@
Outline
-
+
967
355
-1
@@ -1131,7 +3967,7 @@
Normal
-
+
1173
488
-1
@@ -1150,7 +3986,7 @@
Outline
-
+
324
106
-1
@@ -1164,7 +4000,7 @@
Normal
-
+
110
219
-1
@@ -1183,7 +4019,7 @@
Outline
-
+
324
269
-1
@@ -1197,7 +4033,7 @@
Normal
-
+
110
382
-1
@@ -1216,7 +4052,7 @@
Outline
-
+
324
437
-1
@@ -1230,7 +4066,7 @@
Normal
-
+
110
550
-1
@@ -1249,7 +4085,7 @@
Outline
-
+
967
155
-1
@@ -1263,7 +4099,7 @@
Normal
-
+
1173
288
-1
@@ -1282,7 +4118,7 @@
Outline
-
+
967
355
-1
@@ -1296,7 +4132,7 @@
Normal
-
+
1173
488
-1
@@ -1315,7 +4151,7 @@
Outline
-
+
324
106
-1
@@ -1329,7 +4165,7 @@
Normal
-
+
110
219
-1
@@ -1348,7 +4184,7 @@
Outline
-
+
324
269
-1
@@ -1362,7 +4198,7 @@
Normal
-
+
110
382
-1
@@ -1381,7 +4217,7 @@
Outline
-
+
324
437
-1
@@ -1395,7 +4231,7 @@
Normal
-
+
110
550
-1
@@ -1414,7 +4250,7 @@
Outline
-
+
967
106
-1
@@ -1428,7 +4264,7 @@
Normal
-
+
1173
219
-1
@@ -1447,7 +4283,7 @@
Outline
-
+
967
269
-1
@@ -1461,7 +4297,7 @@
Normal
-
+
1173
382
-1
@@ -1480,7 +4316,7 @@
Outline
-
+
967
437
-1
@@ -1494,7 +4330,7 @@
Normal
-
+
1173
550
-1
@@ -1513,6 +4349,3471 @@
Outline
+
+ 2520
+ 355
+ -1
+ 198
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 1390
+ 513
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2520
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 1390
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2520
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 1390
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2520
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 1390
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2520
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 1390
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2520
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 1390
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 1604
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 1390
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 1604
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 1390
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2247
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2453
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2247
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2453
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 1604
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 1390
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 1604
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 1390
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 1604
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 1390
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2247
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2453
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2247
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2453
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 1604
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 1390
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 1604
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 1390
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 1604
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 1390
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2247
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2453
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2247
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2453
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2247
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2453
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3800
+ 355
+ -1
+ 198
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 2670
+ 513
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3800
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 2670
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3800
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 2670
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3800
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 2670
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3800
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 2670
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3800
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 2670
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2884
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2670
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2884
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2670
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3527
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3733
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3527
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3733
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2884
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2670
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2884
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2670
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2884
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2670
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3527
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3733
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3527
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3733
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2884
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2670
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2884
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2670
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 2884
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 2670
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3527
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3733
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3527
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3733
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 3527
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3733
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5080
+ 355
+ -1
+ 198
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 3950
+ 513
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5080
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 3950
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5080
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 3950
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5080
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 3950
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5080
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 3950
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5080
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 3950
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4164
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3950
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4164
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3950
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4807
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5013
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4807
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5013
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4164
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3950
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4164
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3950
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4164
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3950
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4807
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5013
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4807
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5013
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4164
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3950
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4164
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3950
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4164
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 3950
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4807
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5013
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4807
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5013
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 4807
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5013
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6360
+ 355
+ -1
+ 198
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 5230
+ 513
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6360
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 5230
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6360
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 5230
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6360
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 5230
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6360
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 5230
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6360
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 5230
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5444
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5230
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5444
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5230
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6087
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6293
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6087
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6293
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5444
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5230
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5444
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5230
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5444
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5230
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6087
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6293
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6087
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6293
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5444
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5230
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5444
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5230
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 5444
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 5230
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6087
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6293
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6087
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6293
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6087
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6293
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7640
+ 355
+ -1
+ 198
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 6510
+ 513
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7640
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 6510
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7640
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 6510
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7640
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 6510
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7640
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 6510
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7640
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Right
+ Center
+
+ Normal
+
+
+
+ 6510
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6724
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6510
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6724
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6510
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7367
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 7573
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7367
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 7573
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6724
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6510
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6724
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6510
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6724
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6510
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7367
+ 155
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 7573
+ 288
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7367
+ 355
+ -1
+ 173
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 7573
+ 488
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6724
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6510
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6724
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6510
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 6724
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 6510
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7367
+ 106
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 7573
+ 219
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7367
+ 269
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 7573
+ 382
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
+ 7367
+ 437
+ -1
+ 148
+ 0
+ 0.4
+
+ Center
+ Center
+
+ Normal
+
+
+
+ 7573
+ 550
+ -1
+ 28
+ 0
+
+ 1
+ 1
+ 1
+ 0.4
+
+
+ Center
+ Center
+
+ Outline
+
+
+
\ No newline at end of file
diff --git a/Output/Themes/Changelog/Changelog_ScreenSing.txt b/Output/Themes/Changelog/Changelog_ScreenSing.txt
index dd1ef423..1ba74906 100644
--- a/Output/Themes/Changelog/Changelog_ScreenSing.txt
+++ b/Output/Themes/Changelog/Changelog_ScreenSing.txt
@@ -1,5 +1,20 @@
ScreenSing
++++++++++
+Version 8
+
+Add:
+Modified elements for 6 monitors support
+
+S# = Screen
+P# = Player
+N# = Players on screen
+
+
+
+
+
+
+++++++++
Version 7
diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs
index 2629cc8a..d0649f2c 100644
--- a/Vocaluxe/Base/CConfig.cs
+++ b/Vocaluxe/Base/CConfig.cs
@@ -83,6 +83,8 @@ namespace Vocaluxe.Base
[XmlRanged(32, 1024), DefaultValue(256)]
public int CoverSize;
+ [XmlRanged(1, 6), DefaultValue(1)]
+ public int NumScreens;
[DefaultValue(1024)]
public int ScreenW;
[DefaultValue(576)]
@@ -417,6 +419,9 @@ namespace Vocaluxe.Base
Config.Game.NumPlayers = 2;
Array.Resize(ref Config.Game.Players, CSettings.MaxNumPlayer);
+ if (!Config.Graphics.NumScreens.IsInRange(1, CSettings.MaxNumScreens))
+ Config.Graphics.NumScreens = 1;
+
bool langExists = CLanguage.SetLanguage(Config.Game.Language);
if (langExists == false)
@@ -464,6 +469,8 @@ namespace Vocaluxe.Base
return "TextureQuality: " + CHelper.ListStrings(Enum.GetNames(typeof(ETextureQuality)));
case "CoverSize":
return "CoverSize (pixels): 32, 64, 128, 256, 512, 1024 (default: 128)";
+ case "NumScreens":
+ return "Number of screens to use. 1 - 6 (default: 1)";
case "ScreenW":
return "Screen width and height (pixels)";
case "BorderLeft":
@@ -626,6 +633,11 @@ namespace Vocaluxe.Base
return max;
}
+ public static int GetNumScreens()
+ {
+ return Config.Graphics.NumScreens;
+ }
+
///
/// Try to assign automatically player 1 and 2 to usb-mics.
///
diff --git a/Vocaluxe/Base/CDraw.cs b/Vocaluxe/Base/CDraw.cs
index 7b3b58d1..57f61ff2 100644
--- a/Vocaluxe/Base/CDraw.cs
+++ b/Vocaluxe/Base/CDraw.cs
@@ -285,9 +285,10 @@ namespace Vocaluxe.Base
///
///
///
- public static void DrawRect(SColorF color, SRectF rect)
+ /// Render on all monitors
+ public static void DrawRect(SColorF color, SRectF rect, bool allMonitors = true)
{
- _Draw.DrawRect(color, rect);
+ _Draw.DrawRect(color, rect, allMonitors);
}
///
@@ -328,9 +329,10 @@ namespace Vocaluxe.Base
///
///
/// True to mirror the texture on the y axis
- public static void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, bool mirrored = false)
+ /// Render on all monitors
+ public static void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, bool mirrored = false, bool allMonitors = true)
{
- _Draw.DrawTexture(textureRef, rect, color, mirrored);
+ _Draw.DrawTexture(textureRef, rect, color, mirrored, allMonitors);
}
///
@@ -341,9 +343,10 @@ namespace Vocaluxe.Base
///
/// Bounds to draw the texture in (rest gets cropped off)
/// True to mirror the texture on the y axis
- public static void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false)
+ /// Render on all monitors
+ public static void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false, bool allMonitors = true)
{
- _Draw.DrawTexture(textureRef, rect, color, bounds, mirrored);
+ _Draw.DrawTexture(textureRef, rect, color, bounds, mirrored, allMonitors);
}
///
@@ -354,9 +357,10 @@ namespace Vocaluxe.Base
///
/// Normalized start x-coordinate (0..1)
/// Normalized end x-coordinate (0..1)
- public static void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, float begin, float end)
+ /// Render on all monitors
+ public static void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, float begin, float end, bool allMonitors = true)
{
- _Draw.DrawTexture(textureRef, rect, color, begin, end);
+ _Draw.DrawTexture(textureRef, rect, color, begin, end, allMonitors);
}
///
@@ -383,7 +387,7 @@ namespace Vocaluxe.Base
return;
SRectF rect = CHelper.FitInBounds(bounds, textureRef.OrigAspect, aspect);
- DrawTexture(textureRef, rect, color);
+ DrawTexture(textureRef, rect, color, bounds);
}
///
@@ -395,9 +399,9 @@ namespace Vocaluxe.Base
///
/// Spacing between the rect and the reflection
/// Height of the reflection
- public static void DrawTextureReflection(CTextureRef textureRef, SRectF rect, SColorF color, SRectF bounds, float space, float height)
+ public static void DrawTextureReflection(CTextureRef textureRef, SRectF rect, SColorF color, SRectF bounds, float space, float height, bool allMonitors = true)
{
- _Draw.DrawTextureReflection(textureRef, rect, color, bounds, space, height);
+ _Draw.DrawTextureReflection(textureRef, rect, color, bounds, space, height, allMonitors);
}
}
}
\ No newline at end of file
diff --git a/Vocaluxe/Base/CMain.cs b/Vocaluxe/Base/CMain.cs
index 3a131649..b4565895 100644
--- a/Vocaluxe/Base/CMain.cs
+++ b/Vocaluxe/Base/CMain.cs
@@ -170,6 +170,11 @@ namespace Vocaluxe.Base
{
CConfig.SongMenuChanged -= onSongMenuChanged;
}
+
+ public int GetNumScreens()
+ {
+ return CConfig.GetNumScreens();
+ }
}
class CBsettings : ISettings
@@ -229,6 +234,11 @@ namespace Vocaluxe.Base
return CSettings.MaxNumPlayer;
}
+ public int GetMaxNumScreens()
+ {
+ return CSettings.MaxNumScreens;
+ }
+
public float GetDefaultMedleyFadeInTime()
{
return CSettings.DefaultMedleyFadeInTime;
@@ -398,14 +408,14 @@ namespace Vocaluxe.Base
CDraw.DrawTexture(texture, rect);
}
- public void DrawTexture(CTextureRef texture, SRectF rect, SColorF color)
+ public void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, bool allMonitors = true)
{
- CDraw.DrawTexture(texture, rect, color);
+ CDraw.DrawTexture(texture, rect, color, false, allMonitors);
}
- public void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false)
+ public void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false, bool allMonitors = true)
{
- CDraw.DrawTexture(texture, rect, color, bounds, mirrored);
+ CDraw.DrawTexture(texture, rect, color, bounds, mirrored, allMonitors);
}
public void DrawTexture(CTextureRef textureRef, SRectF bounds, EAspect aspect)
@@ -418,9 +428,9 @@ namespace Vocaluxe.Base
CDraw.DrawTexture(textureRef, bounds, aspect, color);
}
- public void DrawTextureReflection(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, float reflectionSpace, float reflectionHeight)
+ public void DrawTextureReflection(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, float reflectionSpace, float reflectionHeight, bool allMonitors = true)
{
- CDraw.DrawTextureReflection(texture, rect, color, bounds, reflectionSpace, reflectionHeight);
+ CDraw.DrawTextureReflection(texture, rect, color, bounds, reflectionSpace, reflectionHeight, allMonitors);
}
public CTextureRef AddTexture(string fileName)
@@ -438,9 +448,9 @@ namespace Vocaluxe.Base
CDraw.RemoveTexture(ref texture);
}
- public void DrawRect(SColorF color, SRectF rect)
+ public void DrawRect(SColorF color, SRectF rect, bool allMonitors = true)
{
- CDraw.DrawRect(color, rect);
+ CDraw.DrawRect(color, rect, allMonitors);
}
public void DrawRectReflection(SColorF color, SRectF rect, float space, float height)
@@ -517,9 +527,9 @@ namespace Vocaluxe.Base
return CFonts.GetTextBounds(text);
}
- public void DrawText(string text, CFont font, float x, float y, float z, SColorF color)
+ public void DrawText(string text, CFont font, float x, float y, float z, SColorF color, bool allMonitors = true)
{
- CFonts.DrawText(text, font, x, y, z, color);
+ CFonts.DrawText(text, font, x, y, z, color, allMonitors);
}
public void DrawTextReflection(string text, CFont font, float x, float y, float z, SColorF color, float reflectionSpace, float reflectionHeight)
diff --git a/Vocaluxe/Base/CSettings.cs b/Vocaluxe/Base/CSettings.cs
index 774af072..0c76bc64 100644
--- a/Vocaluxe/Base/CSettings.cs
+++ b/Vocaluxe/Base/CSettings.cs
@@ -97,6 +97,7 @@ namespace Vocaluxe.Base
public const int DatabaseCoverVersion = 1;
public const int DatabaseCreditsRessourcesVersion = 1;
+ public const int MaxNumScreens = 6;
public const int RenderW = 1280;
public const int RenderH = 720;
public static readonly SRectF RenderRect = new SRectF(0, 0, RenderW, RenderH, 0);
@@ -252,7 +253,7 @@ namespace Vocaluxe.Base
public static float GetRenderAspect()
{
- return RenderW / (float)RenderH;
+ return RenderW * CConfig.GetNumScreens() / (float)RenderH;
}
public static void CreateFolders()
diff --git a/Vocaluxe/Base/CUtility.cs b/Vocaluxe/Base/CUtility.cs
index ee6fa27c..8402169c 100644
--- a/Vocaluxe/Base/CUtility.cs
+++ b/Vocaluxe/Base/CUtility.cs
@@ -225,7 +225,9 @@ namespace Vocaluxe.Base
private void _Add(int x, int y, bool lb, bool ld, bool rb, int wheel, bool lbh, bool rbh, bool mb, bool mbh)
{
_CheckModifiers();
- x = (int)(x * (float)CSettings.RenderW / CDraw.GetScreenWidth());
+ x = (int)(x * (float)CSettings.RenderW * CConfig.Config.Graphics.NumScreens / CDraw.GetScreenWidth());
+ while (x > CSettings.RenderW)
+ x -= CSettings.RenderW;
y = (int)(y * (float)CSettings.RenderH / CDraw.GetScreenHeight());
var pool = new SMouseEvent(ESender.Mouse, _Mod, x, y, lb, ld, rb, -wheel / 120, lbh, rbh, mb, mbh);
diff --git a/Vocaluxe/Base/Fonts/CFontStyle.cs b/Vocaluxe/Base/Fonts/CFontStyle.cs
index ba59e87b..0958632b 100644
--- a/Vocaluxe/Base/Fonts/CFontStyle.cs
+++ b/Vocaluxe/Base/Fonts/CFontStyle.cs
@@ -99,12 +99,12 @@ namespace Vocaluxe.Base.Fonts
return new Font(_Family, height, _GetSystemFontStyle(), GraphicsUnit.Pixel);
}
- public void DrawGlyph(char chr, float fontHeight, float x, float y, float z, SColorF color)
+ public void DrawGlyph(char chr, float fontHeight, float x, float y, float z, SColorF color, bool allMonitors = true)
{
CTextureRef texture;
SRectF rect;
GetOrAddGlyph(chr, fontHeight).GetTextureAndRect(fontHeight, x, y, z, out texture, out rect);
- CDraw.DrawTexture(texture, rect, color);
+ CDraw.DrawTexture(texture, rect, color, false, allMonitors);
}
public void DrawGlyph(char chr, float fontHeight, float x, float y, float z, SColorF color, float begin, float end)
diff --git a/Vocaluxe/Base/Fonts/CFonts.cs b/Vocaluxe/Base/Fonts/CFonts.cs
index b0ab10d8..5e242e2c 100644
--- a/Vocaluxe/Base/Fonts/CFonts.cs
+++ b/Vocaluxe/Base/Fonts/CFonts.cs
@@ -74,7 +74,7 @@ namespace Vocaluxe.Base.Fonts
/// The texts y-position
/// The texts z-position
/// The text color
- public static void DrawText(string text, CFont font, float x, float y, float z, SColorF color)
+ public static void DrawText(string text, CFont font, float x, float y, float z, SColorF color, bool allMonitors = true)
{
if (font.Height <= 0f || text == "")
return;
@@ -84,7 +84,7 @@ namespace Vocaluxe.Base.Fonts
float dx = x;
foreach (char chr in text)
{
- fontStyle.DrawGlyph(chr, font.Height, dx, y, z, color);
+ fontStyle.DrawGlyph(chr, font.Height, dx, y, z, color, allMonitors);
dx += fontStyle.GetWidth(chr, font.Height);
}
}
diff --git a/Vocaluxe/Lib/Draw/CDirect3D.cs b/Vocaluxe/Lib/Draw/CDirect3D.cs
index 78d64ee3..272ad9d1 100644
--- a/Vocaluxe/Lib/Draw/CDirect3D.cs
+++ b/Vocaluxe/Lib/Draw/CDirect3D.cs
@@ -86,7 +86,7 @@ namespace Vocaluxe.Lib.Draw
///
public CDirect3D()
{
- _Form = new CRenderFormHook { ClientSize = new Size(CConfig.Config.Graphics.ScreenW, CConfig.Config.Graphics.ScreenH) };
+ _Form = new CRenderFormHook { ClientSize = new Size(CConfig.Config.Graphics.ScreenW * CConfig.Config.Graphics.NumScreens, CConfig.Config.Graphics.ScreenH) };
try
{
@@ -114,7 +114,7 @@ namespace Vocaluxe.Lib.Draw
Windowed = true,
SwapEffect = SwapEffect.Discard,
BackBufferHeight = CConfig.Config.Graphics.ScreenH,
- BackBufferWidth = CConfig.Config.Graphics.ScreenW,
+ BackBufferWidth = CConfig.Config.Graphics.ScreenW * CConfig.Config.Graphics.NumScreens,
BackBufferFormat = _D3D.Adapters.DefaultAdapter.CurrentDisplayMode.Format,
Multisample = MultisampleType.None,
MultisampleQuality = 0
@@ -379,7 +379,7 @@ namespace Vocaluxe.Lib.Draw
const float dy = (float)CSettings.RenderH / 2;
Matrix translate = Matrix.Translation(new Vector3(-dx, dy, 0));
Matrix projection = Matrix.OrthoOffCenterLH(
- -dx - _BorderLeft, dx + _BorderRight,
+ -dx - _BorderLeft, (CSettings.RenderW * CConfig.Config.Graphics.NumScreens) - dx + _BorderRight,
-dy - _BorderBottom, dy + _BorderTop,
CSettings.ZNear, CSettings.ZFar);
@@ -572,9 +572,9 @@ namespace Vocaluxe.Lib.Draw
///
/// The color in which the rectangle will be drawn in
/// The coordinates in a SRectF struct
- public void DrawRect(SColorF color, SRectF rect)
+ public void DrawRect(SColorF color, SRectF rect, bool allMonitors = true)
{
- DrawTexture(_BlankTexture, rect, color);
+ DrawTexture(_BlankTexture, rect, color, false, allMonitors);
}
///
diff --git a/Vocaluxe/Lib/Draw/CDrawBase.cs b/Vocaluxe/Lib/Draw/CDrawBase.cs
index d02dc520..846c03f6 100644
--- a/Vocaluxe/Lib/Draw/CDrawBase.cs
+++ b/Vocaluxe/Lib/Draw/CDrawBase.cs
@@ -220,7 +220,7 @@ namespace Vocaluxe.Lib.Draw
return true;
}
- public void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, bool mirrored = false)
+ public void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, bool mirrored = false, bool allMonitors = true)
{
if (Math.Abs(color.A) < 0.01)
return;
@@ -228,10 +228,23 @@ namespace Vocaluxe.Lib.Draw
TTextureType texture;
if (!_GetTexture(textureRef, out texture))
return;
- if (!_CalcDrawCoords(texture, rect, out dc, mirrored))
- return;
-
- _DrawTexture(texture, dc, color);
+ if (allMonitors)
+ {
+ for (int i = 0; i < CConfig.Config.Graphics.NumScreens; i++)
+ {
+ SRectF newrect = rect;
+ newrect.X += CSettings.RenderW * i;
+ if (!_CalcDrawCoords(texture, newrect, out dc, mirrored))
+ return;
+ _DrawTexture(texture, dc, color);
+ }
+ }
+ else
+ {
+ if (!_CalcDrawCoords(texture, rect, out dc, mirrored))
+ return;
+ _DrawTexture(texture, dc, color);
+ }
}
///
@@ -242,7 +255,7 @@ namespace Vocaluxe.Lib.Draw
/// A SColorF struct containing a color which the texture will be colored in
/// A SRectF struct containing which part of the texture should be drawn
/// True if the texture should be mirrored
- public void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false)
+ public void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false, bool allMonitors = true)
{
if (Math.Abs(color.A) < 0.01)
return;
@@ -250,10 +263,26 @@ namespace Vocaluxe.Lib.Draw
TTextureType texture;
if (!_GetTexture(textureRef, out texture))
return;
- if (!_CalcDrawCoords(texture, rect, bounds, out dc))
- return;
- _DrawTexture(texture, dc, color);
+ if (allMonitors)
+ {
+ for (int i = 0; i < CConfig.Config.Graphics.NumScreens; i++)
+ {
+ SRectF newrect = rect;
+ SRectF newbounds = bounds;
+ newrect.X += CSettings.RenderW * i;
+ newbounds.X += CSettings.RenderW * i;
+ if (!_CalcDrawCoords(texture, newrect, newbounds, out dc, mirrored))
+ return;
+ _DrawTexture(texture, dc, color);
+ }
+ }
+ else
+ {
+ if (!_CalcDrawCoords(texture, rect, bounds, out dc, mirrored))
+ return;
+ _DrawTexture(texture, dc, color);
+ }
}
///
@@ -264,7 +293,7 @@ namespace Vocaluxe.Lib.Draw
/// A SColorF struct containing a color which the texture will be colored in
/// A Value ranging from 0 to 1 containing the beginning of the texture
/// A Value ranging from 0 to 1 containing the ending of the texture
- public void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, float begin, float end)
+ public void DrawTexture(CTextureRef textureRef, SRectF rect, SColorF color, float begin, float end, bool allMonitors = true)
{
if (Math.Abs(color.A) < 0.01)
return;
@@ -272,10 +301,24 @@ namespace Vocaluxe.Lib.Draw
TTextureType texture;
if (!_GetTexture(textureRef, out texture))
return;
- if (!_CalcDrawCoords(texture, rect, out dc, false, begin, end))
- return;
- _DrawTexture(texture, dc, color);
+ if (allMonitors)
+ {
+ for (int i = 0; i < CConfig.Config.Graphics.NumScreens; i++)
+ {
+ SRectF newrect = rect;
+ newrect.X += CSettings.RenderW * i;
+ if (!_CalcDrawCoords(texture, newrect, out dc, false, begin, end))
+ return;
+ _DrawTexture(texture, dc, color);
+ }
+ }
+ else
+ {
+ if (!_CalcDrawCoords(texture, rect, out dc, false, begin, end))
+ return;
+ _DrawTexture(texture, dc, color);
+ }
}
///
@@ -287,7 +330,7 @@ namespace Vocaluxe.Lib.Draw
/// A SRectF struct containing which part of the texture should be drawn
/// The space between the texture and the reflection
/// The height of the reflection
- public void DrawTextureReflection(CTextureRef textureRef, SRectF rect, SColorF color, SRectF bounds, float space, float height)
+ public void DrawTextureReflection(CTextureRef textureRef, SRectF rect, SColorF color, SRectF bounds, float space, float height, bool allMonitors = true)
{
Debug.Assert(height >= 0);
@@ -297,17 +340,35 @@ namespace Vocaluxe.Lib.Draw
TTextureType texture;
if (!_GetTexture(textureRef, out texture))
return;
- if (!_CalcDrawCoords(texture, rect, bounds, out dc, true))
- return;
- if (height > rect.H)
- height = rect.H;
+ int loops;
+ if (allMonitors)
+ {
+ loops = CConfig.Config.Graphics.NumScreens;
+ }
+ else
+ {
+ loops = 1;
+ }
- dc.Wy1 += rect.H + space; // Move from start of rect to end of rect with spacing
- dc.Wy2 += space + height; // Move from end of rect
- dc.Ty2 += (rect.H - height) / rect.H; // Adjust so not all of the start of the texture is drawn (mirrored--> Ty1>Ty2)
- if (dc.Ty2 < dc.Ty1) // Make sure we actually draw something
- _DrawTexture(texture, dc, color, true);
+ for (int i = 0; i < loops; i++)
+ {
+ SRectF newrect = rect;
+ SRectF newbounds = bounds;
+ newrect.X += CSettings.RenderW * i;
+ newbounds.X += CSettings.RenderW * i;
+ if (!_CalcDrawCoords(texture, newrect, newbounds, out dc, true))
+ return;
+
+ if (height > newrect.H)
+ height = newrect.H;
+
+ dc.Wy1 += newrect.H + space; // Move from start of rect to end of rect with spacing
+ dc.Wy2 += space + height; // Move from end of rect
+ dc.Ty2 += (newrect.H - height) / newrect.H; // Adjust so not all of the start of the texture is drawn (mirrored--> Ty1>Ty2)
+ if (dc.Ty2 < dc.Ty1) // Make sure we actually draw something
+ _DrawTexture(texture, dc, color, true);
+ }
}
// Resharper doesn't get that this is used -.-
diff --git a/Vocaluxe/Lib/Draw/CDrawWinForm.cs b/Vocaluxe/Lib/Draw/CDrawWinForm.cs
index 7f81b6b2..4e634743 100644
--- a/Vocaluxe/Lib/Draw/CDrawWinForm.cs
+++ b/Vocaluxe/Lib/Draw/CDrawWinForm.cs
@@ -308,7 +308,7 @@ namespace Vocaluxe.Lib.Draw
_Backbuffer.Save(file, ImageFormat.Png);
}
- public void DrawRect(SColorF color, SRectF rect) { }
+ public void DrawRect(SColorF color, SRectF rect, bool allMonitors = true) { }
public void DrawRectReflection(SColorF color, SRectF rect, float space, float height) { }
@@ -418,13 +418,13 @@ namespace Vocaluxe.Lib.Draw
_Bitmaps[textureRef.ID] = bmp;
}
- public void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, bool mirrored = false)
+ public void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, bool mirrored = false, bool allMonitors = true)
{
if (texture != null)
DrawTexture(texture, rect, color, rect, mirrored);
}
- public void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false)
+ public void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false, bool allMonitors = true)
{
if (!_TextureExists(texture))
return;
@@ -433,9 +433,9 @@ namespace Vocaluxe.Lib.Draw
coloredBitmap.Dispose();
}
- public void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, float begin, float end) { }
+ public void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, float begin, float end, bool allMonitors = true) { }
- public void DrawTextureReflection(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) { }
+ public void DrawTextureReflection(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, float space, float height, bool allMonitors = true) { }
public int GetTextureCount()
{
diff --git a/Vocaluxe/Lib/Draw/COpenGL.cs b/Vocaluxe/Lib/Draw/COpenGL.cs
index bb006118..f4b6945d 100644
--- a/Vocaluxe/Lib/Draw/COpenGL.cs
+++ b/Vocaluxe/Lib/Draw/COpenGL.cs
@@ -100,7 +100,7 @@ namespace Vocaluxe.Lib.Draw
public COpenGL()
{
- _Form = new CFormHook { ClientSize = new Size(CConfig.Config.Graphics.ScreenW, CConfig.Config.Graphics.ScreenH) };
+ _Form = new CFormHook { ClientSize = new Size(CConfig.Config.Graphics.ScreenW * CConfig.Config.Graphics.NumScreens, CConfig.Config.Graphics.ScreenH) };
//OpenGL needs that here but D3D needs it in the constructor, so do NOT unify!
//Check AA Mode
@@ -285,7 +285,7 @@ namespace Vocaluxe.Lib.Draw
{
GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
- GL.Ortho(-CConfig.Config.Graphics.BorderLeft, CConfig.Config.Graphics.BorderRight + CSettings.RenderW, CConfig.Config.Graphics.BorderBottom + CSettings.RenderH,
+ GL.Ortho(-CConfig.Config.Graphics.BorderLeft, CConfig.Config.Graphics.BorderRight + CSettings.RenderW * CConfig.Config.Graphics.NumScreens, CConfig.Config.Graphics.BorderBottom + CSettings.RenderH,
-CConfig.Config.Graphics.BorderTop, CSettings.ZNear, CSettings.ZFar);
}
@@ -338,27 +338,36 @@ namespace Vocaluxe.Lib.Draw
}
}
- public void DrawRect(SColorF color, SRectF rect)
+ public void DrawRect(SColorF color, SRectF rect, bool allMonitors = true)
{
- GL.Enable(EnableCap.Blend);
- GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha);
-
- GL.Begin(PrimitiveType.Quads);
- GL.MatrixMode(MatrixMode.Color);
- GL.PushMatrix();
- if (Math.Abs(rect.Rotation) > 0.001)
+ int loops = 1;
+ if (allMonitors)
+ loops = CConfig.Config.Graphics.NumScreens;
+ for (int i = 0; i < loops; i++)
{
- GL.Translate(0.5f, 0.5f, 0);
- GL.Rotate(-rect.Rotation, 0f, 0f, 1f);
- GL.Translate(-0.5f, -0.5f, 0);
+ SRectF newrect = rect;
+ newrect.X += CSettings.RenderW * i;
+
+ GL.Enable(EnableCap.Blend);
+ GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha);
+
+ GL.Begin(PrimitiveType.Quads);
+ GL.MatrixMode(MatrixMode.Color);
+ GL.PushMatrix();
+ if (Math.Abs(newrect.Rotation) > 0.001)
+ {
+ GL.Translate(0.5f, 0.5f, 0);
+ GL.Rotate(-newrect.Rotation, 0f, 0f, 1f);
+ GL.Translate(-0.5f, -0.5f, 0);
+ }
+ GL.Vertex3(newrect.X, newrect.Y, newrect.Z + CGraphics.ZOffset);
+ GL.Vertex3(newrect.X, newrect.Y + newrect.H, newrect.Z + CGraphics.ZOffset);
+ GL.Vertex3(newrect.X + newrect.W, newrect.Y + newrect.H, newrect.Z + CGraphics.ZOffset);
+ GL.Vertex3(newrect.X + newrect.W, newrect.Y, newrect.Z + CGraphics.ZOffset);
+ GL.End();
+ GL.PopMatrix();
+ GL.Disable(EnableCap.Blend);
}
- GL.Vertex3(rect.X, rect.Y, rect.Z + CGraphics.ZOffset);
- GL.Vertex3(rect.X, rect.Y + rect.H, rect.Z + CGraphics.ZOffset);
- GL.Vertex3(rect.X + rect.W, rect.Y + rect.H, rect.Z + CGraphics.ZOffset);
- GL.Vertex3(rect.X + rect.W, rect.Y, rect.Z + CGraphics.ZOffset);
- GL.End();
- GL.PopMatrix();
- GL.Disable(EnableCap.Blend);
}
public void DrawRectReflection(SColorF color, SRectF rect, float space, float height)
diff --git a/Vocaluxe/Lib/Draw/IDraw.cs b/Vocaluxe/Lib/Draw/IDraw.cs
index 5b362a49..1fc3fd7d 100644
--- a/Vocaluxe/Lib/Draw/IDraw.cs
+++ b/Vocaluxe/Lib/Draw/IDraw.cs
@@ -49,13 +49,13 @@ namespace Vocaluxe.Lib.Draw
void RemoveTexture(ref CTextureRef texture);
// Basic Draw Methods
- void DrawRect(SColorF color, SRectF rect);
+ void DrawRect(SColorF color, SRectF rect, bool allMonitors = true);
void DrawRectReflection(SColorF color, SRectF rect, float space, float height);
- void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, bool mirrored = false);
- void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false);
- void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, float begin, float end);
+ void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, bool mirrored = false, bool allMonitors = true);
+ void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false, bool allMonitors = true);
+ void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, float begin, float end, bool allMonitors = true);
- void DrawTextureReflection(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, float space, float height);
+ void DrawTextureReflection(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, float space, float height, bool allMonitors = true);
}
}
\ No newline at end of file
diff --git a/Vocaluxe/Screens/CScreenSing.cs b/Vocaluxe/Screens/CScreenSing.cs
index 0da54667..d2a94f3c 100644
--- a/Vocaluxe/Screens/CScreenSing.cs
+++ b/Vocaluxe/Screens/CScreenSing.cs
@@ -38,7 +38,7 @@ namespace Vocaluxe.Screens
// Version number for theme files. Increment it, if you've changed something on the theme files!
protected override int _ScreenVersion
{
- get { return 7; }
+ get { return 8; }
}
private struct STimeRect
@@ -54,8 +54,8 @@ namespace Vocaluxe.Screens
private const string _TextDuetName1 = "TextDuetName1";
private const string _TextDuetName2 = "TextDuetName2";
private const string _TextMedleyCountdown = "TextMedleyCountdown";
- private string[,] _TextScores;
- private string[,] _TextNames;
+ private string[,,] _TextScores;
+ private string[,,] _TextNames;
private const string _StaticSongText = "StaticSongText";
private const string _StaticLyrics = "StaticLyrics";
@@ -71,8 +71,8 @@ namespace Vocaluxe.Screens
private const string _StaticLyricHelperTop = "StaticLyricHelperTop";
private const string _StaticPauseBG = "StaticPauseBG";
- private string[,] _StaticScores;
- private string[,] _StaticAvatars;
+ private string[,,] _StaticScores;
+ private string[,,] _StaticAvatars;
private const string _ButtonCancel = "ButtonCancel";
private const string _ButtonContinue = "ButtonContinue";
@@ -87,6 +87,11 @@ namespace Vocaluxe.Screens
private const string _SingBars = "SingBars";
+ private string[] _PlayerTextScore;
+ private string[] _PlayerTextName;
+ private string[] _PlayerStaticScore;
+ private string[] _PlayerStaticAvatar;
+
private bool _DynamicLyricsTop;
private bool _DynamicLyricsBottom;
@@ -150,6 +155,7 @@ namespace Vocaluxe.Screens
_StaticPauseBG
};
_BuildStaticStrings(ref statics);
+ _AssignPlayerElements();
_ThemeStatics = statics.ToArray();
_ThemeButtons = new string[] { _ButtonCancel, _ButtonContinue, _ButtonSkip };
@@ -334,15 +340,15 @@ namespace Vocaluxe.Screens
if (CConfig.Config.Theme.FadePlayerInfo == EFadePlayerInfo.TR_CONFIG_FADEPLAYERINFO_INFO ||
CConfig.Config.Theme.FadePlayerInfo == EFadePlayerInfo.TR_CONFIG_FADEPLAYERINFO_ALL)
{
- _Statics[_StaticAvatars[p, CGame.NumPlayers - 1]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
- _Texts[_TextNames[p, CGame.NumPlayers - 1]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
+ _Statics[_PlayerStaticAvatar[p]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
+ _Texts[_PlayerTextName[p]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
}
if (CConfig.Config.Theme.FadePlayerInfo == EFadePlayerInfo.TR_CONFIG_FADEPLAYERINFO_ALL)
{
- _Statics[_StaticScores[p, CGame.NumPlayers - 1]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
- _Statics[_StaticAvatars[p, CGame.NumPlayers - 1]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
- _Texts[_TextNames[p, CGame.NumPlayers - 1]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
- _Texts[_TextScores[p, CGame.NumPlayers - 1]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
+ _Statics[_PlayerStaticScore[p]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
+ _Statics[_PlayerStaticAvatar[p]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
+ _Texts[_PlayerTextName[p]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
+ _Texts[_PlayerTextScore[p]].Alpha = alpha[CGame.Players[p].VoiceNr * 2];
}
}
@@ -366,7 +372,7 @@ namespace Vocaluxe.Screens
for (int p = 0; p < CGame.NumPlayers; p++)
{
string fmtString = (CGame.Players[p].Points < 10000) ? "0000" : "00000";
- _Texts[_TextScores[p, CGame.NumPlayers - 1]].Text = CGame.Players[p].Points.ToString(fmtString);
+ _Texts[_PlayerTextScore[p]].Text = CGame.Players[p].Points.ToString(fmtString);
}
if (_CurrentVideo != null && !_FadeOut && CConfig.Config.Video.VideosInSongs == EOffOn.TR_CONFIG_ON)
@@ -397,12 +403,17 @@ namespace Vocaluxe.Screens
_TimeRects.Clear();
_SingNotes[_SingBars].Init(0);
+ _AssignPlayerElements();
foreach (CLyric lyric in _Lyrics)
lyric.LyricStyle = CConfig.Config.Theme.LyricStyle;
for (int p = 0; p < CGame.NumPlayers; p++)
- _Statics[_StaticAvatars[p, CGame.NumPlayers - 1]].Aspect = EAspect.Crop;
+ {
+ _Statics[_PlayerStaticAvatar[p]].Aspect = EAspect.Crop;
+ _Texts[_PlayerTextScore[p]].Color = new SColorF(CBase.Themes.GetPlayerColor(p + 1), _Texts[_PlayerTextScore[p]].Color.A);
+ }
+
_SetVisibility();
_UpdateAvatars();
@@ -583,7 +594,7 @@ namespace Vocaluxe.Screens
}
//Attention: This needs to be done after player-assignment!
- _SingNotes[_SingBars].Init(CGame.NumPlayers);
+ _SingNotes[_SingBars].Init(CGame.NumPlayers, CConfig.Config.Graphics.NumScreens);
_DynamicLyricsTop = false;
_DynamicLyricsBottom = false;
@@ -804,21 +815,23 @@ namespace Vocaluxe.Screens
private void _BuildTextStrings(List texts)
{
- _TextScores = new string[CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
- _TextNames = new string[CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
-
- for (int numplayer = 0; numplayer < CSettings.MaxNumPlayer; numplayer++)
+ _TextScores = new string[CSettings.MaxNumScreens, CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
+ _TextNames = new string[CSettings.MaxNumScreens, CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
+ for (int screen = 0; screen < CSettings.MaxNumScreens; screen++)
{
- for (int player = 0; player < CSettings.MaxNumPlayer; player++)
+ for (int numplayer = 0; numplayer < CSettings.MaxNumPlayer; numplayer++)
{
- if (player <= numplayer)
+ for (int player = 0; player < CSettings.MaxNumPlayer; player++)
{
- string target = "P" + (player + 1) + "N" + (numplayer + 1);
- _TextScores[player, numplayer] = "TextScore" + target;
- _TextNames[player, numplayer] = "TextName" + target;
+ if (player <= numplayer)
+ {
+ string target = "S" + (screen + 1) + "P" + (player + 1) + "N" + (numplayer + 1);
+ _TextScores[screen, player, numplayer] = "TextScore" + target;
+ _TextNames[screen, player, numplayer] = "TextName" + target;
- texts.Add(_TextScores[player, numplayer]);
- texts.Add(_TextNames[player, numplayer]);
+ texts.Add(_TextScores[screen, player, numplayer]);
+ texts.Add(_TextNames[screen, player, numplayer]);
+ }
}
}
}
@@ -826,21 +839,24 @@ namespace Vocaluxe.Screens
private void _BuildStaticStrings(ref List statics)
{
- _StaticScores = new string[CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
- _StaticAvatars = new string[CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
+ _StaticScores = new string[CSettings.MaxNumScreens, CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
+ _StaticAvatars = new string[CSettings.MaxNumScreens, CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
- for (int numplayer = 0; numplayer < CSettings.MaxNumPlayer; numplayer++)
+ for (int screen = 0; screen < CSettings.MaxNumScreens; screen++)
{
- for (int player = 0; player < CSettings.MaxNumPlayer; player++)
+ for (int numplayer = 0; numplayer < CSettings.MaxNumPlayer; numplayer++)
{
- if (player <= numplayer)
+ for (int player = 0; player < CSettings.MaxNumPlayer; player++)
{
- string target = "P" + (player + 1) + "N" + (numplayer + 1);
- _StaticScores[player, numplayer] = "StaticScore" + target;
- _StaticAvatars[player, numplayer] = "StaticAvatar" + target;
+ if (player <= numplayer)
+ {
+ string target = "S" + (screen + 1) + "P" + (player + 1) + "N" + (numplayer + 1);
+ _StaticScores[screen, player, numplayer] = "StaticScore" + target;
+ _StaticAvatars[screen, player, numplayer] = "StaticAvatar" + target;
- statics.Add(_StaticScores[player, numplayer]);
- statics.Add(_StaticAvatars[player, numplayer]);
+ statics.Add(_StaticScores[screen, player, numplayer]);
+ statics.Add(_StaticAvatars[screen, player, numplayer]);
+ }
}
}
}
@@ -886,22 +902,34 @@ namespace Vocaluxe.Screens
_Texts[tx].Visible = n == curN;
}
- for (int numplayer = 0; numplayer < CSettings.MaxNumPlayer; numplayer++)
+ for (int screen = 0; screen < CSettings.MaxNumScreens; screen++)
{
- for (int player = 0; player < CSettings.MaxNumPlayer && player <= numplayer; player++)
+ for (int numplayer = 0; numplayer < CSettings.MaxNumPlayer; numplayer++)
{
- bool isIvisible = numplayer + 1 == CGame.NumPlayers && player <= CGame.NumPlayers;
- _Texts[_TextScores[player, numplayer]].Visible = isIvisible;
- _Texts[_TextNames[player, numplayer]].Visible = isIvisible &&
- (CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH ||
- CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_NAME);
- _Statics[_StaticScores[player, numplayer]].Visible = isIvisible;
- _Statics[_StaticAvatars[player, numplayer]].Visible = isIvisible &&
- (CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH ||
- CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_AVATAR);
+ for (int player = 0; player < CSettings.MaxNumPlayer && player <= numplayer; player++)
+ {
+ _Texts[_TextScores[screen, player, numplayer]].AllMonitors = false;
+ _Texts[_TextScores[screen, player, numplayer]].Visible = false;
+ _Texts[_TextNames[screen, player, numplayer]].AllMonitors = false;
+ _Texts[_TextNames[screen, player, numplayer]].Visible = false;
+ _Statics[_StaticScores[screen, player, numplayer]].AllMonitors = false;
+ _Statics[_StaticScores[screen, player, numplayer]].Visible = false;
+ _Statics[_StaticAvatars[screen, player, numplayer]].AllMonitors = false;
+ _Statics[_StaticAvatars[screen, player, numplayer]].Visible = false;
+ }
}
}
+ for (int player = 0; player < CGame.NumPlayers; player++)
+ {
+ _Texts[_PlayerTextScore[player]].Visible = true;
+ _Texts[_PlayerTextName[player]].Visible = (CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH ||
+ CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_NAME);
+ _Statics[_PlayerStaticScore[player]].Visible = true;
+ _Statics[_PlayerStaticAvatar[player]].Visible = (CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH ||
+ CConfig.Config.Theme.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_AVATAR);
+ }
+
_Lyrics[_LyricMain].Alpha = 0f;
_Lyrics[_LyricSub].Alpha = 0f;
@@ -1355,9 +1383,9 @@ namespace Vocaluxe.Screens
for (int i = 0; i < CGame.NumPlayers; i++)
{
if (CProfiles.IsProfileIDValid(CGame.Players[i].ProfileID))
- _Statics[_StaticAvatars[i, CGame.NumPlayers - 1]].Texture = CProfiles.GetAvatarTextureFromProfile(CGame.Players[i].ProfileID);
+ _Statics[_PlayerStaticAvatar[i]].Texture = CProfiles.GetAvatarTextureFromProfile(CGame.Players[i].ProfileID);
else
- _Statics[_StaticAvatars[i, CGame.NumPlayers - 1]].Visible = false;
+ _Statics[_PlayerStaticAvatar[i]].Visible = false;
}
}
@@ -1366,9 +1394,59 @@ namespace Vocaluxe.Screens
for (int i = 0; i < CGame.NumPlayers; i++)
{
if (CProfiles.IsProfileIDValid(CGame.Players[i].ProfileID))
- _Texts[_TextNames[i, CGame.NumPlayers - 1]].Text = CProfiles.GetPlayerName(CGame.Players[i].ProfileID);
+ _Texts[_PlayerTextName[i]].Text = CProfiles.GetPlayerName(CGame.Players[i].ProfileID);
else
- _Texts[_TextNames[i, CGame.NumPlayers - 1]].Visible = false;
+ _Texts[_PlayerTextName[i]].Visible = false;
+ }
+ }
+ private void _AssignPlayerElements()
+ {
+ _PlayerTextScore = new String[CGame.NumPlayers];
+ _PlayerTextName = new String[CGame.NumPlayers];
+ _PlayerStaticAvatar = new String[CGame.NumPlayers];
+ _PlayerStaticScore = new String[CGame.NumPlayers];
+
+ int screenPlayers = CGame.NumPlayers / CConfig.GetNumScreens();
+ int remainingPlayers = CGame.NumPlayers - (screenPlayers * CConfig.GetNumScreens());
+ int player = 0;
+
+ for (int s = 0; s < CConfig.GetNumScreens(); s++)
+ {
+ for (int p = 0; p < screenPlayers; p++)
+ {
+ if (remainingPlayers > 0)
+ {
+ _PlayerTextScore[player] = _TextScores[s, p, screenPlayers];
+ _PlayerTextName[player] = _TextNames[s, p, screenPlayers];
+ _PlayerStaticAvatar[player] = _StaticAvatars[s, p, screenPlayers];
+ _PlayerStaticScore[player++] = _StaticScores[s, p, screenPlayers];
+ if (p == screenPlayers - 1)
+ {
+ _PlayerTextScore[player] = _TextScores[s, p + 1, screenPlayers];
+ _PlayerTextName[player] = _TextNames[s, p + 1, screenPlayers];
+ _PlayerStaticAvatar[player] = _StaticAvatars[s, p + 1, screenPlayers];
+ _PlayerStaticScore[player++] = _StaticScores[s, p + 1, screenPlayers];
+ remainingPlayers--;
+ }
+ }
+ else
+ {
+ _PlayerTextScore[player] = _TextScores[s, p, screenPlayers - 1];
+ _PlayerTextName[player] = _TextNames[s, p, screenPlayers - 1];
+ _PlayerStaticAvatar[player] = _StaticAvatars[s, p, screenPlayers - 1];
+ _PlayerStaticScore[player++] = _StaticScores[s, p, screenPlayers - 1];
+ }
+
+ }
+ //Handle when players < screens
+ if (screenPlayers == 0 && remainingPlayers > 0)
+ {
+ _PlayerTextScore[player] = _TextScores[s, 0, 0];
+ _PlayerTextName[player] = _TextNames[s, 0, 0];
+ _PlayerStaticAvatar[player] = _StaticAvatars[s, 0, 0];
+ _PlayerStaticScore[player++] = _StaticScores[s, 0, 0];
+ remainingPlayers--;
+ }
}
}
}
diff --git a/VocaluxeLib/IBasic.cs b/VocaluxeLib/IBasic.cs
index 0e35883e..e70befbc 100644
--- a/VocaluxeLib/IBasic.cs
+++ b/VocaluxeLib/IBasic.cs
@@ -83,6 +83,7 @@ namespace VocaluxeLib
int GetNumNoteLines();
int GetMaxNumPlayer();
+ int GetMaxNumScreens();
float GetDefaultMedleyFadeInTime();
float GetDefaultMedleyFadeOutTime();
@@ -135,17 +136,17 @@ namespace VocaluxeLib
public interface IDrawing
{
void DrawTexture(CTextureRef texture, SRectF rect);
- void DrawTexture(CTextureRef texture, SRectF rect, SColorF color);
- void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false);
+ void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, bool allMonitors = true);
+ void DrawTexture(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false, bool allMonitors = true);
void DrawTexture(CTextureRef textureRef, SRectF bounds, EAspect aspect);
void DrawTexture(CTextureRef textureRef, SRectF bounds, EAspect aspect, SColorF color);
- void DrawTextureReflection(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, float reflectionSpace, float reflectionHeight);
+ void DrawTextureReflection(CTextureRef texture, SRectF rect, SColorF color, SRectF bounds, float reflectionSpace, float reflectionHeight, bool allMonitors = true);
CTextureRef AddTexture(string fileName);
CTextureRef EnqueueTexture(string fileName);
void RemoveTexture(ref CTextureRef texture);
- void DrawRect(SColorF color, SRectF rect);
+ void DrawRect(SColorF color, SRectF rect, bool allMonitors = true);
void DrawRectReflection(SColorF color, SRectF rect, float space, float height);
}
@@ -174,7 +175,7 @@ namespace VocaluxeLib
{
RectangleF GetTextBounds(CText text);
- void DrawText(string text, CFont font, float x, float y, float z, SColorF color);
+ void DrawText(string text, CFont font, float x, float y, float z, SColorF color, bool allMonitors = true);
void DrawTextReflection(string text, CFont font, float x, float y, float z, SColorF color, float reflectionSpace, float reflectionHeight);
void DrawText(string text, CFont font, float x, float y, float z, SColorF color, float begin, float end);
}
diff --git a/VocaluxeLib/Menu/CParticle.cs b/VocaluxeLib/Menu/CParticle.cs
index 1d7d983b..580380a2 100644
--- a/VocaluxeLib/Menu/CParticle.cs
+++ b/VocaluxeLib/Menu/CParticle.cs
@@ -265,14 +265,14 @@ namespace VocaluxeLib.Menu
_Timer.Start();
}
- public void Draw()
+ public void Draw(bool allMonitors = true)
{
// ReSharper disable ConvertIfStatementToConditionalTernaryExpression
if (!String.IsNullOrEmpty(_TextureName))
// ReSharper restore ConvertIfStatementToConditionalTernaryExpression
- CBase.Drawing.DrawTexture(CBase.Themes.GetSkinTexture(_TextureName, _PartyModeID), _Rect, new SColorF(_Color.R, _Color.G, _Color.B, _Color.A * Alpha2 * _Alpha));
+ CBase.Drawing.DrawTexture(CBase.Themes.GetSkinTexture(_TextureName, _PartyModeID), _Rect, new SColorF(_Color.R, _Color.G, _Color.B, _Color.A * Alpha2 * _Alpha), allMonitors);
else
- CBase.Drawing.DrawTexture(_Texture, _Rect, new SColorF(_Color.R, _Color.G, _Color.B, _Color.A * Alpha2 * _Alpha));
+ CBase.Drawing.DrawTexture(_Texture, _Rect, new SColorF(_Color.R, _Color.G, _Color.B, _Color.A * Alpha2 * _Alpha), allMonitors);
}
}
}
\ No newline at end of file
diff --git a/VocaluxeLib/Menu/CParticleEffect.cs b/VocaluxeLib/Menu/CParticleEffect.cs
index 88ddd2cb..e5d3f996 100644
--- a/VocaluxeLib/Menu/CParticleEffect.cs
+++ b/VocaluxeLib/Menu/CParticleEffect.cs
@@ -36,6 +36,7 @@ namespace VocaluxeLib.Menu
public EParticleType Type;
public float Size;
public int MaxNumber;
+ public bool? AllMonitors;
}
public enum EParticleType
@@ -61,6 +62,8 @@ namespace VocaluxeLib.Menu
public float Alpha = 1f;
+ public bool AllMonitors = true;
+
public string GetThemeName()
{
return _Theme.Name;
@@ -302,7 +305,7 @@ namespace VocaluxeLib.Menu
foreach (CParticle star in _Stars)
{
star.Alpha2 = Alpha;
- star.Draw();
+ star.Draw(AllMonitors);
}
}
diff --git a/VocaluxeLib/Menu/CStatic.cs b/VocaluxeLib/Menu/CStatic.cs
index bd4e06eb..719c2518 100644
--- a/VocaluxeLib/Menu/CStatic.cs
+++ b/VocaluxeLib/Menu/CStatic.cs
@@ -32,6 +32,7 @@ namespace VocaluxeLib.Menu
public SThemeColor Color;
public SRectF Rect;
public SReflection? Reflection;
+ public bool? AllMonitors;
}
public sealed class CStatic : CMenuElementBase, IMenuElement, IThemeable
@@ -66,6 +67,8 @@ namespace VocaluxeLib.Menu
public float ReflectionSpace;
public float ReflectionHeight;
+ public bool AllMonitors = true;
+
public float Alpha = 1;
public EAspect Aspect = EAspect.Stretch;
@@ -85,6 +88,7 @@ namespace VocaluxeLib.Menu
Reflection = s.Reflection;
ReflectionSpace = s.ReflectionHeight;
ReflectionHeight = s.ReflectionSpace;
+ AllMonitors = s.AllMonitors;
Alpha = s.Alpha;
Visible = s.Visible;
@@ -176,9 +180,9 @@ namespace VocaluxeLib.Menu
{
if (texture != null)
{
- CBase.Drawing.DrawTexture(texture, rect, color, bounds);
+ CBase.Drawing.DrawTexture(texture, rect, color, bounds, false, AllMonitors);
if (Reflection)
- CBase.Drawing.DrawTextureReflection(texture, rect, color, bounds, ReflectionSpace, ReflectionHeight);
+ CBase.Drawing.DrawTextureReflection(texture, rect, color, bounds, ReflectionSpace, ReflectionHeight, AllMonitors);
}
else
CBase.Drawing.DrawRect(color, rect);
diff --git a/VocaluxeLib/Menu/CText.cs b/VocaluxeLib/Menu/CText.cs
index 2adc07c2..27bd6b5d 100644
--- a/VocaluxeLib/Menu/CText.cs
+++ b/VocaluxeLib/Menu/CText.cs
@@ -45,6 +45,7 @@ namespace VocaluxeLib.Menu
public string FontFamily;
public string Text;
public SReflection? Reflection;
+ public bool? AllMonitors;
}
public sealed class CText : CMenuElementBase, IMenuElement, IThemeable, IFontObserver
@@ -167,6 +168,8 @@ namespace VocaluxeLib.Menu
private float _ReflectionSpace;
private float _ReflectionHeight;
+ public bool AllMonitors = true;
+
private string _Text = String.Empty;
public string Text
{
@@ -254,6 +257,7 @@ namespace VocaluxeLib.Menu
SelColor = text.SelColor;
_ReflectionSpace = text._ReflectionSpace;
_ReflectionHeight = text._ReflectionHeight;
+ AllMonitors = text.AllMonitors;
Text = text.Text;
Visible = text.Visible;
@@ -388,7 +392,7 @@ namespace VocaluxeLib.Menu
SColorF currentColor = (Selected) ? SelColor : Color;
var color = new SColorF(currentColor.R, currentColor.G, currentColor.B, currentColor.A * Alpha);
- CBase.Fonts.DrawText(_Text, CalculatedFont, Rect.X, Rect.Y, Z, color);
+ CBase.Fonts.DrawText(_Text, CalculatedFont, Rect.X, Rect.Y, Z, color, AllMonitors);
if (_ReflectionHeight > 0)
CBase.Fonts.DrawTextReflection(_Text, CalculatedFont, Rect.X, Rect.Y, Z, color, _ReflectionSpace, _ReflectionHeight);
diff --git a/VocaluxeLib/Menu/SingNotes/CNoteBars.cs b/VocaluxeLib/Menu/SingNotes/CNoteBars.cs
index ba296f94..46ebde8b 100644
--- a/VocaluxeLib/Menu/SingNotes/CNoteBars.cs
+++ b/VocaluxeLib/Menu/SingNotes/CNoteBars.cs
@@ -187,7 +187,7 @@ namespace VocaluxeLib.Menu.SingNotes
for (int i = 0; i < CBase.Settings.GetNumNoteLines(); i++)
{
lineRect.Y = Rect.Y + Rect.H / CBase.Settings.GetNumNoteLines() * (i + 1);
- CBase.Drawing.DrawRect(color, lineRect);
+ CBase.Drawing.DrawRect(color, lineRect, false);
}
}
@@ -218,7 +218,7 @@ namespace VocaluxeLib.Menu.SingNotes
var color = new SColorF(_Color, _Color.A * Alpha);
CTextureRef toneHelper = CBase.Themes.GetSkinTexture(_Theme.SkinToneHelper, _PartyModeID);
- CBase.Drawing.DrawTexture(toneHelper, drawRect, color);
+ CBase.Drawing.DrawTexture(toneHelper, drawRect, color, false);
}
private void _DrawNote(SRectF rect, SColorF color, float factor)
@@ -239,15 +239,15 @@ namespace VocaluxeLib.Menu.SingNotes
//Need 2 of them so use minimum
float endsW = Math.Min(noteRect.H * noteBegin.OrigAspect, noteRect.W / 2);
- CBase.Drawing.DrawTexture(noteBegin, new SRectF(noteRect.X, noteRect.Y, endsW, noteRect.H, noteRect.Z), color);
+ CBase.Drawing.DrawTexture(noteBegin, new SRectF(noteRect.X, noteRect.Y, endsW, noteRect.H, noteRect.Z), color, false);
var middleRect = new SRectF(noteRect.X + endsW, noteRect.Y, noteRect.W - 2 * endsW, noteRect.H, noteRect.Z);
if (noteRect.W >= 4 * endsW)
- CBase.Drawing.DrawTexture(noteMiddle, middleRect, color);
+ CBase.Drawing.DrawTexture(noteMiddle, middleRect, color, false);
else
- CBase.Drawing.DrawTexture(noteMiddle, new SRectF(middleRect.X, middleRect.Y, 2 * endsW, middleRect.H, middleRect.Z), color, middleRect);
+ CBase.Drawing.DrawTexture(noteMiddle, new SRectF(middleRect.X, middleRect.Y, 2 * endsW, middleRect.H, middleRect.Z), color, middleRect, false, false);
- CBase.Drawing.DrawTexture(noteEnd, new SRectF(noteRect.X + noteRect.W - endsW, noteRect.Y, endsW, noteRect.H, noteRect.Z), color);
+ CBase.Drawing.DrawTexture(noteEnd, new SRectF(noteRect.X + noteRect.W - endsW, noteRect.Y, endsW, noteRect.H, noteRect.Z), color, false);
}
private void _DrawNoteBG(SRectF noteRect, SColorF color)
@@ -272,23 +272,24 @@ namespace VocaluxeLib.Menu.SingNotes
var col = new SColorF(color, color.A * alpha);
- CBase.Drawing.DrawTexture(noteBackgroundBegin, new SRectF(noteRect.X, noteRect.Y, dx, noteRect.H, noteRect.Z), col);
+ CBase.Drawing.DrawTexture(noteBackgroundBegin, new SRectF(noteRect.X, noteRect.Y, dx, noteRect.H, noteRect.Z), col, false);
if (noteRect.W - 2 * dx >= 2 * dx)
- CBase.Drawing.DrawTexture(noteBackgroundMiddle, new SRectF(noteRect.X + dx, noteRect.Y, noteRect.W - 2 * dx, noteRect.H, noteRect.Z), col);
+ CBase.Drawing.DrawTexture(noteBackgroundMiddle, new SRectF(noteRect.X + dx, noteRect.Y, noteRect.W - 2 * dx, noteRect.H, noteRect.Z), col, false);
else
{
CBase.Drawing.DrawTexture(noteBackgroundMiddle, new SRectF(noteRect.X + dx, noteRect.Y, 2 * dx, noteRect.H, noteRect.Z), col,
- new SRectF(noteRect.X + dx, noteRect.Y, noteRect.W - 2 * dx, noteRect.H, noteRect.Z));
+ new SRectF(noteRect.X + dx, noteRect.Y, noteRect.W - 2 * dx, noteRect.H, noteRect.Z), false, false);
}
- CBase.Drawing.DrawTexture(noteBackgroundEnd, new SRectF(noteRect.X + noteRect.W - dx, noteRect.Y, dx, noteRect.H, noteRect.Z), col);
+ CBase.Drawing.DrawTexture(noteBackgroundEnd, new SRectF(noteRect.X + noteRect.W - dx, noteRect.Y, dx, noteRect.H, noteRect.Z), col, false);
}
private void _AddGoldenNote(SRectF noteRect)
{
var numstars = (int)(noteRect.W * 0.25f);
var stars = new CParticleEffect(_PartyModeID, numstars, new SColorF(Color.Yellow), noteRect, _Theme.SkinGoldenStar, 20, EParticleType.Star);
+ stars.AllMonitors = false;
_GoldenStars.Add(stars);
}
@@ -297,6 +298,7 @@ namespace VocaluxeLib.Menu.SingNotes
var rect = new SRectF(noteRect.Right, noteRect.Y, 0f, noteRect.H, noteRect.Z);
var flares = new CParticleEffect(_PartyModeID, 15, new SColorF(Color.White), rect, _Theme.SkinGoldenStar, 20, EParticleType.Flare);
+ flares.AllMonitors = false;
_Flares.Add(flares);
}
@@ -311,12 +313,14 @@ namespace VocaluxeLib.Menu.SingNotes
var stars = new CParticleEffect(_PartyModeID, CBase.Game.GetRandom(2) + 1, new SColorF(Color.White), r, _Theme.SkinPerfectNoteStart, 35,
EParticleType.PerfNoteStar);
+ stars.AllMonitors = false;
_PerfectNoteEffect.Add(stars);
}
private void _AddPerfectLine()
{
var twinkle = new CParticleEffect(_PartyModeID, 200, _Color, Rect, _Theme.SkinGoldenStar, 25, EParticleType.Twinkle);
+ twinkle.AllMonitors = false;
_PerfectLineTwinkle.Add(twinkle);
}
}
diff --git a/VocaluxeLib/Menu/SingNotes/CSingNotes.cs b/VocaluxeLib/Menu/SingNotes/CSingNotes.cs
index 71c09fdc..dcb8a4a3 100644
--- a/VocaluxeLib/Menu/SingNotes/CSingNotes.cs
+++ b/VocaluxeLib/Menu/SingNotes/CSingNotes.cs
@@ -27,14 +27,16 @@ namespace VocaluxeLib.Menu.SingNotes
[XmlType("Position")]
public struct SBarPosition
{
- [XmlAttribute(AttributeName = "Name")] public string Name;
+ [XmlAttribute(AttributeName = "Name")]
+ public string Name;
public SRectF Rect;
}
[XmlType("SingBar")]
public struct SThemeSingBar
{
- [XmlAttribute(AttributeName = "Name")] public string Name;
+ [XmlAttribute(AttributeName = "Name")]
+ public string Name;
public string SkinLeft;
public string SkinMiddle;
@@ -48,7 +50,8 @@ namespace VocaluxeLib.Menu.SingNotes
public string SkinToneHelper;
public string SkinPerfectNoteStart;
- [XmlArray("BarPositions")] public SBarPosition[] BarPos;
+ [XmlArray("BarPositions")]
+ public SBarPosition[] BarPos;
}
public class CSingNotes : CMenuElementBase, IMenuElement, IThemeable
@@ -75,12 +78,12 @@ namespace VocaluxeLib.Menu.SingNotes
///
/// first index = player number; second index = num players seen on screen
///
- private SRectF[,] _BarPos { get; set; }
+ private SRectF[,,] _BarPos { get; set; }
public CSingNotes(int partyModeID)
{
_PartyModeID = partyModeID;
- _Theme = new SThemeSingBar {BarPos = new SBarPosition[CHelper.Sum(CBase.Settings.GetMaxNumPlayer())]};
+ _Theme = new SThemeSingBar { BarPos = new SBarPosition[CHelper.Sum(CBase.Settings.GetMaxNumPlayer() * CBase.Settings.GetMaxNumScreens())] };
ThemeLoaded = false;
}
@@ -89,7 +92,7 @@ namespace VocaluxeLib.Menu.SingNotes
_PartyModeID = partyModeID;
_Theme = theme;
- _BarPos = new SRectF[CBase.Settings.GetMaxNumPlayer(),CBase.Settings.GetMaxNumPlayer()];
+ _BarPos = new SRectF[CBase.Settings.GetMaxNumScreens(), CBase.Settings.GetMaxNumPlayer(), CBase.Settings.GetMaxNumPlayer()];
ThemeLoaded = true;
}
@@ -119,21 +122,24 @@ namespace VocaluxeLib.Menu.SingNotes
ThemeLoaded &= xmlReader.GetValue(item + "/SkinPerfectNoteStar", out _Theme.SkinPerfectNoteStart, String.Empty);
int i = 0;
- _BarPos = new SRectF[CBase.Settings.GetMaxNumPlayer(),CBase.Settings.GetMaxNumPlayer()];
+ _BarPos = new SRectF[CBase.Settings.GetMaxNumScreens(), CBase.Settings.GetMaxNumPlayer(), CBase.Settings.GetMaxNumPlayer()];
for (int numplayer = 0; numplayer < CBase.Settings.GetMaxNumPlayer(); numplayer++)
{
- for (int player = 0; player <= numplayer; player++)
+ for (int screen = 0; screen < CBase.Settings.GetMaxNumScreens(); screen++)
{
- _BarPos[player, numplayer] = new SRectF();
- string target = "/BarPositions/P" + (player + 1) + "N" + (numplayer + 1);
- ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "X", ref _BarPos[player, numplayer].X);
- ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "Y", ref _BarPos[player, numplayer].Y);
- ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "Z", ref _BarPos[player, numplayer].Z);
- ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "W", ref _BarPos[player, numplayer].W);
- ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "H", ref _BarPos[player, numplayer].H);
- _Theme.BarPos[i].Name = "P" + (player + 1) + "N" + (numplayer + 1);
- _Theme.BarPos[i].Rect = _BarPos[player, numplayer];
- i++;
+ for (int player = 0; player <= numplayer; player++)
+ {
+ _BarPos[screen, player, numplayer] = new SRectF();
+ string target = "/BarPositions/S" + (screen + 1) + "P" + (player + 1) + "N" + (numplayer + 1);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "X", ref _BarPos[screen, player, numplayer].X);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "Y", ref _BarPos[screen, player, numplayer].Y);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "Z", ref _BarPos[screen, player, numplayer].Z);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "W", ref _BarPos[screen, player, numplayer].W);
+ ThemeLoaded &= xmlReader.TryGetFloatValue(item + target + "H", ref _BarPos[screen, player, numplayer].H);
+ _Theme.BarPos[i].Name = "S" + (screen + 1) + "P" + (player + 1) + "N" + (numplayer + 1);
+ _Theme.BarPos[i].Rect = _BarPos[screen, player, numplayer];
+ i++;
+ }
}
}
@@ -146,11 +152,45 @@ namespace VocaluxeLib.Menu.SingNotes
return ThemeLoaded;
}
- public void Init(int numPlayers)
+ public void Init(int numPlayers, int numScreens = 0)
{
+
PlayerNotes.Clear();
- for (int p = 0; p < numPlayers; p++)
- PlayerNotes.Add(new CNoteBars(_PartyModeID, p, _BarPos[p, numPlayers - 1], _Theme));
+ if (numPlayers > 0 && numScreens > 0)
+ {
+ int[] screenAssignment = new int[numPlayers];
+ int screenPlayers = numPlayers / numScreens;
+ int remainingPlayers = numPlayers - (screenPlayers * numScreens);
+ int player = 0;
+
+ for (int s = 0; s < numScreens; s++)
+ {
+ for (int p = 0; p < screenPlayers; p++)
+ {
+ if (remainingPlayers > 0)
+ {
+ PlayerNotes.Add(new CNoteBars(_PartyModeID, player++, _BarPos[s, p, screenPlayers], _Theme));
+ if (p == screenPlayers - 1)
+ {
+ PlayerNotes.Add(new CNoteBars(_PartyModeID, player++, _BarPos[s, p + 1, screenPlayers], _Theme));
+ remainingPlayers--;
+ }
+ }
+ else
+ {
+ PlayerNotes.Add(new CNoteBars(_PartyModeID, player++, _BarPos[s, p, screenPlayers - 1], _Theme));
+ }
+
+ }
+ //Handle when players < screens
+ if (screenPlayers == 0 && remainingPlayers > 0)
+ {
+ PlayerNotes.Add(new CNoteBars(_PartyModeID, player++, _BarPos[s, 0, 0], _Theme));
+ remainingPlayers--;
+ }
+ }
+ }
+
if (numPlayers == 0)
_Rect = new SRectF(0, 0, 0, 0, Rect.Z);
else
@@ -169,7 +209,7 @@ namespace VocaluxeLib.Menu.SingNotes
noteBars.Draw();
}
- public void UnloadSkin() {}
+ public void UnloadSkin() { }
public void LoadSkin()
{
@@ -181,10 +221,11 @@ namespace VocaluxeLib.Menu.SingNotes
Z = _Theme.BarPos.Select(bp => bp.Rect.Z).Average();
foreach (SBarPosition bp in _Theme.BarPos)
{
- int n = Int32.Parse(bp.Name.Substring(3, 1)) - 1;
- int p = Int32.Parse(bp.Name.Substring(1, 1)) - 1;
+ int p = Int32.Parse(bp.Name.Substring(3, 1)) - 1;
+ int s = Int32.Parse(bp.Name.Substring(1, 1)) - 1;
+ int n = Int32.Parse(bp.Name.Substring(5, 1)) - 1;
- _BarPos[p, n] = bp.Rect;
+ _BarPos[s, p, n] = bp.Rect;
}
}
@@ -200,9 +241,9 @@ namespace VocaluxeLib.Menu.SingNotes
}
#region ThemeEdit
- public void MoveElement(int stepX, int stepY) {}
+ public void MoveElement(int stepX, int stepY) { }
- public void ResizeElement(int stepW, int stepH) {}
+ public void ResizeElement(int stepW, int stepH) { }
#endregion ThemeEdit
}
}
\ No newline at end of file