Merge branch 'develop' into popup-control

This commit is contained in:
Alexander Eckart committed 2012-03-17 12:01:11 +01:00
commit c3d737107a
22 files changed
+1066 -510

No files matched your search

+4 -6
View File
@@ -16,9 +16,7 @@
================================= =================================
= 1. About = = 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 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.
Vocaluxe is an entirely new development in C#, inspired by the original UltraStar (developed by corvus5) and the great Ultrastar Deluxe project.
Supported Operating Systems / Requirements: Supported Operating Systems / Requirements:
- WinXP, Vista, Windows 7 with .NET 2.0 - WinXP, Vista, Windows 7 with .NET 2.0
@@ -28,9 +26,9 @@ Supported Operating Systems / Requirements:
================================= =================================
= 2. Download = = 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: 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/
================================= =================================
+1 -1
View File
@@ -191,7 +191,7 @@ namespace Vocaluxe.Base
public static EPlaybackLib PlayBackLib = EPlaybackLib.PortAudio; public static EPlaybackLib PlayBackLib = EPlaybackLib.PortAudio;
public static ERecordLib RecordLib = ERecordLib.PortAudio; public static ERecordLib RecordLib = ERecordLib.PortAudio;
public static EBufferSize AudioBufferSize = EBufferSize.b2048; public static EBufferSize AudioBufferSize = EBufferSize.b2048;
public static int AudioLatency = 125; public static int AudioLatency = 0;
public static int BackgroundMusicVolume = 50; public static int BackgroundMusicVolume = 50;
public static EOffOn BackgroundMusic = EOffOn.TR_CONFIG_ON; public static EOffOn BackgroundMusic = EOffOn.TR_CONFIG_ON;
public static EBackgroundMusicSource BackgroundMusicSource = EBackgroundMusicSource.TR_CONFIG_NO_OWN_MUSIC; public static EBackgroundMusicSource BackgroundMusicSource = EBackgroundMusicSource.TR_CONFIG_NO_OWN_MUSIC;
+40 -17
View File
@@ -29,6 +29,9 @@ namespace Vocaluxe.Base
private static string _CoverFilePath; private static string _CoverFilePath;
private static string _CreditsRessourcesFilePath; private static string _CreditsRessourcesFilePath;
private static SQLiteConnection _ConnectionCover = null;
private static SQLiteTransaction _TransactionCover = null;
public static void Init() public static void Init()
{ {
_HighscoreFilePath = Path.Combine(System.Environment.CurrentDirectory, CSettings.sFileHighscoreDB); _HighscoreFilePath = Path.Combine(System.Environment.CurrentDirectory, CSettings.sFileHighscoreDB);
@@ -959,18 +962,15 @@ namespace Vocaluxe.Base
return false; return false;
} }
SQLiteConnection connection = new SQLiteConnection(); if (_ConnectionCover == null)
connection.ConnectionString = "Data Source=" + _CoverFilePath; {
_ConnectionCover = new SQLiteConnection();
_ConnectionCover.ConnectionString = "Data Source=" + _CoverFilePath;
_ConnectionCover.Open();
}
SQLiteCommand command; SQLiteCommand command;
try command = new SQLiteCommand(_ConnectionCover);
{
connection.Open();
}
catch (Exception)
{
return false;
}
command = new SQLiteCommand(connection);
command.CommandText = "SELECT id, width, height FROM Cover WHERE [Path] = @path"; command.CommandText = "SELECT id, width, height FROM Cover WHERE [Path] = @path";
command.Parameters.Add("@path", System.Data.DbType.String, 0).Value = CoverPath; command.Parameters.Add("@path", System.Data.DbType.String, 0).Value = CoverPath;
@@ -1008,7 +1008,7 @@ namespace Vocaluxe.Base
result = true; result = true;
reader.Read(); reader.Read();
byte[] data = GetBytes(reader); byte[] data = GetBytes(reader);
tex = CDraw.AddTexture(w, h, ref data); tex = CDraw.QuequeTexture(w, h, ref data);
} }
} }
else else
@@ -1016,6 +1016,11 @@ namespace Vocaluxe.Base
if (reader != null) if (reader != null)
reader.Close(); reader.Close();
if (_TransactionCover == null)
{
_TransactionCover = _ConnectionCover.BeginTransaction();
}
Bitmap origin; Bitmap origin;
try try
{ {
@@ -1032,8 +1037,6 @@ namespace Vocaluxe.Base
reader.Dispose(); reader.Dispose();
} }
command.Dispose(); command.Dispose();
connection.Close();
connection.Dispose();
return false; return false;
} }
@@ -1050,7 +1053,7 @@ namespace Vocaluxe.Base
Graphics g = Graphics.FromImage(bmp); Graphics g = Graphics.FromImage(bmp);
g.DrawImage(origin, new Rectangle(0, 0, w, h)); g.DrawImage(origin, new Rectangle(0, 0, w, h));
g.Dispose(); g.Dispose();
tex = CDraw.AddTexture(bmp);
byte[] data = new byte[w * h * 4]; 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); 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.UnlockBits(bmp_data);
bmp.Dispose(); bmp.Dispose();
tex = CDraw.QuequeTexture(w, h, ref data);
command.CommandText = "INSERT INTO Cover (Path, width, height) " + command.CommandText = "INSERT INTO Cover (Path, width, height) " +
"VALUES (@path, " + w.ToString() + ", " + h.ToString() + ")"; "VALUES (@path, " + w.ToString() + ", " + h.ToString() + ")";
command.Parameters.Add("@path", System.Data.DbType.String, 0).Value = CoverPath; command.Parameters.Add("@path", System.Data.DbType.String, 0).Value = CoverPath;
@@ -1094,12 +1099,30 @@ namespace Vocaluxe.Base
reader.Dispose(); reader.Dispose();
} }
command.Dispose(); command.Dispose();
connection.Close();
connection.Dispose();
return result; 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() private static bool InitCoverDB()
{ {
SQLiteConnection connection = new SQLiteConnection(); SQLiteConnection connection = new SQLiteConnection();
+53 -137
View File
@@ -12,8 +12,6 @@ namespace Vocaluxe.Base
{ {
static class CDraw static class CDraw
{ {
private static Object mutex = new object();
private static IDraw _Draw = null; private static IDraw _Draw = null;
public static void InitDraw() public static void InitDraw()
@@ -50,243 +48,167 @@ namespace Vocaluxe.Base
public static int GetScreenWidth() public static int GetScreenWidth()
{ {
lock (mutex) return _Draw.GetScreenWidth();
{
return _Draw.GetScreenWidth();
}
} }
public static int GetScreenHeight() public static int GetScreenHeight()
{ {
lock (mutex) return _Draw.GetScreenHeight();
{
return _Draw.GetScreenHeight();
}
} }
public static RectangleF GetTextBounds(CText text) public static RectangleF GetTextBounds(CText text)
{ {
lock (mutex) return _Draw.GetTextBounds(text);
{
return _Draw.GetTextBounds(text);
}
} }
public static RectangleF GetTextBounds(CText text, float Height) 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) 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) 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 - 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 + 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 - 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 + Rect.W - Thickness / 2, Rect.Y - Thickness / 2, Thickness, Rect.H + Thickness, Rect.Z));
}
} }
public static void DrawColor(SColorF color, SRectF rect) public static void DrawColor(SColorF color, SRectF rect)
{ {
lock (mutex) _Draw.DrawColor(color, rect);
{
_Draw.DrawColor(color, rect);
}
} }
public static void ClearScreen() public static void ClearScreen()
{ {
lock (mutex) _Draw.ClearScreen();
{
_Draw.ClearScreen();
}
} }
public static STexture CopyScreen() public static STexture CopyScreen()
{ {
lock (mutex) return _Draw.CopyScreen();
{
return _Draw.CopyScreen();
}
} }
public static void CopyScreen(ref STexture Texture) public static void CopyScreen(ref STexture Texture)
{ {
lock (mutex) _Draw.CopyScreen(ref Texture);
{
_Draw.CopyScreen(ref Texture);
}
} }
public static void MakeScreenShot() public static void MakeScreenShot()
{ {
lock (mutex) _Draw.MakeScreenShot();
{
_Draw.MakeScreenShot();
}
} }
// Draw Basic Text (must be deleted later) // Draw Basic Text (must be deleted later)
public static void DrawText(string Text, int x, int y, int h) 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) public static STexture AddTexture(Bitmap Bitmap)
{ {
lock (mutex) return _Draw.AddTexture(Bitmap);
{
return _Draw.AddTexture(Bitmap);
}
} }
public static STexture AddTexture(string TexturePath) public static STexture AddTexture(string TexturePath)
{ {
lock (mutex) return _Draw.AddTexture(TexturePath);
{
return _Draw.AddTexture(TexturePath);
}
} }
public static STexture AddTexture(string TexturePath, int MaxSize) 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)) if (!System.IO.File.Exists(TexturePath))
return new STexture(-1); return new STexture(-1);
Bitmap origin = new Bitmap(TexturePath); Bitmap origin = new Bitmap(TexturePath);
int w = MaxSize; int w = MaxSize;
int h = MaxSize; int h = MaxSize;
if (origin.Width >= origin.Height && origin.Width > w) if (origin.Width >= origin.Height && origin.Width > w)
h = (int)Math.Round((float)w / origin.Width * origin.Height); h = (int)Math.Round((float)w / origin.Width * origin.Height);
else if (origin.Height > origin.Width && origin.Height > h) else if (origin.Height > origin.Width && origin.Height > h)
w = (int)Math.Round((float)h / origin.Height * origin.Width); w = (int)Math.Round((float)h / origin.Height * origin.Width);
Bitmap bmp = new Bitmap(origin, w, h); Bitmap bmp = new Bitmap(origin, w, h);
STexture tex = _Draw.AddTexture(bmp); STexture tex = _Draw.AddTexture(bmp);
bmp.Dispose(); bmp.Dispose();
return tex; return tex;
}
} }
public static STexture AddTexture(int W, int H, IntPtr Data) 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) 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) 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) 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) public static void RemoveTexture(ref STexture Texture)
{ {
lock (mutex) _Draw.RemoveTexture(ref Texture);
{
_Draw.RemoveTexture(ref Texture);
}
} }
public static void DrawTexture(STexture Texture) public static void DrawTexture(STexture Texture)
{ {
lock (mutex) _Draw.DrawTexture(Texture);
{
_Draw.DrawTexture(Texture);
}
} }
public static void DrawTexture(STexture Texture, SRectF rect) 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) 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) 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) 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) 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) 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 DrawTexture(CStatic StaticBounds, STexture Texture, EAspect Aspect) public static void DrawTexture(CStatic StaticBounds, STexture Texture, EAspect Aspect)
@@ -304,18 +226,12 @@ namespace Vocaluxe.Base
public static void DrawTextureReflection(STexture Texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) 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() public static int TextureCount()
{ {
lock (mutex) return _Draw.TextureCount();
{
return _Draw.TextureCount();
}
} }
} }
+15 -3
View File
@@ -12,6 +12,7 @@ using System.Xml;
using System.Xml.XPath; using System.Xml.XPath;
using Vocaluxe.Lib.Draw; using Vocaluxe.Lib.Draw;
using Vocaluxe.Menu;
namespace Vocaluxe.Base namespace Vocaluxe.Base
{ {
@@ -32,7 +33,7 @@ namespace Vocaluxe.Base
class CGlyph class CGlyph
{ {
public readonly float SIZEh = 100f; public readonly float SIZEh = 50f;
public STexture Texture; public STexture Texture;
public char Chr; public char Chr;
public int width; public int width;
@@ -133,7 +134,7 @@ namespace Vocaluxe.Base
sizeB = TextRenderer.MeasureText(g, chr.ToString(), fo, new Size(int.MaxValue, int.MaxValue), flags); sizeB = TextRenderer.MeasureText(g, chr.ToString(), fo, new Size(int.MaxValue, int.MaxValue), flags);
//size = g.MeasureString(chr.ToString(), fo); //size = g.MeasureString(chr.ToString(), fo);
float h_style = sizeB.Height; float h_style = sizeB.Height;
g.Dispose();
return h_normal / h_style; 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) public static float GetTextWidth(string text)
{ {
float dx = 0; float dx = 0;
+1 -1
View File
@@ -47,7 +47,7 @@ namespace Vocaluxe.Base
public const int iVersionSub = 0; // steps public const int iVersionSub = 0; // steps
public const ERevision VersionRevision = ERevision.Beta; 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 iDatabaseHighscoreVersion = 1;
public const int iDatabaseCoverVersion = 1; public const int iDatabaseCoverVersion = 1;
+40 -18
View File
@@ -826,11 +826,32 @@ namespace Vocaluxe.Base
CLog.StopBenchmark(2, "Sort Songs"); CLog.StopBenchmark(2, "Sort Songs");
Category = -1; Category = -1;
_SongsLoaded = true; _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 "); 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) if (!SongsLoaded)
return; return;
@@ -846,25 +867,26 @@ namespace Vocaluxe.Base
STexture texture = new STexture(-1); STexture texture = new STexture(-1);
if (_CoverLoadTimer.ElapsedMilliseconds >= WaitTime) if (_CoverLoadTimer.ElapsedMilliseconds >= WaitTime)
{ {
CSong song = new CSong(); for (int i = 0; i < NumLoads; i++)
int i = GetNextSongWithoutCover(ref song);
if (i < 0)
return;
song.ReadNotes();
if (song.CoverFileName != String.Empty)
{ {
if (!CDataBase.GetCover(Path.Combine(song.Folder, song.CoverFileName), ref texture, CConfig.CoverSize)) CSong song = new CSong();
texture = CCover.NoCover; int n = GetNextSongWithoutCover(ref song);
}
else
texture = CCover.NoCover;
SetCoverSmall(i, texture);
SetCoverBig(i, texture);
_CoverLoadTimer.Reset(); if (n < 0)
_CoverLoadTimer.Start(); return;
song.ReadNotes();
texture = song.CoverTextureSmall;
SetCoverSmall(n, texture);
SetCoverBig(n, texture);
if (CoverLoaded)
CDataBase.CommitCovers();
_CoverLoadTimer.Reset();
_CoverLoadTimer.Start();
}
} }
} }
} }
+3 -3
View File
@@ -501,7 +501,7 @@ namespace Vocaluxe.Base
long ticks = _Timer.ElapsedTicks; long ticks = _Timer.ElapsedTicks;
float dt = _Timer.ElapsedMilliseconds / 1000f; float dt = _Timer.ElapsedMilliseconds / 1000f;
if (Stopwatch.IsHighResolution) if (Stopwatch.IsHighResolution && ticks != 0)
dt = (float)(ticks * nanosecPerTick / 1000000000.0); dt = (float)(ticks * nanosecPerTick / 1000000000.0);
return _SetValue + dt; return _SetValue + dt;
@@ -581,7 +581,7 @@ namespace Vocaluxe.Base
long ticks = _STimer.ElapsedTicks; long ticks = _STimer.ElapsedTicks;
float dt = _STimer.ElapsedMilliseconds / 1000f; float dt = _STimer.ElapsedMilliseconds / 1000f;
if (Stopwatch.IsHighResolution) if (Stopwatch.IsHighResolution && ticks != 0)
dt = (float)(ticks * nanosecPerTick / 1000000000.0); dt = (float)(ticks * nanosecPerTick / 1000000000.0);
return _CurrentTime + dt; return _CurrentTime + dt;
@@ -617,7 +617,7 @@ namespace Vocaluxe.Base
long ticks = _STimer.ElapsedTicks; long ticks = _STimer.ElapsedTicks;
float dt = _STimer.ElapsedMilliseconds / 1000f; float dt = _STimer.ElapsedMilliseconds / 1000f;
if (Stopwatch.IsHighResolution) if (Stopwatch.IsHighResolution && ticks != 0)
dt = (float)(ticks * nanosecPerTick / 1000000000.0); dt = (float)(ticks * nanosecPerTick / 1000000000.0);
float Ts = 0f; float Ts = 0f;
+3 -2
View File
@@ -147,8 +147,9 @@ namespace Vocaluxe.Base
{ {
if (_Stopwatch.IsRunning) if (_Stopwatch.IsRunning)
{ {
if (Stopwatch.IsHighResolution) long ticks = _Stopwatch.ElapsedTicks;
return (float)(((double)nanosecPerTick * (double)_Stopwatch.ElapsedTicks) / (1000.0 * 1000.0)); if (Stopwatch.IsHighResolution && ticks != 0)
return (float)(((double)nanosecPerTick * (double)ticks) / (1000.0 * 1000.0));
else else
return (float)_Stopwatch.ElapsedMilliseconds; return (float)_Stopwatch.ElapsedMilliseconds;
} }
+271 -162
View File
@@ -36,6 +36,9 @@ namespace Vocaluxe.Lib.Draw
private List<STexture> _Textures; private List<STexture> _Textures;
private List<Texture> _D3DTextures; private List<Texture> _D3DTextures;
private List<STextureQueque> _Queque;
private Object MutexTexture = new Object();
private VertexBuffer _VertexBuffer; private VertexBuffer _VertexBuffer;
@@ -46,6 +49,7 @@ namespace Vocaluxe.Lib.Draw
private Bitmap blankMap; private Bitmap blankMap;
private STexture blankTexture; private STexture blankTexture;
private Texture transparentTexture;
#endregion private vars #endregion private vars
@@ -57,6 +61,8 @@ namespace Vocaluxe.Lib.Draw
this.Icon = new System.Drawing.Icon(Path.Combine(System.Environment.CurrentDirectory, CSettings.sIcon)); this.Icon = new System.Drawing.Icon(Path.Combine(System.Environment.CurrentDirectory, CSettings.sIcon));
_Textures = new List<STexture>(); _Textures = new List<STexture>();
_D3DTextures = new List<Texture>(); _D3DTextures = new List<Texture>();
_Queque = new List<STextureQueque>();
_Keys = new CKeys(); _Keys = new CKeys();
_D3D = new Direct3D(); _D3D = new Direct3D();
@@ -164,8 +170,7 @@ namespace Vocaluxe.Lib.Draw
g.Dispose(); g.Dispose();
blankTexture = AddTexture(blankMap); blankTexture = AddTexture(blankMap);
h = ClientSize.Height; transparentTexture = new Texture(_Device, 1, 1, 0, Usage.None, Format.A8R8G8B8, Pool.Managed);
w = ClientSize.Width;
blankMap.Dispose(); blankMap.Dispose();
} }
@@ -402,6 +407,7 @@ namespace Vocaluxe.Lib.Draw
ClearScreen(); ClearScreen();
//We want to begin drawing //We want to begin drawing
_Device.BeginScene(); _Device.BeginScene();
CheckQueque();
_Run = _Run && CGraphics.Draw(); _Run = _Run && CGraphics.Draw();
//We finished drawing the frame //We finished drawing the frame
_Device.EndScene(); _Device.EndScene();
@@ -465,7 +471,8 @@ namespace Vocaluxe.Lib.Draw
//Dispose all textures //Dispose all textures
for (int i = 0; i < _D3DTextures.Count; i++) for (int i = 0; i < _D3DTextures.Count; i++)
{ {
_D3DTextures[i].Dispose(); if(_D3DTextures[i] != null)
_D3DTextures[i].Dispose();
} }
TexturedColoredVertex.GetDeclaration(_Device).Dispose(); TexturedColoredVertex.GetDeclaration(_Device).Dispose();
_VertexBuffer.Dispose(); _VertexBuffer.Dispose();
@@ -513,7 +520,7 @@ namespace Vocaluxe.Lib.Draw
CFonts.Height = Height; CFonts.Height = Height;
CFonts.SetFont(text.Fon); CFonts.SetFont(text.Fon);
CFonts.Style = text.Style; 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 #region Basic Draw Methods
@@ -554,7 +561,7 @@ namespace Vocaluxe.Lib.Draw
{ {
string file = "Screenshot_"; string file = "Screenshot_";
string path = Path.Combine(Environment.CurrentDirectory, CSettings.sFolderScreenshots); string path = Path.Combine(Environment.CurrentDirectory, CSettings.sFolderScreenshots);
int i = 0; int i = 0;
while (File.Exists(Path.Combine(path, file + i.ToString("00000") + ".bmp"))) while (File.Exists(Path.Combine(path, file + i.ToString("00000") + ".bmp")))
i++; i++;
@@ -620,7 +627,15 @@ namespace Vocaluxe.Lib.Draw
/// <param name="rect">The coordinates in a SRectF struct</param> /// <param name="rect">The coordinates in a SRectF struct</param>
public void DrawColor(SColorF color, SRectF rect) public void DrawColor(SColorF color, SRectF rect)
{ {
//blankMap = new Bitmap(1, 1);
//Graphics g = Graphics.FromImage(blankMap);
//g.Clear(Color.White);
//g.Dispose();
//blankTexture = AddTexture(blankMap);
//blankMap.Dispose();
DrawTexture(blankTexture, rect, color); DrawTexture(blankTexture, rect, color);
//RemoveTexture(ref blankTexture);
} }
#endregion Basic Draw Methods #endregion Basic Draw Methods
#region Textures #region Textures
@@ -749,16 +764,20 @@ namespace Vocaluxe.Lib.Draw
rect.Data.Position += rect.Pitch; rect.Data.Position += rect.Pitch;
} }
t.UnlockRectangle(0); t.UnlockRectangle(0);
_D3DTextures.Add(t);
bmp2.Dispose(); bmp2.Dispose();
bmp_data = null; bmp_data = null;
// Add to Texture List // Add to Texture List
texture.index = _D3DTextures.Count - 1;
texture.color = new SColorF(1f, 1f, 1f, 1f); texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
texture.TexturePath = String.Empty; texture.TexturePath = String.Empty;
_Textures.Add(texture); lock (MutexTexture)
{
_D3DTextures.Add(t);
texture.index = _D3DTextures.Count - 1;
_Textures.Add(texture);
}
return texture; return texture;
} }
@@ -780,6 +799,26 @@ namespace Vocaluxe.Lib.Draw
return AddTexture(W, H, ref PointerData); return AddTexture(W, H, ref PointerData);
} }
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)
{
_D3DTextures.Add(null);
texture.index = _D3DTextures.Count - 1;
queque.ID = texture.index;
_Queque.Add(queque);
_Textures.Add(texture);
}
return texture;
}
public STexture AddTexture(int W, int H, ref byte[] Data) public STexture AddTexture(int W, int H, ref byte[] Data)
{ {
STexture texture = new STexture(-1); STexture texture = new STexture(-1);
@@ -800,13 +839,17 @@ namespace Vocaluxe.Lib.Draw
rect.Data.Position += rect.Pitch; rect.Data.Position += rect.Pitch;
} }
t.UnlockRectangle(0); t.UnlockRectangle(0);
_D3DTextures.Add(t);
texture.index = _D3DTextures.Count - 1;
texture.color = new SColorF(1f, 1f, 1f, 1f); texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
texture.TexturePath = String.Empty; texture.TexturePath = String.Empty;
_Textures.Add(texture);
lock (MutexTexture)
{
_D3DTextures.Add(t);
texture.index = _D3DTextures.Count - 1;
_Textures.Add(texture);
}
return texture; return texture;
} }
@@ -832,7 +875,7 @@ namespace Vocaluxe.Lib.Draw
/// <returns>True if succeeded</returns> /// <returns>True if succeeded</returns>
public bool UpdateTexture(ref STexture Texture, ref byte[] Data) public bool UpdateTexture(ref STexture Texture, ref byte[] Data)
{ {
if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index)) if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index) && _TextureExists(ref Texture))
{ {
DataRectangle rect = _D3DTextures[Texture.index].LockRectangle(0, LockFlags.None); DataRectangle rect = _D3DTextures[Texture.index].LockRectangle(0, LockFlags.None);
for (int i = 0; i < Data.Length; ) for (int i = 0; i < Data.Length; )
@@ -857,15 +900,20 @@ namespace Vocaluxe.Lib.Draw
/// </summary> /// </summary>
/// <param name="Texture">The texture to check</param> /// <param name="Texture">The texture to check</param>
/// <returns>True if the texture exists</returns> /// <returns>True if the texture exists</returns>
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++) 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].index >= 0)
{
Texture = _Textures[i];
return true;
}
break;
} }
} }
} }
@@ -878,18 +926,20 @@ namespace Vocaluxe.Lib.Draw
/// <param name="Texture">The texture to be removed</param> /// <param name="Texture">The texture to be removed</param>
public void RemoveTexture(ref STexture Texture) public void RemoveTexture(ref STexture Texture)
{ {
if ((Texture.index >= 0) && (_Textures.Count > 0)) lock (MutexTexture)
{ {
for (int i = 0; i < _Textures.Count; i++) if ((Texture.index >= 0) && (_Textures.Count > 0))
{ {
if (_Textures[i].index == Texture.index) for (int i = 0; i < _Textures.Count; i++)
{ {
_D3DTextures[Texture.index].Dispose(); if (_Textures[i].index == Texture.index)
_Textures.RemoveAt(i); {
Texture.index = -1; _D3DTextures[Texture.index].Dispose();
//Calling the garbage collector to get rid of all unused objects _D3DTextures[Texture.index] = null;
GC.Collect(); _Textures.RemoveAt(i);
break; Texture.index = -1;
Texture.ID = -1;
}
} }
} }
} }
@@ -964,7 +1014,7 @@ namespace Vocaluxe.Lib.Draw
/// <param name="mirrored">True if the texture should be mirrored</param> /// <param name="mirrored">True if the texture should be mirrored</param>
public void DrawTexture(STexture Texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored) public void DrawTexture(STexture Texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored)
{ {
if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index)) if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index) && _TextureExists(ref Texture))
{ {
//Calculate the position //Calculate the position
float x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio; float x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
@@ -1044,19 +1094,19 @@ namespace Vocaluxe.Lib.Draw
if (!mirrored) if (!mirrored)
{ {
stream.WriteRange(new[] { stream.WriteRange(new[] {
new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), c.ToArgb()), new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()), new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()), new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()), new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()),
}); });
} }
else else
{ {
stream.WriteRange(new[] { stream.WriteRange(new[] {
new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y1), c.ToArgb()), new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y1), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y2), c.ToArgb()), new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y2), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y2), c.ToArgb()), new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y2), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y1), c.ToArgb()), new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y1), c.ToArgb()),
}); });
} }
_VertexBuffer.Unlock(); _VertexBuffer.Unlock();
@@ -1086,128 +1136,17 @@ namespace Vocaluxe.Lib.Draw
public void DrawTexture(STexture Texture, SRectF rect, SColorF color, float begin, float end) public void DrawTexture(STexture Texture, SRectF rect, SColorF color, float begin, float end)
{ {
float x1 = 0f + begin * Texture.width_ratio; if (_TextureExists(ref Texture))
float x2 = Texture.width_ratio * end;
float y1 = 0f;
float y2 = Texture.height_ratio;
float rx1 = rect.X + begin * rect.W;
float rx2 = rect.X + end * rect.W;
float ry1 = rect.Y;
float ry2 = rect.Y + rect.H;
//Align the pixels because Direct3D expects the pixels to be the left top corner
rx1 -= 0.5f;
ry1 -= 0.5f;
rx2 -= 0.5f;
ry2 -= 0.5f;
Color c = Color.FromArgb((int)(color.A * 255 * CGraphics.GlobalAlpha), (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
//Apply rotation
//FIXME: Rotated textures get distorted when they hit the border of the window
if (rect.Rotation != 0)
{ {
rect.Rotation = rect.Rotation * (float)Math.PI / 180; float x1 = 0f + begin * Texture.width_ratio;
float centerX = (rx1 + rx2) / 2f; float x2 = Texture.width_ratio * end;
float centerY = -(ry1 + ry2) / 2f; float y1 = 0f;
float y2 = Texture.height_ratio;
Matrix originTranslation = _Device.GetTransform(TransformState.World); float rx1 = rect.X + begin * rect.W;
Matrix translationA = Matrix.Translation(-centerX, -centerY, 0); float rx2 = rect.X + end * rect.W;
Matrix rotation = Matrix.RotationZ(-rect.Rotation); float ry1 = rect.Y;
Matrix translationB = Matrix.Translation(centerX, centerY, 0); float ry2 = rect.Y + rect.H;
//Multiplicate the matrices to get the real world matrix,
//First shift the texture into the center
//Rotate it and shift it back to the origin position
//Apply the originTranslation after
Matrix result = translationA * rotation * translationB * originTranslation;
_Device.SetTransform(TransformState.World, result);
}
//Create new vertices and write them into a vertexbuffer
DataStream stream = _VertexBuffer.Lock(0, 0, LockFlags.Discard);
stream.WriteRange(new[] {
new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()),
});
_VertexBuffer.Unlock();
stream.Dispose();
//Set the texture
_Device.SetTexture(0, _D3DTextures[Texture.index]);
//Draw 2 triangles to build a quad
_Device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 2);
//Reapply old matrices if the texture was rotated
if (rect.Rotation != 0)
{
Matrix originTranslation = Matrix.Translation(new Vector3(-CSettings.iRenderW / 2, CSettings.iRenderH / 2, 0));
_Device.SetTransform(TransformState.World, originTranslation);
}
}
/// <summary>
/// Draws a reflection of a texture
/// </summary>
/// <param name="Texture">The texture of which a reflection should be drawn</param>
/// <param name="rect">A SRectF struct containing the destination coordinates</param>
/// <param name="color">A SColorF struct containing a color which the texture will be colored in</param>
/// <param name="bounds">A SRectF struct containing which part of the texture should be drawn</param>
/// <param name="space">The space between the texture and the reflection</param>
/// <param name="height">The height of the reflection</param>
public void DrawTextureReflection(STexture Texture, SRectF rect, SColorF color, SRectF bounds, float space, float height)
{
if (rect.W == 0f || rect.H == 0f || bounds.H == 0f || bounds.W == 0f || color.A == 0f || height <= 0f)
return;
if (bounds.X > rect.X + rect.W || bounds.X + bounds.W < rect.X)
return;
if (bounds.Y > rect.Y + rect.H || bounds.Y + bounds.H < rect.Y)
return;
if (height > bounds.H)
height = bounds.H;
if (_TextureExists(Texture))
{
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 - height) / rect.H * Texture.height_ratio;
float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * Texture.height_ratio;
if (x1 < 0)
x1 = 0f;
if (x2 > Texture.width_ratio)
x2 = Texture.width_ratio;
if (y1 < 0)
y1 = 0f;
if (y2 > Texture.height_ratio)
y2 = Texture.height_ratio;
float rx1 = rect.X;
float rx2 = rect.X + rect.W;
float ry1 = rect.Y + rect.H + space;
float ry2 = rect.Y + rect.H + space + height;
if (rx1 < bounds.X)
rx1 = bounds.X;
if (rx2 > bounds.X + bounds.W)
rx2 = bounds.X + bounds.W;
if (ry1 < bounds.Y + space)
ry1 = bounds.Y + space;
if (ry2 > bounds.Y + bounds.H + space + height)
ry2 = bounds.Y + bounds.H + space + height;
//Align the pixels because Direct3D expects the pixels to be the left top corner //Align the pixels because Direct3D expects the pixels to be the left top corner
rx1 -= 0.5f; rx1 -= 0.5f;
@@ -1215,6 +1154,8 @@ namespace Vocaluxe.Lib.Draw
rx2 -= 0.5f; rx2 -= 0.5f;
ry2 -= 0.5f; ry2 -= 0.5f;
Color c = Color.FromArgb((int)(color.A * 255 * CGraphics.GlobalAlpha), (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
//Apply rotation //Apply rotation
//FIXME: Rotated textures get distorted when they hit the border of the window //FIXME: Rotated textures get distorted when they hit the border of the window
if (rect.Rotation != 0) if (rect.Rotation != 0)
@@ -1237,16 +1178,13 @@ namespace Vocaluxe.Lib.Draw
_Device.SetTransform(TransformState.World, result); _Device.SetTransform(TransformState.World, result);
} }
Color c = Color.FromArgb((int)(color.A * 255 * CGraphics.GlobalAlpha), (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
Color transparent = Color.FromArgb(0, (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
//Create new vertices and write them into a vertexbuffer //Create new vertices and write them into a vertexbuffer
DataStream stream = _VertexBuffer.Lock(0, 0, LockFlags.Discard); DataStream stream = _VertexBuffer.Lock(0, 0, LockFlags.Discard);
stream.WriteRange(new[] { stream.WriteRange(new[] {
new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()), new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), transparent.ToArgb()), new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), transparent.ToArgb()), new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()), new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()),
}); });
_VertexBuffer.Unlock(); _VertexBuffer.Unlock();
stream.Dispose(); stream.Dispose();
@@ -1264,6 +1202,177 @@ namespace Vocaluxe.Lib.Draw
} }
} }
/// <summary>
/// Draws a reflection of a texture
/// </summary>
/// <param name="Texture">The texture of which a reflection should be drawn</param>
/// <param name="rect">A SRectF struct containing the destination coordinates</param>
/// <param name="color">A SColorF struct containing a color which the texture will be colored in</param>
/// <param name="bounds">A SRectF struct containing which part of the texture should be drawn</param>
/// <param name="space">The space between the texture and the reflection</param>
/// <param name="height">The height of the reflection</param>
public void DrawTextureReflection(STexture Texture, SRectF rect, SColorF color, SRectF bounds, float space, float height)
{
if (_TextureExists(ref Texture))
{
if (rect.W == 0f || rect.H == 0f || bounds.H == 0f || bounds.W == 0f || color.A == 0f || height <= 0f)
return;
if (bounds.X > rect.X + rect.W || bounds.X + bounds.W < rect.X)
return;
if (bounds.Y > rect.Y + rect.H || bounds.Y + bounds.H < rect.Y)
return;
if (height > bounds.H)
height = bounds.H;
if (_TextureExists(ref Texture))
{
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 - height) / rect.H * Texture.height_ratio;
float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * Texture.height_ratio;
if (x1 < 0)
x1 = 0f;
if (x2 > Texture.width_ratio)
x2 = Texture.width_ratio;
if (y1 < 0)
y1 = 0f;
if (y2 > Texture.height_ratio)
y2 = Texture.height_ratio;
float rx1 = rect.X;
float rx2 = rect.X + rect.W;
float ry1 = rect.Y + rect.H + space;
float ry2 = rect.Y + rect.H + space + height;
if (rx1 < bounds.X)
rx1 = bounds.X;
if (rx2 > bounds.X + bounds.W)
rx2 = bounds.X + bounds.W;
if (ry1 < bounds.Y + space)
ry1 = bounds.Y + space;
if (ry2 > bounds.Y + bounds.H + space + height)
ry2 = bounds.Y + bounds.H + space + height;
//Align the pixels because Direct3D expects the pixels to be the left top corner
rx1 -= 0.5f;
ry1 -= 0.5f;
rx2 -= 0.5f;
ry2 -= 0.5f;
//Apply rotation
//FIXME: Rotated textures get distorted when they hit the border of the window
if (rect.Rotation != 0)
{
rect.Rotation = rect.Rotation * (float)Math.PI / 180;
float centerX = (rx1 + rx2) / 2f;
float centerY = -(ry1 + ry2) / 2f;
Matrix originTranslation = _Device.GetTransform(TransformState.World);
Matrix translationA = Matrix.Translation(-centerX, -centerY, 0);
Matrix rotation = Matrix.RotationZ(-rect.Rotation);
Matrix translationB = Matrix.Translation(centerX, centerY, 0);
//Multiplicate the matrices to get the real world matrix,
//First shift the texture into the center
//Rotate it and shift it back to the origin position
//Apply the originTranslation after
Matrix result = translationA * rotation * translationB * originTranslation;
_Device.SetTransform(TransformState.World, result);
}
Color c = Color.FromArgb((int)(color.A * 255 * CGraphics.GlobalAlpha), (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
Color transparent = Color.FromArgb(0, (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
//Create new vertices and write them into a vertexbuffer
DataStream stream = _VertexBuffer.Lock(0, 0, LockFlags.Discard);
stream.WriteRange(new[] {
new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()),
new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), transparent.ToArgb()),
new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), transparent.ToArgb()),
new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()),
});
_VertexBuffer.Unlock();
stream.Dispose();
//Set the texture
_Device.SetTexture(0, _D3DTextures[Texture.index]);
//Draw 2 triangles to build a quad
_Device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 2);
//Reapply old matrices if the texture was rotated
if (rect.Rotation != 0)
{
Matrix originTranslation = Matrix.Translation(new Vector3(-CSettings.iRenderW / 2, CSettings.iRenderH / 2, 0));
_Device.SetTransform(TransformState.World, originTranslation);
}
}
}
}
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 < 0)
return;
texture.width = q.width;
texture.height = q.height;
texture.w2 = NextPowerOfTwo(texture.width);
texture.h2 = NextPowerOfTwo(texture.height);
texture.width_ratio = texture.width / texture.w2;
texture.height_ratio = texture.height / texture.h2;
Texture t = new Texture(_Device, (int)texture.w2, (int)texture.h2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed);
DataRectangle rect = t.LockRectangle(0, LockFlags.None);
for (int i = 0; i < q.data.Length; )
{
rect.Data.Write(q.data, i, 4 * q.width);
i += 4 * q.width;
rect.Data.Position = rect.Data.Position - 4 * q.width;
rect.Data.Position += rect.Pitch;
}
t.UnlockRectangle(0);
_D3DTextures[q.ID] = t;
// 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;
_Queque.RemoveAt(0);
}
}
/// <summary> /// <summary>
/// Gets the count of current textures /// Gets the count of current textures
/// </summary> /// </summary>
+6 -1
View File
@@ -256,7 +256,7 @@ namespace Vocaluxe.Lib.Draw
CFonts.Height = Height; CFonts.Height = Height;
CFonts.SetFont(text.Fon); CFonts.SetFont(text.Fon);
CFonts.Style = text.Style; 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() public void ClearScreen()
@@ -400,6 +400,11 @@ namespace Vocaluxe.Lib.Draw
return new STexture(-1); 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) public STexture AddTexture(int W, int H, ref byte[] Data)
{ {
Bitmap bmp = new Bitmap(W, H); Bitmap bmp = new Bitmap(W, H);
+201 -54
View File
@@ -18,14 +18,21 @@ using Vocaluxe.Menu;
namespace Vocaluxe.Lib.Draw namespace Vocaluxe.Lib.Draw
{ {
public struct SClientRect struct SClientRect
{ {
public Point location; public Point location;
public int width; public int width;
public int height; public int height;
}; };
struct STextureQueque
{
public int ID;
public int width;
public int height;
public byte[] data;
}
class COpenGL : Form, IDraw class COpenGL : Form, IDraw
{ {
#region private vars #region private vars
@@ -40,6 +47,10 @@ namespace Vocaluxe.Lib.Draw
private bool _fullscreen = false; private bool _fullscreen = false;
private List<STexture> _Textures; private List<STexture> _Textures;
private Queue<int> _IDs;
private List<STextureQueque> _Queque;
private Object MutexTexture = new Object();
private int h = 1; private int h = 1;
private int w = 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)); this.Icon = new System.Drawing.Icon(Path.Combine(System.Environment.CurrentDirectory, CSettings.sIcon));
_Textures = new List<STexture>(); _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 //Check AA Mode
CConfig.AAMode = (EAntiAliasingModes)CheckAntiAliasingMode((int)CConfig.AAMode); CConfig.AAMode = (EAntiAliasingModes)CheckAntiAliasingMode((int)CConfig.AAMode);
@@ -440,12 +458,15 @@ namespace Vocaluxe.Lib.Draw
ClearScreen(); ClearScreen();
_Run = _Run && CGraphics.Draw(); _Run = _Run && CGraphics.Draw();
_Run = CGraphics.UpdateGameLogic(_Keys, _Mouse); _Run = CGraphics.UpdateGameLogic(_Keys, _Mouse);
control.SwapBuffers(); control.SwapBuffers();
if ((CSettings.bFullScreen && !_fullscreen) || (!CSettings.bFullScreen && _fullscreen)) if ((CSettings.bFullScreen && !_fullscreen) || (!CSettings.bFullScreen && _fullscreen))
ToggleFullScreen(); ToggleFullScreen();
CheckQueque();
if (CTime.IsRunning()) if (CTime.IsRunning())
delay = (int)Math.Floor(CConfig.CalcCycleTime() - CTime.GetMilliseconds()); delay = (int)Math.Floor(CConfig.CalcCycleTime() - CTime.GetMilliseconds());
@@ -490,7 +511,7 @@ namespace Vocaluxe.Lib.Draw
CFonts.Height = Height; CFonts.Height = Height;
CFonts.SetFont(text.Fon); CFonts.SetFont(text.Fon);
CFonts.Style = text.Style; 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 #region Basic Draw Methods
@@ -505,7 +526,7 @@ namespace Vocaluxe.Lib.Draw
int id = GL.GenTexture(); int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id); GL.BindTexture(TextureTarget.Texture2D, id);
texture.index = id; texture.ID = id;
texture.width = w; texture.width = w;
texture.height = h; texture.height = h;
@@ -529,21 +550,26 @@ namespace Vocaluxe.Lib.Draw
// Add to Texture List // Add to Texture List
texture.color = new SColorF(1f, 1f, 1f, 1f); texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); 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; return texture;
} }
public void CopyScreen(ref STexture 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); RemoveTexture(ref Texture);
Texture = CopyScreen(); Texture = CopyScreen();
} }
else else
{ {
GL.BindTexture(TextureTarget.Texture2D, Texture.index); GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
GL.CopyTexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, 0, 0, GL.CopyTexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, 0, 0,
(int)Texture.width, (int)Texture.height); (int)Texture.width, (int)Texture.height);
@@ -643,10 +669,6 @@ namespace Vocaluxe.Lib.Draw
if (bmp.Height == 0 || bmp.Width == 0) if (bmp.Height == 0 || bmp.Width == 0)
return texture; return texture;
int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);
texture.index = id;
int MaxSize; int MaxSize;
switch (CConfig.TextureQuality) switch (CConfig.TextureQuality)
{ {
@@ -685,6 +707,10 @@ namespace Vocaluxe.Lib.Draw
h = MaxSize; h = MaxSize;
} }
int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);
texture.ID = id;
texture.width = w; texture.width = w;
texture.height = h; texture.height = h;
@@ -696,7 +722,8 @@ namespace Vocaluxe.Lib.Draw
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height)); g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height));
g.Dispose();
texture.width_ratio = 1f; texture.width_ratio = 1f;
texture.height_ratio = 1f; texture.height_ratio = 1f;
@@ -727,7 +754,12 @@ namespace Vocaluxe.Lib.Draw
texture.color = new SColorF(1f, 1f, 1f, 1f); texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
texture.TexturePath = String.Empty; texture.TexturePath = String.Empty;
_Textures.Add(texture);
lock (MutexTexture)
{
texture.index = _IDs.Dequeue();
_Textures.Add(texture);
}
return texture; return texture;
} }
@@ -753,7 +785,7 @@ namespace Vocaluxe.Lib.Draw
int id = GL.GenTexture(); int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id); GL.BindTexture(TextureTarget.Texture2D, id);
texture.index = id; texture.ID = id;
texture.width = W; texture.width = W;
texture.height = H; texture.height = H;
@@ -786,8 +818,13 @@ namespace Vocaluxe.Lib.Draw
texture.color = new SColorF(1f, 1f, 1f, 1f); texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
texture.TexturePath = String.Empty; texture.TexturePath = String.Empty;
_Textures.Add(texture);
lock (MutexTexture)
{
texture.index = _IDs.Dequeue();
_Textures.Add(texture);
}
return texture; return texture;
} }
@@ -813,7 +850,7 @@ namespace Vocaluxe.Lib.Draw
int id = GL.GenTexture(); int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id); GL.BindTexture(TextureTarget.Texture2D, id);
texture.index = id; texture.ID = id;
texture.width = W; texture.width = W;
texture.height = H; texture.height = H;
@@ -846,14 +883,39 @@ namespace Vocaluxe.Lib.Draw
texture.color = new SColorF(1f, 1f, 1f, 1f); texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
texture.TexturePath = String.Empty; 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; return texture;
} }
public bool UpdateTexture(ref STexture Texture, IntPtr Data) public bool UpdateTexture(ref STexture Texture, IntPtr Data)
{ {
if (_TextureExists(Texture)) if (_TextureExists(ref Texture))
{ {
if (_UsePBO) if (_UsePBO)
{ {
@@ -869,7 +931,7 @@ namespace Vocaluxe.Lib.Draw
GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer); 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, GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); 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, GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, Data); 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) public bool UpdateTexture(ref STexture Texture, ref byte[] Data)
{ {
if (_TextureExists(Texture)) if (_TextureExists(ref Texture))
{ {
if (_UsePBO) if (_UsePBO)
{ {
@@ -921,7 +983,7 @@ namespace Vocaluxe.Lib.Draw
GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer); 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, GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); 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, GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, Data); OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, Data);
@@ -963,30 +1025,41 @@ namespace Vocaluxe.Lib.Draw
{ {
if ((Texture.index > 0) && (_Textures.Count > 0)) if ((Texture.index > 0) && (_Textures.Count > 0))
{ {
for (int i = 0; i < _Textures.Count; i++) lock (MutexTexture)
{ {
if (_Textures[i].index == Texture.index) for (int i = 0; i < _Textures.Count; i++)
{ {
GL.DeleteTexture(Texture.index); if (_Textures[i].index == Texture.index)
if (Texture.PBO > 0) {
GL.DeleteBuffers(1, ref Texture.PBO); _IDs.Enqueue(Texture.index);
_Textures.RemoveAt(i);
Texture.index = -1; GL.DeleteTexture(Texture.ID);
break; 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++) 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) if (bounds.Y > rect.Y + rect.H || bounds.Y + bounds.H < rect.Y)
return; 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 x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
float x2 = (bounds.X + bounds.W - 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; float y1 = (bounds.Y - rect.Y) / rect.H * Texture.height_ratio;
@@ -1073,21 +1146,21 @@ namespace Vocaluxe.Lib.Draw
GL.MatrixMode(MatrixMode.Texture); GL.MatrixMode(MatrixMode.Texture);
GL.PushMatrix(); GL.PushMatrix();
if (rect.Rotation != 0f) if (rect.Rotation != 0f)
{ {
GL.Translate(0.5f, 0.5f, 0); GL.Translate(0.5f, 0.5f, 0);
GL.Rotate(-rect.Rotation, 0f, 0f, 1f); GL.Rotate(-rect.Rotation, 0f, 0f, 1f);
GL.Translate(-0.5f, -0.5f, 0); GL.Translate(-0.5f, -0.5f, 0);
} }
if (!mirrored) if (!mirrored)
{ {
GL.Begin(BeginMode.Quads); GL.Begin(BeginMode.Quads);
GL.TexCoord2(x1, y1); GL.TexCoord2(x1, y1);
GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset); GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset);
GL.TexCoord2(x1, y2); GL.TexCoord2(x1, y2);
GL.Vertex3(rx1, ry2, rect.Z + CGraphics.ZOffset); GL.Vertex3(rx1, ry2, rect.Z + CGraphics.ZOffset);
@@ -1119,7 +1192,7 @@ namespace Vocaluxe.Lib.Draw
} }
GL.PopMatrix(); GL.PopMatrix();
GL.Disable(EnableCap.Blend); GL.Disable(EnableCap.Blend);
GL.BindTexture(TextureTarget.Texture2D, 0); 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) 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.Enable(EnableCap.Blend);
GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha); GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha);
GL.Begin(BeginMode.Quads); GL.Begin(BeginMode.Quads);
GL.TexCoord2(0f + begin * Texture.width_ratio, 0f); 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.Vertex3(rect.X + end * rect.W, rect.Y, rect.Z + CGraphics.ZOffset);
GL.End(); GL.End();
GL.Disable(EnableCap.Blend); GL.Disable(EnableCap.Blend);
GL.BindTexture(TextureTarget.Texture2D, 0); GL.BindTexture(TextureTarget.Texture2D, 0);
@@ -1171,9 +1244,9 @@ namespace Vocaluxe.Lib.Draw
if (height > bounds.H) if (height > bounds.H)
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 x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
float x2 = (bounds.X + bounds.W - 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; ry2 = bounds.Y + bounds.H + space + height;
GL.Enable(EnableCap.Blend); GL.Enable(EnableCap.Blend);
GL.MatrixMode(MatrixMode.Texture); GL.MatrixMode(MatrixMode.Texture);
GL.PushMatrix(); GL.PushMatrix();
@@ -1222,7 +1295,7 @@ namespace Vocaluxe.Lib.Draw
GL.Translate(-0.5f, -0.5f, 0); GL.Translate(-0.5f, -0.5f, 0);
} }
GL.Begin(BeginMode.Quads); GL.Begin(BeginMode.Quads);
GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha); 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.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset);
GL.End(); GL.End();
GL.PopMatrix(); GL.PopMatrix();
@@ -1255,6 +1328,80 @@ namespace Vocaluxe.Lib.Draw
{ {
return _Textures.Count; 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 Textures
#endregion implementation #endregion implementation
+5 -2
View File
@@ -67,6 +67,7 @@ namespace Vocaluxe.Lib.Draw
{ {
public int index; public int index;
public int PBO; public int PBO;
public int ID;
public string TexturePath; public string TexturePath;
@@ -85,10 +86,11 @@ namespace Vocaluxe.Lib.Draw
{ {
index = Index; index = Index;
PBO = 0; PBO = 0;
ID = -1;
TexturePath = String.Empty; TexturePath = String.Empty;
width = 0f; width = 1f;
height = 0f; height = 1f;
rect = new SRectF(0f, 0f, 1f, 1f, 0f); rect = new SRectF(0f, 0f, 1f, 1f, 0f);
w2 = 2f; w2 = 2f;
@@ -136,6 +138,7 @@ namespace Vocaluxe.Lib.Draw
STexture AddTexture(Bitmap Bitmap); STexture AddTexture(Bitmap Bitmap);
STexture AddTexture(int W, int H, IntPtr Data); STexture AddTexture(int W, int H, IntPtr Data);
STexture AddTexture(int W, int H, ref byte[] 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, ref byte[] Data);
bool UpdateTexture(ref STexture Texture, IntPtr Data); bool UpdateTexture(ref STexture Texture, IntPtr Data);
+36 -30
View File
@@ -245,6 +245,8 @@ namespace Vocaluxe.Lib.Song
private int _EndBeat; private int _EndBeat;
private bool _PerfectLine; // for drawing perfect line effect private bool _PerfectLine; // for drawing perfect line effect
private int _MinBeat = int.MaxValue;
private int _MaxBeat = int.MinValue;
private List<CNote> _Notes; private List<CNote> _Notes;
#region Constructors #region Constructors
@@ -263,14 +265,7 @@ namespace Vocaluxe.Lib.Song
get { return _StartBeat; } get { return _StartBeat; }
set set
{ {
int min = int.MaxValue; if (value <= _MinBeat)
foreach (CNote note in _Notes)
{
if (note.StartBeat < min)
min = note.StartBeat;
}
if (value <= min)
_StartBeat = value; _StartBeat = value;
} }
} }
@@ -280,14 +275,7 @@ namespace Vocaluxe.Lib.Song
get { return _EndBeat; } get { return _EndBeat; }
set set
{ {
int max = int.MinValue; if (value >= _MaxBeat)
foreach (CNote note in _Notes)
{
if (note.EndBeat > max)
max = note.EndBeat;
}
if (value >= max)
_EndBeat = value; _EndBeat = value;
} }
} }
@@ -302,13 +290,7 @@ namespace Vocaluxe.Lib.Song
{ {
get get
{ {
int Result = int.MaxValue; return _MinBeat;
foreach (CNote note in _Notes)
{
if (note.StartBeat < Result)
Result = note.StartBeat;
}
return Result;
} }
} }
@@ -316,13 +298,7 @@ namespace Vocaluxe.Lib.Song
{ {
get get
{ {
int Result = int.MinValue; return _MaxBeat;
foreach (CNote note in _Notes)
{
if (note.EndBeat > Result)
Result = note.EndBeat;
}
return Result;
} }
} }
@@ -429,6 +405,7 @@ namespace Vocaluxe.Lib.Song
public void AddNote(CNote Note) public void AddNote(CNote Note)
{ {
_Notes.Add(Note); _Notes.Add(Note);
updateMinMaxBeat(Note);
} }
public bool InsertNote(CNote Note, int Index) public bool InsertNote(CNote Note, int Index)
@@ -436,6 +413,7 @@ namespace Vocaluxe.Lib.Song
if (_Notes.Count >= Index) if (_Notes.Count >= Index)
{ {
_Notes.Insert(Index, Note); _Notes.Insert(Index, Note);
updateMinMaxBeat(Note);
return true; return true;
} }
return false; return false;
@@ -446,6 +424,7 @@ namespace Vocaluxe.Lib.Song
if (_Notes.Count > Index) if (_Notes.Count > Index)
{ {
_Notes.RemoveAt(Index); _Notes.RemoveAt(Index);
updateMinMaxBeat();
return true; return true;
} }
return false; return false;
@@ -457,6 +436,7 @@ namespace Vocaluxe.Lib.Song
{ {
_Notes.RemoveAt(Index); _Notes.RemoveAt(Index);
_Notes.Insert(Index, Note); _Notes.Insert(Index, Note);
updateMinMaxBeat();
return true; return true;
} }
return false; return false;
@@ -467,6 +447,7 @@ namespace Vocaluxe.Lib.Song
if (_Notes.Count > 0) if (_Notes.Count > 0)
{ {
_Notes[_Notes.Count - 1].Duration++; _Notes[_Notes.Count - 1].Duration++;
updateMinMaxBeat();
} }
return false; return false;
} }
@@ -474,6 +455,31 @@ namespace Vocaluxe.Lib.Song
public void DeleteAllNotes() public void DeleteAllNotes()
{ {
_Notes.Clear(); _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 #endregion Methods
} }
+5 -1
View File
@@ -25,6 +25,7 @@ namespace Vocaluxe.Lib.Song
class CSong class CSong
{ {
private bool _CoverLoaded = false; private bool _CoverLoaded = false;
private bool _NotesLoaded = false;
private STexture _CoverTextureSmall = new STexture(-1); private STexture _CoverTextureSmall = new STexture(-1);
private STexture _CoverTextureBig = new STexture(-1); private STexture _CoverTextureBig = new STexture(-1);
@@ -54,7 +55,9 @@ namespace Vocaluxe.Lib.Song
{ {
if (!_CoverLoaded) if (!_CoverLoaded)
{ {
this.ReadNotes(); if (!_NotesLoaded)
this.ReadNotes();
if (this.CoverFileName != String.Empty) if (this.CoverFileName != String.Empty)
{ {
if (!CDataBase.GetCover(Path.Combine(this.Folder, this.CoverFileName), ref _CoverTextureSmall, CConfig.CoverSize)) if (!CDataBase.GetCover(Path.Combine(this.Folder, this.CoverFileName), ref _CoverTextureSmall, CConfig.CoverSize))
@@ -471,6 +474,7 @@ namespace Vocaluxe.Lib.Song
CLog.LogError("Error loading song. Line No.: " + FileLineNo.ToString() + ". An unhandled exception occured (" + e.Message + "): " + FilePath); CLog.LogError("Error loading song. Line No.: " + FileLineNo.ToString() + ". An unhandled exception occured (" + e.Message + "): " + FilePath);
return false; return false;
} }
_NotesLoaded = true;
return true; return true;
} }
+1 -1
View File
@@ -343,7 +343,7 @@ namespace Vocaluxe.Menu
CBackgroundMusic.Update(); CBackgroundMusic.Update();
if (CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_DYNAMIC && _CurrentScreen != EScreens.ScreenSing) if (CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_DYNAMIC && _CurrentScreen != EScreens.ScreenSing)
CSongs.LoadCover(30L); CSongs.LoadCover(30L, 1);
if (CSettings.GameState != EGameState.EditTheme) if (CSettings.GameState != EGameState.EditTheme)
{ {
+246 -61
View File
@@ -14,27 +14,164 @@ namespace Vocaluxe.Menu
{ {
public string Name; public string Name;
public string Text;
public string ColorName; public string ColorName;
public string SColorName; //for Buttons 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 class CText : IMenuElement
{ {
private SThemeText _Theme; private SThemeText _Theme;
private bool _ThemeLoaded; private bool _ThemeLoaded;
private bool _ButtonText; private bool _ButtonText;
private bool _PositionNeedsUpdate = true;
public float X; //left private STextPosition _DrawPosition = new STextPosition(0);
public float Y; //higher
public float Z;
public float Height;
public float MaxWidth;
public SRectF Bounds;
public EAlignment Align; private float _X = 0f;
public EStyle Style; public float X //left
public string Fon; {
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 Color; //normal Color
public SColorF SColor; //selected Color for Buttons public SColorF SColor; //selected Color for Buttons
@@ -42,7 +179,22 @@ namespace Vocaluxe.Menu
public float ReflectionSpace; public float ReflectionSpace;
public float ReflectionHeight; 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 Selected;
public bool Visible = true; public bool Visible = true;
@@ -94,7 +246,7 @@ namespace Vocaluxe.Menu
Color = new SColorF(r, g, b, a); Color = new SColorF(r, g, b, a);
SColor = new SColorF(r, g, b, a); SColor = new SColorF(r, g, b, a);
text = Text; Text = text;
Selected = false; Selected = false;
@@ -130,7 +282,7 @@ namespace Vocaluxe.Menu
Color = new SColorF(r, g, b, a); Color = new SColorF(r, g, b, a);
SColor = new SColorF(r, g, b, a); SColor = new SColorF(r, g, b, a);
text = Text; Text = text;
Selected = false; Selected = false;
@@ -226,14 +378,14 @@ namespace Vocaluxe.Menu
string item = XmlPath + "/" + ElementName; string item = XmlPath + "/" + ElementName;
_ThemeLoaded = true; _ThemeLoaded = true;
_ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/X", navigator, ref X); _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/X", navigator, ref _X);
_ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Y", navigator, ref Y); _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/Y", navigator, ref _Y);
if (!ButtonText) 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); _ThemeLoaded &= CHelper.TryGetFloatValueFromXML(item + "/H", navigator, ref _Height);
CHelper.TryGetFloatValueFromXML(item + "/MaxW", navigator, ref MaxWidth); CHelper.TryGetFloatValueFromXML(item + "/MaxW", navigator, ref _MaxWidth);
if (CHelper.GetValueFromXML(item + "/Color", navigator, ref _Theme.ColorName, String.Empty)) 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<EAlignment>(item + "/Align", navigator, ref _Align);
_ThemeLoaded &= CHelper.TryGetEnumValueFromXML<EStyle>(item + "/Style", navigator, ref Style); _ThemeLoaded &= CHelper.TryGetEnumValueFromXML<EStyle>(item + "/Style", navigator, ref _Style);
_ThemeLoaded &= CHelper.GetValueFromXML(item + "/Font", navigator, ref Fon, "Normal"); _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) if (CHelper.ItemExistsInXML(item + "/Reflection", navigator) && !ButtonText)
{ {
@@ -276,6 +428,17 @@ namespace Vocaluxe.Menu
else else
Reflection = false; 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) if (_ThemeLoaded)
{ {
_Theme.Name = ElementName; _Theme.Name = ElementName;
@@ -352,8 +515,8 @@ namespace Vocaluxe.Menu
writer.WriteElementString("Font", Fon); writer.WriteElementString("Font", Fon);
writer.WriteComment("<Text>: Text or translation tag"); writer.WriteComment("<Text>: Text or translation tag");
if (CLanguage.TranslationExists(Text)) if (CLanguage.TranslationExists(_Theme.Text))
writer.WriteElementString("Text", Text); writer.WriteElementString("Text", _Theme.Text);
else else
writer.WriteElementString("Text", string.Empty); writer.WriteElementString("Text", string.Empty);
@@ -394,29 +557,14 @@ namespace Vocaluxe.Menu
if (!ForceDraw && !Visible && CSettings.GameState != EGameState.EditTheme) if (!ForceDraw && !Visible && CSettings.GameState != EGameState.EditTheme)
return; return;
float h = Height; // Update Text
float y = Y; Text = Text;
RectangleF bounds = CDraw.GetTextBounds(this);
while (bounds.Width > Bounds.W) if (_PositionNeedsUpdate)
{ UpdateTextPosition();
h -= 0.2f;
y += 0.1f;
bounds = CDraw.GetTextBounds(this, h);
}
float x = X; CFonts.SetFont(Fon);
switch (Align) CFonts.Style = Style;
{
case EAlignment.Center:
x = X - bounds.Width / 2;
break;
case EAlignment.Right:
x = X - bounds.Width;
break;
default:
break;
}
SColorF CurrentColor = new SColorF(Color); SColorF CurrentColor = new SColorF(Color);
if (Selected) if (Selected)
@@ -424,22 +572,21 @@ namespace Vocaluxe.Menu
SColorF color = new SColorF(CurrentColor.R, CurrentColor.G, CurrentColor.B, CurrentColor.A * Alpha); SColorF color = new SColorF(CurrentColor.R, CurrentColor.G, CurrentColor.B, CurrentColor.A * Alpha);
CFonts.SetFont(Fon);
CFonts.Style = Style; CFonts.DrawText(_Text, _DrawPosition.tH, _DrawPosition.X, _DrawPosition.Y, Z, color);
CFonts.DrawText(CLanguage.Translate(Text), h, x, y, Z, color);
if (Reflection) 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)) 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) 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)); 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) 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) public void DrawRelative(float rx, float ry, bool reflection, float reflectionSpace, float reflectionHeight, float rectHeight)
{ {
// Update Text
Text = Text;
float h = Height; float h = Height;
float x = X + rx; float x = X + rx;
@@ -529,22 +676,19 @@ namespace Vocaluxe.Menu
CFonts.SetFont(Fon); CFonts.SetFont(Fon);
CFonts.Style = Style; CFonts.Style = Style;
CFonts.DrawText(CLanguage.Translate(Text), h, x, y, Z, color); CFonts.DrawText(_Text, h, x, y, Z, color);
if (reflection) if (reflection)
{ {
float space = (rectHeight - Y - bounds.Height) * 2f + reflectionSpace; float space = (rectHeight - Y - bounds.Height) * 2f + reflectionSpace;
float height = reflectionHeight - (rectHeight - Y) + bounds.Height; 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)) 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(x, y, bounds.Width, bounds.Height, Z));
} }
CFonts.SetFont("Normal");
CFonts.Style = EStyle.Normal;
} }
public void UnloadTextures() public void UnloadTextures()
@@ -580,5 +724,46 @@ namespace Vocaluxe.Menu
Height = 1; Height = 1;
} }
#endregion ThemeEdit #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;
}
} }
} }
+1
View File
@@ -152,6 +152,7 @@ namespace Vocaluxe
CVideo.VdCloseAll(); CVideo.VdCloseAll();
CDraw.Unload(); CDraw.Unload();
CLog.CloseAll(); CLog.CloseAll();
CDataBase.CloseConnections();
} }
static Assembly AssemblyResolver(Object sender, ResolveEventArgs args) static Assembly AssemblyResolver(Object sender, ResolveEventArgs args)
+98 -5
View File
@@ -41,6 +41,10 @@ namespace Vocaluxe.Screens
private Stopwatch LogoTimer; private Stopwatch LogoTimer;
private Stopwatch CreditsTimer; private Stopwatch CreditsTimer;
private Stopwatch TextTimer;
private List<string[]> paragraphs;
private List<CText> paragraphTexts;
public CScreenCredits() public CScreenCredits()
{ {
@@ -56,6 +60,40 @@ namespace Vocaluxe.Screens
LogoTimer = new Stopwatch(); LogoTimer = new Stopwatch();
CreditsTimer = new Stopwatch(); CreditsTimer = new Stopwatch();
TextTimer = new Stopwatch();
//Text for last part of credits.
paragraphTexts = new List<CText>();
paragraphs = new List<string[]>();
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 = "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 = "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 bool HandleInput(KeyEvent KeyEvent) public override bool HandleInput(KeyEvent KeyEvent)
@@ -210,9 +248,42 @@ namespace Vocaluxe.Screens
CreditEntryPinky007.direction = EDirection.Right; CreditEntryPinky007.direction = EDirection.Right;
_CreditNames.Add(CreditEntryPinky007); _CreditNames.Add(CreditEntryPinky007);
//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];
//CreditEntry.image = new CStatic(tex, new SColorF(1, 1, 1, 1), new SRectF(0, 0, 350, 110, -4)); //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;
}
}
}
}
TextTimer.Reset();
LogoTimer.Reset();
CreditsTimer.Reset();
} }
public override void OnShowFinish() public override void OnShowFinish()
@@ -247,6 +318,15 @@ namespace Vocaluxe.Screens
_CreditNames[i].particle.Draw(); _CreditNames[i].particle.Draw();
} }
} }
//Draw Text
if (TextTimer.IsRunning)
{
for (int i = 0; i < paragraphTexts.Count; i++)
{
paragraphTexts[i].Draw();
}
}
return true; return true;
} }
@@ -347,12 +427,13 @@ namespace Vocaluxe.Screens
//Check, if last name is set to false //Check, if last name is set to false
if (i == _CreditNames.Count - 1) if (i == _CreditNames.Count - 1)
{ {
//Will later fade to Main-Screen
active = false;
//Stop and reset timer for next time //Stop and reset timer for next time
CreditsTimer.Stop(); CreditsTimer.Stop();
CreditsTimer.Reset(); CreditsTimer.Reset();
//Start Text-Timer
TextTimer.Start();
active = true;
} }
} }
break; break;
@@ -361,6 +442,18 @@ namespace Vocaluxe.Screens
} }
} }
if (TextTimer.IsRunning)
{
if (TextTimer.ElapsedMilliseconds > 600000)
{
active = false;
}
else
{
active = true;
}
}
return active; return active;
} }
} }
+3 -1
View File
@@ -135,6 +135,7 @@ namespace Vocaluxe.Screens
} }
CLog.StartBenchmark(3, "Load Cover"); CLog.StartBenchmark(3, "Load Cover");
_SongLoaderThread.IsBackground = true;
_SongLoaderThread.Start(); _SongLoaderThread.Start();
_timer.Start(); _timer.Start();
@@ -153,7 +154,7 @@ namespace Vocaluxe.Screens
if (CSongs.SongsLoaded && CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_ATSTART && _timer.ElapsedMilliseconds > 1000L) 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) || bool next = ((CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_ATSTART && CSongs.CoverLoaded) ||
@@ -306,6 +307,7 @@ namespace Vocaluxe.Screens
_Finished = CVideo.VdFinished(_VideoStream); _Finished = CVideo.VdFinished(_VideoStream);
STexture tex = new STexture(-1); STexture tex = new STexture(-1);
tex.height = 0f;
CVideo.VdGetFrame(_VideoStream, ref tex, VideoTime, ref VideoTime); CVideo.VdGetFrame(_VideoStream, ref tex, VideoTime, ref VideoTime);
if (tex.height > 0) if (tex.height > 0)
+4
View File
@@ -136,7 +136,11 @@ namespace Vocaluxe.Screens
base.DrawFG(); base.DrawFG();
if (CSettings.VersionRevision != ERevision.Release) if (CSettings.VersionRevision != ERevision.Release)
{
CFonts.SetFont("Normal");
CFonts.Style = EStyle.Normal;
CDraw.DrawText(CSettings.GetFullVersionText(), 10, 680, 40); CDraw.DrawText(CSettings.GetFullVersionText(), 10, 680, 40);
}
return true; return true;
} }
+29 -4
View File
@@ -54,9 +54,16 @@ namespace Vocaluxe.Screens
{ {
base.HandleInput(KeyEvent); 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 else
{ {
@@ -71,7 +78,7 @@ namespace Vocaluxe.Screens
if (CSongs.Category < 0 || CConfig.Tabs == EOffOn.TR_CONFIG_OFF) if (CSongs.Category < 0 || CConfig.Tabs == EOffOn.TR_CONFIG_OFF)
CGraphics.FadeTo(EScreens.ScreenMain); CGraphics.FadeTo(EScreens.ScreenMain);
break; break;
case Keys.Enter: case Keys.Enter:
if (CSongs.NumVisibleSongs > 0) if (CSongs.NumVisibleSongs > 0)
StartSong(SongMenus[htSongMenus(SongMenu)].GetSelectedSong()); StartSong(SongMenus[htSongMenus(SongMenu)].GetSelectedSong());
@@ -128,7 +135,7 @@ namespace Vocaluxe.Screens
break; break;
case Keys.R: case Keys.R:
if (CSongs.Category != -1) if (CSongs.Category != -1 && KeyEvent.Mod == Modifier.Ctrl)
{ {
SongMenus[htSongMenus(SongMenu)].SetSelectedSong(CSongs.GetRandomSong()); SongMenus[htSongMenus(SongMenu)].SetSelectedSong(CSongs.GetRandomSong());
} }
@@ -289,6 +296,24 @@ namespace Vocaluxe.Screens
CGraphics.FadeTo(EScreens.ScreenNames); 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) private void ApplyNewSearchFilter(string NewFilterString)
{ {
int song = SongMenus[htSongMenus(SongMenu)].GetSelectedSong(); int song = SongMenus[htSongMenus(SongMenu)].GetSelectedSong();