Add Inital Multi-Monitor Support

Initial support for multimonitor setups.
Support for up to 6 monitors with 1-6 players on screen 1 and 0-6
players on screen 2-6.
Currently the max amount of players is unchanged and participating
players are spread across all available screens.

Screens are extended horizontally. For fullscreen use with multiple
physical monitors one will have to use some kind of
surround-configuration. (AMD Eyefinity/nVidia Surround/etc.)
This commit is contained in:
Jiiniasu committed 2016-12-18 18:51:51 +01:00
1 parent e888197cdc
commit bf5205b080
22 files changed
+7786 -291

No files matched your search

+68 -27
View File
@@ -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
/// <remarks>
/// first index = player number; second index = num players seen on screen
/// </remarks>
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
}
}