Merge remote-tracking branch 'upstream/release-0.1' into release-0.1
This commit is contained in:
commit
863ecb9b07
22 files changed
+1433
-573
No files matched your search
@@ -16,9 +16,7 @@
|
||||
=================================
|
||||
= 1. About =
|
||||
=================================
|
||||
Vocaluxe is a free and open source singing game. It allows up to three players (currently) to sing along with music using microphones in order to score points, depending on the pitch of the voice and the rhythm of singing.
|
||||
|
||||
Vocaluxe is an entirely new development in C#, inspired by the original UltraStar (developed by corvus5) and the great Ultrastar Deluxe project.
|
||||
Vocaluxe is a free and open source singing game, inspired by the original UltraStar (developed by corvus5) and the great Ultrastar Deluxe project - yet it is an entirely new development in C#. It allows up to three players (currently) to sing along with music using microphones in order to score points, depending on the pitch of the voice and the rhythm of singing. It features mouse and keyboard navigation, a multi-language interface, and singer profiles with avatars and supports songs in CP1250/52 and UTF8 encodings.
|
||||
|
||||
Supported Operating Systems / Requirements:
|
||||
- WinXP, Vista, Windows 7 with .NET 2.0
|
||||
@@ -28,9 +26,9 @@ Supported Operating Systems / Requirements:
|
||||
=================================
|
||||
= 2. Download =
|
||||
=================================
|
||||
You can donwloadn precompiles Windows binaries at SourceForge:
|
||||
You can download precompiled Windows binaries at SourceForge:
|
||||
|
||||
Download: http://sourceforge.net/projects/vocaluxe/
|
||||
http://sourceforge.net/projects/vocaluxe/
|
||||
|
||||
|
||||
=================================
|
||||
@@ -38,7 +36,7 @@ Download: http://sourceforge.net/projects/vocaluxe/
|
||||
=================================
|
||||
The development of Vocaluxe uses this git branching model:
|
||||
|
||||
http://nvie.com/posts/a-successful-git-branching-model/
|
||||
http://nvie.com/posts/a-successful-git-branching-model/
|
||||
|
||||
|
||||
=================================
|
||||
|
||||
@@ -191,7 +191,7 @@ namespace Vocaluxe.Base
|
||||
public static EPlaybackLib PlayBackLib = EPlaybackLib.PortAudio;
|
||||
public static ERecordLib RecordLib = ERecordLib.PortAudio;
|
||||
public static EBufferSize AudioBufferSize = EBufferSize.b2048;
|
||||
public static int AudioLatency = 125;
|
||||
public static int AudioLatency = 0;
|
||||
public static int BackgroundMusicVolume = 50;
|
||||
public static EOffOn BackgroundMusic = EOffOn.TR_CONFIG_ON;
|
||||
public static EBackgroundMusicSource BackgroundMusicSource = EBackgroundMusicSource.TR_CONFIG_NO_OWN_MUSIC;
|
||||
|
||||
+40
-17
@@ -29,6 +29,9 @@ namespace Vocaluxe.Base
|
||||
private static string _CoverFilePath;
|
||||
private static string _CreditsRessourcesFilePath;
|
||||
|
||||
private static SQLiteConnection _ConnectionCover = null;
|
||||
private static SQLiteTransaction _TransactionCover = null;
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
_HighscoreFilePath = Path.Combine(System.Environment.CurrentDirectory, CSettings.sFileHighscoreDB);
|
||||
@@ -959,18 +962,15 @@ namespace Vocaluxe.Base
|
||||
return false;
|
||||
}
|
||||
|
||||
SQLiteConnection connection = new SQLiteConnection();
|
||||
connection.ConnectionString = "Data Source=" + _CoverFilePath;
|
||||
if (_ConnectionCover == null)
|
||||
{
|
||||
_ConnectionCover = new SQLiteConnection();
|
||||
_ConnectionCover.ConnectionString = "Data Source=" + _CoverFilePath;
|
||||
_ConnectionCover.Open();
|
||||
}
|
||||
|
||||
SQLiteCommand command;
|
||||
try
|
||||
{
|
||||
connection.Open();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
command = new SQLiteCommand(connection);
|
||||
command = new SQLiteCommand(_ConnectionCover);
|
||||
|
||||
command.CommandText = "SELECT id, width, height FROM Cover WHERE [Path] = @path";
|
||||
command.Parameters.Add("@path", System.Data.DbType.String, 0).Value = CoverPath;
|
||||
@@ -1008,7 +1008,7 @@ namespace Vocaluxe.Base
|
||||
result = true;
|
||||
reader.Read();
|
||||
byte[] data = GetBytes(reader);
|
||||
tex = CDraw.AddTexture(w, h, ref data);
|
||||
tex = CDraw.QuequeTexture(w, h, ref data);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1016,6 +1016,11 @@ namespace Vocaluxe.Base
|
||||
if (reader != null)
|
||||
reader.Close();
|
||||
|
||||
if (_TransactionCover == null)
|
||||
{
|
||||
_TransactionCover = _ConnectionCover.BeginTransaction();
|
||||
}
|
||||
|
||||
Bitmap origin;
|
||||
try
|
||||
{
|
||||
@@ -1032,8 +1037,6 @@ namespace Vocaluxe.Base
|
||||
reader.Dispose();
|
||||
}
|
||||
command.Dispose();
|
||||
connection.Close();
|
||||
connection.Dispose();
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -1050,7 +1053,7 @@ namespace Vocaluxe.Base
|
||||
Graphics g = Graphics.FromImage(bmp);
|
||||
g.DrawImage(origin, new Rectangle(0, 0, w, h));
|
||||
g.Dispose();
|
||||
tex = CDraw.AddTexture(bmp);
|
||||
|
||||
byte[] data = new byte[w * h * 4];
|
||||
|
||||
BitmapData bmp_data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
||||
@@ -1058,6 +1061,8 @@ namespace Vocaluxe.Base
|
||||
bmp.UnlockBits(bmp_data);
|
||||
bmp.Dispose();
|
||||
|
||||
tex = CDraw.QuequeTexture(w, h, ref data);
|
||||
|
||||
command.CommandText = "INSERT INTO Cover (Path, width, height) " +
|
||||
"VALUES (@path, " + w.ToString() + ", " + h.ToString() + ")";
|
||||
command.Parameters.Add("@path", System.Data.DbType.String, 0).Value = CoverPath;
|
||||
@@ -1094,12 +1099,30 @@ namespace Vocaluxe.Base
|
||||
reader.Dispose();
|
||||
}
|
||||
command.Dispose();
|
||||
connection.Close();
|
||||
connection.Dispose();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void CommitCovers()
|
||||
{
|
||||
if (_TransactionCover != null)
|
||||
{
|
||||
_TransactionCover.Commit();
|
||||
_TransactionCover = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void CloseConnections()
|
||||
{
|
||||
CommitCovers();
|
||||
|
||||
if (_ConnectionCover != null)
|
||||
{
|
||||
_ConnectionCover.Close();
|
||||
_ConnectionCover = null;
|
||||
}
|
||||
}
|
||||
|
||||
private static bool InitCoverDB()
|
||||
{
|
||||
SQLiteConnection connection = new SQLiteConnection();
|
||||
|
||||
+53
-137
@@ -12,8 +12,6 @@ namespace Vocaluxe.Base
|
||||
{
|
||||
static class CDraw
|
||||
{
|
||||
private static Object mutex = new object();
|
||||
|
||||
private static IDraw _Draw = null;
|
||||
|
||||
public static void InitDraw()
|
||||
@@ -50,259 +48,177 @@ namespace Vocaluxe.Base
|
||||
|
||||
public static int GetScreenWidth()
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.GetScreenWidth();
|
||||
}
|
||||
return _Draw.GetScreenWidth();
|
||||
}
|
||||
|
||||
public static int GetScreenHeight()
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.GetScreenHeight();
|
||||
}
|
||||
return _Draw.GetScreenHeight();
|
||||
}
|
||||
|
||||
public static RectangleF GetTextBounds(CText text)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.GetTextBounds(text);
|
||||
}
|
||||
return _Draw.GetTextBounds(text);
|
||||
}
|
||||
|
||||
public static RectangleF GetTextBounds(CText text, float Height)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.GetTextBounds(text, Height);
|
||||
}
|
||||
return _Draw.GetTextBounds(text, Height);
|
||||
}
|
||||
|
||||
public static void DrawLine(int a, int r, int g, int b, int w, int x1, int y1, int x2, int y2)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawLine(a, r, g, b, w, x1, y1, x2, y2);
|
||||
}
|
||||
_Draw.DrawLine(a, r, g, b, w, x1, y1, x2, y2);
|
||||
}
|
||||
|
||||
public static void DrawRect(SColorF Color, SRectF Rect, float Thickness)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
if (Thickness <= 0f)
|
||||
return;
|
||||
if (Thickness <= 0f)
|
||||
return;
|
||||
|
||||
_Draw.DrawColor(Color, new SRectF(Rect.X - Thickness / 2, Rect.Y - Thickness / 2, Rect.W + Thickness, Thickness, Rect.Z));
|
||||
_Draw.DrawColor(Color, new SRectF(Rect.X - Thickness / 2, Rect.Y + Rect.H - Thickness / 2, Rect.W + Thickness, Thickness, Rect.Z));
|
||||
_Draw.DrawColor(Color, new SRectF(Rect.X - Thickness / 2, Rect.Y - Thickness / 2, Thickness, Rect.H + Thickness, Rect.Z));
|
||||
_Draw.DrawColor(Color, new SRectF(Rect.X + Rect.W - Thickness / 2, Rect.Y - Thickness / 2, Thickness, Rect.H + Thickness, Rect.Z));
|
||||
}
|
||||
_Draw.DrawColor(Color, new SRectF(Rect.X - Thickness / 2, Rect.Y - Thickness / 2, Rect.W + Thickness, Thickness, Rect.Z));
|
||||
_Draw.DrawColor(Color, new SRectF(Rect.X - Thickness / 2, Rect.Y + Rect.H - Thickness / 2, Rect.W + Thickness, Thickness, Rect.Z));
|
||||
_Draw.DrawColor(Color, new SRectF(Rect.X - Thickness / 2, Rect.Y - Thickness / 2, Thickness, Rect.H + Thickness, Rect.Z));
|
||||
_Draw.DrawColor(Color, new SRectF(Rect.X + Rect.W - Thickness / 2, Rect.Y - Thickness / 2, Thickness, Rect.H + Thickness, Rect.Z));
|
||||
}
|
||||
|
||||
public static void DrawColor(SColorF color, SRectF rect)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawColor(color, rect);
|
||||
}
|
||||
_Draw.DrawColor(color, rect);
|
||||
}
|
||||
|
||||
public static void ClearScreen()
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.ClearScreen();
|
||||
}
|
||||
_Draw.ClearScreen();
|
||||
}
|
||||
|
||||
public static STexture CopyScreen()
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.CopyScreen();
|
||||
}
|
||||
return _Draw.CopyScreen();
|
||||
}
|
||||
|
||||
public static void CopyScreen(ref STexture Texture)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.CopyScreen(ref Texture);
|
||||
}
|
||||
_Draw.CopyScreen(ref Texture);
|
||||
}
|
||||
|
||||
public static void MakeScreenShot()
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.MakeScreenShot();
|
||||
}
|
||||
_Draw.MakeScreenShot();
|
||||
}
|
||||
|
||||
// Draw Basic Text (must be deleted later)
|
||||
public static void DrawText(string Text, int x, int y, int h)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawText(Text, x, y, h);
|
||||
}
|
||||
_Draw.DrawText(Text, x, y, h);
|
||||
}
|
||||
|
||||
public static STexture AddTexture(Bitmap Bitmap)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.AddTexture(Bitmap);
|
||||
}
|
||||
return _Draw.AddTexture(Bitmap);
|
||||
}
|
||||
|
||||
public static STexture AddTexture(string TexturePath)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.AddTexture(TexturePath);
|
||||
}
|
||||
return _Draw.AddTexture(TexturePath);
|
||||
}
|
||||
|
||||
public static STexture AddTexture(string TexturePath, int MaxSize)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
if (MaxSize == 0)
|
||||
return _Draw.AddTexture(TexturePath);
|
||||
if (MaxSize == 0)
|
||||
return _Draw.AddTexture(TexturePath);
|
||||
|
||||
if (!System.IO.File.Exists(TexturePath))
|
||||
return new STexture(-1);
|
||||
if (!System.IO.File.Exists(TexturePath))
|
||||
return new STexture(-1);
|
||||
|
||||
Bitmap origin = new Bitmap(TexturePath);
|
||||
int w = MaxSize;
|
||||
int h = MaxSize;
|
||||
Bitmap origin = new Bitmap(TexturePath);
|
||||
int w = MaxSize;
|
||||
int h = MaxSize;
|
||||
|
||||
if (origin.Width >= origin.Height && origin.Width > w)
|
||||
h = (int)Math.Round((float)w / origin.Width * origin.Height);
|
||||
else if (origin.Height > origin.Width && origin.Height > h)
|
||||
w = (int)Math.Round((float)h / origin.Height * origin.Width);
|
||||
if (origin.Width >= origin.Height && origin.Width > w)
|
||||
h = (int)Math.Round((float)w / origin.Width * origin.Height);
|
||||
else if (origin.Height > origin.Width && origin.Height > h)
|
||||
w = (int)Math.Round((float)h / origin.Height * origin.Width);
|
||||
|
||||
Bitmap bmp = new Bitmap(origin, w, h);
|
||||
STexture tex = _Draw.AddTexture(bmp);
|
||||
bmp.Dispose();
|
||||
return tex;
|
||||
}
|
||||
Bitmap bmp = new Bitmap(origin, w, h);
|
||||
STexture tex = _Draw.AddTexture(bmp);
|
||||
bmp.Dispose();
|
||||
return tex;
|
||||
}
|
||||
|
||||
public static STexture AddTexture(int W, int H, IntPtr Data)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.AddTexture(W, H, Data);
|
||||
}
|
||||
return _Draw.AddTexture(W, H, Data);
|
||||
}
|
||||
|
||||
public static STexture AddTexture(int W, int H, ref byte[] Data)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.AddTexture(W, H, ref Data);
|
||||
}
|
||||
return _Draw.AddTexture(W, H, ref Data);
|
||||
}
|
||||
|
||||
public static STexture QuequeTexture(int W, int H, ref byte[] Data)
|
||||
{
|
||||
return _Draw.QuequeTexture(W, H, ref Data);
|
||||
}
|
||||
|
||||
public static bool UpdateTexture(ref STexture Texture, ref byte[] Data)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.UpdateTexture(ref Texture, ref Data);
|
||||
}
|
||||
return _Draw.UpdateTexture(ref Texture, ref Data);
|
||||
}
|
||||
|
||||
public static bool UpdateTexture(ref STexture Texture, IntPtr Data)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.UpdateTexture(ref Texture, Data);
|
||||
}
|
||||
return _Draw.UpdateTexture(ref Texture, Data);
|
||||
}
|
||||
|
||||
public static void RemoveTexture(ref STexture Texture)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.RemoveTexture(ref Texture);
|
||||
}
|
||||
_Draw.RemoveTexture(ref Texture);
|
||||
}
|
||||
|
||||
public static void DrawTexture(STexture Texture)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawTexture(Texture);
|
||||
}
|
||||
_Draw.DrawTexture(Texture);
|
||||
}
|
||||
|
||||
public static void DrawTexture(STexture Texture, SRectF rect)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawTexture(Texture, rect);
|
||||
}
|
||||
_Draw.DrawTexture(Texture, rect);
|
||||
}
|
||||
|
||||
public static void DrawTexture(STexture Texture, SRectF rect, SColorF color)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawTexture(Texture, rect, color);
|
||||
}
|
||||
_Draw.DrawTexture(Texture, rect, color);
|
||||
}
|
||||
|
||||
public static void DrawTexture(STexture Texture, SRectF rect, SColorF color, SRectF bounds)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawTexture(Texture, rect, color, bounds);
|
||||
}
|
||||
_Draw.DrawTexture(Texture, rect, color, bounds);
|
||||
}
|
||||
|
||||
public static void DrawTexture(STexture Texture, SRectF rect, SColorF color,bool mirrored)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawTexture(Texture, rect, color, mirrored);
|
||||
}
|
||||
_Draw.DrawTexture(Texture, rect, color, mirrored);
|
||||
}
|
||||
|
||||
public static void DrawTexture(STexture Texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawTexture(Texture, rect, color, bounds, mirrored);
|
||||
}
|
||||
_Draw.DrawTexture(Texture, rect, color, bounds, mirrored);
|
||||
}
|
||||
|
||||
public static void DrawTexture(STexture Texture, SRectF rect, SColorF color, float begin, float end)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawTexture(Texture, rect, color, begin, end);
|
||||
}
|
||||
_Draw.DrawTexture(Texture, rect, color, begin, end);
|
||||
}
|
||||
|
||||
public static void DrawTextureReflection(STexture Texture, SRectF rect, SColorF color, SRectF bounds, float space, float height)
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
_Draw.DrawTextureReflection(Texture, rect, color, bounds, space, height);
|
||||
}
|
||||
_Draw.DrawTextureReflection(Texture, rect, color, bounds, space, height);
|
||||
}
|
||||
|
||||
public static int TextureCount()
|
||||
{
|
||||
lock (mutex)
|
||||
{
|
||||
return _Draw.TextureCount();
|
||||
}
|
||||
return _Draw.TextureCount();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+15
-3
@@ -12,6 +12,7 @@ using System.Xml;
|
||||
using System.Xml.XPath;
|
||||
|
||||
using Vocaluxe.Lib.Draw;
|
||||
using Vocaluxe.Menu;
|
||||
|
||||
namespace Vocaluxe.Base
|
||||
{
|
||||
@@ -32,7 +33,7 @@ namespace Vocaluxe.Base
|
||||
|
||||
class CGlyph
|
||||
{
|
||||
public readonly float SIZEh = 100f;
|
||||
public readonly float SIZEh = 50f;
|
||||
public STexture Texture;
|
||||
public char Chr;
|
||||
public int width;
|
||||
@@ -133,7 +134,7 @@ namespace Vocaluxe.Base
|
||||
sizeB = TextRenderer.MeasureText(g, chr.ToString(), fo, new Size(int.MaxValue, int.MaxValue), flags);
|
||||
//size = g.MeasureString(chr.ToString(), fo);
|
||||
float h_style = sizeB.Height;
|
||||
|
||||
g.Dispose();
|
||||
return h_normal / h_style;
|
||||
}
|
||||
}
|
||||
@@ -551,7 +552,18 @@ namespace Vocaluxe.Base
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static RectangleF GetTextBounds(CText text)
|
||||
{
|
||||
return GetTextBounds(text, text.Height);
|
||||
}
|
||||
|
||||
public static RectangleF GetTextBounds(CText text, float height)
|
||||
{
|
||||
Height = height;
|
||||
return new RectangleF(text.X, text.Y, GetTextWidth(CLanguage.Translate(text.Text)), GetTextHeight(CLanguage.Translate(text.Text)));
|
||||
}
|
||||
|
||||
public static float GetTextWidth(string text)
|
||||
{
|
||||
float dx = 0;
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace Vocaluxe.Base
|
||||
public const int iVersionSub = 0; // steps
|
||||
public const ERevision VersionRevision = ERevision.Beta;
|
||||
|
||||
public const int iBuild = 54; // Increase on every published version! Never Reset!
|
||||
public const int iBuild = 55; // Increase on every published version! Never Reset!
|
||||
|
||||
public const int iDatabaseHighscoreVersion = 1;
|
||||
public const int iDatabaseCoverVersion = 1;
|
||||
|
||||
+40
-18
@@ -826,11 +826,32 @@ namespace Vocaluxe.Base
|
||||
CLog.StopBenchmark(2, "Sort Songs");
|
||||
Category = -1;
|
||||
_SongsLoaded = true;
|
||||
|
||||
if (CConfig.Renderer != ERenderer.TR_CONFIG_SOFTWARE && CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_ATSTART)
|
||||
{
|
||||
CLog.StartBenchmark(2, "Load Cover");
|
||||
for (int i = 0; i < _Songs.Count; i++)
|
||||
{
|
||||
CSong song = _Songs[i];
|
||||
|
||||
song.ReadNotes();
|
||||
STexture texture = song.CoverTextureSmall;
|
||||
song.CoverTextureBig = texture;
|
||||
_CoverLoadIndex++;
|
||||
}
|
||||
|
||||
_CoverLoaded = true;
|
||||
CDataBase.CommitCovers();
|
||||
CLog.StopBenchmark(2, "Load Cover");
|
||||
}
|
||||
CLog.StopBenchmark(1, "Load Songs ");
|
||||
}
|
||||
|
||||
public static void LoadCover(long WaitTime)
|
||||
public static void LoadCover(long WaitTime, int NumLoads)
|
||||
{
|
||||
if (CConfig.Renderer != ERenderer.TR_CONFIG_SOFTWARE)
|
||||
return; //should be removed as soon as the other renderer are ready for queque
|
||||
|
||||
if (!SongsLoaded)
|
||||
return;
|
||||
|
||||
@@ -846,25 +867,26 @@ namespace Vocaluxe.Base
|
||||
STexture texture = new STexture(-1);
|
||||
if (_CoverLoadTimer.ElapsedMilliseconds >= WaitTime)
|
||||
{
|
||||
CSong song = new CSong();
|
||||
int i = GetNextSongWithoutCover(ref song);
|
||||
|
||||
if (i < 0)
|
||||
return;
|
||||
|
||||
song.ReadNotes();
|
||||
if (song.CoverFileName != String.Empty)
|
||||
for (int i = 0; i < NumLoads; i++)
|
||||
{
|
||||
if (!CDataBase.GetCover(Path.Combine(song.Folder, song.CoverFileName), ref texture, CConfig.CoverSize))
|
||||
texture = CCover.NoCover;
|
||||
}
|
||||
else
|
||||
texture = CCover.NoCover;
|
||||
SetCoverSmall(i, texture);
|
||||
SetCoverBig(i, texture);
|
||||
CSong song = new CSong();
|
||||
int n = GetNextSongWithoutCover(ref song);
|
||||
|
||||
_CoverLoadTimer.Reset();
|
||||
_CoverLoadTimer.Start();
|
||||
if (n < 0)
|
||||
return;
|
||||
|
||||
song.ReadNotes();
|
||||
texture = song.CoverTextureSmall;
|
||||
|
||||
SetCoverSmall(n, texture);
|
||||
SetCoverBig(n, texture);
|
||||
|
||||
if (CoverLoaded)
|
||||
CDataBase.CommitCovers();
|
||||
|
||||
_CoverLoadTimer.Reset();
|
||||
_CoverLoadTimer.Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -501,7 +501,7 @@ namespace Vocaluxe.Base
|
||||
long ticks = _Timer.ElapsedTicks;
|
||||
float dt = _Timer.ElapsedMilliseconds / 1000f;
|
||||
|
||||
if (Stopwatch.IsHighResolution)
|
||||
if (Stopwatch.IsHighResolution && ticks != 0)
|
||||
dt = (float)(ticks * nanosecPerTick / 1000000000.0);
|
||||
|
||||
return _SetValue + dt;
|
||||
@@ -581,7 +581,7 @@ namespace Vocaluxe.Base
|
||||
long ticks = _STimer.ElapsedTicks;
|
||||
float dt = _STimer.ElapsedMilliseconds / 1000f;
|
||||
|
||||
if (Stopwatch.IsHighResolution)
|
||||
if (Stopwatch.IsHighResolution && ticks != 0)
|
||||
dt = (float)(ticks * nanosecPerTick / 1000000000.0);
|
||||
|
||||
return _CurrentTime + dt;
|
||||
@@ -617,7 +617,7 @@ namespace Vocaluxe.Base
|
||||
long ticks = _STimer.ElapsedTicks;
|
||||
float dt = _STimer.ElapsedMilliseconds / 1000f;
|
||||
|
||||
if (Stopwatch.IsHighResolution)
|
||||
if (Stopwatch.IsHighResolution && ticks != 0)
|
||||
dt = (float)(ticks * nanosecPerTick / 1000000000.0);
|
||||
|
||||
float Ts = 0f;
|
||||
|
||||
@@ -147,8 +147,9 @@ namespace Vocaluxe.Base
|
||||
{
|
||||
if (_Stopwatch.IsRunning)
|
||||
{
|
||||
if (Stopwatch.IsHighResolution)
|
||||
return (float)(((double)nanosecPerTick * (double)_Stopwatch.ElapsedTicks) / (1000.0 * 1000.0));
|
||||
long ticks = _Stopwatch.ElapsedTicks;
|
||||
if (Stopwatch.IsHighResolution && ticks != 0)
|
||||
return (float)(((double)nanosecPerTick * (double)ticks) / (1000.0 * 1000.0));
|
||||
else
|
||||
return (float)_Stopwatch.ElapsedMilliseconds;
|
||||
}
|
||||
|
||||
+594
-168
File diff suppressed because it is too large.
Load diff
@@ -256,7 +256,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
CFonts.Height = Height;
|
||||
CFonts.SetFont(text.Fon);
|
||||
CFonts.Style = text.Style;
|
||||
return new RectangleF(text.X, text.Y, CFonts.GetTextWidth(CLanguage.Translate(text.Text)), CFonts.GetTextHeight(text.Text));
|
||||
return new RectangleF(text.X, text.Y, CFonts.GetTextWidth(CLanguage.Translate(text.Text)), CFonts.GetTextHeight(CLanguage.Translate(text.Text)));
|
||||
}
|
||||
|
||||
public void ClearScreen()
|
||||
@@ -400,6 +400,11 @@ namespace Vocaluxe.Lib.Draw
|
||||
return new STexture(-1);
|
||||
}
|
||||
|
||||
public STexture QuequeTexture(int W, int H, ref byte[] Data)
|
||||
{
|
||||
return AddTexture(W, H, ref Data);
|
||||
}
|
||||
|
||||
public STexture AddTexture(int W, int H, ref byte[] Data)
|
||||
{
|
||||
Bitmap bmp = new Bitmap(W, H);
|
||||
|
||||
+201
-54
@@ -18,14 +18,21 @@ using Vocaluxe.Menu;
|
||||
|
||||
namespace Vocaluxe.Lib.Draw
|
||||
{
|
||||
public struct SClientRect
|
||||
struct SClientRect
|
||||
{
|
||||
public Point location;
|
||||
public int width;
|
||||
public int height;
|
||||
};
|
||||
|
||||
|
||||
struct STextureQueque
|
||||
{
|
||||
public int ID;
|
||||
public int width;
|
||||
public int height;
|
||||
public byte[] data;
|
||||
}
|
||||
|
||||
class COpenGL : Form, IDraw
|
||||
{
|
||||
#region private vars
|
||||
@@ -40,6 +47,10 @@ namespace Vocaluxe.Lib.Draw
|
||||
private bool _fullscreen = false;
|
||||
|
||||
private List<STexture> _Textures;
|
||||
private Queue<int> _IDs;
|
||||
private List<STextureQueque> _Queque;
|
||||
|
||||
private Object MutexTexture = new Object();
|
||||
|
||||
private int h = 1;
|
||||
private int w = 1;
|
||||
@@ -55,6 +66,13 @@ namespace Vocaluxe.Lib.Draw
|
||||
this.Icon = new System.Drawing.Icon(Path.Combine(System.Environment.CurrentDirectory, CSettings.sIcon));
|
||||
|
||||
_Textures = new List<STexture>();
|
||||
_Queque = new List<STextureQueque>();
|
||||
_IDs = new Queue<int>(1000000);
|
||||
|
||||
for (int i = 1; i < 1000000; i++)
|
||||
{
|
||||
_IDs.Enqueue(i);
|
||||
}
|
||||
|
||||
//Check AA Mode
|
||||
CConfig.AAMode = (EAntiAliasingModes)CheckAntiAliasingMode((int)CConfig.AAMode);
|
||||
@@ -440,12 +458,15 @@ namespace Vocaluxe.Lib.Draw
|
||||
ClearScreen();
|
||||
|
||||
_Run = _Run && CGraphics.Draw();
|
||||
|
||||
_Run = CGraphics.UpdateGameLogic(_Keys, _Mouse);
|
||||
control.SwapBuffers();
|
||||
|
||||
if ((CSettings.bFullScreen && !_fullscreen) || (!CSettings.bFullScreen && _fullscreen))
|
||||
ToggleFullScreen();
|
||||
|
||||
CheckQueque();
|
||||
|
||||
if (CTime.IsRunning())
|
||||
delay = (int)Math.Floor(CConfig.CalcCycleTime() - CTime.GetMilliseconds());
|
||||
|
||||
@@ -490,7 +511,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
CFonts.Height = Height;
|
||||
CFonts.SetFont(text.Fon);
|
||||
CFonts.Style = text.Style;
|
||||
return new RectangleF(text.X, text.Y, CFonts.GetTextWidth(CLanguage.Translate(text.Text)), CFonts.GetTextHeight(text.Text));
|
||||
return new RectangleF(text.X, text.Y, CFonts.GetTextWidth(CLanguage.Translate(text.Text)), CFonts.GetTextHeight(CLanguage.Translate(text.Text)));
|
||||
}
|
||||
|
||||
#region Basic Draw Methods
|
||||
@@ -505,7 +526,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
int id = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, id);
|
||||
texture.index = id;
|
||||
texture.ID = id;
|
||||
|
||||
texture.width = w;
|
||||
texture.height = h;
|
||||
@@ -529,21 +550,26 @@ namespace Vocaluxe.Lib.Draw
|
||||
// Add to Texture List
|
||||
texture.color = new SColorF(1f, 1f, 1f, 1f);
|
||||
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
|
||||
_Textures.Add(texture);
|
||||
|
||||
lock (MutexTexture)
|
||||
{
|
||||
texture.index = _IDs.Dequeue();
|
||||
_Textures.Add(texture);
|
||||
}
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
public void CopyScreen(ref STexture Texture)
|
||||
{
|
||||
if (!_TextureExists(Texture) || (Texture.width != GetScreenWidth()) || (Texture.height != GetScreenHeight()))
|
||||
if (!_TextureExists(ref Texture) || (Texture.width != GetScreenWidth()) || (Texture.height != GetScreenHeight()))
|
||||
{
|
||||
RemoveTexture(ref Texture);
|
||||
Texture = CopyScreen();
|
||||
}
|
||||
else
|
||||
{
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
|
||||
|
||||
GL.CopyTexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, 0, 0,
|
||||
(int)Texture.width, (int)Texture.height);
|
||||
@@ -643,10 +669,6 @@ namespace Vocaluxe.Lib.Draw
|
||||
if (bmp.Height == 0 || bmp.Width == 0)
|
||||
return texture;
|
||||
|
||||
int id = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, id);
|
||||
texture.index = id;
|
||||
|
||||
int MaxSize;
|
||||
switch (CConfig.TextureQuality)
|
||||
{
|
||||
@@ -685,6 +707,10 @@ namespace Vocaluxe.Lib.Draw
|
||||
h = MaxSize;
|
||||
}
|
||||
|
||||
int id = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, id);
|
||||
texture.ID = id;
|
||||
|
||||
texture.width = w;
|
||||
texture.height = h;
|
||||
|
||||
@@ -696,7 +722,8 @@ namespace Vocaluxe.Lib.Draw
|
||||
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
|
||||
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
||||
g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height));
|
||||
|
||||
g.Dispose();
|
||||
|
||||
texture.width_ratio = 1f;
|
||||
texture.height_ratio = 1f;
|
||||
|
||||
@@ -727,7 +754,12 @@ namespace Vocaluxe.Lib.Draw
|
||||
texture.color = new SColorF(1f, 1f, 1f, 1f);
|
||||
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
|
||||
texture.TexturePath = String.Empty;
|
||||
_Textures.Add(texture);
|
||||
|
||||
lock (MutexTexture)
|
||||
{
|
||||
texture.index = _IDs.Dequeue();
|
||||
_Textures.Add(texture);
|
||||
}
|
||||
|
||||
return texture;
|
||||
}
|
||||
@@ -753,7 +785,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
int id = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, id);
|
||||
texture.index = id;
|
||||
texture.ID = id;
|
||||
|
||||
texture.width = W;
|
||||
texture.height = H;
|
||||
@@ -786,8 +818,13 @@ namespace Vocaluxe.Lib.Draw
|
||||
texture.color = new SColorF(1f, 1f, 1f, 1f);
|
||||
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
|
||||
texture.TexturePath = String.Empty;
|
||||
_Textures.Add(texture);
|
||||
|
||||
lock (MutexTexture)
|
||||
{
|
||||
texture.index = _IDs.Dequeue();
|
||||
_Textures.Add(texture);
|
||||
}
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
@@ -813,7 +850,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
int id = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, id);
|
||||
texture.index = id;
|
||||
texture.ID = id;
|
||||
|
||||
texture.width = W;
|
||||
texture.height = H;
|
||||
@@ -846,14 +883,39 @@ namespace Vocaluxe.Lib.Draw
|
||||
texture.color = new SColorF(1f, 1f, 1f, 1f);
|
||||
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
|
||||
texture.TexturePath = String.Empty;
|
||||
_Textures.Add(texture);
|
||||
|
||||
lock (MutexTexture)
|
||||
{
|
||||
texture.index = _IDs.Dequeue();
|
||||
_Textures.Add(texture);
|
||||
}
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
public STexture QuequeTexture(int W, int H, ref byte[] Data)
|
||||
{
|
||||
STexture texture = new STexture(-1);
|
||||
STextureQueque queque = new STextureQueque();
|
||||
|
||||
queque.data = Data;
|
||||
queque.height = H;
|
||||
queque.width = W;
|
||||
|
||||
lock (MutexTexture)
|
||||
{
|
||||
texture.index = _IDs.Dequeue();
|
||||
queque.ID = texture.index;
|
||||
_Queque.Add(queque);
|
||||
_Textures.Add(texture);
|
||||
}
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
public bool UpdateTexture(ref STexture Texture, IntPtr Data)
|
||||
{
|
||||
if (_TextureExists(Texture))
|
||||
if (_TextureExists(ref Texture))
|
||||
{
|
||||
if (_UsePBO)
|
||||
{
|
||||
@@ -869,7 +931,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer);
|
||||
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
|
||||
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
|
||||
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
|
||||
|
||||
@@ -884,7 +946,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
}
|
||||
}
|
||||
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
|
||||
|
||||
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
|
||||
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, Data);
|
||||
@@ -908,7 +970,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
public bool UpdateTexture(ref STexture Texture, ref byte[] Data)
|
||||
{
|
||||
if (_TextureExists(Texture))
|
||||
if (_TextureExists(ref Texture))
|
||||
{
|
||||
if (_UsePBO)
|
||||
{
|
||||
@@ -921,7 +983,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer);
|
||||
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
|
||||
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
|
||||
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
|
||||
|
||||
@@ -937,7 +999,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
}
|
||||
}
|
||||
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
|
||||
|
||||
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
|
||||
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, Data);
|
||||
@@ -963,30 +1025,41 @@ namespace Vocaluxe.Lib.Draw
|
||||
{
|
||||
if ((Texture.index > 0) && (_Textures.Count > 0))
|
||||
{
|
||||
for (int i = 0; i < _Textures.Count; i++)
|
||||
{
|
||||
if (_Textures[i].index == Texture.index)
|
||||
lock (MutexTexture)
|
||||
{
|
||||
for (int i = 0; i < _Textures.Count; i++)
|
||||
{
|
||||
GL.DeleteTexture(Texture.index);
|
||||
if (Texture.PBO > 0)
|
||||
GL.DeleteBuffers(1, ref Texture.PBO);
|
||||
_Textures.RemoveAt(i);
|
||||
Texture.index = -1;
|
||||
break;
|
||||
if (_Textures[i].index == Texture.index)
|
||||
{
|
||||
_IDs.Enqueue(Texture.index);
|
||||
|
||||
GL.DeleteTexture(Texture.ID);
|
||||
if (Texture.PBO > 0)
|
||||
GL.DeleteBuffers(1, ref Texture.PBO);
|
||||
_Textures.RemoveAt(i);
|
||||
Texture.index = -1;
|
||||
Texture.ID = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool _TextureExists(STexture Texture)
|
||||
private bool _TextureExists(ref STexture Texture)
|
||||
{
|
||||
if ((Texture.index > 0) && (_Textures.Count > 0))
|
||||
lock (MutexTexture)
|
||||
{
|
||||
for (int i = 0; i < _Textures.Count; i++)
|
||||
{
|
||||
if (_Textures[i].index == Texture.index)
|
||||
if (Texture.index == _Textures[i].index)
|
||||
{
|
||||
return true;
|
||||
if (_Textures[i].ID > 0)
|
||||
{
|
||||
Texture = _Textures[i];
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1029,10 +1102,10 @@ namespace Vocaluxe.Lib.Draw
|
||||
if (bounds.Y > rect.Y + rect.H || bounds.Y + bounds.H < rect.Y)
|
||||
return;
|
||||
|
||||
if (_TextureExists(Texture))
|
||||
if (_TextureExists(ref Texture))
|
||||
{
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
|
||||
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
|
||||
|
||||
float x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
|
||||
float x2 = (bounds.X + bounds.W - rect.X) / rect.W * Texture.width_ratio;
|
||||
float y1 = (bounds.Y - rect.Y) / rect.H * Texture.height_ratio;
|
||||
@@ -1073,21 +1146,21 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
GL.MatrixMode(MatrixMode.Texture);
|
||||
GL.PushMatrix();
|
||||
|
||||
|
||||
if (rect.Rotation != 0f)
|
||||
{
|
||||
GL.Translate(0.5f, 0.5f, 0);
|
||||
GL.Rotate(-rect.Rotation, 0f, 0f, 1f);
|
||||
GL.Translate(-0.5f, -0.5f, 0);
|
||||
GL.Translate(-0.5f, -0.5f, 0);
|
||||
}
|
||||
|
||||
|
||||
if (!mirrored)
|
||||
{
|
||||
GL.Begin(BeginMode.Quads);
|
||||
|
||||
GL.TexCoord2(x1, y1);
|
||||
GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset);
|
||||
|
||||
|
||||
GL.TexCoord2(x1, y2);
|
||||
GL.Vertex3(rx1, ry2, rect.Z + CGraphics.ZOffset);
|
||||
|
||||
@@ -1119,7 +1192,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
}
|
||||
|
||||
GL.PopMatrix();
|
||||
|
||||
|
||||
GL.Disable(EnableCap.Blend);
|
||||
GL.BindTexture(TextureTarget.Texture2D, 0);
|
||||
}
|
||||
@@ -1127,14 +1200,14 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
public void DrawTexture(STexture Texture, SRectF rect, SColorF color, float begin, float end)
|
||||
{
|
||||
if (_TextureExists(Texture))
|
||||
if (_TextureExists(ref Texture))
|
||||
{
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
|
||||
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
|
||||
|
||||
GL.Enable(EnableCap.Blend);
|
||||
GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha);
|
||||
|
||||
|
||||
|
||||
GL.Begin(BeginMode.Quads);
|
||||
|
||||
GL.TexCoord2(0f + begin * Texture.width_ratio, 0f);
|
||||
@@ -1150,7 +1223,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
GL.Vertex3(rect.X + end * rect.W, rect.Y, rect.Z + CGraphics.ZOffset);
|
||||
|
||||
GL.End();
|
||||
|
||||
|
||||
|
||||
GL.Disable(EnableCap.Blend);
|
||||
GL.BindTexture(TextureTarget.Texture2D, 0);
|
||||
@@ -1171,9 +1244,9 @@ namespace Vocaluxe.Lib.Draw
|
||||
if (height > bounds.H)
|
||||
height = bounds.H;
|
||||
|
||||
if (_TextureExists(Texture))
|
||||
if (_TextureExists(ref Texture))
|
||||
{
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
|
||||
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
|
||||
|
||||
float x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
|
||||
float x2 = (bounds.X + bounds.W - rect.X) / rect.W * Texture.width_ratio;
|
||||
@@ -1211,7 +1284,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
ry2 = bounds.Y + bounds.H + space + height;
|
||||
|
||||
GL.Enable(EnableCap.Blend);
|
||||
|
||||
|
||||
GL.MatrixMode(MatrixMode.Texture);
|
||||
GL.PushMatrix();
|
||||
|
||||
@@ -1222,7 +1295,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
GL.Translate(-0.5f, -0.5f, 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
GL.Begin(BeginMode.Quads);
|
||||
|
||||
GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha);
|
||||
@@ -1242,7 +1315,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset);
|
||||
|
||||
GL.End();
|
||||
|
||||
|
||||
|
||||
GL.PopMatrix();
|
||||
|
||||
@@ -1255,6 +1328,80 @@ namespace Vocaluxe.Lib.Draw
|
||||
{
|
||||
return _Textures.Count;
|
||||
}
|
||||
|
||||
private void CheckQueque()
|
||||
{
|
||||
lock (MutexTexture)
|
||||
{
|
||||
if (_Queque.Count == 0)
|
||||
return;
|
||||
|
||||
STextureQueque q = _Queque[0];
|
||||
STexture texture = new STexture(-1);
|
||||
int index = -1;
|
||||
for (int i = 0; i < _Textures.Count; i++)
|
||||
{
|
||||
if (_Textures[i].index == q.ID)
|
||||
{
|
||||
texture = _Textures[i];
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (texture.index < 1)
|
||||
return;
|
||||
|
||||
if (_UsePBO)
|
||||
{
|
||||
try
|
||||
{
|
||||
GL.GenBuffers(1, out texture.PBO);
|
||||
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, texture.PBO);
|
||||
GL.BufferData(BufferTarget.PixelUnpackBuffer, (IntPtr)q.data.Length, IntPtr.Zero, BufferUsageHint.StreamDraw);
|
||||
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//throw;
|
||||
_UsePBO = false;
|
||||
}
|
||||
}
|
||||
|
||||
int id = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, id);
|
||||
texture.ID = id;
|
||||
|
||||
texture.width = q.width;
|
||||
texture.height = q.height;
|
||||
texture.w2 = (float)MathHelper.NextPowerOfTwo(texture.width);
|
||||
texture.h2 = (float)MathHelper.NextPowerOfTwo(texture.height);
|
||||
|
||||
texture.width_ratio = texture.width / texture.w2;
|
||||
texture.height_ratio = texture.height / texture.h2;
|
||||
|
||||
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)texture.w2, (int)texture.h2, 0,
|
||||
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
|
||||
|
||||
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, q.width, q.height,
|
||||
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, q.data);
|
||||
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
|
||||
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
|
||||
|
||||
GL.BindTexture(TextureTarget.Texture2D, 0);
|
||||
|
||||
// Add to Texture List
|
||||
texture.color = new SColorF(1f, 1f, 1f, 1f);
|
||||
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
|
||||
texture.TexturePath = String.Empty;
|
||||
|
||||
_Textures[index] = texture;
|
||||
q.data = null;
|
||||
_Queque.RemoveAt(0);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Textures
|
||||
|
||||
#endregion implementation
|
||||
|
||||
@@ -67,6 +67,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
{
|
||||
public int index;
|
||||
public int PBO;
|
||||
public int ID;
|
||||
|
||||
public string TexturePath;
|
||||
|
||||
@@ -85,10 +86,11 @@ namespace Vocaluxe.Lib.Draw
|
||||
{
|
||||
index = Index;
|
||||
PBO = 0;
|
||||
ID = -1;
|
||||
TexturePath = String.Empty;
|
||||
|
||||
width = 0f;
|
||||
height = 0f;
|
||||
width = 1f;
|
||||
height = 1f;
|
||||
rect = new SRectF(0f, 0f, 1f, 1f, 0f);
|
||||
|
||||
w2 = 2f;
|
||||
@@ -136,6 +138,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
STexture AddTexture(Bitmap Bitmap);
|
||||
STexture AddTexture(int W, int H, IntPtr Data);
|
||||
STexture AddTexture(int W, int H, ref byte[] Data);
|
||||
STexture QuequeTexture(int W, int H, ref byte[] Data);
|
||||
bool UpdateTexture(ref STexture Texture, ref byte[] Data);
|
||||
bool UpdateTexture(ref STexture Texture, IntPtr Data);
|
||||
|
||||
|
||||
+36
-30
@@ -245,6 +245,8 @@ namespace Vocaluxe.Lib.Song
|
||||
private int _EndBeat;
|
||||
private bool _PerfectLine; // for drawing perfect line effect
|
||||
|
||||
private int _MinBeat = int.MaxValue;
|
||||
private int _MaxBeat = int.MinValue;
|
||||
private List<CNote> _Notes;
|
||||
|
||||
#region Constructors
|
||||
@@ -263,14 +265,7 @@ namespace Vocaluxe.Lib.Song
|
||||
get { return _StartBeat; }
|
||||
set
|
||||
{
|
||||
int min = int.MaxValue;
|
||||
foreach (CNote note in _Notes)
|
||||
{
|
||||
if (note.StartBeat < min)
|
||||
min = note.StartBeat;
|
||||
}
|
||||
|
||||
if (value <= min)
|
||||
if (value <= _MinBeat)
|
||||
_StartBeat = value;
|
||||
}
|
||||
}
|
||||
@@ -280,14 +275,7 @@ namespace Vocaluxe.Lib.Song
|
||||
get { return _EndBeat; }
|
||||
set
|
||||
{
|
||||
int max = int.MinValue;
|
||||
foreach (CNote note in _Notes)
|
||||
{
|
||||
if (note.EndBeat > max)
|
||||
max = note.EndBeat;
|
||||
}
|
||||
|
||||
if (value >= max)
|
||||
if (value >= _MaxBeat)
|
||||
_EndBeat = value;
|
||||
}
|
||||
}
|
||||
@@ -302,13 +290,7 @@ namespace Vocaluxe.Lib.Song
|
||||
{
|
||||
get
|
||||
{
|
||||
int Result = int.MaxValue;
|
||||
foreach (CNote note in _Notes)
|
||||
{
|
||||
if (note.StartBeat < Result)
|
||||
Result = note.StartBeat;
|
||||
}
|
||||
return Result;
|
||||
return _MinBeat;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -316,13 +298,7 @@ namespace Vocaluxe.Lib.Song
|
||||
{
|
||||
get
|
||||
{
|
||||
int Result = int.MinValue;
|
||||
foreach (CNote note in _Notes)
|
||||
{
|
||||
if (note.EndBeat > Result)
|
||||
Result = note.EndBeat;
|
||||
}
|
||||
return Result;
|
||||
return _MaxBeat;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -429,6 +405,7 @@ namespace Vocaluxe.Lib.Song
|
||||
public void AddNote(CNote Note)
|
||||
{
|
||||
_Notes.Add(Note);
|
||||
updateMinMaxBeat(Note);
|
||||
}
|
||||
|
||||
public bool InsertNote(CNote Note, int Index)
|
||||
@@ -436,6 +413,7 @@ namespace Vocaluxe.Lib.Song
|
||||
if (_Notes.Count >= Index)
|
||||
{
|
||||
_Notes.Insert(Index, Note);
|
||||
updateMinMaxBeat(Note);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -446,6 +424,7 @@ namespace Vocaluxe.Lib.Song
|
||||
if (_Notes.Count > Index)
|
||||
{
|
||||
_Notes.RemoveAt(Index);
|
||||
updateMinMaxBeat();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -457,6 +436,7 @@ namespace Vocaluxe.Lib.Song
|
||||
{
|
||||
_Notes.RemoveAt(Index);
|
||||
_Notes.Insert(Index, Note);
|
||||
updateMinMaxBeat();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -467,6 +447,7 @@ namespace Vocaluxe.Lib.Song
|
||||
if (_Notes.Count > 0)
|
||||
{
|
||||
_Notes[_Notes.Count - 1].Duration++;
|
||||
updateMinMaxBeat();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -474,6 +455,31 @@ namespace Vocaluxe.Lib.Song
|
||||
public void DeleteAllNotes()
|
||||
{
|
||||
_Notes.Clear();
|
||||
_MinBeat = int.MaxValue;
|
||||
_MaxBeat = int.MinValue;
|
||||
}
|
||||
|
||||
private void updateMinMaxBeat(CNote Note)
|
||||
{
|
||||
if (Note.StartBeat < _MinBeat)
|
||||
{
|
||||
_MinBeat = Note.StartBeat;
|
||||
}
|
||||
|
||||
if (Note.EndBeat > _MaxBeat)
|
||||
{
|
||||
_MaxBeat = Note.EndBeat;
|
||||
}
|
||||
}
|
||||
|
||||
private void updateMinMaxBeat()
|
||||
{
|
||||
_MinBeat = int.MaxValue;
|
||||
_MaxBeat = int.MinValue;
|
||||
foreach (CNote note in _Notes)
|
||||
{
|
||||
updateMinMaxBeat(note);
|
||||
}
|
||||
}
|
||||
#endregion Methods
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace Vocaluxe.Lib.Song
|
||||
class CSong
|
||||
{
|
||||
private bool _CoverLoaded = false;
|
||||
private bool _NotesLoaded = false;
|
||||
private STexture _CoverTextureSmall = new STexture(-1);
|
||||
private STexture _CoverTextureBig = new STexture(-1);
|
||||
|
||||
@@ -54,7 +55,9 @@ namespace Vocaluxe.Lib.Song
|
||||
{
|
||||
if (!_CoverLoaded)
|
||||
{
|
||||
this.ReadNotes();
|
||||
if (!_NotesLoaded)
|
||||
this.ReadNotes();
|
||||
|
||||
if (this.CoverFileName != String.Empty)
|
||||
{
|
||||
if (!CDataBase.GetCover(Path.Combine(this.Folder, this.CoverFileName), ref _CoverTextureSmall, CConfig.CoverSize))
|
||||
@@ -466,6 +469,7 @@ namespace Vocaluxe.Lib.Song
|
||||
CLog.LogError("Error loading song. Line No.: " + FileLineNo.ToString() + ". An unhandled exception occured (" + e.Message + "): " + FilePath);
|
||||
return false;
|
||||
}
|
||||
_NotesLoaded = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -249,12 +249,9 @@ namespace Vocaluxe.Menu
|
||||
|
||||
for (int i = 0; i < Screens.Length; i++)
|
||||
{
|
||||
if (Enum.GetNames(typeof(EScreens))[i] != Enum.GetName(typeof(EScreens), (int)EScreens.ScreenCredits))
|
||||
{
|
||||
CLog.StartBenchmark(1, "Load Theme " + Enum.GetNames(typeof(EScreens))[i]);
|
||||
Screens[i].LoadTheme();
|
||||
CLog.StopBenchmark(1, "Load Theme " + Enum.GetNames(typeof(EScreens))[i]);
|
||||
}
|
||||
CLog.StartBenchmark(1, "Load Theme " + Enum.GetNames(typeof(EScreens))[i]);
|
||||
Screens[i].LoadTheme();
|
||||
CLog.StopBenchmark(1, "Load Theme " + Enum.GetNames(typeof(EScreens))[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -263,10 +260,7 @@ namespace Vocaluxe.Menu
|
||||
ReloadCursor();
|
||||
for (int i = 0; i < Screens.Length; i++)
|
||||
{
|
||||
if (Enum.GetNames(typeof(EScreens))[i] != Enum.GetName(typeof(EScreens), (int)EScreens.ScreenCredits))
|
||||
{
|
||||
Screens[i].ReloadTheme();
|
||||
}
|
||||
Screens[i].ReloadTheme();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -275,10 +269,7 @@ namespace Vocaluxe.Menu
|
||||
ReloadCursor();
|
||||
for (int i = 0; i < Screens.Length; i++)
|
||||
{
|
||||
if (Enum.GetNames(typeof(EScreens))[i] != Enum.GetName(typeof(EScreens), (int)EScreens.ScreenCredits))
|
||||
{
|
||||
Screens[i].ReloadTextures();
|
||||
}
|
||||
Screens[i].ReloadTextures();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -287,10 +278,7 @@ namespace Vocaluxe.Menu
|
||||
CTheme.SaveTheme();
|
||||
for (int i = 0; i < Screens.Length; i++)
|
||||
{
|
||||
if (Enum.GetNames(typeof(EScreens))[i] != Enum.GetName(typeof(EScreens), (int)EScreens.ScreenCredits))
|
||||
{
|
||||
Screens[i].SaveTheme();
|
||||
}
|
||||
Screens[i].SaveTheme();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -317,7 +305,7 @@ namespace Vocaluxe.Menu
|
||||
CBackgroundMusic.Update();
|
||||
|
||||
if (CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_DYNAMIC && ActualScreen != EScreens.ScreenSing)
|
||||
CSongs.LoadCover(30L);
|
||||
CSongs.LoadCover(30L, 1);
|
||||
|
||||
if (CSettings.GameState != EGameState.EditTheme)
|
||||
{
|
||||
|
||||
+246
-61
@@ -14,27 +14,164 @@ namespace Vocaluxe.Menu
|
||||
{
|
||||
public string Name;
|
||||
|
||||
public string Text;
|
||||
public string ColorName;
|
||||
public string SColorName; //for Buttons
|
||||
}
|
||||
|
||||
struct STextPosition
|
||||
{
|
||||
public float X;
|
||||
public float Y;
|
||||
public float tH;
|
||||
public float Width;
|
||||
public float Height;
|
||||
|
||||
public STextPosition(int dummy)
|
||||
{
|
||||
X = 0f;
|
||||
Y = 0f;
|
||||
tH = 0f;
|
||||
Width = 0f;
|
||||
Height = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
class CText : IMenuElement
|
||||
{
|
||||
private SThemeText _Theme;
|
||||
private bool _ThemeLoaded;
|
||||
private bool _ButtonText;
|
||||
private bool _PositionNeedsUpdate = true;
|
||||
|
||||
public float X; //left
|
||||
public float Y; //higher
|
||||
public float Z;
|
||||
public float Height;
|
||||
public float MaxWidth;
|
||||
public SRectF Bounds;
|
||||
private STextPosition _DrawPosition = new STextPosition(0);
|
||||
|
||||
public EAlignment Align;
|
||||
public EStyle Style;
|
||||
public string Fon;
|
||||
|
||||
private float _X = 0f;
|
||||
public float X //left
|
||||
{
|
||||
get { return _X; }
|
||||
set
|
||||
{
|
||||
if (_X != value)
|
||||
{
|
||||
_X = value;
|
||||
_PositionNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float _Y = 0f;
|
||||
public float Y //higher
|
||||
{
|
||||
get { return _Y; }
|
||||
set
|
||||
{
|
||||
if (_Y != value)
|
||||
{
|
||||
_Y = value;
|
||||
_PositionNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float _Z = 0f;
|
||||
public float Z
|
||||
{
|
||||
get { return _Z; }
|
||||
set
|
||||
{
|
||||
if (_Z != value)
|
||||
{
|
||||
_Z = value;
|
||||
_PositionNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float _Height = 0f;
|
||||
public float Height
|
||||
{
|
||||
get { return _Height; }
|
||||
set
|
||||
{
|
||||
if (_Height != value)
|
||||
{
|
||||
_Height = value;
|
||||
_PositionNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float _MaxWidth = 0f;
|
||||
public float MaxWidth
|
||||
{
|
||||
get { return _MaxWidth; }
|
||||
set
|
||||
{
|
||||
if (_MaxWidth != value)
|
||||
{
|
||||
_MaxWidth = value;
|
||||
_PositionNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private SRectF _Bounds = new SRectF();
|
||||
public SRectF Bounds
|
||||
{
|
||||
get { return _Bounds; }
|
||||
set
|
||||
{
|
||||
if (_Bounds.X != value.X || _Bounds.Y != value.Y || _Bounds.W != value.W || _Bounds.H != value.H || _Bounds.Z != value.Z)
|
||||
{
|
||||
_Bounds = value;
|
||||
_PositionNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private EAlignment _Align = EAlignment.Left;
|
||||
public EAlignment Align
|
||||
{
|
||||
get { return _Align; }
|
||||
set
|
||||
{
|
||||
if (_Align != value)
|
||||
{
|
||||
_Align = value;
|
||||
_PositionNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private EStyle _Style = EStyle.Normal;
|
||||
public EStyle Style
|
||||
{
|
||||
get { return _Style; }
|
||||
set
|
||||
{
|
||||
if (_Style != value)
|
||||
{
|
||||
_Style = value;
|
||||
_PositionNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string _Fon = String.Empty;
|
||||
public string Fon
|
||||
{
|
||||
get { return _Fon; }
|
||||
set
|
||||
{
|
||||
if (_Fon != value)
|
||||
{
|
||||
_Fon = value;
|
||||
_PositionNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public SColorF Color; //normal Color
|
||||
public SColorF SColor; //selected Color for Buttons
|
||||
|
||||
@@ -42,7 +179,22 @@ namespace Vocaluxe.Menu
|
||||
public float ReflectionSpace;
|
||||
public float ReflectionHeight;
|
||||
|
||||
public string Text;
|
||||
private string _Text = String.Empty;
|
||||
public string Text
|
||||
{
|
||||
get { return _Theme.Text; }
|
||||
set
|
||||
{
|
||||
string translation = CLanguage.Translate(value);
|
||||
if (_Theme.Text != value || translation != _Text)
|
||||
{
|
||||
_Theme.Text = value;
|
||||
_Text = translation;
|
||||
_PositionNeedsUpdate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool Selected;
|
||||
public bool Visible = true;
|
||||
|
||||
@@ -94,7 +246,7 @@ namespace Vocaluxe.Menu
|
||||
Color = new SColorF(r, g, b, a);
|
||||
SColor = new SColorF(r, g, b, a);
|
||||
|
||||
text = Text;
|
||||
Text = text;
|
||||
|
||||
Selected = false;
|
||||
|
||||
@@ -130,7 +282,7 @@ namespace Vocaluxe.Menu
|
||||
Color = new SColorF(r, g, b, a);
|
||||
SColor = new SColorF(r, g, b, a);
|
||||
|
||||
text = Text;
|
||||
Text = text;
|
||||
|
||||
Selected = false;
|
||||
|
||||
@@ -226,14 +378,14 @@ namespace Vocaluxe.Menu
|
||||
string item = XmlPath + "/" + ElementName;
|
||||
_ThemeLoaded = true;
|
||||
|
||||
_ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/X", navigator, ref X);
|
||||
_ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Y", navigator, ref Y);
|
||||
_ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/X", navigator, ref _X);
|
||||
_ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Y", navigator, ref _Y);
|
||||
|
||||
if (!ButtonText)
|
||||
_ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Z", navigator, ref Z);
|
||||
_ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Z", navigator, ref _Z);
|
||||
|
||||
_ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/H", navigator, ref Height);
|
||||
CHelper.TryGetFloatValueFromXML(item + "/MaxW", navigator, ref MaxWidth);
|
||||
_ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/H", navigator, ref _Height);
|
||||
CHelper.TryGetFloatValueFromXML(item + "/MaxW", navigator, ref _MaxWidth);
|
||||
|
||||
if (CHelper.GetValueFromXML(item + "/Color", navigator, ref _Theme.ColorName, String.Empty))
|
||||
{
|
||||
@@ -261,11 +413,11 @@ namespace Vocaluxe.Menu
|
||||
}
|
||||
}
|
||||
|
||||
_ThemeLoaded &= CHelper.TryGetEnumValueFromXML<EAlignment>(item + "/Align", navigator, ref Align);
|
||||
_ThemeLoaded &= CHelper.TryGetEnumValueFromXML<EStyle>(item + "/Style", navigator, ref Style);
|
||||
_ThemeLoaded &= CHelper.GetValueFromXML(item + "/Font", navigator, ref Fon, "Normal");
|
||||
_ThemeLoaded &= CHelper.TryGetEnumValueFromXML<EAlignment>(item + "/Align", navigator, ref _Align);
|
||||
_ThemeLoaded &= CHelper.TryGetEnumValueFromXML<EStyle>(item + "/Style", navigator, ref _Style);
|
||||
_ThemeLoaded &= CHelper.GetValueFromXML(item + "/Font", navigator, ref _Fon, "Normal");
|
||||
|
||||
_ThemeLoaded &= CHelper.GetValueFromXML(item + "/Text", navigator, ref Text, String.Empty);
|
||||
_ThemeLoaded &= CHelper.GetValueFromXML(item + "/Text", navigator, ref _Theme.Text, String.Empty);
|
||||
|
||||
if (CHelper.ItemExistsInXML(item + "/Reflection", navigator) && !ButtonText)
|
||||
{
|
||||
@@ -276,6 +428,17 @@ namespace Vocaluxe.Menu
|
||||
else
|
||||
Reflection = false;
|
||||
|
||||
// Set values
|
||||
X = _X;
|
||||
Y = _Y;
|
||||
Z = _Z;
|
||||
Height = _Height;
|
||||
MaxWidth = _MaxWidth;
|
||||
Text = _Theme.Text;
|
||||
Fon = _Fon;
|
||||
Align = _Align;
|
||||
Style = _Style;
|
||||
|
||||
if (_ThemeLoaded)
|
||||
{
|
||||
_Theme.Name = ElementName;
|
||||
@@ -352,8 +515,8 @@ namespace Vocaluxe.Menu
|
||||
writer.WriteElementString("Font", Fon);
|
||||
|
||||
writer.WriteComment("<Text>: Text or translation tag");
|
||||
if (CLanguage.TranslationExists(Text))
|
||||
writer.WriteElementString("Text", Text);
|
||||
if (CLanguage.TranslationExists(_Theme.Text))
|
||||
writer.WriteElementString("Text", _Theme.Text);
|
||||
else
|
||||
writer.WriteElementString("Text", string.Empty);
|
||||
|
||||
@@ -394,29 +557,14 @@ namespace Vocaluxe.Menu
|
||||
if (!ForceDraw && !Visible && CSettings.GameState != EGameState.EditTheme)
|
||||
return;
|
||||
|
||||
float h = Height;
|
||||
float y = Y;
|
||||
RectangleF bounds = CDraw.GetTextBounds(this);
|
||||
// Update Text
|
||||
Text = Text;
|
||||
|
||||
while (bounds.Width > Bounds.W)
|
||||
{
|
||||
h -= 0.2f;
|
||||
y += 0.1f;
|
||||
bounds = CDraw.GetTextBounds(this, h);
|
||||
}
|
||||
if (_PositionNeedsUpdate)
|
||||
UpdateTextPosition();
|
||||
|
||||
float x = X;
|
||||
switch (Align)
|
||||
{
|
||||
case EAlignment.Center:
|
||||
x = X - bounds.Width / 2;
|
||||
break;
|
||||
case EAlignment.Right:
|
||||
x = X - bounds.Width;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
CFonts.SetFont(Fon);
|
||||
CFonts.Style = Style;
|
||||
|
||||
SColorF CurrentColor = new SColorF(Color);
|
||||
if (Selected)
|
||||
@@ -424,22 +572,21 @@ namespace Vocaluxe.Menu
|
||||
|
||||
SColorF color = new SColorF(CurrentColor.R, CurrentColor.G, CurrentColor.B, CurrentColor.A * Alpha);
|
||||
|
||||
CFonts.SetFont(Fon);
|
||||
CFonts.Style = Style;
|
||||
CFonts.DrawText(CLanguage.Translate(Text), h, x, y, Z, color);
|
||||
|
||||
CFonts.DrawText(_Text, _DrawPosition.tH, _DrawPosition.X, _DrawPosition.Y, Z, color);
|
||||
|
||||
if (Reflection)
|
||||
{
|
||||
CFonts.DrawTextReflection(CLanguage.Translate(Text), h, x, y, Z, color, ReflectionSpace, ReflectionHeight);
|
||||
CFonts.DrawTextReflection(_Text, _DrawPosition.tH, _DrawPosition.X, _DrawPosition.Y, Z, color, ReflectionSpace, ReflectionHeight);
|
||||
}
|
||||
|
||||
if (Selected && (CSettings.GameState == EGameState.EditTheme))
|
||||
{
|
||||
CDraw.DrawColor(new SColorF(0.5f, 1f, 0.5f, 0.5f * CGraphics.GlobalAlpha), new SRectF(x, y, bounds.Width, bounds.Height, Z));
|
||||
CDraw.DrawColor(
|
||||
new SColorF(0.5f, 1f, 0.5f, 0.5f * CGraphics.GlobalAlpha),
|
||||
new SRectF(_DrawPosition.X, _DrawPosition.Y, _DrawPosition.Width, _DrawPosition.Height, Z)
|
||||
);
|
||||
}
|
||||
|
||||
CFonts.SetFont("Normal");
|
||||
CFonts.Style = EStyle.Normal;
|
||||
}
|
||||
|
||||
public void Draw(float begin, float end)
|
||||
@@ -478,9 +625,6 @@ namespace Vocaluxe.Menu
|
||||
{
|
||||
CDraw.DrawColor(new SColorF(0.5f, 1f, 0.5f, 0.5f), new SRectF(x, Y, bounds.Width, bounds.Height, Z));
|
||||
}
|
||||
|
||||
CFonts.SetFont("Normal");
|
||||
CFonts.Style = EStyle.Normal;
|
||||
}
|
||||
|
||||
public void DrawRelative(float x, float y)
|
||||
@@ -495,6 +639,9 @@ namespace Vocaluxe.Menu
|
||||
|
||||
public void DrawRelative(float rx, float ry, bool reflection, float reflectionSpace, float reflectionHeight, float rectHeight)
|
||||
{
|
||||
// Update Text
|
||||
Text = Text;
|
||||
|
||||
float h = Height;
|
||||
|
||||
float x = X + rx;
|
||||
@@ -529,22 +676,19 @@ namespace Vocaluxe.Menu
|
||||
|
||||
CFonts.SetFont(Fon);
|
||||
CFonts.Style = Style;
|
||||
CFonts.DrawText(CLanguage.Translate(Text), h, x, y, Z, color);
|
||||
CFonts.DrawText(_Text, h, x, y, Z, color);
|
||||
|
||||
if (reflection)
|
||||
{
|
||||
float space = (rectHeight - Y - bounds.Height) * 2f + reflectionSpace;
|
||||
float height = reflectionHeight - (rectHeight - Y) + bounds.Height;
|
||||
CFonts.DrawTextReflection(CLanguage.Translate(Text), h, x, y, Z, color, space, height);
|
||||
CFonts.DrawTextReflection(_Text, h, x, y, Z, color, space, height);
|
||||
}
|
||||
|
||||
if (Selected && (CSettings.GameState == EGameState.EditTheme))
|
||||
{
|
||||
CDraw.DrawColor(new SColorF(0.5f, 1f, 0.5f, 0.5f * CGraphics.GlobalAlpha), new SRectF(x, y, bounds.Width, bounds.Height, Z));
|
||||
}
|
||||
|
||||
CFonts.SetFont("Normal");
|
||||
CFonts.Style = EStyle.Normal;
|
||||
}
|
||||
|
||||
public void UnloadTextures()
|
||||
@@ -580,5 +724,46 @@ namespace Vocaluxe.Menu
|
||||
Height = 1;
|
||||
}
|
||||
#endregion ThemeEdit
|
||||
|
||||
private void UpdateTextPosition()
|
||||
{
|
||||
if (_Text == String.Empty)
|
||||
return;
|
||||
|
||||
CFonts.SetFont(Fon);
|
||||
CFonts.Style = Style;
|
||||
|
||||
float h = Height;
|
||||
float y = Y;
|
||||
RectangleF bounds = CFonts.GetTextBounds(this);
|
||||
|
||||
while (bounds.Width > Bounds.W)
|
||||
{
|
||||
h -= 0.2f;
|
||||
y += 0.1f;
|
||||
bounds = CFonts.GetTextBounds(this, h);
|
||||
}
|
||||
|
||||
float x = X;
|
||||
switch (Align)
|
||||
{
|
||||
case EAlignment.Center:
|
||||
x = X - bounds.Width / 2;
|
||||
break;
|
||||
case EAlignment.Right:
|
||||
x = X - bounds.Width;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
_DrawPosition.X = x;
|
||||
_DrawPosition.Y = y;
|
||||
_DrawPosition.tH = h;
|
||||
_DrawPosition.Width = bounds.Width;
|
||||
_DrawPosition.Height = bounds.Height;
|
||||
|
||||
_PositionNeedsUpdate = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -152,6 +152,7 @@ namespace Vocaluxe
|
||||
CVideo.VdCloseAll();
|
||||
CDraw.Unload();
|
||||
CLog.CloseAll();
|
||||
CDataBase.CloseConnections();
|
||||
}
|
||||
|
||||
static Assembly AssemblyResolver(Object sender, ResolveEventArgs args)
|
||||
|
||||
@@ -33,7 +33,6 @@ namespace Vocaluxe.Screens
|
||||
// Version number for theme files. Increment it, if you've changed something on the theme files!
|
||||
const int ScreenVersion = 1;
|
||||
|
||||
|
||||
private CStatic logo;
|
||||
private CParticleEffect starsRed;
|
||||
private CParticleEffect starsBlue;
|
||||
@@ -45,6 +44,18 @@ namespace Vocaluxe.Screens
|
||||
|
||||
private List<string[]> paragraphs;
|
||||
private List<CText> paragraphTexts;
|
||||
|
||||
private STexture _TexLogo;
|
||||
private STexture _TexPerfectNoteStar;
|
||||
|
||||
private STexture _TexNameBrunzel;
|
||||
private STexture _TexNameDarkice;
|
||||
private STexture _TexNameFlokuep;
|
||||
private STexture _TexNameMesand;
|
||||
private STexture _TexNameBohning;
|
||||
private STexture _TexNameBabene03;
|
||||
private STexture _TexNamePantero;
|
||||
private STexture _TexNamePinky007;
|
||||
|
||||
public CScreenCredits()
|
||||
{
|
||||
@@ -65,23 +76,113 @@ namespace Vocaluxe.Screens
|
||||
//Text for last part of credits.
|
||||
paragraphTexts = new List<CText>();
|
||||
paragraphs = new List<string[]>();
|
||||
string paragraph = "Inspired by the achievements of UltraStar Deluxe and its variants and pursuing the goal of making a good thing even better, we ended up rewriting the game from scratch. And a new implementation in a new programming language called for a new name - and VOCALUXE it is!";
|
||||
string[] words = paragraph.Split(new Char[] { ' ' });
|
||||
paragraphs.Add(words);
|
||||
|
||||
paragraph = "This first public version has already implemented many of the original features and it is fully compatible with all the song files in your existing song collection. The code design allows a much faster implementation of new features, thus the roadmap for the next few stable releases is packed and we expect much shorter release cycles than ever before. And, of course, our and your ideas may be the features of tomorrow.";
|
||||
string paragraph;
|
||||
string[] words;
|
||||
|
||||
paragraph = "Inspired by the achievements of UltraStar Deluxe and its variants and pursuing the goal of making " +
|
||||
"a good thing even better, we ended up rewriting the game from scratch. And a new implementation in a new " +
|
||||
"programming language called for a new name - and VOCALUXE [ˈvoʊˈkəˈlʌks] it is!";
|
||||
words = paragraph.Split(new Char[] { ' ' });
|
||||
paragraphs.Add(words);
|
||||
|
||||
paragraph = "We appreciate the feedback in the beta release phase and are, of course, always open for bug reports, suggestions for improve- ments and ideas for new features. We would also like to thank the translators who make Vocaluxe an international experience from the very beginning. Last, but most definitely not least, we thank all those diligent song makers out there - there's a song for everyone!";
|
||||
paragraph = "This first public version has already implemented many of the original features and it is fully " +
|
||||
"compatible with all the song files in your existing song collection. The code design allows a much faster " +
|
||||
"implementation of new features, thus the roadmap for the next few stable releases is packed and we expect much " +
|
||||
"shorter release cycles than ever before. And, of course, our and your ideas may be the features of tomorrow.";
|
||||
words = paragraph.Split(new Char[] { ' ' });
|
||||
paragraphs.Add(words);
|
||||
|
||||
paragraph = "Go ahead and grab your mics, crank up your stereo, warm up your voice and get ready to sing to the best of your abilities!";
|
||||
paragraph = "We appreciate the feedback in the beta release phase and are, of course, always open for bug reports, " +
|
||||
"suggestions for improvements and ideas for new features. We would also like to thank the translators who make " +
|
||||
"Vocaluxe an international experience from the very beginning and all those diligent song makers out there - " +
|
||||
"there's something for everyone in the huge collection of available songs! Last but not least, thanks to " +
|
||||
"Kosal Sen's Philly Sans type used in the Vocaluxe Logo.";
|
||||
words = paragraph.Split(new Char[] { ' ' });
|
||||
paragraphs.Add(words);
|
||||
|
||||
paragraph = "Go ahead and grab your mics, crank up your stereo, warm up your voice and get ready to sing to the best " +
|
||||
"of your abilities!";
|
||||
words = paragraph.Split(new Char[] { ' ' });
|
||||
paragraphs.Add(words);
|
||||
}
|
||||
|
||||
public override void LoadTheme()
|
||||
{
|
||||
//Vocaluxe-Logo
|
||||
CDataBase.GetCreditsRessource("Logo_voc.png", ref _TexLogo);
|
||||
|
||||
//Little stars for logo
|
||||
CDataBase.GetCreditsRessource("PerfectNoteStar.png", ref _TexPerfectNoteStar);
|
||||
|
||||
//brunzel
|
||||
CDataBase.GetCreditsRessource("brunzel.png", ref _TexNameBrunzel);
|
||||
|
||||
//Darkice
|
||||
CDataBase.GetCreditsRessource("Darkice.png", ref _TexNameDarkice);
|
||||
|
||||
//flokuep
|
||||
CDataBase.GetCreditsRessource("flokuep.png", ref _TexNameFlokuep);
|
||||
|
||||
//bohning
|
||||
CDataBase.GetCreditsRessource("bohning.png", ref _TexNameBohning);
|
||||
|
||||
//mesand
|
||||
CDataBase.GetCreditsRessource("mesand.png", ref _TexNameMesand);
|
||||
|
||||
//babene03
|
||||
CDataBase.GetCreditsRessource("babene03.png", ref _TexNameBabene03);
|
||||
|
||||
//pantero
|
||||
CDataBase.GetCreditsRessource("pantero.png", ref _TexNamePantero);
|
||||
|
||||
//Pinky007
|
||||
CDataBase.GetCreditsRessource("Pinky007.png", ref _TexNamePinky007);
|
||||
|
||||
//Prepare Text
|
||||
int lastY = 280;
|
||||
for (int i = 0; i < paragraphs.Count; i++)
|
||||
{
|
||||
string line = "";
|
||||
for (int e = 0; e < paragraphs[i].Length; e++)
|
||||
{
|
||||
if (paragraphs[i][e] != null)
|
||||
{
|
||||
string newline = line + " " + paragraphs[i][e];
|
||||
CText text = new CText(75, lastY, -2, 30, -1, EAlignment.Left, EStyle.Bold, "Outline", new SColorF(1, 1, 1, 1), line);
|
||||
if (CDraw.GetTextBounds(text).Width < (CSettings.iRenderW - 220))
|
||||
{
|
||||
line = line + " " + paragraphs[i][e];
|
||||
|
||||
//Check if all words are used
|
||||
if ((e + 1) == paragraphs[i].Length)
|
||||
{
|
||||
text.Text = line;
|
||||
paragraphTexts.Add(text);
|
||||
line = "";
|
||||
lastY += 40;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
paragraphTexts.Add(text);
|
||||
line = " " + paragraphs[i][e];
|
||||
lastY += 27;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public override void ReloadTheme() {}
|
||||
|
||||
public override void SaveTheme() {}
|
||||
|
||||
public override void UnloadTextures() {}
|
||||
|
||||
public override void ReloadTextures() {}
|
||||
|
||||
public override bool HandleInput(KeyEvent KeyEvent)
|
||||
{
|
||||
if (KeyEvent.KeyPressed && !Char.IsControl(KeyEvent.Unicode))
|
||||
@@ -136,100 +237,88 @@ namespace Vocaluxe.Screens
|
||||
|
||||
public override void OnShow()
|
||||
{
|
||||
STexture tex = new STexture();
|
||||
STexture particleTex = new STexture();
|
||||
base.OnShow();
|
||||
|
||||
//Vocaluxe-Logo
|
||||
CDataBase.GetCreditsRessource("Logo_voc.png", ref tex);
|
||||
logo = new CStatic(tex, new SColorF(1, 1, 1, 1), new SRectF((CSettings.iRenderW - tex.width)/2, -270 , tex.width, tex.height, -2));
|
||||
|
||||
logo = new CStatic(_TexLogo, new SColorF(1, 1, 1, 1), new SRectF((CSettings.iRenderW - _TexLogo.width) / 2, -270, _TexLogo.width, _TexLogo.height, -2));
|
||||
|
||||
//Little stars for logo
|
||||
CDataBase.GetCreditsRessource("PerfectNoteStar.png", ref particleTex);
|
||||
int numstars = (int)(logo.Rect.W * 0.25f /2f);
|
||||
starsRed = new CParticleEffect(numstars, new SColorF(1, 0, 0, 1), new SRectF(logo.Rect.X, logo.Rect.Y, logo.Rect.W, logo.Rect.H, -1), particleTex, 35, EParticeType.Star);
|
||||
starsBlue = new CParticleEffect(numstars, new SColorF(0.149f, 0.415f, 0.819f, 1), new SRectF(logo.Rect.X, logo.Rect.Y, logo.Rect.W, logo.Rect.H, -1), particleTex, 35, EParticeType.Star);
|
||||
int numstars = (int)(logo.Rect.W * 0.25f / 2f);
|
||||
starsRed = new CParticleEffect(numstars, new SColorF(1, 0, 0, 1), new SRectF(logo.Rect.X, logo.Rect.Y, logo.Rect.W, logo.Rect.H, -1), _TexPerfectNoteStar, 35, EParticeType.Star);
|
||||
starsBlue = new CParticleEffect(numstars, new SColorF(0.149f, 0.415f, 0.819f, 1), new SRectF(logo.Rect.X, logo.Rect.Y, logo.Rect.W, logo.Rect.H, -1), _TexPerfectNoteStar, 35, EParticeType.Star);
|
||||
|
||||
//Credit names
|
||||
_CreditNames = new List<CCreditName>();
|
||||
|
||||
CCreditName CreditEntry = new CCreditName();
|
||||
|
||||
//brunzel
|
||||
CDataBase.GetCreditsRessource("brunzel.png", ref tex);
|
||||
CCreditName CreditEntryBrunzel = new CCreditName();
|
||||
CreditEntryBrunzel.image = new CStatic(tex, new SColorF(1,1,1,1), new SRectF(-450, 580, 400, 120, -4));
|
||||
CreditEntryBrunzel.image = new CStatic(_TexNameBrunzel, new SColorF(1, 1, 1, 1), new SRectF(-450, 580, 400, 120, -4));
|
||||
CreditEntryBrunzel.particleRect = new SRectF(CreditEntryBrunzel.image.Rect.X + 342, CreditEntryBrunzel.image.Rect.Y + 4, 30, 30, -5);
|
||||
CreditEntryBrunzel.particle = new CParticleEffect(8, new SColorF(1, 0, 0, 1), CreditEntryBrunzel.particleRect, particleTex, 35, EParticeType.Star);
|
||||
CreditEntryBrunzel.particle = new CParticleEffect(8, new SColorF(1, 0, 0, 1), CreditEntryBrunzel.particleRect, _TexPerfectNoteStar, 35, EParticeType.Star);
|
||||
CreditEntryBrunzel.active = true;
|
||||
CreditEntryBrunzel.direction = EDirection.Left;
|
||||
_CreditNames.Add(CreditEntryBrunzel);
|
||||
|
||||
//Darkice
|
||||
CDataBase.GetCreditsRessource("Darkice.png", ref tex);
|
||||
CCreditName CreditEntryDarkice = new CCreditName();
|
||||
CreditEntryDarkice.image = new CStatic(tex, new SColorF(1, 1, 1, 1), new SRectF(CSettings.iRenderW, 580, 400, 120, -4));
|
||||
CreditEntryDarkice.image = new CStatic(_TexNameDarkice, new SColorF(1, 1, 1, 1), new SRectF(CSettings.iRenderW, 580, 400, 120, -4));
|
||||
CreditEntryDarkice.particleRect = new SRectF(CreditEntryDarkice.image.Rect.X + 242, CreditEntryDarkice.image.Rect.Y + 23, 30, 30, -5);
|
||||
CreditEntryDarkice.particle = new CParticleEffect(8, new SColorF(0.149f, 0.415f ,0.819f, 1), CreditEntryDarkice.particleRect, particleTex, 35, EParticeType.Star);
|
||||
CreditEntryDarkice.particle = new CParticleEffect(8, new SColorF(0.149f, 0.415f, 0.819f, 1), CreditEntryDarkice.particleRect, _TexPerfectNoteStar, 35, EParticeType.Star);
|
||||
CreditEntryDarkice.active = true;
|
||||
CreditEntryDarkice.direction = EDirection.Right;
|
||||
_CreditNames.Add(CreditEntryDarkice);
|
||||
|
||||
//flokuep
|
||||
CDataBase.GetCreditsRessource("flokuep.png", ref tex);
|
||||
CCreditName CreditEntryFlokuep = new CCreditName();
|
||||
CreditEntryFlokuep.image = new CStatic(tex, new SColorF(1, 1, 1, 1), new SRectF(-450, 580, 400, 120, -4));
|
||||
CreditEntryFlokuep.particleRect = new SRectF(CreditEntryFlokuep.image.Rect.X + 141, CreditEntryFlokuep.image.Rect.Y-2, 30, 30, -5);
|
||||
CreditEntryFlokuep.particle = new CParticleEffect(8, new SColorF(1, 0, 0, 1), CreditEntryFlokuep.particleRect, particleTex, 35, EParticeType.Star);
|
||||
CreditEntryFlokuep.image = new CStatic(_TexNameFlokuep, new SColorF(1, 1, 1, 1), new SRectF(-450, 580, 400, 120, -4));
|
||||
CreditEntryFlokuep.particleRect = new SRectF(CreditEntryFlokuep.image.Rect.X + 141, CreditEntryFlokuep.image.Rect.Y - 2, 30, 30, -5);
|
||||
CreditEntryFlokuep.particle = new CParticleEffect(8, new SColorF(1, 0, 0, 1), CreditEntryFlokuep.particleRect, _TexPerfectNoteStar, 35, EParticeType.Star);
|
||||
CreditEntryFlokuep.active = true;
|
||||
CreditEntryFlokuep.direction = EDirection.Left;
|
||||
_CreditNames.Add(CreditEntryFlokuep);
|
||||
|
||||
//bohning
|
||||
CDataBase.GetCreditsRessource("bohning.png", ref tex);
|
||||
CCreditName CreditEntryBohning = new CCreditName();
|
||||
CreditEntryBohning.image = new CStatic(tex, new SColorF(1, 1, 1, 1), new SRectF(CSettings.iRenderW, 580, 350, 110, -4));
|
||||
CreditEntryBohning.image = new CStatic(_TexNameBohning, new SColorF(1, 1, 1, 1), new SRectF(CSettings.iRenderW, 580, 350, 110, -4));
|
||||
CreditEntryBohning.particleRect = new SRectF(CreditEntryBohning.image.Rect.X + 172, CreditEntryBohning.image.Rect.Y + 16, 10, 10, -5);
|
||||
CreditEntryBohning.particle = new CParticleEffect(4, new SColorF(0.149f, 0.415f ,0.819f, 1), CreditEntryBohning.particleRect, particleTex, 25, EParticeType.Star);
|
||||
CreditEntryBohning.particle = new CParticleEffect(4, new SColorF(0.149f, 0.415f, 0.819f, 1), CreditEntryBohning.particleRect, _TexPerfectNoteStar, 25, EParticeType.Star);
|
||||
CreditEntryBohning.active = true;
|
||||
CreditEntryBohning.direction = EDirection.Right;
|
||||
_CreditNames.Add(CreditEntryBohning);
|
||||
|
||||
//mesand
|
||||
CDataBase.GetCreditsRessource("mesand.png", ref tex);
|
||||
CCreditName CreditEntryMesand = new CCreditName();
|
||||
CreditEntryMesand.image = new CStatic(tex, new SColorF(1, 1, 1, 1), new SRectF(-450, 580, 350, 110, -4));
|
||||
CreditEntryMesand.image = new CStatic(_TexNameMesand, new SColorF(1, 1, 1, 1), new SRectF(-450, 580, 350, 110, -4));
|
||||
CreditEntryMesand.particleRect = new SRectF(CreditEntryMesand.image.Rect.X + 240, CreditEntryMesand.image.Rect.Y - 2, 10, 10, -5);
|
||||
CreditEntryMesand.particle = new CParticleEffect(4, new SColorF(1, 0, 0, 1), CreditEntryMesand.particleRect, particleTex, 25, EParticeType.Star);
|
||||
CreditEntryMesand.particle = new CParticleEffect(4, new SColorF(1, 0, 0, 1), CreditEntryMesand.particleRect, _TexPerfectNoteStar, 25, EParticeType.Star);
|
||||
CreditEntryMesand.active = true;
|
||||
CreditEntryMesand.direction = EDirection.Left;
|
||||
_CreditNames.Add(CreditEntryMesand);
|
||||
|
||||
//babene03
|
||||
CDataBase.GetCreditsRessource("babene03.png", ref tex);
|
||||
CCreditName CreditEntryBabene03 = new CCreditName();
|
||||
CreditEntryBabene03.image = new CStatic(tex, new SColorF(1, 1, 1, 1), new SRectF(CSettings.iRenderW, 580, 350, 110, -4));
|
||||
CreditEntryBabene03.image = new CStatic(_TexNameBabene03, new SColorF(1, 1, 1, 1), new SRectF(CSettings.iRenderW, 580, 350, 110, -4));
|
||||
CreditEntryBabene03.particleRect = new SRectF(CreditEntryBabene03.image.Rect.X + 7, CreditEntryBabene03.image.Rect.Y + 4, 10, 10, -5);
|
||||
CreditEntryBabene03.particle = new CParticleEffect(4, new SColorF(0.149f, 0.415f ,0.819f, 1), CreditEntryBabene03.particleRect, particleTex, 25, EParticeType.Star);
|
||||
CreditEntryBabene03.particle = new CParticleEffect(4, new SColorF(0.149f, 0.415f, 0.819f, 1), CreditEntryBabene03.particleRect, _TexPerfectNoteStar, 25, EParticeType.Star);
|
||||
CreditEntryBabene03.active = true;
|
||||
CreditEntryBabene03.direction = EDirection.Right;
|
||||
_CreditNames.Add(CreditEntryBabene03);
|
||||
|
||||
//pantero
|
||||
CDataBase.GetCreditsRessource("pantero.png", ref tex);
|
||||
CCreditName CreditEntrypantero = new CCreditName();
|
||||
CreditEntrypantero.image = new CStatic(tex, new SColorF(1, 1, 1, 1), new SRectF(-450, 580, 350, 110, -4));
|
||||
CreditEntrypantero.image = new CStatic(_TexNamePantero, new SColorF(1, 1, 1, 1), new SRectF(-450, 580, 350, 110, -4));
|
||||
CreditEntrypantero.particleRect = new SRectF(CreditEntrypantero.image.Rect.X + 140, CreditEntrypantero.image.Rect.Y + 15, 10, 10, -5);
|
||||
CreditEntrypantero.particle = new CParticleEffect(4, new SColorF(1, 0, 0, 1), CreditEntrypantero.particleRect, particleTex, 25, EParticeType.Star);
|
||||
CreditEntrypantero.particle = new CParticleEffect(4, new SColorF(1, 0, 0, 1), CreditEntrypantero.particleRect, _TexPerfectNoteStar, 25, EParticeType.Star);
|
||||
CreditEntrypantero.active = true;
|
||||
CreditEntrypantero.direction = EDirection.Left;
|
||||
_CreditNames.Add(CreditEntrypantero);
|
||||
|
||||
|
||||
//Pinky007
|
||||
CDataBase.GetCreditsRessource("Pinky007.png", ref tex);
|
||||
CCreditName CreditEntryPinky007 = new CCreditName();
|
||||
CreditEntryPinky007.image = new CStatic(tex, new SColorF(1, 1, 1, 1), new SRectF(CSettings.iRenderW, 580, 350, 110, -4));
|
||||
CreditEntryPinky007.image = new CStatic(_TexNamePinky007, new SColorF(1, 1, 1, 1), new SRectF(CSettings.iRenderW, 580, 350, 110, -4));
|
||||
CreditEntryPinky007.particleRect = new SRectF(CreditEntryPinky007.image.Rect.X + 42, CreditEntryPinky007.image.Rect.Y + 15, 10, 10, -5);
|
||||
CreditEntryPinky007.particle = new CParticleEffect(4, new SColorF(0.149f, 0.415f ,0.819f, 1), CreditEntryPinky007.particleRect, particleTex, 25, EParticeType.Star);
|
||||
CreditEntryPinky007.particle = new CParticleEffect(4, new SColorF(0.149f, 0.415f, 0.819f, 1), CreditEntryPinky007.particleRect, _TexPerfectNoteStar, 25, EParticeType.Star);
|
||||
CreditEntryPinky007.active = true;
|
||||
CreditEntryPinky007.direction = EDirection.Right;
|
||||
_CreditNames.Add(CreditEntryPinky007);
|
||||
@@ -267,6 +356,9 @@ namespace Vocaluxe.Screens
|
||||
}
|
||||
}
|
||||
}
|
||||
TextTimer.Reset();
|
||||
LogoTimer.Reset();
|
||||
CreditsTimer.Reset();
|
||||
}
|
||||
|
||||
public override void OnShowFinish()
|
||||
@@ -427,7 +519,7 @@ namespace Vocaluxe.Screens
|
||||
|
||||
if (TextTimer.IsRunning)
|
||||
{
|
||||
if (TextTimer.ElapsedMilliseconds > 10000)
|
||||
if (TextTimer.ElapsedMilliseconds > 600000)
|
||||
{
|
||||
active = false;
|
||||
}
|
||||
|
||||
@@ -135,6 +135,7 @@ namespace Vocaluxe.Screens
|
||||
}
|
||||
|
||||
CLog.StartBenchmark(3, "Load Cover");
|
||||
_SongLoaderThread.IsBackground = true;
|
||||
_SongLoaderThread.Start();
|
||||
_timer.Start();
|
||||
|
||||
@@ -153,7 +154,7 @@ namespace Vocaluxe.Screens
|
||||
|
||||
if (CSongs.SongsLoaded && CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_ATSTART && _timer.ElapsedMilliseconds > 1000L)
|
||||
{
|
||||
CSongs.LoadCover(20L);
|
||||
CSongs.LoadCover(0L, 1);
|
||||
}
|
||||
|
||||
bool next = ((CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_ATSTART && CSongs.CoverLoaded) ||
|
||||
@@ -306,6 +307,7 @@ namespace Vocaluxe.Screens
|
||||
_Finished = CVideo.VdFinished(_VideoStream);
|
||||
|
||||
STexture tex = new STexture(-1);
|
||||
tex.height = 0f;
|
||||
CVideo.VdGetFrame(_VideoStream, ref tex, VideoTime, ref VideoTime);
|
||||
|
||||
if (tex.height > 0)
|
||||
|
||||
@@ -140,7 +140,11 @@ namespace Vocaluxe.Screens
|
||||
base.DrawFG();
|
||||
|
||||
if (CSettings.VersionRevision != ERevision.Release)
|
||||
{
|
||||
CFonts.SetFont("Normal");
|
||||
CFonts.Style = EStyle.Normal;
|
||||
CDraw.DrawText(CSettings.GetFullVersionText(), 10, 680, 40);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -54,9 +54,16 @@ namespace Vocaluxe.Screens
|
||||
{
|
||||
base.HandleInput(KeyEvent);
|
||||
|
||||
if (KeyEvent.KeyPressed && !Char.IsControl(KeyEvent.Unicode) && _SearchActive)
|
||||
if (KeyEvent.KeyPressed && !Char.IsControl(KeyEvent.Unicode))
|
||||
{
|
||||
ApplyNewSearchFilter(_SearchText + KeyEvent.Unicode);
|
||||
if (_SearchActive)
|
||||
ApplyNewSearchFilter(_SearchText + KeyEvent.Unicode);
|
||||
/*
|
||||
else if (!Char.IsControl(KeyEvent.Unicode))
|
||||
{
|
||||
JumpTo(KeyEvent.Unicode);
|
||||
return true;
|
||||
}*/
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -71,7 +78,7 @@ namespace Vocaluxe.Screens
|
||||
if (CSongs.Category < 0 || CConfig.Tabs == EOffOn.TR_CONFIG_OFF)
|
||||
CGraphics.FadeTo(EScreens.ScreenMain);
|
||||
break;
|
||||
|
||||
|
||||
case Keys.Enter:
|
||||
if (CSongs.NumVisibleSongs > 0)
|
||||
StartSong(SongMenus[htSongMenus(SongMenu)].GetSelectedSong());
|
||||
@@ -128,7 +135,7 @@ namespace Vocaluxe.Screens
|
||||
break;
|
||||
|
||||
case Keys.R:
|
||||
if (CSongs.Category != -1)
|
||||
if (CSongs.Category != -1 && KeyEvent.Mod == Modifier.Ctrl)
|
||||
{
|
||||
SongMenus[htSongMenus(SongMenu)].SetSelectedSong(CSongs.GetRandomSong());
|
||||
}
|
||||
@@ -288,6 +295,24 @@ namespace Vocaluxe.Screens
|
||||
CGraphics.FadeTo(EScreens.ScreenNames);
|
||||
}
|
||||
|
||||
private void JumpTo(char Letter)
|
||||
{
|
||||
int song = SongMenus[htSongMenus(SongMenu)].GetSelectedSong();
|
||||
int id = -1;
|
||||
if (song > -1 && song < CSongs.NumVisibleSongs)
|
||||
{
|
||||
id = CSongs.VisibleSongs[song].ID;
|
||||
}
|
||||
|
||||
// here is a fault: SetSelectedSong should point to the visible index
|
||||
Vocaluxe.Lib.Song.CSong s = Array.Find<Vocaluxe.Lib.Song.CSong>(CSongs.VisibleSongs, element => element.Artist.StartsWith(Letter.ToString(), StringComparison.OrdinalIgnoreCase));
|
||||
if (s != null && s.ID > -1)
|
||||
{
|
||||
id = s.ID;
|
||||
SongMenus[htSongMenus(SongMenu)].SetSelectedSong(id);
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyNewSearchFilter(string NewFilterString)
|
||||
{
|
||||
int song = SongMenus[htSongMenus(SongMenu)].GetSelectedSong();
|
||||
|
||||
Reference in new issue
Block a user