diff --git a/PartyModes/PartyModeChallengeMedley/CChallengeRounds.cs b/PartyModes/PartyModeChallengeMedley/CChallengeRounds.cs index 4114320b..d2345005 100644 --- a/PartyModes/PartyModeChallengeMedley/CChallengeRounds.cs +++ b/PartyModes/PartyModeChallengeMedley/CChallengeRounds.cs @@ -146,7 +146,7 @@ namespace VocaluxeLib.PartyModes.ChallengeMedley _Rand = rand; } - public CCombination GetNextCombination(List playerNrDemand) + public CCombination GetNextCombination(IEnumerable playerNrDemand) { if (_Combs.Count == 0) _Create(); diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs index c4f40329..3bcbd703 100644 --- a/Vocaluxe/Base/CBackgroundMusic.cs +++ b/Vocaluxe/Base/CBackgroundMusic.cs @@ -24,6 +24,9 @@ using System.IO; using System.Linq; using VocaluxeLib; using VocaluxeLib.Songs; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu; +using VocaluxeLib.Menu.SongMenu; namespace Vocaluxe.Base { @@ -39,7 +42,7 @@ namespace Vocaluxe.Base private static readonly List _PreviousFileNames = new List(); private static int _Video = -1; - private static STexture _CurrentVideoTexture = new STexture(-1); + private static CTexture _CurrentVideoTexture; private static readonly Stopwatch _FadeTimer = new Stopwatch(); private static bool _VideoEnabled; @@ -118,7 +121,7 @@ namespace Vocaluxe.Base } } - public static STexture Cover + public static CTexture Cover { get { return _CurrentPlaylistElement.Cover; } } @@ -155,7 +158,7 @@ namespace Vocaluxe.Base CSound.Fade(_CurrentMusicStream, 100f, CSettings.BackgroundMusicFadeTime); CSound.Play(_CurrentMusicStream); if (_VideoEnabled && _Video != -1) - CVideo.VdResume(_Video); + CVideo.Resume(_Video); IsPlaying = true; } else @@ -173,7 +176,7 @@ namespace Vocaluxe.Base if (_VideoEnabled && _Video != -1) { - CVideo.VdClose(_Video); + CVideo.Close(_Video); CDraw.RemoveTexture(ref _CurrentVideoTexture); _Video = -1; } @@ -191,8 +194,8 @@ namespace Vocaluxe.Base if (_VideoEnabled && _Video != -1) { - CVideo.VdPause(_Video); - CVideo.VdSkip(_Video, CSound.GetPosition(_CurrentMusicStream) + CSettings.BackgroundMusicFadeTime, _CurrentPlaylistElement.VideoGap); + CVideo.Pause(_Video); + CVideo.Skip(_Video, CSound.GetPosition(_CurrentMusicStream) + CSettings.BackgroundMusicFadeTime, _CurrentPlaylistElement.VideoGap); } CSound.FadeAndPause(_CurrentMusicStream, 0f, CSettings.BackgroundMusicFadeTime); IsPlaying = false; @@ -221,9 +224,9 @@ namespace Vocaluxe.Base if (_VideoEnabled && _Video != -1) { if (_CurrentPlaylistElement.Start > 0.001 && CConfig.BackgroundMusicUseStart == EOffOn.TR_CONFIG_ON) - CVideo.VdSkip(_Video, _CurrentPlaylistElement.Start, _CurrentPlaylistElement.VideoGap); + CVideo.Skip(_Video, _CurrentPlaylistElement.Start, _CurrentPlaylistElement.VideoGap); else - CVideo.VdSkip(_Video, 0f, _CurrentPlaylistElement.VideoGap); + CVideo.Skip(_Video, 0f, _CurrentPlaylistElement.VideoGap); } } else @@ -287,9 +290,9 @@ namespace Vocaluxe.Base if (_VideoEnabled && _Video != -1) { if (_CurrentPlaylistElement.Start > 0.001 && CConfig.BackgroundMusicUseStart == EOffOn.TR_CONFIG_ON) - CVideo.VdSkip(_Video, _CurrentPlaylistElement.Start, _CurrentPlaylistElement.VideoGap); + CVideo.Skip(_Video, _CurrentPlaylistElement.Start, _CurrentPlaylistElement.VideoGap); else - CVideo.VdSkip(_Video, 0f, _CurrentPlaylistElement.VideoGap); + CVideo.Skip(_Video, 0f, _CurrentPlaylistElement.VideoGap); } } else @@ -319,9 +322,9 @@ namespace Vocaluxe.Base if (_VideoEnabled && _Video != -1) { if (_CurrentPlaylistElement.Start > 0.001 && CConfig.BackgroundMusicUseStart == EOffOn.TR_CONFIG_ON) - CVideo.VdSkip(_Video, _CurrentPlaylistElement.Start, _CurrentPlaylistElement.VideoGap); + CVideo.Skip(_Video, _CurrentPlaylistElement.Start, _CurrentPlaylistElement.VideoGap); else - CVideo.VdSkip(_Video, 0f, _CurrentPlaylistElement.VideoGap); + CVideo.Skip(_Video, 0f, _CurrentPlaylistElement.VideoGap); } } } @@ -441,14 +444,14 @@ namespace Vocaluxe.Base if (_VideoEnabled) { _VideoEnabled = false; - CVideo.VdClose(_Video); + CVideo.Close(_Video); _Video = -1; CDraw.RemoveTexture(ref _CurrentVideoTexture); return; } - if (CVideo.VdFinished(_Video)) + if (CVideo.Finished(_Video)) { - CVideo.VdClose(_Video); + CVideo.Close(_Video); CDraw.RemoveTexture(ref _CurrentVideoTexture); _Video = -1; } @@ -457,22 +460,24 @@ namespace Vocaluxe.Base _LoadVideo(); } - public static STexture GetVideoTexture() + public static CTexture GetVideoTexture() { if (_Video != -1) { float vtime; - CVideo.VdGetFrame(_Video, ref _CurrentVideoTexture, CSound.GetPosition(_CurrentMusicStream), out vtime); - if (_FadeTimer.ElapsedMilliseconds <= 3000L) - _CurrentVideoTexture.Color.A = _FadeTimer.ElapsedMilliseconds / 3000f; - else + if (CVideo.GetFrame(_Video, ref _CurrentVideoTexture, CSound.GetPosition(_CurrentMusicStream), out vtime)) { - _CurrentVideoTexture.Color.A = 1f; - _FadeTimer.Stop(); + if (_FadeTimer.ElapsedMilliseconds <= 3000L) + _CurrentVideoTexture.Color.A = _FadeTimer.ElapsedMilliseconds / 3000f; + else + { + _CurrentVideoTexture.Color.A = 1f; + _FadeTimer.Stop(); + } + return _CurrentVideoTexture; } - return _CurrentVideoTexture; } - return new STexture(-1); + return null; } private static bool _IsBackgroundFile(CPlaylistElement element) @@ -484,11 +489,11 @@ namespace Vocaluxe.Base { if (_Video == -1) { - _Video = CVideo.VdLoad(_CurrentPlaylistElement.VideoFilePath); + _Video = CVideo.Load(_CurrentPlaylistElement.VideoFilePath); if (_CurrentPlaylistElement.Start > 0.001 && CConfig.BackgroundMusicUseStart == EOffOn.TR_CONFIG_ON) - CVideo.VdSkip(_Video, _CurrentPlaylistElement.Start, _CurrentPlaylistElement.VideoGap); + CVideo.Skip(_Video, _CurrentPlaylistElement.Start, _CurrentPlaylistElement.VideoGap); else - CVideo.VdSkip(_Video, 0f, _CurrentPlaylistElement.VideoGap); + CVideo.Skip(_Video, 0f, _CurrentPlaylistElement.VideoGap); _VideoEnabled = true; _FadeTimer.Reset(); _FadeTimer.Start(); @@ -576,7 +581,7 @@ namespace Vocaluxe.Base } } - public STexture Cover + public CTexture Cover { get { diff --git a/Vocaluxe/Base/CCover.cs b/Vocaluxe/Base/CCover.cs index 30c51ef2..43abe8e8 100644 --- a/Vocaluxe/Base/CCover.cs +++ b/Vocaluxe/Base/CCover.cs @@ -23,7 +23,7 @@ using System.IO; using System.Linq; using System.Text; using System.Xml; -using VocaluxeLib; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; namespace Vocaluxe.Base @@ -31,8 +31,7 @@ namespace Vocaluxe.Base struct SCover { public string Name; - public string Value; - public STexture Texture; + public CTexture Texture; } struct SCoverTheme @@ -47,14 +46,10 @@ namespace Vocaluxe.Base private static readonly XmlWriterSettings _Settings = new XmlWriterSettings(); private static readonly List _Cover = new List(); private static readonly List _CoverThemes = new List(); - private static STexture _NoCover = new STexture(-1); private static readonly Object _MutexCover = new Object(); - public static STexture NoCover - { - get { return _NoCover; } - } + public static CTexture NoCover { get; private set; } public static void Init() { @@ -98,21 +93,17 @@ namespace Vocaluxe.Base /// /// Returns a STexture for a given cover name. Returns "NoCover" if the cover does not exist. /// - public static STexture Cover(string name) + public static CTexture Cover(string name) { - STexture cov = _NoCover; lock (_MutexCover) { foreach (SCover cover in _Cover) { if (cover.Name == name) - { - cov = cover.Texture; - break; - } + return cover.Texture; } } - return cov; + return NoCover; } /// @@ -133,7 +124,7 @@ namespace Vocaluxe.Base { foreach (SCover cover in _Cover) { - STexture texture = cover.Texture; + CTexture texture = cover.Texture; CDraw.RemoveTexture(ref texture); } _Cover.Clear(); @@ -145,16 +136,12 @@ namespace Vocaluxe.Base /// private static SCoverTheme _CoverTheme(string coverThemeName) { - SCoverTheme coverTheme = new SCoverTheme(); for (int i = 0; i < _CoverThemes.Count; i++) { if (_CoverThemes[i].Name == coverThemeName) - { - coverTheme = _CoverThemes[i]; - break; - } + return _CoverThemes[i]; } - return coverTheme; + return new SCoverTheme(); } /// @@ -195,7 +182,7 @@ namespace Vocaluxe.Base { SCoverTheme coverTheme = _CoverTheme(coverThemeName); - if (coverTheme.Name == "") + if (String.IsNullOrEmpty(coverTheme.Name)) return; CXMLReader xmlReader = CXMLReader.OpenFile(Path.Combine(CSettings.FolderCover, coverTheme.File)); @@ -207,31 +194,30 @@ namespace Vocaluxe.Base List cover = xmlReader.GetValues("Cover"); foreach (string coverName in cover) { - SCover sk = new SCover(); string name; - string value; + string filePath; xmlReader.GetValue("//root/Cover/" + coverName + "/Name", out name, String.Empty); - xmlReader.GetValue("//root/Cover/" + coverName + "/Path", out value, String.Empty); - sk.Name = name; - sk.Value = Path.Combine(coverTheme.Folder, value); - sk.Texture = File.Exists(Path.Combine(CSettings.FolderCover, sk.Value)) - ? CDraw.AddTexture(Path.Combine(CSettings.FolderCover, Path.Combine(coverTheme.Folder, value))) : _NoCover; + xmlReader.GetValue("//root/Cover/" + coverName + "/Path", out filePath, String.Empty); + string coverFilePath = Path.Combine(CSettings.FolderCover, Path.Combine(coverTheme.Folder, filePath)); + if (!File.Exists(coverFilePath)) + continue; + SCover sk = new SCover {Name = name, Texture = CDraw.AddTexture(coverFilePath)}; _Cover.Add(sk); if (sk.Name == "NoCover") - _NoCover = sk.Texture; + NoCover = sk.Texture; } } } List files = new List(); - string path = Path.Combine(CSettings.FolderCover, coverTheme.Folder); - files.AddRange(CHelper.ListFiles(path, "*.png", true, true)); - files.AddRange(CHelper.ListFiles(path, "*.jpg", true, true)); - files.AddRange(CHelper.ListFiles(path, "*.jpeg", true, true)); - files.AddRange(CHelper.ListFiles(path, "*.bmp", true, true)); + string coverPath = Path.Combine(CSettings.FolderCover, coverTheme.Folder); + files.AddRange(CHelper.ListFiles(coverPath, "*.png", true, true)); + files.AddRange(CHelper.ListFiles(coverPath, "*.jpg", true, true)); + files.AddRange(CHelper.ListFiles(coverPath, "*.jpeg", true, true)); + files.AddRange(CHelper.ListFiles(coverPath, "*.bmp", true, true)); foreach (string file in files) @@ -241,11 +227,9 @@ namespace Vocaluxe.Base if (_CoverExists(name)) continue; // ReSharper disable AssignNullToNotNullAttribute - SCover sk = new SCover {Name = name, Value = Path.Combine(coverTheme.Folder, Path.GetFileName(file))}; + SCover sk = new SCover {Name = name, Texture = CDraw.AddTexture(file)}; // ReSharper restore AssignNullToNotNullAttribute - sk.Texture = CDraw.AddTexture(Path.Combine(CSettings.FolderCover, sk.Value)); - _Cover.Add(sk); } } diff --git a/Vocaluxe/Base/CCursor.cs b/Vocaluxe/Base/CCursor.cs new file mode 100644 index 00000000..4a3b45d0 --- /dev/null +++ b/Vocaluxe/Base/CCursor.cs @@ -0,0 +1,138 @@ +using System; +using System.Diagnostics; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu; + +namespace Vocaluxe.Base +{ + class CCursor + { + private readonly Stopwatch _CursorFadingTimer = new Stopwatch(); + private float _CursorTargetAlpha = 1f; + private float _CursorStartAlpha; + private float _CursorFadingTime = 0.5f; + private CTexture _Cursor; + + private readonly Stopwatch _Movetimer = new Stopwatch(); + + public bool ShowCursor = true; + public bool Visible = true; + + public int X + { + get { return (int)_Cursor.Rect.X; } + } + + public int Y + { + get { return (int)_Cursor.Rect.Y; } + } + + public bool IsActive + { + get { return _Movetimer.IsRunning; } + } + + public void Draw() + { + if (_Movetimer.IsRunning && _Movetimer.ElapsedMilliseconds / 1000f > CSettings.MouseMoveOffTime) + { + _Movetimer.Stop(); + _Fade(0f, 0.5f); + } + + + if (_CursorFadingTimer.IsRunning) + { + float t = _CursorFadingTimer.ElapsedMilliseconds / 1000f; + if (t < _CursorFadingTime) + { + if (_CursorTargetAlpha >= _CursorStartAlpha) + _Cursor.Color.A = _CursorStartAlpha + (_CursorTargetAlpha - _CursorStartAlpha) * t / _CursorFadingTime; + else + _Cursor.Color.A = (_CursorStartAlpha - _CursorTargetAlpha) * (1f - t / _CursorFadingTime); + } + else + { + _CursorFadingTimer.Stop(); + _Cursor.Color.A = _CursorTargetAlpha; + } + } + + if (Visible && (CSettings.GameState == EGameState.EditTheme || ShowCursor)) + CDraw.DrawTexture(_Cursor); + } + + public void UpdatePosition(int x, int y) + { + if (Math.Abs(_Cursor.Rect.X - x) > CSettings.MouseMoveDiffMin || + Math.Abs(_Cursor.Rect.Y - y) > CSettings.MouseMoveDiffMin) + { + if (_CursorTargetAlpha < 0.01) + _Fade(1f, 0.2f); + + _Movetimer.Reset(); + _Movetimer.Start(); + CSettings.MouseActive(); + } + + _Cursor.Rect.X = x; + _Cursor.Rect.Y = y; + } + + public void LoadTextures() + { + _Cursor = CDraw.AddTexture(CTheme.GetSkinFilePath(CTheme.Cursor.SkinName, -1)); + + _Cursor.Color = !String.IsNullOrEmpty(CTheme.Cursor.Color) + ? CTheme.GetColor(CTheme.Cursor.Color, -1) : new SColorF(CTheme.Cursor.R, CTheme.Cursor.G, CTheme.Cursor.B, CTheme.Cursor.A); + _Cursor.Rect.W = CTheme.Cursor.W; + _Cursor.Rect.H = CTheme.Cursor.H; + _Cursor.Rect.Z = CSettings.ZNear; + } + + public void UnloadTextures() + { + CDraw.RemoveTexture(ref _Cursor); + } + + public void ReloadTextures() + { + int x = X; + int y = Y; + UnloadTextures(); + LoadTextures(); + UpdatePosition(x, y); + } + + public void FadeOut() + { + _Movetimer.Stop(); + _Fade(0f, 0.5f); + } + + public void FadeIn() + { + _Movetimer.Reset(); + _Movetimer.Start(); + _Fade(1f, 0.2f); + } + + private void _Fade(float targetAlpha, float time) + { + _CursorFadingTimer.Stop(); + _CursorFadingTimer.Reset(); + + if (targetAlpha >= 0f && targetAlpha <= 1f) + _CursorTargetAlpha = targetAlpha; + else + _CursorTargetAlpha = 1f; + + if (time >= 0f) + _CursorFadingTime = time; + + _CursorStartAlpha = _Cursor.Color.A; + _CursorFadingTimer.Start(); + } + } +} \ No newline at end of file diff --git a/Vocaluxe/Base/CDataBase.cs b/Vocaluxe/Base/CDataBase.cs index 35deea77..a48526aa 100644 --- a/Vocaluxe/Base/CDataBase.cs +++ b/Vocaluxe/Base/CDataBase.cs @@ -37,6 +37,9 @@ using SQLiteDataReader = Mono.Data.Sqlite.SqliteDataReader; using Community.CsharpSqlite; using VocaluxeLib; using VocaluxeLib.Songs; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu; +using VocaluxeLib.Menu.SongMenu; namespace Vocaluxe.Base { @@ -912,7 +915,7 @@ namespace Vocaluxe.Base #endregion Highscores #region Cover - public static bool GetCover(string coverPath, ref STexture tex, int maxSize) + public static bool GetCover(string coverPath, ref CTexture tex, int maxSize) { if (!File.Exists(coverPath)) { @@ -1141,7 +1144,7 @@ namespace Vocaluxe.Base #endregion Cover #region CreditsRessources - public static bool GetCreditsRessource(string fileName, ref STexture tex) + public static bool GetCreditsRessource(string fileName, ref CTexture tex) { bool result = false; diff --git a/Vocaluxe/Base/CDraw.cs b/Vocaluxe/Base/CDraw.cs index f9166042..2acc4d35 100644 --- a/Vocaluxe/Base/CDraw.cs +++ b/Vocaluxe/Base/CDraw.cs @@ -20,7 +20,7 @@ using System; using System.Drawing; using Vocaluxe.Lib.Draw; -using VocaluxeLib; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; namespace Vocaluxe.Base @@ -125,12 +125,12 @@ namespace Vocaluxe.Base _Draw.ClearScreen(); } - public static STexture CopyScreen() + public static CTexture CopyScreen() { return _Draw.CopyScreen(); } - public static void CopyScreen(ref STexture texture) + public static void CopyScreen(ref CTexture texture) { _Draw.CopyScreen(ref texture); } @@ -140,75 +140,80 @@ namespace Vocaluxe.Base _Draw.MakeScreenShot(); } - public static STexture AddTexture(Bitmap bitmap) + public static CTexture AddTexture(Bitmap bitmap) { return _Draw.AddTexture(bitmap); } - public static STexture AddTexture(string texturePath) + public static CTexture AddTexture(string texturePath) { return _Draw.AddTexture(texturePath); } - public static STexture AddTexture(int w, int h, byte[] data) + public static CTexture AddTexture(int w, int h, byte[] data) { return _Draw.AddTexture(w, h, data); } - public static STexture EnqueueTexture(int w, int h, byte[] data) + public static CTexture EnqueueTexture(int w, int h, byte[] data) { return _Draw.EnqueueTexture(w, h, data); } - public static bool UpdateTexture(ref STexture texture, byte[] data) + public static bool UpdateTexture(CTexture texture, int w, int h, byte[] data) { - return _Draw.UpdateTexture(ref texture, data); + return _Draw.UpdateTexture(texture, w, h, data); } - public static void RemoveTexture(ref STexture texture) + public static bool UpdateOrAddTexture(ref CTexture texture, int w, int h, byte[] data) + { + return _Draw.UpdateOrAddTexture(ref texture, w, h, data); + } + + public static void RemoveTexture(ref CTexture texture) { _Draw.RemoveTexture(ref texture); } - public static void DrawTexture(STexture texture) + public static void DrawTexture(CTexture texture) { _Draw.DrawTexture(texture); } - public static void DrawTexture(STexture texture, SRectF rect) + public static void DrawTexture(CTexture texture, SRectF rect) { _Draw.DrawTexture(texture, rect); } - public static void DrawTexture(STexture texture, SRectF rect, SColorF color, bool mirrored = false) + public static void DrawTexture(CTexture texture, SRectF rect, SColorF color, bool mirrored = false) { _Draw.DrawTexture(texture, rect, color, mirrored); } - public static void DrawTexture(STexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false) + public static void DrawTexture(CTexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false) { _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(CTexture texture, SRectF rect, SColorF color, float begin, float end) { _Draw.DrawTexture(texture, rect, color, begin, end); } - public static void DrawTexture(CStatic staticBounds, STexture texture, EAspect aspect) + public static void DrawTexture(CStatic staticBounds, CTexture texture, EAspect aspect) { - if (texture.Height <= 0f) + if (texture == null) return; RectangleF bounds = new RectangleF(staticBounds.Rect.X, staticBounds.Rect.Y, staticBounds.Rect.W, staticBounds.Rect.H); - RectangleF rect = new RectangleF(0f, 0f, texture.Width, texture.Height); + RectangleF rect; - CHelper.SetRect(bounds, out rect, rect.Width / rect.Height, aspect); + CHelper.SetRect(bounds, out rect, texture.OrigAspect, aspect); DrawTexture(texture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, staticBounds.Rect.Z), texture.Color, new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f)); } - public static void DrawTextureReflection(STexture texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) + public static void DrawTextureReflection(CTexture texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) { _Draw.DrawTextureReflection(texture, rect, color, bounds, space, height); } diff --git a/Vocaluxe/Base/CGraphics.cs b/Vocaluxe/Base/CGraphics.cs index df205d9d..f531a3c7 100644 --- a/Vocaluxe/Base/CGraphics.cs +++ b/Vocaluxe/Base/CGraphics.cs @@ -30,152 +30,11 @@ using VocaluxeLib.PartyModes; namespace Vocaluxe.Base { - class CCursor - { - private readonly Stopwatch _CursorFadingTimer; - private float _CursorTargetAlpha; - private float _CursorStartAlpha; - private float _CursorFadingTime; - private STexture _Cursor; - private readonly string _CursorName = String.Empty; - - private readonly Stopwatch _Movetimer; - - public bool ShowCursor; - public bool Visible = true; - public bool CursorVisible = true; - - public int X - { - get { return (int)_Cursor.Rect.X; } - set { UpdatePosition(value, (int)_Cursor.Rect.Y); } - } - - public int Y - { - get { return (int)_Cursor.Rect.Y; } - set { UpdatePosition((int)_Cursor.Rect.X, value); } - } - - public bool IsActive - { - get { return _Movetimer.IsRunning; } - } - - public CCursor(string textureName, SColorF color, float w, float h, float z) - { - _CursorFadingTimer = new Stopwatch(); - ShowCursor = true; - _CursorTargetAlpha = 1f; - _CursorStartAlpha = 0f; - _CursorFadingTime = 0.5f; - - _CursorName = textureName; - _Cursor = CDraw.AddTexture(CTheme.GetSkinFilePath(_CursorName, -1)); - - _Cursor.Color = color; - _Cursor.Rect.W = w; - _Cursor.Rect.H = h; - _Cursor.Rect.Z = z; - - _Movetimer = new Stopwatch(); - } - - public void Draw() - { - if (_Movetimer.IsRunning && _Movetimer.ElapsedMilliseconds / 1000f > CSettings.MouseMoveOffTime) - { - _Movetimer.Stop(); - _Fade(0f, 0.5f); - } - - - if (_CursorFadingTimer.IsRunning) - { - float t = _CursorFadingTimer.ElapsedMilliseconds / 1000f; - if (t < _CursorFadingTime) - { - if (_CursorTargetAlpha >= _CursorStartAlpha) - _Cursor.Color.A = _CursorStartAlpha + (_CursorTargetAlpha - _CursorStartAlpha) * t / _CursorFadingTime; - else - _Cursor.Color.A = (_CursorStartAlpha - _CursorTargetAlpha) * (1f - t / _CursorFadingTime); - } - else - { - _CursorFadingTimer.Stop(); - _Cursor.Color.A = _CursorTargetAlpha; - } - } - - if (CursorVisible && (CSettings.GameState == EGameState.EditTheme || ShowCursor)) - CDraw.DrawTexture(_Cursor); - } - - public void UpdatePosition(int x, int y) - { - if (Math.Abs(_Cursor.Rect.X - x) > CSettings.MouseMoveDiffMin || - Math.Abs(_Cursor.Rect.Y - y) > CSettings.MouseMoveDiffMin) - { - if (_CursorTargetAlpha < 0.01) - _Fade(1f, 0.2f); - - _Movetimer.Reset(); - _Movetimer.Start(); - CSettings.MouseActive(); - } - - _Cursor.Rect.X = x; - _Cursor.Rect.Y = y; - } - - public void UnloadTextures() - { - CDraw.RemoveTexture(ref _Cursor); - } - - public void ReloadTextures() - { - UnloadTextures(); - - _Cursor = CDraw.AddTexture(CTheme.GetSkinFilePath(_CursorName, -1)); - } - - public void FadeOut() - { - _Movetimer.Stop(); - _Fade(0f, 0.5f); - } - - public void FadeIn() - { - _Movetimer.Reset(); - _Movetimer.Start(); - _Fade(1f, 0.2f); - } - - private void _Fade(float targetAlpha, float time) - { - _CursorFadingTimer.Stop(); - _CursorFadingTimer.Reset(); - - if (targetAlpha >= 0f && targetAlpha <= 1f) - _CursorTargetAlpha = targetAlpha; - else - _CursorTargetAlpha = 1f; - - if (time >= 0f) - _CursorFadingTime = time; - - _CursorStartAlpha = _Cursor.Color.A; - _CursorFadingTimer.Start(); - } - } - static class CGraphics { private static bool _Fading; private static Stopwatch _FadingTimer; - private static CCursor _Cursor; + private static readonly CCursor _Cursor = new CCursor(); private static float _GlobalAlpha; private static float _ZOffset; @@ -252,12 +111,7 @@ namespace Vocaluxe.Base public static void LoadTheme() { - _Cursor = new CCursor( - CTheme.Cursor.SkinName, - new SColorF(CTheme.Cursor.R, CTheme.Cursor.G, CTheme.Cursor.B, CTheme.Cursor.A), - CTheme.Cursor.W, - CTheme.Cursor.H, - CSettings.ZNear); + _Cursor.LoadTextures(); for (int i = 0; i < _Screens.Count; i++) { @@ -276,7 +130,7 @@ namespace Vocaluxe.Base public static void ReloadTheme() { - _ReloadCursor(); + _Cursor.ReloadTextures(); foreach (IMenu screen in _Screens) screen.ReloadTheme(CTheme.GetThemeScreensPath(-1)); @@ -286,7 +140,7 @@ namespace Vocaluxe.Base public static void ReloadSkin() { - _ReloadCursor(); + _Cursor.ReloadTextures(); foreach (IMenu menu in _Screens) menu.ReloadTextures(); @@ -313,7 +167,7 @@ namespace Vocaluxe.Base public static bool UpdateGameLogic(CKeys keys, CMouse mouse) { bool run = true; - _Cursor.CursorVisible = mouse.Visible; + _Cursor.Visible = mouse.Visible; mouse.CopyEvents(); keys.CopyEvents(); @@ -783,27 +637,6 @@ namespace Vocaluxe.Base y += rect.Height; } } - - private static void _ReloadCursor() - { - _Cursor.UnloadTextures(); - - if (CTheme.Cursor.Color != "") - { - SColorF color = CTheme.GetColor(CTheme.Cursor.Color, -1); - CTheme.Cursor.R = color.R; - CTheme.Cursor.G = color.G; - CTheme.Cursor.B = color.B; - CTheme.Cursor.A = color.A; - } - - _Cursor = new CCursor( - CTheme.Cursor.SkinName, - new SColorF(CTheme.Cursor.R, CTheme.Cursor.G, CTheme.Cursor.B, CTheme.Cursor.A), - CTheme.Cursor.W, - CTheme.Cursor.H, - CSettings.ZNear); - } #endregion private stuff } } \ No newline at end of file diff --git a/Vocaluxe/Base/CMain.cs b/Vocaluxe/Base/CMain.cs index 852f731a..1d8c8a7c 100644 --- a/Vocaluxe/Base/CMain.cs +++ b/Vocaluxe/Base/CMain.cs @@ -24,6 +24,7 @@ using System.Drawing; using Vocaluxe.Base.Fonts; using VocaluxeLib; using VocaluxeLib.Game; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; using VocaluxeLib.Menu.SongMenu; using VocaluxeLib.Songs; @@ -233,12 +234,12 @@ namespace Vocaluxe.Base return CTheme.GetSkinIndex(partyModeID); } - public STexture GetSkinTexture(string textureName, int partyModeID) + public CTexture GetSkinTexture(string textureName, int partyModeID) { return CTheme.GetSkinTexture(textureName, partyModeID); } - public STexture GetSkinVideoTexture(string videoName, int partyModeID) + public CTexture GetSkinVideoTexture(string videoName, int partyModeID) { return CTheme.GetSkinVideoTexture(videoName, partyModeID); } @@ -341,7 +342,7 @@ namespace Vocaluxe.Base CBackgroundMusic.ApplyVolume(); } - public STexture GetVideoTexture() + public CTexture GetVideoTexture() { return CBackgroundMusic.GetVideoTexture(); } @@ -349,22 +350,22 @@ namespace Vocaluxe.Base class CBdraw : IDrawing { - public void DrawTexture(STexture texture, SRectF rect) + public void DrawTexture(CTexture texture, SRectF rect) { CDraw.DrawTexture(texture, rect); } - public void DrawTexture(STexture texture, SRectF rect, SColorF color) + public void DrawTexture(CTexture texture, SRectF rect, SColorF color) { CDraw.DrawTexture(texture, rect, color); } - public void DrawTexture(STexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false) + public void DrawTexture(CTexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false) { CDraw.DrawTexture(texture, rect, color, bounds, mirrored); } - public void DrawTextureReflection(STexture texture, SRectF rect, SColorF color, SRectF bounds, float reflectionSpace, float reflectionHeight) + public void DrawTextureReflection(CTexture texture, SRectF rect, SColorF color, SRectF bounds, float reflectionSpace, float reflectionHeight) { CDraw.DrawTextureReflection(texture, rect, color, bounds, reflectionSpace, reflectionHeight); } @@ -686,27 +687,27 @@ namespace Vocaluxe.Base { public int Load(string videoFileName) { - return CVideo.VdLoad(videoFileName); + return CVideo.Load(videoFileName); } public bool Skip(int videoStream, float startPosition, float videoGap) { - return CVideo.VdSkip(videoStream, startPosition, videoGap); + return CVideo.Skip(videoStream, startPosition, videoGap); } - public bool GetFrame(int videoStream, ref STexture videoTexture, float time, out float videoTime) + public bool GetFrame(int videoStream, ref CTexture videoTexture, float time, out float videoTime) { - return CVideo.VdGetFrame(videoStream, ref videoTexture, time, out videoTime); + return CVideo.GetFrame(videoStream, ref videoTexture, time, out videoTime); } public bool IsFinished(int videoStream) { - return CVideo.VdFinished(videoStream); + return CVideo.Finished(videoStream); } public bool Close(int videoStream) { - return CVideo.VdClose(videoStream); + return CVideo.Close(videoStream); } } @@ -765,7 +766,7 @@ namespace Vocaluxe.Base class CBcover : ICover { - public STexture GetNoCover() + public CTexture GetNoCover() { return CCover.NoCover; } @@ -773,7 +774,7 @@ namespace Vocaluxe.Base class CBdataBase : IDataBase { - public bool GetCover(string fileName, ref STexture texture, int coverSize) + public bool GetCover(string fileName, ref CTexture texture, int coverSize) { return CDataBase.GetCover(fileName, ref texture, coverSize); } diff --git a/Vocaluxe/Base/CProfiles.cs b/Vocaluxe/Base/CProfiles.cs index 0143edaf..232fa378 100644 --- a/Vocaluxe/Base/CProfiles.cs +++ b/Vocaluxe/Base/CProfiles.cs @@ -25,6 +25,8 @@ using System.Xml; using VocaluxeLib; using VocaluxeLib.Game; using VocaluxeLib.Profile; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu; namespace Vocaluxe.Base { @@ -437,7 +439,7 @@ namespace Vocaluxe.Base return String.Empty; CProfile profile = _Profiles[profileID]; - if (profile.PlayerName != "") + if (!String.IsNullOrEmpty(profile.PlayerName)) profile.PlayerName = profile.PlayerName.Remove(profile.PlayerName.Length - 1); return profile.PlayerName; diff --git a/Vocaluxe/Base/CTheme.cs b/Vocaluxe/Base/CTheme.cs index e032dcbc..9353ed43 100644 --- a/Vocaluxe/Base/CTheme.cs +++ b/Vocaluxe/Base/CTheme.cs @@ -25,6 +25,7 @@ using System.Windows.Forms; using System.Xml; using Vocaluxe.Base.Fonts; using VocaluxeLib; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; namespace Vocaluxe.Base @@ -49,7 +50,7 @@ namespace Vocaluxe.Base public string Name; public string Value; - public STexture Texture; + public CTexture Texture; public int VideoIndex; } @@ -200,10 +201,10 @@ namespace Vocaluxe.Base { xmlReader.GetValue("//root/Videos/" + _Skins[skinIndex].VideoList[i].Name, out value, String.Empty); SSkinElement sk = new SSkinElement {Name = _Skins[skinIndex].VideoList[i].Name, Value = value}; - sk.VideoIndex = CVideo.VdLoad(Path.Combine(_Skins[skinIndex].Path, sk.Value)); - CVideo.VdSetLoop(sk.VideoIndex, true); - CVideo.VdPause(sk.VideoIndex); - sk.Texture = new STexture(-1); + sk.VideoIndex = CVideo.Load(Path.Combine(_Skins[skinIndex].Path, sk.Value)); + CVideo.SetLoop(sk.VideoIndex, true); + CVideo.Pause(sk.VideoIndex); + sk.Texture = null; _Skins[skinIndex].VideoList[i] = sk; } catch (Exception e) @@ -225,14 +226,14 @@ namespace Vocaluxe.Base { foreach (SSkinElement sk in _Skins[i].SkinList.Values) { - STexture texture = sk.Texture; + CTexture texture = sk.Texture; CDraw.RemoveTexture(ref texture); } for (int j = 0; j < _Skins[i].VideoList.Count; j++) { - CVideo.VdClose(_Skins[i].VideoList[j].VideoIndex); - STexture videoTexture = _Skins[i].VideoList[j].Texture; + CVideo.Close(_Skins[i].VideoList[j].VideoIndex); + CTexture videoTexture = _Skins[i].VideoList[j].Texture; CDraw.RemoveTexture(ref videoTexture); } @@ -580,12 +581,12 @@ namespace Vocaluxe.Base return path; } - public static STexture GetSkinTexture(string textureName, int partyModeID) + public static CTexture GetSkinTexture(string textureName, int partyModeID) { int skinIndex = GetSkinIndex(partyModeID); if (skinIndex != -1 && textureName != null && _Skins[skinIndex].SkinList.ContainsKey(textureName)) return _Skins[skinIndex].SkinList[textureName].Texture; - return new STexture(-1); + return null; } public static string GetSkinFilePath(string skinName, int partyModeID) @@ -605,7 +606,7 @@ namespace Vocaluxe.Base return skinName; } - public static STexture GetSkinVideoTexture(string videoName, int partyModeID) + public static CTexture GetSkinVideoTexture(string videoName, int partyModeID) { int skinIndex = GetSkinIndex(partyModeID); if (skinIndex != -1) @@ -618,16 +619,16 @@ namespace Vocaluxe.Base float time = 0f; if (sk.VideoIndex == -1) { - sk.VideoIndex = CVideo.VdLoad(GetVideoFilePath(sk.Name, partyModeID)); - CVideo.VdSetLoop(sk.VideoIndex, true); + sk.VideoIndex = CVideo.Load(GetVideoFilePath(sk.Name, partyModeID)); + CVideo.SetLoop(sk.VideoIndex, true); } - CVideo.VdGetFrame(sk.VideoIndex, ref sk.Texture, time, out time); + CVideo.GetFrame(sk.VideoIndex, ref sk.Texture, time, out time); _Skins[skinIndex].VideoList[i] = sk; return sk.Texture; } } } - return new STexture(-1); + return null; } public static void SkinVideoPause(string videoName, int partyModeID) @@ -642,10 +643,10 @@ namespace Vocaluxe.Base { if (sk.VideoIndex == -1) { - sk.VideoIndex = CVideo.VdLoad(GetVideoFilePath(sk.Name, partyModeID)); - CVideo.VdSetLoop(sk.VideoIndex, true); + sk.VideoIndex = CVideo.Load(GetVideoFilePath(sk.Name, partyModeID)); + CVideo.SetLoop(sk.VideoIndex, true); } - CVideo.VdPause(sk.VideoIndex); + CVideo.Pause(sk.VideoIndex); _Skins[skinIndex].VideoList[i] = sk; return; } @@ -665,10 +666,10 @@ namespace Vocaluxe.Base { if (sk.VideoIndex == -1) { - sk.VideoIndex = CVideo.VdLoad(GetVideoFilePath(sk.Name, partyModeID)); - CVideo.VdSetLoop(sk.VideoIndex, true); + sk.VideoIndex = CVideo.Load(GetVideoFilePath(sk.Name, partyModeID)); + CVideo.SetLoop(sk.VideoIndex, true); } - CVideo.VdResume(sk.VideoIndex); + CVideo.Resume(sk.VideoIndex); _Skins[skinIndex].VideoList[i] = sk; return; } @@ -809,7 +810,7 @@ namespace Vocaluxe.Base writer.WriteElementString("W", Cursor.W.ToString("#0.000")); writer.WriteElementString("H", Cursor.H.ToString("#0.000")); - if (Cursor.Color != "") + if (!String.IsNullOrEmpty(Cursor.Color)) writer.WriteElementString("Color", Cursor.Color); else { @@ -871,7 +872,7 @@ namespace Vocaluxe.Base public static SColorF GetPlayerColor(string playerNrString, int skinIndex, out bool success) { int selection = 0; - if (playerNrString.StartsWith("Player")) + if (playerNrString != null && playerNrString.StartsWith("Player")) int.TryParse(playerNrString.Substring(6), out selection); return GetPlayerColor(selection, skinIndex, out success); @@ -885,13 +886,12 @@ namespace Vocaluxe.Base public static SColorF GetPlayerColor(int playerNr, int skinIndex, out bool success) { success = false; - SColorF color = new SColorF(1f, 1f, 1f, 1f); if (_Skins[skinIndex].PartyModeID != -1) skinIndex = GetSkinIndex(-1); if (_Skins[skinIndex].ThemeColors.Player.Length < playerNr || playerNr < 1) - return color; + return new SColorF(1f, 1f, 1f, 1f); success = true; return _Skins[skinIndex].ThemeColors.Player[playerNr - 1]; diff --git a/Vocaluxe/Base/CVideo.cs b/Vocaluxe/Base/CVideo.cs index cd9e89f4..63fdd7b6 100644 --- a/Vocaluxe/Base/CVideo.cs +++ b/Vocaluxe/Base/CVideo.cs @@ -21,6 +21,8 @@ using System.Diagnostics; using System.Drawing; using Vocaluxe.Lib.Video; using VocaluxeLib; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu; namespace Vocaluxe.Base { @@ -50,12 +52,7 @@ namespace Vocaluxe.Base #endregion Init #region Interface - public static bool VdInit() - { - return _VideoDecoder.Init(); - } - - public static void VdCloseAll() + public static void CloseAll() { _VideoDecoder.CloseAll(); } @@ -65,47 +62,47 @@ namespace Vocaluxe.Base return _VideoDecoder.GetNumStreams(); } - public static int VdLoad(string videoFileName) + public static int Load(string videoFileName) { return _VideoDecoder.Load(videoFileName); } - public static bool VdClose(int streamID) + public static bool Close(int streamID) { return _VideoDecoder.Close(streamID); } - public static float VdGetLength(int streamID) + public static float GetLength(int streamID) { return _VideoDecoder.GetLength(streamID); } - public static bool VdGetFrame(int streamID, ref STexture frame, float time, out float videoTime) + public static bool GetFrame(int streamID, ref CTexture frame, float time, out float videoTime) { return _VideoDecoder.GetFrame(streamID, ref frame, time, out videoTime); } - public static bool VdSkip(int streamID, float start, float gap) + public static bool Skip(int streamID, float start, float gap) { return _VideoDecoder.Skip(streamID, start, gap); } - public static void VdSetLoop(int streamID, bool loop) + public static void SetLoop(int streamID, bool loop) { _VideoDecoder.SetLoop(streamID, loop); } - public static void VdPause(int streamID) + public static void Pause(int streamID) { _VideoDecoder.Pause(streamID); } - public static void VdResume(int streamID) + public static void Resume(int streamID) { _VideoDecoder.Resume(streamID); } - public static bool VdFinished(int streamID) + public static bool Finished(int streamID) { return _VideoDecoder.Finished(streamID); } @@ -121,9 +118,9 @@ namespace Vocaluxe.Base class CVideoPlayer { - private STexture _VideoTexture; + private CTexture _VideoTexture; private int _VideoStream; - private readonly Stopwatch _VideoTimer; + private readonly Stopwatch _VideoTimer = new Stopwatch(); private bool _Finished; private bool _Loaded; @@ -134,20 +131,12 @@ namespace Vocaluxe.Base public bool Loop { - set { CVideo.VdSetLoop(_VideoStream, value); } - } - - public CVideoPlayer() - { - _VideoTimer = new Stopwatch(); - _VideoTexture = new STexture(-1); - _Finished = false; - _Loaded = false; + set { CVideo.SetLoop(_VideoStream, value); } } public void Load(string videoName) { - _VideoStream = CVideo.VdLoad(CTheme.GetVideoFilePath(videoName, -1)); + _VideoStream = CVideo.Load(CTheme.GetVideoFilePath(videoName, -1)); _Loaded = true; } @@ -174,20 +163,15 @@ namespace Vocaluxe.Base if (!_Finished) { float videoTime = _VideoTimer.ElapsedMilliseconds / 1000f; - _Finished = CVideo.VdFinished(_VideoStream); + _Finished = CVideo.Finished(_VideoStream); - STexture tex = new STexture(-1) {Height = 0f}; - CVideo.VdGetFrame(_VideoStream, ref tex, videoTime, out videoTime); - - if (tex.Height > 0) - { - CDraw.RemoveTexture(ref _VideoTexture); - _VideoTexture = tex; - } + CVideo.GetFrame(_VideoStream, ref _VideoTexture, videoTime, out videoTime); } + if (_VideoTexture == null) + return; RectangleF bounds = new RectangleF(0f, 0f, CSettings.RenderW, CSettings.RenderH); - RectangleF rect = new RectangleF(0f, 0f, _VideoTexture.Width, _VideoTexture.Height); - CHelper.SetRect(bounds, out rect, rect.Width / rect.Height, EAspect.Crop); + RectangleF rect; + CHelper.SetRect(bounds, out rect, _VideoTexture.OrigAspect, EAspect.Crop); CDraw.DrawTexture(_VideoTexture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, CSettings.ZFar / 4)); } @@ -195,17 +179,17 @@ namespace Vocaluxe.Base public void PreLoad() { float videoTime = 0f; - while (_VideoTexture.Index == -1 && videoTime < 1f) + while (_VideoTexture == null && videoTime < 1f) { float dummy; - CVideo.VdGetFrame(_VideoStream, ref _VideoTexture, 0, out dummy); + CVideo.GetFrame(_VideoStream, ref _VideoTexture, 0, out dummy); videoTime += 0.05f; } } public void Close() { - CVideo.VdClose(_VideoStream); + CVideo.Close(_VideoStream); CDraw.RemoveTexture(ref _VideoTexture); _Loaded = false; _Finished = false; diff --git a/Vocaluxe/Base/CWebcam.cs b/Vocaluxe/Base/CWebcam.cs index c30787f1..8c1d95d1 100644 --- a/Vocaluxe/Base/CWebcam.cs +++ b/Vocaluxe/Base/CWebcam.cs @@ -20,6 +20,8 @@ using System.Drawing; using Vocaluxe.Lib.Webcam; using VocaluxeLib; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu; namespace Vocaluxe.Base { @@ -46,10 +48,9 @@ namespace Vocaluxe.Base CConfig.SaveConfig(); } - public static bool GetFrame(ref STexture tex) + public static bool GetFrame(ref CTexture tex) { - _Webcam.GetFrame(ref tex); - return true; + return _Webcam.GetFrame(ref tex); } public static Bitmap GetBitmap() diff --git a/Vocaluxe/Base/Fonts/CFont.cs b/Vocaluxe/Base/Fonts/CFont.cs index 73216784..3fd7bda8 100644 --- a/Vocaluxe/Base/Fonts/CFont.cs +++ b/Vocaluxe/Base/Fonts/CFont.cs @@ -22,6 +22,7 @@ using System.Collections.Generic; using System.Drawing; using System.Drawing.Text; using VocaluxeLib; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; namespace Vocaluxe.Base.Fonts @@ -87,7 +88,7 @@ namespace Vocaluxe.Base.Fonts public void DrawGlyph(char chr, float x, float y, float z, SColorF color) { - STexture texture; + CTexture texture; SRectF rect; GetOrAddGlyph(chr).GetTextureAndRect(x, y, z, out texture, out rect); CDraw.DrawTexture(texture, rect, color); @@ -95,7 +96,7 @@ namespace Vocaluxe.Base.Fonts public void DrawGlyph(char chr, float x, float y, float z, SColorF color, float begin, float end) { - STexture texture; + CTexture texture; SRectF rect; GetOrAddGlyph(chr).GetTextureAndRect(x, y, z, out texture, out rect); CDraw.DrawTexture(texture, rect, color, begin, end); @@ -103,7 +104,7 @@ namespace Vocaluxe.Base.Fonts public void DrawGlyphReflection(char chr, float x, float y, float z, SColorF color, float rspace, float rheight) { - STexture texture; + CTexture texture; SRectF rect; GetOrAddGlyph(chr).GetTextureAndRect(x, y, z, out texture, out rect); CDraw.DrawTextureReflection(texture, rect, color, rect, rspace, rheight); diff --git a/Vocaluxe/Base/Fonts/CFonts.cs b/Vocaluxe/Base/Fonts/CFonts.cs index cee81df5..1de2f929 100644 --- a/Vocaluxe/Base/Fonts/CFonts.cs +++ b/Vocaluxe/Base/Fonts/CFonts.cs @@ -71,7 +71,7 @@ namespace Vocaluxe.Base.Fonts private static void _BuildFonts() { - foreach (var font in _Fonts) + foreach (SFont font in _Fonts) { font.Normal.Dispose(); font.Bold.Dispose(); @@ -258,8 +258,8 @@ namespace Vocaluxe.Base.Fonts Height = height; SetFont(text.Font); Style = text.Style; - var result = new RectangleF(text.X, text.Y, GetTextWidth(CLanguage.Translate(text.Text, text.TranslationID)), - GetTextHeight(CLanguage.Translate(text.Text, text.TranslationID))); + RectangleF result = new RectangleF(text.X, text.Y, GetTextWidth(CLanguage.Translate(text.Text, text.TranslationID)), + GetTextHeight(CLanguage.Translate(text.Text, text.TranslationID))); //restore old values Height = oldHeight; _CurrentFont = oldFont; diff --git a/Vocaluxe/Base/Fonts/CGlyph.cs b/Vocaluxe/Base/Fonts/CGlyph.cs index f61f0c88..b73bd60f 100644 --- a/Vocaluxe/Base/Fonts/CGlyph.cs +++ b/Vocaluxe/Base/Fonts/CGlyph.cs @@ -24,12 +24,14 @@ using System.Drawing.Imaging; using System.Drawing.Text; using System.Runtime.InteropServices; using VocaluxeLib; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu; namespace Vocaluxe.Base.Fonts { class CGlyph { - private STexture _Texture; + private CTexture _Texture; private readonly SizeF _BoundingBox; private readonly RectangleF _DrawBounding; public readonly float MaxHeight; @@ -121,6 +123,7 @@ namespace Vocaluxe.Base.Fonts _DrawBounding.Width = _Texture.Width; _DrawBounding.Height = _Texture.Height;*/ #pragma warning disable 162 + // ReSharper disable HeuristicUnreachableCode if (false && Char.IsLetterOrDigit(chr)) { if (outline > 0) @@ -128,6 +131,7 @@ namespace Vocaluxe.Base.Fonts else bmpCropped.Save("font_" + chr + CFonts.Style + "2.png", ImageFormat.Png); } + // ReSharper restore HeuristicUnreachableCode #pragma warning restore 162 } } @@ -145,7 +149,7 @@ namespace Vocaluxe.Base.Fonts return CFonts.Height / _BoundingBox.Height; } - public void GetTextureAndRect(float x, float y, float z, out STexture texture, out SRectF rect) + public void GetTextureAndRect(float x, float y, float z, out CTexture texture, out SRectF rect) { texture = _Texture; float factor = _GetFactor(); diff --git a/Vocaluxe/Lib/Draw/CDirect3D.cs b/Vocaluxe/Lib/Draw/CDirect3D.cs index 21a1a0c1..28b3c5cb 100644 --- a/Vocaluxe/Lib/Draw/CDirect3D.cs +++ b/Vocaluxe/Lib/Draw/CDirect3D.cs @@ -32,6 +32,7 @@ using System.Windows.Forms; using SlimDX.Windows; using Vocaluxe.Base; using VocaluxeLib; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; namespace Vocaluxe.Lib.Draw @@ -39,6 +40,8 @@ namespace Vocaluxe.Lib.Draw class CDirect3D : RenderForm, IDraw { #region private vars + private const int _MaxID = 100000; + private readonly CKeys _Keys; private readonly CMouse _Mouse; private bool _Run; @@ -51,10 +54,9 @@ namespace Vocaluxe.Lib.Draw private Size _OldSize; private Size _SizeBeforeMinimize; - private readonly Dictionary _Textures; - private readonly Dictionary _D3DTextures; - private readonly List _Queue; - private readonly Queue _IDs; + private readonly Dictionary _D3DTextures = new Dictionary(); + private readonly Queue _TexturesToLoad = new Queue(); + private readonly Queue _IDs = new Queue(_MaxID); private readonly Object _MutexTexture = new Object(); @@ -66,11 +68,11 @@ namespace Vocaluxe.Lib.Draw private int _Y; private int _X; - private STexture _BlankTexture; + private CTexture _BlankTexture; - private readonly Queue _Vertices; - private readonly Queue _VerticesTextures; - private readonly Queue _VerticesRotationMatrices; + private readonly Queue _Vertices = new Queue(); + private readonly Queue _VerticesTextures = new Queue(); + private readonly Queue _VerticesRotationMatrices = new Queue(); private readonly bool _NonPowerOf2TextureSupported; #endregion private vars @@ -81,19 +83,11 @@ namespace Vocaluxe.Lib.Draw public CDirect3D() { Icon = new Icon(Path.Combine(Environment.CurrentDirectory, CSettings.Icon)); - _Textures = new Dictionary(); - _D3DTextures = new Dictionary(); - _Queue = new List(); - _IDs = new Queue(); //Fill Queue with 100000 IDs - for (int i = 0; i < 100000; i++) + for (int i = 0; i < _MaxID; i++) _IDs.Enqueue(i); - _Vertices = new Queue(); - _VerticesTextures = new Queue(); - _VerticesRotationMatrices = new Queue(); - _Keys = new CKeys(); try { @@ -255,40 +249,39 @@ namespace Vocaluxe.Lib.Draw // The window was minimized, so restore it to the last known size if (ClientSize.Width == 0 || ClientSize.Height == 0) ClientSize = _SizeBeforeMinimize; - if (_Run) + if (!_Run) + return; + _H = ClientSize.Height; + _W = ClientSize.Width; + _Y = 0; + _X = 0; + + if (_W / (float)_H > CSettings.GetRenderAspect()) { - _H = ClientSize.Height; - _W = ClientSize.Width; - _Y = 0; - _X = 0; - - if (_W / (float)_H > CSettings.GetRenderAspect()) - { - //The windows's width is too big - _W = (int)Math.Round(_H * CSettings.GetRenderAspect()); - _X = (ClientSize.Width - _W) / 2; - } - else - { - //The windows's height is too big - _H = (int)Math.Round(_W / CSettings.GetRenderAspect()); - _Y = (ClientSize.Height - _H) / 2; - } - - //Apply the new sizes to the PresentParameters - _PresentParameters.BackBufferWidth = ClientSize.Width; - _PresentParameters.BackBufferHeight = ClientSize.Height; - ClearScreen(); - //To set new PresentParameters the device has to be resetted - _Reset(); - //All configurations got flushed due to Reset(), so apply them again - Init(); - - //Set the new Viewport - _Device.Viewport = new Viewport(_X, _Y, _W, _H); - //Store size so it can get restored after the window gets minimized - _SizeBeforeMinimize = ClientSize; + //The windows's width is too big + _W = (int)Math.Round(_H * CSettings.GetRenderAspect()); + _X = (ClientSize.Width - _W) / 2; } + else + { + //The windows's height is too big + _H = (int)Math.Round(_W / CSettings.GetRenderAspect()); + _Y = (ClientSize.Height - _H) / 2; + } + + //Apply the new sizes to the PresentParameters + _PresentParameters.BackBufferWidth = ClientSize.Width; + _PresentParameters.BackBufferHeight = ClientSize.Height; + ClearScreen(); + //To set new PresentParameters the device has to be resetted + _Reset(); + //All configurations got flushed due to Reset(), so apply them again + Init(); + + //Set the new Viewport + _Device.Viewport = new Viewport(_X, _Y, _W, _H); + //Store size so it can get restored after the window gets minimized + _SizeBeforeMinimize = ClientSize; } /// @@ -677,39 +670,32 @@ namespace Vocaluxe.Lib.Draw /// Copies the current frame into a texture /// A texture holding the current frame /// - public STexture CopyScreen() + public CTexture CopyScreen() { - STexture texture = new STexture(-1); + CTexture texture = _GetNewTexture(_W, _H); Surface backbufferSurface = _Device.GetBackBuffer(0, 0); - Texture tex = new Texture(_Device, _PresentParameters.BackBufferWidth, _PresentParameters.BackBufferHeight, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed); + Texture tex = new Texture(_Device, texture.W2, texture.H2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed); Surface textureSurface = tex.GetSurfaceLevel(0); - Surface.FromSurface(textureSurface, backbufferSurface, Filter.Default, 0); + Surface.FromSurface(textureSurface, backbufferSurface, Filter.Default, 0, new Rectangle(0, 0, _W, _H), new Rectangle(0, 0, _W, _H)); backbufferSurface.Dispose(); lock (_MutexTexture) { - _D3DTextures.Add(_IDs.Peek(), tex); + texture.ID = _IDs.Dequeue(); + _D3DTextures.Add(texture.ID, tex); - texture.Color = new SColorF(1f, 1f, 1f, 1f); - texture.Rect = new SRectF(0f, 0f, texture.Width, texture.Height, 0f); - texture.Width = _W; - texture.Height = _H; - texture.W2 = _CheckForNextPowerOf2(texture.Width); - texture.H2 = _CheckForNextPowerOf2(texture.Height); - texture.Index = _IDs.Dequeue(); - - _Textures[texture.Index] = texture; + return texture; } - return texture; } /// /// Copies the current frame into a texture /// /// The texture in which the frame is copied to - public void CopyScreen(ref STexture texture) + public void CopyScreen(ref CTexture texture) { - if (!_TextureExists(ref texture) || (int)texture.Width != GetScreenWidth() || (int)texture.Height != GetScreenHeight()) + //Check for actual texture sizes! (W2/H2) as it may be up/downsized compared to OrigSize + if (!_TextureExists(texture) || texture.W2 != GetScreenWidth() || texture.H2 != GetScreenHeight()) { RemoveTexture(ref texture); texture = CopyScreen(); @@ -717,7 +703,7 @@ namespace Vocaluxe.Lib.Draw else { Surface backbufferSurface = _Device.GetBackBuffer(0, 0); - Surface textureSurface = _D3DTextures[texture.Index].GetSurfaceLevel(0); + Surface textureSurface = _D3DTextures[texture.ID].GetSurfaceLevel(0); Surface.FromSurface(textureSurface, backbufferSurface, Filter.Default, 0); } } @@ -741,8 +727,6 @@ namespace Vocaluxe.Lib.Draw screen.Save(Path.Combine(path, file + i.ToString("00000") + ".bmp"), ImageFormat.Bmp); screen.Dispose(); } - Cursor.Hide(); - _Mouse.Visible = true; } /// @@ -759,8 +743,8 @@ namespace Vocaluxe.Lib.Draw /// The end y-value public void DrawLine(int a, int r, int g, int b, int w, int x1, int y1, int x2, int y2) { - var lineVector = new Vector2[] {new Vector2(x1, y1), new Vector2(x2, y2)}; - using (var line = new Line(_Device)) + Vector2[] lineVector = new Vector2[] {new Vector2(x1, y1), new Vector2(x2, y2)}; + using (Line line = new Line(_Device)) { line.Antialias = true; line.Begin(); @@ -800,33 +784,33 @@ namespace Vocaluxe.Lib.Draw /// /// The texture's filepath /// A STexture object containing the added texture - public STexture AddTexture(string texturePath) + public CTexture AddTexture(string texturePath) { - if (File.Exists(texturePath)) + if (!File.Exists(texturePath)) { - Bitmap bmp; - try - { - bmp = new Bitmap(texturePath); - } - catch (Exception) - { - CLog.LogError("Error loading Texture: " + texturePath); - return new STexture(-1); - } - STexture s; - try - { - s = AddTexture(bmp); - } - finally - { - bmp.Dispose(); - } - return s; + CLog.LogError("Can't find File: " + texturePath); + return null; } - CLog.LogError("Can't find File: " + texturePath); - return new STexture(-1); + Bitmap bmp; + try + { + bmp = new Bitmap(texturePath); + } + catch (Exception) + { + CLog.LogError("Error loading Texture: " + texturePath); + return null; + } + CTexture s; + try + { + s = AddTexture(bmp); + } + finally + { + bmp.Dispose(); + } + return s; } /// @@ -834,10 +818,10 @@ namespace Vocaluxe.Lib.Draw /// /// The Bitmap of which the texure will be created from /// A STexture object containing the added texture - public STexture AddTexture(Bitmap bmp) + public CTexture AddTexture(Bitmap bmp) { if (bmp.Height == 0 || bmp.Width == 0) - return new STexture(-1); + return null; int maxSize; //Apply the right max size switch (CConfig.TextureQuality) @@ -862,49 +846,26 @@ namespace Vocaluxe.Lib.Draw break; } - int w = bmp.Width; - int h = bmp.Height; - float ratio = (float)w / h; - int newW = w; - int newH = h; - - if (w > maxSize && w > h) - newW = maxSize; - else if (h > maxSize) - newH = maxSize; - else if (w > h) - newW = (int)_CheckForNextPowerOf2(w); - else - newH = (int)_CheckForNextPowerOf2(h); + int w = Math.Min(bmp.Width, maxSize); + int h = Math.Min(bmp.Height, maxSize); + w = _CheckForNextPowerOf2(w); + h = _CheckForNextPowerOf2(h); Bitmap bmp2 = null; byte[] data; try { - if (w != newW || h != newH) + if (bmp.Width != w || bmp.Height != h) { - if (w != newW) - { - w = newW; - h = (int)Math.Round(w / ratio); - if (h == 0) - h = 1; - } - else - { - h = newH; - w = (int)Math.Round(h * ratio); - if (w == 0) - w = 1; - } //Create a new Bitmap with the new sizes bmp2 = new Bitmap(w, h); //Scale the texture - Graphics g = Graphics.FromImage(bmp2); - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.SmoothingMode = SmoothingMode.HighQuality; - g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height)); - g.Dispose(); + using (Graphics g = Graphics.FromImage(bmp2)) + { + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.SmoothingMode = SmoothingMode.HighQuality; + g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height)); + } bmp = bmp2; } @@ -920,81 +881,75 @@ namespace Vocaluxe.Lib.Draw bmp2.Dispose(); } - return AddTexture(w, h, data); + CTexture texture = new CTexture(bmp.Width, bmp.Height, w, h, true); + return _AddTexture(texture, w, data); } - public STexture AddTexture(int w, int h, byte[] data) + public CTexture AddTexture(int w, int h, byte[] data) { - STexture texture = new STexture(-1); + CTexture texture = _GetNewTexture(w, h); + return _AddTexture(texture, w, data); + } - Texture t = _CreateTexture(w, h, data, ref texture); + private CTexture _AddTexture(CTexture texture, int w, byte[] data) + { + Texture t = _CreateTexture(texture.W2, texture.H2, w, data); lock (_MutexTexture) { - _D3DTextures.Add(_IDs.Peek(), t); - texture.Index = _IDs.Dequeue(); - _Textures[texture.Index] = texture; + texture.ID = _IDs.Dequeue(); + _D3DTextures.Add(texture.ID, t); } return texture; } - private Texture _CreateTexture(int w, int h, byte[] data, ref STexture texture) + private Texture _CreateTexture(int textureW, int textureH, int w, byte[] data) { - texture.Width = w; - texture.Height = h; - texture.W2 = _CheckForNextPowerOf2(w); - texture.H2 = _CheckForNextPowerOf2(h); - texture.WidthRatio = w / texture.W2; - texture.HeightRatio = h / texture.H2; - //Create a new texture in the managed pool, which does not need to be recreated on a lost device //because a copy of the texture is hold in the Ram - Texture t = null; - try - { - t = new Texture(_Device, (int)texture.W2, (int)texture.H2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed); - //Lock the texture and fill it with the data - DataRectangle rect = t.LockRectangle(0, LockFlags.Discard); - int rowWidth = 4 * (int)texture.W2; - for (int i = 0; i + rowWidth <= data.Length; i += 4 * w) - { - rect.Data.Write(data, i, rowWidth); - rect.Data.Position = rect.Data.Position - rowWidth; - rect.Data.Position += rect.Pitch; - } - t.UnlockRectangle(0); - - texture.Color = new SColorF(1f, 1f, 1f, 1f); - texture.Rect = new SRectF(0f, 0f, texture.Width, texture.Height, 0f); - texture.TexturePath = String.Empty; - } - catch (Exception) - { - if (t != null) - t.Dispose(); - throw; - } + Texture t; + using (t = new Texture(_Device, textureW, textureH, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed)) + _WriteDataToTexture(t, w, data); return t; } - public STexture EnqueueTexture(int w, int h, byte[] data) + private static void _WriteDataToTexture(Texture t, int w, byte[] data) { - STexture texture = new STexture(-1); - STextureQueue queue = new STextureQueue {Data = data, Height = h, Width = w}; + //Lock the texture and fill it with the data + DataRectangle rect = t.LockRectangle(0, LockFlags.Discard); + int rowWidth = 4 * w; + if (rowWidth == rect.Pitch) + rect.Data.Write(data, 0, data.Length); + else + { + for (int i = 0; i + rowWidth <= data.Length; i += rowWidth) + { + rect.Data.Write(data, i, rowWidth); + //Go to next row + rect.Data.Position = rect.Data.Position - rowWidth + rect.Pitch; + } + } + t.UnlockRectangle(0); + } - texture.Height = h; - texture.Width = w; + public CTexture EnqueueTexture(int w, int h, byte[] data) + { + CTexture texture = _GetNewTexture(w, h); lock (_MutexTexture) { - _D3DTextures.Add(_IDs.Peek(), null); - texture.Index = _IDs.Dequeue(); - queue.ID = texture.Index; - _Queue.Add(queue); - _Textures[texture.Index] = texture; + texture.ID = _IDs.Dequeue(); + _D3DTextures.Add(texture.ID, null); + STextureQueue queue = new STextureQueue(texture.ID, texture.W2, texture.H2, w, h, data); + _TexturesToLoad.Enqueue(queue); } return texture; } + + private CTexture _GetNewTexture(int w, int h) + { + return new CTexture(w, h, _CheckForNextPowerOf2(w), _CheckForNextPowerOf2(h)); + } #endregion adding #region updating @@ -1002,48 +957,30 @@ namespace Vocaluxe.Lib.Draw /// Updates the data of a texture /// /// The texture to update + /// + /// /// A byte array containing the new texture's data /// True if succeeded - public bool UpdateTexture(ref STexture texture, byte[] data) + public bool UpdateTexture(CTexture texture, int w, int h, byte[] data) { - if ((texture.Index >= 0) && (_Textures.Count > 0) && _TextureExists(ref texture)) + //Check if texture exists and extend matches + if (!_TextureExists(texture) || texture.UsedWidth != w || texture.UsedHeight != h) + return false; + lock (_MutexTexture) { - lock (_MutexTexture) - { - DataRectangle rect = _D3DTextures[texture.Index].LockRectangle(0, LockFlags.Discard); - int w = (int)texture.Width; - for (int i = 0; i < data.Length; i += 4 * w) - { - rect.Data.Write(data, i, 4 * w); - rect.Data.Position -= 4 * w; - rect.Data.Position += rect.Pitch; - } - _D3DTextures[texture.Index].UnlockRectangle(0); - } - - //Flamefire: Unneccesary as height can not be changed by this! (Texture gets copied) - //Texture.height_ratio = Texture.height / CheckForNextPowerOf2(Texture.height); - //Texture.width_ratio = Texture.width / CheckForNextPowerOf2(Texture.width); - return true; - - /*Surface s = _D3DTextures[Texture.index].GetSurfaceLevel(0); - DataRectangle d = s.LockRectangle(LockFlags.Discard); - - for (int i = 0; i < Data.Length; ) - { - d.Data.Write(Data, i, 4 * (int)Texture.width); - i += 4 * (int)Texture.width; - d.Data.Position = d.Data.Position - 4 * (int)Texture.width; - d.Data.Position += d.Pitch; - } - - Texture.height_ratio = Texture.height / NextPowerOfTwo(Texture.height); - Texture.width_ratio = Texture.width / NextPowerOfTwo(Texture.width); - - s.UnlockRectangle(); - return true; */ + _WriteDataToTexture(_D3DTextures[texture.ID], w, data); } - return false; + return true; + } + + public bool UpdateOrAddTexture(ref CTexture texture, int w, int h, byte[] data) + { + if (!UpdateTexture(texture, w, h, data)) + { + RemoveTexture(ref texture); + texture = AddTexture(w, h, data); + } + return true; } #endregion updating @@ -1052,40 +989,30 @@ namespace Vocaluxe.Lib.Draw /// /// The texture to check /// True if the texture exists - private bool _TextureExists(ref STexture texture) + private bool _TextureExists(CTexture texture) { lock (_MutexTexture) { - if (_Textures.ContainsKey(texture.Index)) - { - if (_Textures[texture.Index].Index >= 0) - { - texture = _Textures[texture.Index]; - return true; - } - } + return texture != null && _D3DTextures.ContainsKey(texture.ID); } - return false; } /// /// Removes a texture from the Vram /// /// The texture to be removed - public void RemoveTexture(ref STexture texture) + public void RemoveTexture(ref CTexture texture) { - lock (_MutexTexture) + if (_TextureExists(texture)) { - if ((texture.Index >= 0) && (_Textures.Count > 0)) + lock (_MutexTexture) { - _D3DTextures[texture.Index].Dispose(); - _D3DTextures.Remove(texture.Index); - _Textures.Remove(texture.Index); - _IDs.Enqueue(texture.Index); - texture.Index = -1; - texture.ID = -1; + _D3DTextures[texture.ID].Dispose(); + _D3DTextures.Remove(texture.ID); + _IDs.Enqueue(texture.ID); } } + texture = null; } #region drawing @@ -1093,8 +1020,10 @@ namespace Vocaluxe.Lib.Draw /// Draws a texture /// /// The texture to be drawn - public void DrawTexture(STexture texture) + public void DrawTexture(CTexture texture) { + if (texture == null) + return; DrawTexture(texture, texture.Rect, texture.Color); } @@ -1103,8 +1032,10 @@ namespace Vocaluxe.Lib.Draw /// /// The texture to be drawn /// A SRectF struct containing the destination coordinates - public void DrawTexture(STexture texture, SRectF rect) + public void DrawTexture(CTexture texture, SRectF rect) { + if (texture == null) + return; DrawTexture(texture, rect, texture.Color); } @@ -1115,7 +1046,7 @@ namespace Vocaluxe.Lib.Draw /// A SRectF struct containing the destination coordinates /// A SColorF struct containing a color which the texture will be colored in /// True if the texture should be mirrored - public void DrawTexture(STexture texture, SRectF rect, SColorF color, bool mirrored = false) + public void DrawTexture(CTexture texture, SRectF rect, SColorF color, bool mirrored = false) { DrawTexture(texture, rect, color, new SRectF(0, 0, CSettings.RenderW, CSettings.RenderH, rect.Z), mirrored); } @@ -1128,86 +1059,85 @@ namespace Vocaluxe.Lib.Draw /// A SColorF struct containing a color which the texture will be colored in /// A SRectF struct containing which part of the texture should be drawn /// True if the texture should be mirrored - public void DrawTexture(STexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false) + public void DrawTexture(CTexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false) { - if (_TextureExists(ref texture)) + if (!_TextureExists(texture)) + return; + if (_D3DTextures[texture.ID] == null) + return; + + //Calculate the position + float x1 = (bounds.X - rect.X) / rect.W * texture.WidthRatio; + float x2 = (bounds.X + bounds.W - rect.X) / rect.W * texture.WidthRatio; + float y1 = (bounds.Y - rect.Y) / rect.H * texture.HeightRatio; + float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * texture.HeightRatio; + + if (x1 < 0) + x1 = 0f; + + if (x2 > texture.WidthRatio) + x2 = texture.WidthRatio; + + if (y1 < 0) + y1 = 0f; + + if (y2 > texture.HeightRatio) + y2 = texture.HeightRatio; + + //Calculate the size + float rx1 = rect.X; + float rx2 = rect.X + rect.W; + float ry1 = rect.Y; + float ry2 = rect.Y + rect.H; + + if (rx1 < bounds.X) + rx1 = bounds.X; + + if (rx2 > bounds.X + bounds.W) + rx2 = bounds.X + bounds.W; + + if (ry1 < bounds.Y) + ry1 = bounds.Y; + + if (ry2 > bounds.Y + bounds.H) + ry2 = bounds.Y + bounds.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.A *= CGraphics.GlobalAlpha; + + if (color.A > 1) + color.A = 1; + if (color.R > 1) + color.R = 1; + if (color.G > 1) + color.G = 1; + if (color.B > 1) + color.B = 1; + + Color c = color.AsColor(); + + if (!mirrored) { - if (_D3DTextures[texture.Index] == null) - return; - - //Calculate the position - float x1 = (bounds.X - rect.X) / rect.W * texture.WidthRatio; - float x2 = (bounds.X + bounds.W - rect.X) / rect.W * texture.WidthRatio; - float y1 = (bounds.Y - rect.Y) / rect.H * texture.HeightRatio; - float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * texture.HeightRatio; - - if (x1 < 0) - x1 = 0f; - - if (x2 > texture.WidthRatio) - x2 = texture.WidthRatio; - - if (y1 < 0) - y1 = 0f; - - if (y2 > texture.HeightRatio) - y2 = texture.HeightRatio; - - //Calculate the size - float rx1 = rect.X; - float rx2 = rect.X + rect.W; - float ry1 = rect.Y; - float ry2 = rect.Y + rect.H; - - if (rx1 < bounds.X) - rx1 = bounds.X; - - if (rx2 > bounds.X + bounds.W) - rx2 = bounds.X + bounds.W; - - if (ry1 < bounds.Y) - ry1 = bounds.Y; - - if (ry2 > bounds.Y + bounds.H) - ry2 = bounds.Y + bounds.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.A *= CGraphics.GlobalAlpha; - - if (color.A > 1) - color.A = 1; - if (color.R > 1) - color.R = 1; - if (color.G > 1) - color.G = 1; - if (color.B > 1) - color.B = 1; - - Color c = color.AsColor(); - - if (!mirrored) - { - STexturedColoredVertex[] vert = new STexturedColoredVertex[4]; - vert[0] = new STexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), c.ToArgb()); - vert[1] = new STexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()); - vert[2] = new STexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()); - vert[3] = new STexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()); - _AddToVertexBuffer(vert, _D3DTextures[texture.Index], _CalculateRotationMatrix(rect.Rotation, rx1, rx2, ry1, ry2)); - } - else - { - STexturedColoredVertex[] vert = new STexturedColoredVertex[4]; - vert[0] = new STexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y1), c.ToArgb()); - vert[1] = new STexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y2), c.ToArgb()); - vert[2] = new STexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y2), c.ToArgb()); - vert[3] = new STexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y1), c.ToArgb()); - _AddToVertexBuffer(vert, _D3DTextures[texture.Index], _CalculateRotationMatrix(rect.Rotation, rx1, rx2, ry1, ry2)); - } + STexturedColoredVertex[] vert = new STexturedColoredVertex[4]; + vert[0] = new STexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), c.ToArgb()); + vert[1] = new STexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()); + vert[2] = new STexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()); + vert[3] = new STexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()); + _AddToVertexBuffer(vert, _D3DTextures[texture.ID], _CalculateRotationMatrix(rect.Rotation, rx1, rx2, ry1, ry2)); + } + else + { + STexturedColoredVertex[] vert = new STexturedColoredVertex[4]; + vert[0] = new STexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y1), c.ToArgb()); + vert[1] = new STexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y2), c.ToArgb()); + vert[2] = new STexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y2), c.ToArgb()); + vert[3] = new STexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y1), c.ToArgb()); + _AddToVertexBuffer(vert, _D3DTextures[texture.ID], _CalculateRotationMatrix(rect.Rotation, rx1, rx2, ry1, ry2)); } } @@ -1219,11 +1149,11 @@ namespace Vocaluxe.Lib.Draw /// A SColorF struct containing a color which the texture will be colored in /// A Value ranging from 0 to 1 containing the beginning of the texture /// A Value ranging from 0 to 1 containing the ending of the texture - public void DrawTexture(STexture texture, SRectF rect, SColorF color, float begin, float end) + public void DrawTexture(CTexture texture, SRectF rect, SColorF color, float begin, float end) { - if (!_TextureExists(ref texture)) + if (!_TextureExists(texture)) return; - if (_D3DTextures[texture.Index] == null) + if (_D3DTextures[texture.ID] == null) return; float x1 = 0f + begin * texture.WidthRatio; @@ -1251,7 +1181,7 @@ namespace Vocaluxe.Lib.Draw vert[1] = new STexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()); vert[2] = new STexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()); vert[3] = new STexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()); - _AddToVertexBuffer(vert, _D3DTextures[texture.Index], _CalculateRotationMatrix(rect.Rotation, rx1, rx2, ry1, ry2)); + _AddToVertexBuffer(vert, _D3DTextures[texture.ID], _CalculateRotationMatrix(rect.Rotation, rx1, rx2, ry1, ry2)); } /// @@ -1263,11 +1193,11 @@ namespace Vocaluxe.Lib.Draw /// A SRectF struct containing which part of the texture should be drawn /// The space between the texture and the reflection /// The height of the reflection - public void DrawTextureReflection(STexture texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) + public void DrawTextureReflection(CTexture texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) { - if (!_TextureExists(ref texture)) + if (!_TextureExists(texture)) return; - if (_D3DTextures[texture.Index] == null) + if (_D3DTextures[texture.ID] == null) return; if (Math.Abs(rect.W) < float.Epsilon || Math.Abs(rect.H) < float.Epsilon || Math.Abs(bounds.H) < float.Epsilon || Math.Abs(bounds.W) < float.Epsilon || @@ -1283,61 +1213,58 @@ namespace Vocaluxe.Lib.Draw if (height > bounds.H) height = bounds.H; - if (_TextureExists(ref texture)) - { - float x1 = (bounds.X - rect.X) / rect.W * texture.WidthRatio; - float x2 = (bounds.X + bounds.W - rect.X) / rect.W * texture.WidthRatio; - float y1 = (bounds.Y - rect.Y + rect.H - height) / rect.H * texture.HeightRatio; - float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * texture.HeightRatio; + float x1 = (bounds.X - rect.X) / rect.W * texture.WidthRatio; + float x2 = (bounds.X + bounds.W - rect.X) / rect.W * texture.WidthRatio; + float y1 = (bounds.Y - rect.Y + rect.H - height) / rect.H * texture.HeightRatio; + float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * texture.HeightRatio; - if (x1 < 0) - x1 = 0f; + if (x1 < 0) + x1 = 0f; - if (x2 > texture.WidthRatio) - x2 = texture.WidthRatio; + if (x2 > texture.WidthRatio) + x2 = texture.WidthRatio; - if (y1 < 0) - y1 = 0f; + if (y1 < 0) + y1 = 0f; - if (y2 > texture.HeightRatio) - y2 = texture.HeightRatio; + if (y2 > texture.HeightRatio) + y2 = texture.HeightRatio; - 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; + 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 (rx1 < bounds.X) + rx1 = bounds.X; - if (rx2 > bounds.X + bounds.W) - rx2 = bounds.X + bounds.W; + if (rx2 > bounds.X + bounds.W) + rx2 = bounds.X + bounds.W; - if (ry1 < bounds.Y + space) - ry1 = bounds.Y + space; + if (ry1 < bounds.Y + space) + ry1 = bounds.Y + space; - if (ry2 > bounds.Y + bounds.H + space + height) - ry2 = bounds.Y + bounds.H + space + height; + 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; + //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.A *= CGraphics.GlobalAlpha; - Color c = color.AsColor(); - color.A = 0; - Color transparent = color.AsColor(); + color.A *= CGraphics.GlobalAlpha; + Color c = color.AsColor(); + color.A = 0; + Color transparent = color.AsColor(); - STexturedColoredVertex[] vert = new STexturedColoredVertex[4]; - vert[0] = new STexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()); - vert[1] = new STexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), transparent.ToArgb()); - vert[2] = new STexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), transparent.ToArgb()); - vert[3] = new STexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()); - _AddToVertexBuffer(vert, _D3DTextures[texture.Index], _CalculateRotationMatrix(rect.Rotation, rx1, rx2, ry1, ry2)); - } + STexturedColoredVertex[] vert = new STexturedColoredVertex[4]; + vert[0] = new STexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()); + vert[1] = new STexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), transparent.ToArgb()); + vert[2] = new STexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), transparent.ToArgb()); + vert[3] = new STexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()); + _AddToVertexBuffer(vert, _D3DTextures[texture.ID], _CalculateRotationMatrix(rect.Rotation, rx1, rx2, ry1, ry2)); } #endregion drawing @@ -1345,21 +1272,16 @@ namespace Vocaluxe.Lib.Draw { lock (_MutexTexture) { - if (_Queue.Count == 0) - return; + while (_TexturesToLoad.Count > 0) + { + STextureQueue q = _TexturesToLoad.Dequeue(); + Texture t; + if (_D3DTextures.TryGetValue(q.ID, out t) && t != null) + continue; - STextureQueue q = _Queue[0]; - STexture texture; - if (_Textures.ContainsKey(q.ID)) - texture = _Textures[q.ID]; - else - return; - - Texture t = _CreateTexture(q.Width, q.Height, q.Data, ref texture); - _D3DTextures[q.ID] = t; - - _Textures[texture.Index] = texture; - _Queue.RemoveAt(0); + t = _CreateTexture(q.TextureWidth, q.TextureHeight, q.DataWidth, q.Data); + _D3DTextures[q.ID] = t; + } } } @@ -1369,7 +1291,7 @@ namespace Vocaluxe.Lib.Draw /// The amount of textures public int GetTextureCount() { - return _Textures.Count; + return _D3DTextures.Count; } #endregion Textures @@ -1381,13 +1303,13 @@ namespace Vocaluxe.Lib.Draw /// /// The value of which the next power of two will be calculated /// The next power of two - private float _CheckForNextPowerOf2(float n) + private int _CheckForNextPowerOf2(int n) { if (_NonPowerOf2TextureSupported) return n; if (n < 0) throw new ArgumentOutOfRangeException("n", "Must be positive."); - return (float)Math.Pow(2, Math.Ceiling(Math.Log(n, 2))); + return (int)Math.Pow(2, Math.Ceiling(Math.Log(n, 2))); } private SlimDX.Matrix _CalculateRotationMatrix(float rot, float rx1, float rx2, float ry1, float ry2) diff --git a/Vocaluxe/Lib/Draw/CDrawWinForm.cs b/Vocaluxe/Lib/Draw/CDrawWinForm.cs index 5da213ee..e15143b3 100644 --- a/Vocaluxe/Lib/Draw/CDrawWinForm.cs +++ b/Vocaluxe/Lib/Draw/CDrawWinForm.cs @@ -28,6 +28,7 @@ using System.Threading; using System.Windows.Forms; using Vocaluxe.Base; using VocaluxeLib; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; namespace Vocaluxe.Lib.Draw @@ -46,8 +47,8 @@ namespace Vocaluxe.Lib.Draw private bool _TopMost; private Rectangle _Bounds; - private readonly List _Textures; - private readonly List _Bitmaps; + private readonly Dictionary _Textures = new Dictionary(); + private readonly List _Bitmaps = new List(); private readonly Color _ClearColor = Color.DarkBlue; @@ -55,9 +56,6 @@ namespace Vocaluxe.Lib.Draw { Icon = new Icon(Path.Combine(Environment.CurrentDirectory, CSettings.Icon)); - _Textures = new List(); - _Bitmaps = new List(); - _Keys = new CKeys(); _Mouse = new CMouse(); ClientSize = new Size(1280, 720); @@ -290,34 +288,27 @@ namespace Vocaluxe.Lib.Draw _G.Clear(_ClearColor); } - public STexture CopyScreen() + public CTexture CopyScreen() { - STexture texture = new STexture(0); Bitmap bmp = new Bitmap(_Backbuffer); _Bitmaps.Add(bmp); - - texture.Index = _Bitmaps.Count - 1; - - texture.Width = bmp.Width; - texture.Height = bmp.Height; + CTexture texture = _GetNewTexture(bmp.Width, bmp.Height); // Add to Texture List - texture.Color = new SColorF(1f, 1f, 1f, 1f); - texture.Rect = new SRectF(0f, 0f, texture.Width, texture.Height, 0f); - _Textures.Add(texture); + _Textures[texture.ID] = texture; return texture; } - public void CopyScreen(ref STexture texture) + public void CopyScreen(ref CTexture texture) { - if (texture.Index == 0 || (int)texture.Width != GetScreenWidth() || (int)texture.Height != GetScreenHeight()) + if (!_TextureExists(texture) || texture.W2 != GetScreenWidth() || texture.H2 != GetScreenHeight()) { RemoveTexture(ref texture); texture = CopyScreen(); } else - _Bitmaps[texture.Index] = new Bitmap(_Backbuffer); + _Bitmaps[texture.ID] = new Bitmap(_Backbuffer); } public void MakeScreenShot() @@ -341,70 +332,63 @@ namespace Vocaluxe.Lib.Draw public void DrawColorReflection(SColorF color, SRectF rect, float space, float height) {} - public STexture AddTexture(Bitmap bmp) + public CTexture AddTexture(Bitmap bmp) { Bitmap bmp2 = new Bitmap(bmp); _Bitmaps.Add(bmp2); - STexture texture = new STexture {Index = _Bitmaps.Count - 1, Width = bmp.Width, Height = bmp.Height, Color = new SColorF(1f, 1f, 1f, 1f)}; + CTexture texture = _GetNewTexture(bmp.Width, bmp.Height); // Add to Texture List - texture.Rect = new SRectF(0f, 0f, texture.Width, texture.Height, 0f); - texture.TexturePath = String.Empty; - - _Textures.Add(texture); + _Textures[texture.ID] = texture; return texture; } - public STexture AddTexture(string texturePath) + private CTexture _GetNewTexture(int w, int h) + { + return new CTexture(w, h) {ID = _Bitmaps.Count - 1}; + } + + public CTexture AddTexture(string texturePath) { - STexture texture = new STexture(); if (File.Exists(texturePath)) { - bool found = false; - foreach (STexture tex in _Textures) + foreach (CTexture tex in _Textures.Values) { if (tex.TexturePath == texturePath) - { - texture = tex; - found = true; - break; - } + return tex; } - - if (!found) + using (Bitmap bmp = new Bitmap(texturePath)) { - using (Bitmap bmp = new Bitmap(texturePath)) - return AddTexture(bmp); + CTexture texture = AddTexture(bmp); + texture.TexturePath = texturePath; } } - return texture; + return null; } - public void RemoveTexture(ref STexture texture) + private bool _TextureExists(CTexture texture) { - if ((texture.Index >= 0) && (_Textures.Count > 0)) - { - for (int i = 0; i < _Textures.Count; i++) - { - if (_Textures[i].Index == texture.Index) - { - _Bitmaps[texture.Index].Dispose(); - _Textures.RemoveAt(i); - texture.Index = -1; - break; - } - } - } + return texture != null && _Textures.ContainsKey(texture.ID); } - public STexture EnqueueTexture(int w, int h, byte[] data) + public void RemoveTexture(ref CTexture texture) + { + if (_TextureExists(texture)) + { + _Bitmaps[texture.ID].Dispose(); + _Textures.Remove(texture.ID); + } + texture = null; + } + + public CTexture EnqueueTexture(int w, int h, byte[] data) { return AddTexture(w, h, data); } - public STexture AddTexture(int w, int h, byte[] data) + public CTexture AddTexture(int w, int h, byte[] data) { using (Bitmap bmp = new Bitmap(w, h)) { @@ -415,49 +399,59 @@ namespace Vocaluxe.Lib.Draw } } - public bool UpdateTexture(ref STexture texture, byte[] data) + public bool UpdateTexture(CTexture texture, int w, int h, byte[] data) { - if ((texture.Index >= 0) && (_Textures.Count > 0) && (_Bitmaps.Count > texture.Index)) + if (_TextureExists(texture)) { - BitmapData bmpData = _Bitmaps[texture.Index].LockBits(new Rectangle(0, 0, _Bitmaps[texture.Index].Width, _Bitmaps[texture.Index].Height), - ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); + BitmapData bmpData = _Bitmaps[texture.ID].LockBits(new Rectangle(0, 0, _Bitmaps[texture.ID].Width, _Bitmaps[texture.ID].Height), + ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); Marshal.Copy(data, 0, bmpData.Scan0, data.Length); - _Bitmaps[texture.Index].UnlockBits(bmpData); + _Bitmaps[texture.ID].UnlockBits(bmpData); + return true; + } + return false; + } + + public bool UpdateOrAddTexture(ref CTexture texture, int w, int h, byte[] data) + { + if (!UpdateTexture(texture, w, h, data)) + { + RemoveTexture(ref texture); + texture = AddTexture(w, h, data); } return true; } - public void DrawTexture(STexture texture) + public void DrawTexture(CTexture texture) { - if ((texture.Index >= 0) && (_Textures.Count > 0) && (_Bitmaps.Count > texture.Index)) + if (texture != null) DrawTexture(texture, texture.Rect, texture.Color); } - public void DrawTexture(STexture texture, SRectF rect) + public void DrawTexture(CTexture texture, SRectF rect) { - if ((texture.Index >= 0) && (_Textures.Count > 0) && (_Bitmaps.Count > texture.Index)) + if (texture != null) DrawTexture(texture, rect, texture.Color); } - public void DrawTexture(STexture texture, SRectF rect, SColorF color, bool mirrored = false) + public void DrawTexture(CTexture texture, SRectF rect, SColorF color, bool mirrored = false) { - if ((texture.Index >= 0) && (_Textures.Count > 0) && (_Bitmaps.Count > texture.Index)) + if (texture != null) DrawTexture(texture, rect, color, rect, mirrored); } - public void DrawTexture(STexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false) + public void DrawTexture(CTexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false) { - if ((texture.Index >= 0) && (_Textures.Count > 0) && (_Bitmaps.Count > texture.Index)) - { - Bitmap coloredBitmap = _ColorizeBitmap(_Bitmaps[texture.Index], color); - _G.DrawImage(coloredBitmap, new RectangleF(rect.X, rect.Y, rect.W, rect.H)); - coloredBitmap.Dispose(); - } + if (!_TextureExists(texture)) + return; + Bitmap coloredBitmap = _ColorizeBitmap(_Bitmaps[texture.ID], color); + _G.DrawImage(coloredBitmap, new RectangleF(rect.X, rect.Y, rect.W, rect.H)); + coloredBitmap.Dispose(); } - public void DrawTexture(STexture texture, SRectF rect, SColorF color, float begin, float end) {} + public void DrawTexture(CTexture texture, SRectF rect, SColorF color, float begin, float end) {} - public void DrawTextureReflection(STexture texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) {} + public void DrawTextureReflection(CTexture texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) {} public int GetTextureCount() { diff --git a/Vocaluxe/Lib/Draw/COpenGL.cs b/Vocaluxe/Lib/Draw/COpenGL.cs index d4a123b2..ff9e45ee 100644 --- a/Vocaluxe/Lib/Draw/COpenGL.cs +++ b/Vocaluxe/Lib/Draw/COpenGL.cs @@ -31,6 +31,7 @@ using System.Runtime.InteropServices; using System.Windows.Forms; using Vocaluxe.Base; using VocaluxeLib; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; using BeginMode = OpenTK.Graphics.OpenGL.BeginMode; using BlendingFactorDest = OpenTK.Graphics.OpenGL.BlendingFactorDest; @@ -65,15 +66,29 @@ namespace Vocaluxe.Lib.Draw struct STextureQueue { - public int ID; - public int Width; - public int Height; - public byte[] Data; + public readonly int ID; + public readonly int TextureWidth; + public readonly int TextureHeight; + public readonly int DataWidth; + public readonly int DataHeight; + public readonly byte[] Data; + + public STextureQueue(int id, int textureWidth, int textureHeight, int dataWidth, int dataHeight, byte[] data) + { + ID = id; + TextureWidth = textureWidth; + TextureHeight = textureHeight; + DataWidth = dataWidth; + DataHeight = dataHeight; + Data = data; + } } class COpenGL : Form, IDraw { #region private vars + private const int _MaxID = 100000; + private readonly CKeys _Keys; private readonly CMouse _Mouse; private bool _Run; @@ -83,9 +98,9 @@ namespace Vocaluxe.Lib.Draw private SClientRect _Restore; private bool _Fullscreen; - private readonly Dictionary _Textures; - private readonly Queue _IDs; - private readonly List _Queue; + private readonly Dictionary _Textures = new Dictionary(); + private readonly Queue _IDs = new Queue(_MaxID); + private readonly Queue _TexturesToLoad = new Queue(); private readonly Object _MutexTexture = new Object(); @@ -101,11 +116,7 @@ namespace Vocaluxe.Lib.Draw { Icon = new Icon(Path.Combine(Environment.CurrentDirectory, CSettings.Icon)); - _Textures = new Dictionary(); - _Queue = new List(); - _IDs = new Queue(1000000); - - for (int i = 1; i < 1000000; i++) + for (int i = 1; i < _MaxID; i++) _IDs.Enqueue(i); //Check AA Mode @@ -429,32 +440,29 @@ namespace Vocaluxe.Lib.Draw while (_Run) { + ClearScreen(); + if (!CGraphics.Draw()) + _Run = false; + if (!CGraphics.UpdateGameLogic(_Keys, _Mouse)) + _Run = false; + + _Control.SwapBuffers(); + + if (CSettings.IsFullScreen != _Fullscreen) + _ToggleFullScreen(); + + _CheckQueue(); + + if (CTime.IsRunning()) + delay = (int)Math.Floor(CConfig.CalcCycleTime() - CTime.GetMilliseconds()); + + if (delay >= 1 && CConfig.VSync == EOffOn.TR_CONFIG_OFF) + Thread.Sleep(delay); + + CTime.CalculateFPS(); + CTime.Restart(); + Application.DoEvents(); - - if (_Run) - { - ClearScreen(); - if (!CGraphics.Draw()) - _Run = false; - if (!CGraphics.UpdateGameLogic(_Keys, _Mouse)) - _Run = false; - - _Control.SwapBuffers(); - - if ((CSettings.IsFullScreen && !_Fullscreen) || (!CSettings.IsFullScreen && _Fullscreen)) - _ToggleFullScreen(); - - _CheckQueue(); - - if (CTime.IsRunning()) - delay = (int)Math.Floor(CConfig.CalcCycleTime() - CTime.GetMilliseconds()); - - if (delay >= 1 && CConfig.VSync == EOffOn.TR_CONFIG_OFF) - Thread.Sleep(delay); - - CTime.CalculateFPS(); - CTime.Restart(); - } } Close(); } @@ -466,7 +474,7 @@ namespace Vocaluxe.Lib.Draw Close(); } catch {} - STexture[] textures = new STexture[_Textures.Count]; + CTexture[] textures = new CTexture[_Textures.Count]; _Textures.Values.CopyTo(textures, 0); for (int i = 0; i < _Textures.Count; i++) RemoveTexture(ref textures[i]); @@ -489,25 +497,15 @@ namespace Vocaluxe.Lib.Draw GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); } - public STexture CopyScreen() + public CTexture CopyScreen() { - STexture texture = new STexture(-1); + CTexture texture = _GetNewTexture(_W, _H); - int id = GL.GenTexture(); - GL.BindTexture(TextureTarget.Texture2D, id); - texture.ID = id; + texture.Name = GL.GenTexture(); + GL.BindTexture(TextureTarget.Texture2D, texture.Name); - texture.Width = _W; - texture.Height = _H; - texture.W2 = MathHelper.NextPowerOfTwo(texture.Width); - texture.H2 = MathHelper.NextPowerOfTwo(texture.Height); - - texture.WidthRatio = texture.Width / texture.W2; - texture.HeightRatio = texture.Height / texture.H2; - - GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)texture.W2, (int)texture.H2, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); - - GL.CopyTexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, _X, _Y, (int)texture.Width, (int)texture.Height); + GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, texture.W2, texture.H2, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); + GL.CopyTexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, _X, _Y, _W, _H); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); @@ -515,30 +513,29 @@ namespace Vocaluxe.Lib.Draw 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); lock (_MutexTexture) { - texture.Index = _IDs.Dequeue(); - _Textures[texture.Index] = texture; + texture.ID = _IDs.Dequeue(); + _Textures[texture.ID] = texture; } return texture; } - public void CopyScreen(ref STexture texture) + public void CopyScreen(ref CTexture texture) { - if (!_TextureExists(ref texture) || Math.Abs(texture.Width - GetScreenWidth()) > 1 || Math.Abs(texture.Height - GetScreenHeight()) > 1) + //Check for actual texture sizes as it may be downsized compared to OrigSize + if (!_TextureExists(texture) || texture.UsedWidth != GetScreenWidth() || texture.UsedHeight != GetScreenHeight()) { RemoveTexture(ref texture); texture = CopyScreen(); } else { - GL.BindTexture(TextureTarget.Texture2D, texture.ID); + GL.BindTexture(TextureTarget.Texture2D, texture.Name); - GL.CopyTexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, 0, 0, (int)texture.Width, (int)texture.Height); + GL.CopyTexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, 0, 0, GetScreenWidth(), GetScreenHeight()); GL.BindTexture(TextureTarget.Texture2D, 0); } @@ -651,39 +648,37 @@ namespace Vocaluxe.Lib.Draw #region Textures #region adding - public STexture AddTexture(string texturePath) + public CTexture AddTexture(string texturePath) { - if (File.Exists(texturePath)) + if (!File.Exists(texturePath)) { - Bitmap bmp; - try - { - bmp = new Bitmap(texturePath); - } - catch (Exception) - { - CLog.LogError("Error loading Texture: " + texturePath); - return new STexture(-1); - } - try - { - return AddTexture(bmp); - } - finally - { - bmp.Dispose(); - } + CLog.LogError("Can't find File: " + texturePath); + return null; + } + Bitmap bmp; + try + { + bmp = new Bitmap(texturePath); + } + catch (Exception) + { + CLog.LogError("Error loading Texture: " + texturePath); + return null; + } + try + { + return AddTexture(bmp); + } + finally + { + bmp.Dispose(); } - CLog.LogError("Can't find File: " + texturePath); - return new STexture(-1); } - public STexture AddTexture(Bitmap bmp) + public CTexture AddTexture(Bitmap bmp) { - STexture texture = new STexture(-1); - if (bmp.Height == 0 || bmp.Width == 0) - return texture; + return null; int maxSize; switch (CConfig.TextureQuality) @@ -708,60 +703,40 @@ namespace Vocaluxe.Lib.Draw break; } - int w = bmp.Width; - int h = bmp.Height; + int w = Math.Min(bmp.Width, maxSize); + int h = Math.Min(bmp.Height, maxSize); + w = MathHelper.NextPowerOfTwo(w); + h = MathHelper.NextPowerOfTwo(h); - if (w > maxSize) - { - h = (int)Math.Round((float)maxSize / bmp.Width * bmp.Height); - if (h == 0) - h = 1; - w = maxSize; - } + CTexture texture = new CTexture(bmp.Width, bmp.Height, w, h, true) {Name = GL.GenTexture()}; - if (h > maxSize) - { - w = (int)Math.Round((float)maxSize / bmp.Height * bmp.Width); - if (w == 0) - w = 1; - h = maxSize; - } - - int id = GL.GenTexture(); - GL.BindTexture(TextureTarget.Texture2D, id); - texture.ID = id; - - texture.Width = w; - texture.Height = h; - - texture.W2 = MathHelper.NextPowerOfTwo(w); - texture.H2 = MathHelper.NextPowerOfTwo(h); + GL.BindTexture(TextureTarget.Texture2D, texture.Name); + Bitmap bmp2 = null; try { - using (Bitmap bmp2 = new Bitmap((int)texture.W2, (int)texture.H2)) + if (bmp.Width != w || bmp.Height != h) { - Graphics g = Graphics.FromImage(bmp2); - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.SmoothingMode = SmoothingMode.HighQuality; - g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height)); - g.Dispose(); - - texture.WidthRatio = 1f; - texture.HeightRatio = 1f; - - BitmapData bmpData = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - - GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)texture.W2, (int)texture.H2, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); - - GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, bmpData.Width, bmpData.Height, PixelFormat.Bgra, PixelType.UnsignedByte, bmpData.Scan0); - - bmp2.UnlockBits(bmpData); + //Create a new Bitmap with the new sizes + bmp2 = new Bitmap(w, h); + //Scale the texture + using (Graphics g = Graphics.FromImage(bmp2)) + { + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.SmoothingMode = SmoothingMode.HighQuality; + g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height)); + } + bmp = bmp2; } + + BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, texture.W2, texture.H2, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); + GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, bmpData.Width, bmpData.Height, PixelFormat.Bgra, PixelType.UnsignedByte, bmpData.Scan0); + bmp.UnlockBits(bmpData); } - catch + finally { - CLog.LogError(w + " " + h + " " + (int)texture.W2 + " " + (int)texture.H2); - throw; + if (bmp2 != null) + bmp2.Dispose(); } GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureParameterName.ClampToEdge); @@ -769,28 +744,38 @@ namespace Vocaluxe.Lib.Draw GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); - //GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); GL.Ext.GenerateMipmap(GenerateMipmapTarget.Texture2D); - + 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; lock (_MutexTexture) { - texture.Index = _IDs.Dequeue(); - _Textures[texture.Index] = texture; + texture.ID = _IDs.Dequeue(); + _Textures[texture.ID] = texture; } return texture; } - public STexture AddTexture(int w, int h, byte[] data) + public CTexture AddTexture(int w, int h, byte[] data) { - STexture texture = new STexture(-1); + CTexture texture = _GetNewTexture(w, h); + _CreateTexture(texture, w, h, data); + + lock (_MutexTexture) + { + texture.ID = _IDs.Dequeue(); + _Textures[texture.ID] = texture; + } + + return texture; + } + + private void _CreateTexture(CTexture texture, int w, int h, byte[] data) + { if (_UsePBO) { try @@ -807,161 +792,145 @@ namespace Vocaluxe.Lib.Draw } } - int id = GL.GenTexture(); - GL.BindTexture(TextureTarget.Texture2D, id); - texture.ID = id; - - texture.Width = w; - texture.Height = h; - texture.W2 = MathHelper.NextPowerOfTwo(texture.Width); - texture.H2 = MathHelper.NextPowerOfTwo(texture.Height); - - texture.WidthRatio = texture.Width / texture.W2; - texture.HeightRatio = texture.Height / texture.H2; - - GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)texture.W2, (int)texture.H2, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); + texture.Name = GL.GenTexture(); + GL.BindTexture(TextureTarget.Texture2D, texture.Name); + GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, texture.W2, texture.H2, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, w, h, PixelFormat.Bgra, PixelType.UnsignedByte, data); - - //GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureParameterName.ClampToEdge); - //GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureParameterName.ClampToEdge); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureParameterName.ClampToEdge); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureParameterName.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); + GL.Ext.GenerateMipmap(GenerateMipmapTarget.Texture2D); - //GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); - //GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); - //GL.Ext.GenerateMipmap(GenerateMipmapTarget.Texture2D); 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; + public CTexture EnqueueTexture(int w, int h, byte[] data) + { + CTexture texture = _GetNewTexture(w, h); lock (_MutexTexture) { - texture.Index = _IDs.Dequeue(); - _Textures[texture.Index] = texture; + texture.ID = _IDs.Dequeue(); + STextureQueue queue = new STextureQueue(texture.ID, texture.W2, texture.H2, w, h, data); + _TexturesToLoad.Enqueue(queue); + _Textures[texture.ID] = texture; } return texture; } - public STexture EnqueueTexture(int w, int h, byte[] data) + private static CTexture _GetNewTexture(int w, int h) { - STexture texture = new STexture(-1); - STextureQueue queue = new STextureQueue {Data = data, Height = h, Width = w}; - - texture.Height = h; - texture.Width = w; - - lock (_MutexTexture) - { - texture.Index = _IDs.Dequeue(); - queue.ID = texture.Index; - _Queue.Add(queue); - _Textures[texture.Index] = texture; - } - - return texture; + return new CTexture(w, h, MathHelper.NextPowerOfTwo(w), MathHelper.NextPowerOfTwo(h)); } #endregion adding #region updating - public bool UpdateTexture(ref STexture texture, byte[] data) + public bool UpdateTexture(CTexture texture, int w, int h, byte[] data) { - if (_TextureExists(ref texture)) + //Check if texture exists and extend matches + if (!_TextureExists(texture) || texture.UsedWidth != w || texture.UsedHeight != h) + return false; + if (_UsePBO) { - if (_UsePBO) - { - GL.BindBuffer(BufferTarget.PixelUnpackBuffer, texture.PBO); + GL.BindBuffer(BufferTarget.PixelUnpackBuffer, texture.PBO); - IntPtr buffer = GL.MapBuffer(BufferTarget.PixelUnpackBuffer, BufferAccess.WriteOnly); - Marshal.Copy(data, 0, buffer, data.Length); + IntPtr buffer = GL.MapBuffer(BufferTarget.PixelUnpackBuffer, BufferAccess.WriteOnly); + Marshal.Copy(data, 0, buffer, data.Length); - GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer); + GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer); - GL.BindTexture(TextureTarget.Texture2D, texture.ID); - GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)texture.Width, (int)texture.Height, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); + GL.BindTexture(TextureTarget.Texture2D, texture.Name); - GL.BindTexture(TextureTarget.Texture2D, 0); - GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0); + GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, w, h, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); - return true; - } + GL.Ext.GenerateMipmap(GenerateMipmapTarget.Texture2D); - GL.BindTexture(TextureTarget.Texture2D, texture.ID); - - GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)texture.Width, (int)texture.Height, PixelFormat.Bgra, PixelType.UnsignedByte, data); - - //GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureParameterName.ClampToEdge); - //GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureParameterName.ClampToEdge); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); - - //GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); - //GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); - //GL.Ext.GenerateMipmap(GenerateMipmapTarget.Texture2D); GL.BindTexture(TextureTarget.Texture2D, 0); + GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0); return true; } - return false; + + GL.BindTexture(TextureTarget.Texture2D, texture.Name); + + GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, w, h, PixelFormat.Bgra, PixelType.UnsignedByte, data); + + GL.Ext.GenerateMipmap(GenerateMipmapTarget.Texture2D); + + GL.BindTexture(TextureTarget.Texture2D, 0); + + return true; + } + + public bool UpdateOrAddTexture(ref CTexture texture, int w, int h, byte[] data) + { + if (!UpdateTexture(texture, w, h, data)) + { + RemoveTexture(ref texture); + texture = AddTexture(w, h, data); + } + return true; } #endregion updating - public void RemoveTexture(ref STexture texture) + public void RemoveTexture(ref CTexture texture) { - if ((texture.Index > 0) && (_Textures.Count > 0)) + if (_TextureExists(texture, false)) { lock (_MutexTexture) { - _IDs.Enqueue(texture.Index); - GL.DeleteTexture(texture.ID); + _IDs.Enqueue(texture.ID); + GL.DeleteTexture(texture.Name); if (texture.PBO > 0) GL.DeleteBuffers(1, ref texture.PBO); - _Textures.Remove(texture.Index); - texture.Index = -1; - texture.ID = -1; + _Textures.Remove(texture.ID); } } + texture = null; } - private bool _TextureExists(ref STexture texture) + private bool _TextureExists(CTexture texture, bool checkIfLoaded = true) { lock (_MutexTexture) { - if (_Textures.ContainsKey(texture.Index)) + if (texture != null && _Textures.ContainsKey(texture.ID)) { - if (_Textures[texture.Index].ID > 0) - { - texture = _Textures[texture.Index]; + if (!checkIfLoaded || _Textures[texture.ID].Name > 0) return true; - } } } return false; } #region drawing - public void DrawTexture(STexture texture) + public void DrawTexture(CTexture texture) { + if (texture == null) + return; DrawTexture(texture, texture.Rect, texture.Color); } - public void DrawTexture(STexture texture, SRectF rect) + public void DrawTexture(CTexture texture, SRectF rect) { + if (texture == null) + return; DrawTexture(texture, rect, texture.Color); } - public void DrawTexture(STexture texture, SRectF rect, SColorF color, bool mirrored = false) + public void DrawTexture(CTexture texture, SRectF rect, SColorF color, bool mirrored = false) { DrawTexture(texture, rect, color, new SRectF(0, 0, CSettings.RenderW, CSettings.RenderH, rect.Z), mirrored); } - public void DrawTexture(STexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false) + public void DrawTexture(CTexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false) { + if (!_TextureExists(texture)) + return; + if (Math.Abs(rect.W) < float.Epsilon || Math.Abs(rect.H) < float.Epsilon || Math.Abs(bounds.H) < float.Epsilon || Math.Abs(bounds.W) < float.Epsilon || Math.Abs(color.A) < float.Epsilon) return; @@ -972,136 +941,135 @@ namespace Vocaluxe.Lib.Draw if (bounds.Y > rect.Y + rect.H || bounds.Y + bounds.H < rect.Y) return; - if (_TextureExists(ref texture)) + GL.BindTexture(TextureTarget.Texture2D, texture.Name); + + float x1 = (bounds.X - rect.X) / rect.W * texture.WidthRatio; + float x2 = (bounds.X + bounds.W - rect.X) / rect.W * texture.WidthRatio; + float y1 = (bounds.Y - rect.Y) / rect.H * texture.HeightRatio; + float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * texture.HeightRatio; + + if (x1 < 0) + x1 = 0f; + + if (x2 > texture.WidthRatio) + x2 = texture.WidthRatio; + + if (y1 < 0) + y1 = 0f; + + if (y2 > texture.HeightRatio) + y2 = texture.HeightRatio; + + + float rx1 = rect.X; + float rx2 = rect.X + rect.W; + float ry1 = rect.Y; + float ry2 = rect.Y + rect.H; + + if (rx1 < bounds.X) + rx1 = bounds.X; + + if (rx2 > bounds.X + bounds.W) + rx2 = bounds.X + bounds.W; + + if (ry1 < bounds.Y) + ry1 = bounds.Y; + + if (ry2 > bounds.Y + bounds.H) + ry2 = bounds.Y + bounds.H; + + GL.Enable(EnableCap.Blend); + GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha); + + GL.MatrixMode(MatrixMode.Texture); + GL.PushMatrix(); + + if (Math.Abs(rect.Rotation) > float.Epsilon) { - GL.BindTexture(TextureTarget.Texture2D, texture.ID); - - float x1 = (bounds.X - rect.X) / rect.W * texture.WidthRatio; - float x2 = (bounds.X + bounds.W - rect.X) / rect.W * texture.WidthRatio; - float y1 = (bounds.Y - rect.Y) / rect.H * texture.HeightRatio; - float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * texture.HeightRatio; - - if (x1 < 0) - x1 = 0f; - - if (x2 > texture.WidthRatio) - x2 = texture.WidthRatio; - - if (y1 < 0) - y1 = 0f; - - if (y2 > texture.HeightRatio) - y2 = texture.HeightRatio; - - - float rx1 = rect.X; - float rx2 = rect.X + rect.W; - float ry1 = rect.Y; - float ry2 = rect.Y + rect.H; - - if (rx1 < bounds.X) - rx1 = bounds.X; - - if (rx2 > bounds.X + bounds.W) - rx2 = bounds.X + bounds.W; - - if (ry1 < bounds.Y) - ry1 = bounds.Y; - - if (ry2 > bounds.Y + bounds.H) - ry2 = bounds.Y + bounds.H; - - GL.Enable(EnableCap.Blend); - GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha); - - GL.MatrixMode(MatrixMode.Texture); - GL.PushMatrix(); - - if (Math.Abs(rect.Rotation) > float.Epsilon) - { - GL.Translate(0.5f, 0.5f, 0); - GL.Rotate(-rect.Rotation, 0f, 0f, 1f); - GL.Translate(-0.5f, -0.5f, 0); - } - - if (!mirrored) - { - GL.Begin(BeginMode.Quads); - - GL.TexCoord2(x1, y1); - GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset); - - GL.TexCoord2(x1, y2); - GL.Vertex3(rx1, ry2, rect.Z + CGraphics.ZOffset); - - GL.TexCoord2(x2, y2); - GL.Vertex3(rx2, ry2, rect.Z + CGraphics.ZOffset); - - GL.TexCoord2(x2, y1); - GL.Vertex3(rx2, ry1, rect.Z + CGraphics.ZOffset); - - GL.End(); - } - else - { - GL.Begin(BeginMode.Quads); - - GL.TexCoord2(x2, y2); - GL.Vertex3(rx2, ry1, rect.Z + CGraphics.ZOffset); - - GL.TexCoord2(x2, y1); - GL.Vertex3(rx2, ry2, rect.Z + CGraphics.ZOffset); - - GL.TexCoord2(x1, y1); - GL.Vertex3(rx1, ry2, rect.Z + CGraphics.ZOffset); - - GL.TexCoord2(x1, y2); - GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset); - - GL.End(); - } - - GL.PopMatrix(); - - GL.Disable(EnableCap.Blend); - GL.BindTexture(TextureTarget.Texture2D, 0); + GL.Translate(0.5f, 0.5f, 0); + GL.Rotate(-rect.Rotation, 0f, 0f, 1f); + GL.Translate(-0.5f, -0.5f, 0); } - } - public void DrawTexture(STexture texture, SRectF rect, SColorF color, float begin, float end) - { - if (_TextureExists(ref texture)) + if (!mirrored) { - GL.BindTexture(TextureTarget.Texture2D, texture.ID); - - GL.Enable(EnableCap.Blend); - GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha); - - GL.Begin(BeginMode.Quads); - GL.TexCoord2(0f + begin * texture.WidthRatio, 0f); - GL.Vertex3(rect.X + begin * rect.W, rect.Y, rect.Z + CGraphics.ZOffset); + GL.TexCoord2(x1, y1); + GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset); - GL.TexCoord2(0f + begin * texture.WidthRatio, texture.HeightRatio); - GL.Vertex3(rect.X + begin * rect.W, rect.Y + rect.H, rect.Z + CGraphics.ZOffset); + GL.TexCoord2(x1, y2); + GL.Vertex3(rx1, ry2, rect.Z + CGraphics.ZOffset); - GL.TexCoord2(texture.WidthRatio * end, texture.HeightRatio); - GL.Vertex3(rect.X + end * rect.W, rect.Y + rect.H, rect.Z + CGraphics.ZOffset); + GL.TexCoord2(x2, y2); + GL.Vertex3(rx2, ry2, rect.Z + CGraphics.ZOffset); - GL.TexCoord2(texture.WidthRatio * end, 0f); - GL.Vertex3(rect.X + end * rect.W, rect.Y, rect.Z + CGraphics.ZOffset); + GL.TexCoord2(x2, y1); + GL.Vertex3(rx2, ry1, rect.Z + CGraphics.ZOffset); GL.End(); - - - GL.Disable(EnableCap.Blend); - GL.BindTexture(TextureTarget.Texture2D, 0); } + else + { + GL.Begin(BeginMode.Quads); + + GL.TexCoord2(x2, y2); + GL.Vertex3(rx2, ry1, rect.Z + CGraphics.ZOffset); + + GL.TexCoord2(x2, y1); + GL.Vertex3(rx2, ry2, rect.Z + CGraphics.ZOffset); + + GL.TexCoord2(x1, y1); + GL.Vertex3(rx1, ry2, rect.Z + CGraphics.ZOffset); + + GL.TexCoord2(x1, y2); + GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset); + + GL.End(); + } + + GL.PopMatrix(); + + GL.Disable(EnableCap.Blend); + GL.BindTexture(TextureTarget.Texture2D, 0); } - public void DrawTextureReflection(STexture texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) + public void DrawTexture(CTexture texture, SRectF rect, SColorF color, float begin, float end) { + if (!_TextureExists(texture)) + return; + GL.BindTexture(TextureTarget.Texture2D, texture.Name); + + GL.Enable(EnableCap.Blend); + GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha); + + + GL.Begin(BeginMode.Quads); + + GL.TexCoord2(0f + begin * texture.WidthRatio, 0f); + GL.Vertex3(rect.X + begin * rect.W, rect.Y, rect.Z + CGraphics.ZOffset); + + GL.TexCoord2(0f + begin * texture.WidthRatio, texture.HeightRatio); + GL.Vertex3(rect.X + begin * rect.W, rect.Y + rect.H, rect.Z + CGraphics.ZOffset); + + GL.TexCoord2(texture.WidthRatio * end, texture.HeightRatio); + GL.Vertex3(rect.X + end * rect.W, rect.Y + rect.H, rect.Z + CGraphics.ZOffset); + + GL.TexCoord2(texture.WidthRatio * end, 0f); + GL.Vertex3(rect.X + end * rect.W, rect.Y, rect.Z + CGraphics.ZOffset); + + GL.End(); + + + GL.Disable(EnableCap.Blend); + GL.BindTexture(TextureTarget.Texture2D, 0); + } + + public void DrawTextureReflection(CTexture texture, SRectF rect, SColorF color, SRectF bounds, float space, float height) + { + if (!_TextureExists(texture)) + return; + if (Math.Abs(rect.W) < float.Epsilon || Math.Abs(rect.H) < float.Epsilon || Math.Abs(bounds.H) < float.Epsilon || Math.Abs(bounds.W) < float.Epsilon || Math.Abs(color.A) < float.Epsilon || height <= float.Epsilon) return; @@ -1115,84 +1083,81 @@ namespace Vocaluxe.Lib.Draw if (height > bounds.H) height = bounds.H; - if (_TextureExists(ref texture)) + GL.BindTexture(TextureTarget.Texture2D, texture.Name); + + float x1 = (bounds.X - rect.X) / rect.W * texture.WidthRatio; + float x2 = (bounds.X + bounds.W - rect.X) / rect.W * texture.WidthRatio; + float y1 = (bounds.Y - rect.Y + rect.H - height) / rect.H * texture.HeightRatio; + float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * texture.HeightRatio; + + if (x1 < 0) + x1 = 0f; + + if (x2 > texture.WidthRatio) + x2 = texture.WidthRatio; + + if (y1 < 0) + y1 = 0f; + + if (y2 > texture.HeightRatio) + y2 = texture.HeightRatio; + + + 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; + + GL.Enable(EnableCap.Blend); + + GL.MatrixMode(MatrixMode.Texture); + GL.PushMatrix(); + + if (Math.Abs(rect.Rotation) > float.Epsilon) { - GL.BindTexture(TextureTarget.Texture2D, texture.ID); - - float x1 = (bounds.X - rect.X) / rect.W * texture.WidthRatio; - float x2 = (bounds.X + bounds.W - rect.X) / rect.W * texture.WidthRatio; - float y1 = (bounds.Y - rect.Y + rect.H - height) / rect.H * texture.HeightRatio; - float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * texture.HeightRatio; - - if (x1 < 0) - x1 = 0f; - - if (x2 > texture.WidthRatio) - x2 = texture.WidthRatio; - - if (y1 < 0) - y1 = 0f; - - if (y2 > texture.HeightRatio) - y2 = texture.HeightRatio; - - - 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; - - GL.Enable(EnableCap.Blend); - - GL.MatrixMode(MatrixMode.Texture); - GL.PushMatrix(); - - if (Math.Abs(rect.Rotation) > float.Epsilon) - { - GL.Translate(0.5f, 0.5f, 0); - GL.Rotate(-rect.Rotation, 0f, 0f, 1f); - GL.Translate(-0.5f, -0.5f, 0); - } - - - GL.Begin(BeginMode.Quads); - - GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha); - GL.TexCoord2(x2, y2); - GL.Vertex3(rx2, ry1, rect.Z + CGraphics.ZOffset); - - GL.Color4(color.R, color.G, color.B, 0f); - GL.TexCoord2(x2, y1); - GL.Vertex3(rx2, ry2, rect.Z + CGraphics.ZOffset); - - GL.Color4(color.R, color.G, color.B, 0f); - GL.TexCoord2(x1, y1); - GL.Vertex3(rx1, ry2, rect.Z + CGraphics.ZOffset); - - GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha); - GL.TexCoord2(x1, y2); - GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset); - - GL.End(); - - - GL.PopMatrix(); - - GL.Disable(EnableCap.Blend); - GL.BindTexture(TextureTarget.Texture2D, 0); + GL.Translate(0.5f, 0.5f, 0); + GL.Rotate(-rect.Rotation, 0f, 0f, 1f); + GL.Translate(-0.5f, -0.5f, 0); } + + + GL.Begin(BeginMode.Quads); + + GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha); + GL.TexCoord2(x2, y2); + GL.Vertex3(rx2, ry1, rect.Z + CGraphics.ZOffset); + + GL.Color4(color.R, color.G, color.B, 0f); + GL.TexCoord2(x2, y1); + GL.Vertex3(rx2, ry2, rect.Z + CGraphics.ZOffset); + + GL.Color4(color.R, color.G, color.B, 0f); + GL.TexCoord2(x1, y1); + GL.Vertex3(rx1, ry2, rect.Z + CGraphics.ZOffset); + + GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha); + GL.TexCoord2(x1, y2); + GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset); + + GL.End(); + + + GL.PopMatrix(); + + GL.Disable(EnableCap.Blend); + GL.BindTexture(TextureTarget.Texture2D, 0); } #endregion drawing @@ -1205,68 +1170,15 @@ namespace Vocaluxe.Lib.Draw { lock (_MutexTexture) { - if (_Queue.Count == 0) - return; - - STextureQueue q = _Queue[0]; - STexture texture = new STexture(-1); - if (_Textures.ContainsKey(q.ID)) - texture = _Textures[q.ID]; - - if (texture.Index < 1) - return; - - if (_UsePBO) + while (_TexturesToLoad.Count > 0) { - 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; - } + STextureQueue q = _TexturesToLoad.Dequeue(); + CTexture texture; + if (!_Textures.TryGetValue(q.ID, out texture)) + continue; + + _CreateTexture(texture, q.DataWidth, q.DataHeight, q.Data); } - - int id = GL.GenTexture(); - GL.BindTexture(TextureTarget.Texture2D, id); - texture.ID = id; - - texture.Width = q.Width; - texture.Height = q.Height; - texture.W2 = MathHelper.NextPowerOfTwo(texture.Width); - texture.H2 = MathHelper.NextPowerOfTwo(texture.Height); - - texture.WidthRatio = texture.Width / texture.W2; - texture.HeightRatio = texture.Height / texture.H2; - - GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)texture.W2, (int)texture.H2, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); - - GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, q.Width, q.Height, PixelFormat.Bgra, PixelType.UnsignedByte, q.Data); - - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureParameterName.ClampToEdge); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureParameterName.ClampToEdge); - - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); - - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); - GL.Ext.GenerateMipmap(GenerateMipmapTarget.Texture2D); - - 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[texture.Index] = texture; - q.Data = null; - _Queue.RemoveAt(0); } } #endregion Textures diff --git a/Vocaluxe/Lib/Draw/IDraw.cs b/Vocaluxe/Lib/Draw/IDraw.cs index 921b0f2d..0894c7fe 100644 --- a/Vocaluxe/Lib/Draw/IDraw.cs +++ b/Vocaluxe/Lib/Draw/IDraw.cs @@ -17,11 +17,13 @@ // */ #endregion -using System; using System.Drawing; using VocaluxeLib; using VocaluxeLib.Menu; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu; + namespace Vocaluxe.Lib.Draw { interface IDraw @@ -36,28 +38,29 @@ namespace Vocaluxe.Lib.Draw int GetTextureCount(); void ClearScreen(); - STexture CopyScreen(); - void CopyScreen(ref STexture texture); + CTexture CopyScreen(); + void CopyScreen(ref CTexture texture); void MakeScreenShot(); - STexture AddTexture(string texturePath); - STexture AddTexture(Bitmap bitmap); - STexture AddTexture(int w, int h, byte[] data); - STexture EnqueueTexture(int w, int h, byte[] data); - bool UpdateTexture(ref STexture texture, byte[] data); - void RemoveTexture(ref STexture texture); + CTexture AddTexture(string texturePath); + CTexture AddTexture(Bitmap bitmap); + CTexture AddTexture(int w, int h, byte[] data); + CTexture EnqueueTexture(int w, int h, byte[] data); + bool UpdateTexture(CTexture texture, int w, int h, byte[] data); + bool UpdateOrAddTexture(ref CTexture texture, int w, int h, byte[] data); + void RemoveTexture(ref CTexture texture); // Basic Draw Methods void DrawLine(int a, int r, int g, int b, int w, int x1, int y1, int x2, int y2); void DrawColor(SColorF color, SRectF rect); void DrawColorReflection(SColorF color, SRectF rect, float space, float height); - void DrawTexture(STexture texture); - void DrawTexture(STexture texture, SRectF rect); - void DrawTexture(STexture texture, SRectF rect, SColorF color, bool mirrored = false); - void DrawTexture(STexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false); - void DrawTexture(STexture texture, SRectF rect, SColorF color, float begin, float end); + void DrawTexture(CTexture texture); + void DrawTexture(CTexture texture, SRectF rect); + void DrawTexture(CTexture texture, SRectF rect, SColorF color, bool mirrored = false); + void DrawTexture(CTexture texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored = false); + void DrawTexture(CTexture texture, SRectF rect, SColorF color, float begin, float end); - void DrawTextureReflection(STexture texture, SRectF rect, SColorF color, SRectF bounds, float space, float height); + void DrawTextureReflection(CTexture texture, SRectF rect, SColorF color, SRectF bounds, float space, float height); } } \ No newline at end of file diff --git a/Vocaluxe/Lib/Video/CVideoDecoder.cs b/Vocaluxe/Lib/Video/CVideoDecoder.cs index 34caba5a..b197abbb 100644 --- a/Vocaluxe/Lib/Video/CVideoDecoder.cs +++ b/Vocaluxe/Lib/Video/CVideoDecoder.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using System.Linq; using VocaluxeLib; +using VocaluxeLib.Draw; namespace Vocaluxe.Lib.Video { @@ -58,7 +59,7 @@ namespace Vocaluxe.Lib.Video return 0f; } - public abstract bool GetFrame(int streamID, ref STexture frame, float time, out float videoTime); + public abstract bool GetFrame(int streamID, ref CTexture frame, float time, out float videoTime); public virtual bool Skip(int streamID, float start, float gap) { diff --git a/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs b/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs index b9292683..a3068048 100644 --- a/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs +++ b/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs @@ -27,6 +27,8 @@ using Vocaluxe.Base; using Vocaluxe.Lib.Video.Acinerella; using VocaluxeLib; +using VocaluxeLib.Draw; + namespace Vocaluxe.Lib.Video { delegate void Closeproc(int streamID); @@ -90,7 +92,7 @@ namespace Vocaluxe.Lib.Video return false; } - public override bool GetFrame(int streamID, ref STexture frame, float time, out float videoTime) + public override bool GetFrame(int streamID, ref CTexture frame, float time, out float videoTime) { videoTime = 0; if (_Initialized) @@ -299,7 +301,7 @@ namespace Vocaluxe.Lib.Video return true; } - public bool GetFrame(ref STexture frame, float time, out float videoTime) + public bool GetFrame(ref CTexture frame, float time, out float videoTime) { videoTime = 0; if (!_FileOpened) @@ -323,7 +325,7 @@ namespace Vocaluxe.Lib.Video _UploadNewFrame(ref frame); //EventDecode.Set(); - return true; + return frame != null; } if (Math.Abs(_SetTime - time) > float.Epsilon) @@ -335,7 +337,7 @@ namespace Vocaluxe.Lib.Video _UploadNewFrame(ref frame); videoTime = _CurrentVideoTime; //EventDecode.Set(); - return true; + return frame != null; } return false; } @@ -650,7 +652,7 @@ namespace Vocaluxe.Lib.Video } } - private void _UploadNewFrame(ref STexture frame) + private void _UploadNewFrame(ref CTexture frame) { if (!_FileOpened) return; @@ -661,13 +663,7 @@ namespace Vocaluxe.Lib.Video if (num >= 0) { - if (frame.Index == -1 || _Width != (int)frame.Width || _Height != (int)frame.Height) - { - CDraw.RemoveTexture(ref frame); - frame = CDraw.AddTexture(_Width, _Height, _FrameBuffer[num].Data); - } - else - CDraw.UpdateTexture(ref frame, _FrameBuffer[num].Data); + CDraw.UpdateOrAddTexture(ref frame, _Width, _Height, _FrameBuffer[num].Data); lock (_MutexSyncSignals) { diff --git a/Vocaluxe/Lib/Video/CVideoDecoderGstreamer.cs b/Vocaluxe/Lib/Video/CVideoDecoderGstreamer.cs index f8b1de7e..1bb66d56 100644 --- a/Vocaluxe/Lib/Video/CVideoDecoderGstreamer.cs +++ b/Vocaluxe/Lib/Video/CVideoDecoderGstreamer.cs @@ -21,6 +21,7 @@ using System; using Vocaluxe.Base; using Vocaluxe.Lib.Video.Gstreamer; using VocaluxeLib; +using VocaluxeLib.Draw; namespace Vocaluxe.Lib.Video { @@ -78,13 +79,13 @@ namespace Vocaluxe.Lib.Video return CGstreamerVideoWrapper.GetVideoLength(streamID); } - public bool GetFrame(int streamID, ref STexture frame, float time, out float videoTime) + public bool GetFrame(int streamID, ref CTexture frame, float time, out float videoTime) { SManagedFrame managedFrame = CGstreamerVideoWrapper.GetFrame(streamID, time); videoTime = managedFrame.Videotime; _UploadNewFrame(ref frame, ref managedFrame.Buffer, managedFrame.Width, managedFrame.Height); - return true; + return frame != null; } public bool Skip(int streamID, float start, float gap) @@ -117,17 +118,11 @@ namespace Vocaluxe.Lib.Video CGstreamerVideoWrapper.UpdateVideo(); } - private void _UploadNewFrame(ref STexture frame, ref byte[] data, int width, int height) + private void _UploadNewFrame(ref CTexture frame, ref byte[] data, int width, int height) { if (data == null) return; - if (frame.Index == -1 || width != (int)frame.Width || height != (int)frame.Height || data.Length == 0) - { - CDraw.RemoveTexture(ref frame); - frame = CDraw.AddTexture(width, height, data); - } - else - CDraw.UpdateTexture(ref frame, data); + CDraw.UpdateOrAddTexture(ref frame, width, height, data); data = null; } } diff --git a/Vocaluxe/Lib/Video/IVideoDecoder.cs b/Vocaluxe/Lib/Video/IVideoDecoder.cs index 807361c8..93b274e2 100644 --- a/Vocaluxe/Lib/Video/IVideoDecoder.cs +++ b/Vocaluxe/Lib/Video/IVideoDecoder.cs @@ -19,6 +19,8 @@ using VocaluxeLib; +using VocaluxeLib.Draw; + namespace Vocaluxe.Lib.Video { struct SVideoStreams @@ -41,7 +43,17 @@ namespace Vocaluxe.Lib.Video int GetNumStreams(); float GetLength(int streamID); - bool GetFrame(int streamID, ref STexture frame, float time, out float videoTime); + + /// + /// + /// + /// + /// + /// + /// + /// True if frame is valid + bool GetFrame(int streamID, ref CTexture frame, float time, out float videoTime); + bool Skip(int streamID, float start, float gap); void SetLoop(int streamID, bool loop); void Pause(int streamID); diff --git a/Vocaluxe/Lib/Webcam/CAForgeNet.cs b/Vocaluxe/Lib/Webcam/CAForgeNet.cs index c5af6463..f3723825 100644 --- a/Vocaluxe/Lib/Webcam/CAForgeNet.cs +++ b/Vocaluxe/Lib/Webcam/CAForgeNet.cs @@ -25,6 +25,7 @@ using System.Drawing.Imaging; using System.Runtime.InteropServices; using Vocaluxe.Base; using VocaluxeLib; +using VocaluxeLib.Draw; namespace Vocaluxe.Lib.Webcam { @@ -41,29 +42,20 @@ namespace Vocaluxe.Lib.Webcam public void Close() { - if (_Webcam != null) - { - _Webcam.SignalToStop(); - _Webcam.WaitForStop(); - _Webcam.NewFrame -= _OnFrame; - _Data = new byte[1]; - } + if (_Webcam == null) + return; + _Webcam.SignalToStop(); + _Webcam.WaitForStop(); + _Webcam.NewFrame -= _OnFrame; + _Data = new byte[1]; } - public bool GetFrame(ref STexture frame) + public bool GetFrame(ref CTexture frame) { - if (_Webcam != null && _Width > 0 && _Height > 0 && _Data.Length == _Width * _Height * 4) + lock (_MutexData) { - lock (_MutexData) - { - if (frame.Index == -1 || _Width != (int)frame.Width || _Height != (int)frame.Height) - { - CDraw.RemoveTexture(ref frame); - frame = CDraw.AddTexture(_Width, _Height, _Data); - } - else - CDraw.UpdateTexture(ref frame, _Data); - } + if (_Webcam != null && _Width > 0 && _Height > 0 && _Data.Length == _Width * _Height * 4) + CDraw.UpdateOrAddTexture(ref frame, _Width, _Height, _Data); } return false; } @@ -114,19 +106,18 @@ namespace Vocaluxe.Lib.Webcam private void _OnFrame(object sender, NewFrameEventArgs e) { - if (!_Paused) + if (_Paused) + return; + lock (_MutexData) { - lock (_MutexData) - { - if (_Width != e.Frame.Width || _Height != e.Frame.Height || _Data.Length != e.Frame.Width * e.Frame.Height * 4) - _Data = new byte[4 * e.Frame.Width * e.Frame.Height]; + if (_Width != e.Frame.Width || _Height != e.Frame.Height || _Data.Length != e.Frame.Width * e.Frame.Height * 4) + _Data = new byte[4 * e.Frame.Width * e.Frame.Height]; - _Width = e.Frame.Width; - _Height = e.Frame.Height; - BitmapData bitmapdata = e.Frame.LockBits(new Rectangle(0, 0, _Width, _Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); - Marshal.Copy(bitmapdata.Scan0, _Data, 0, _Data.Length); - e.Frame.UnlockBits(bitmapdata); - } + _Width = e.Frame.Width; + _Height = e.Frame.Height; + BitmapData bitmapdata = e.Frame.LockBits(new Rectangle(0, 0, _Width, _Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); + Marshal.Copy(bitmapdata.Scan0, _Data, 0, _Data.Length); + e.Frame.UnlockBits(bitmapdata); } } @@ -138,14 +129,13 @@ namespace Vocaluxe.Lib.Webcam public void Start() { - if (_Webcam != null) - { - _Webcam.NewFrame -= _OnFrame; - //Subscribe to NewFrame event - _Webcam.NewFrame += _OnFrame; - _Webcam.Start(); - _Paused = false; - } + if (_Webcam == null) + return; + _Webcam.NewFrame -= _OnFrame; + //Subscribe to NewFrame event + _Webcam.NewFrame += _OnFrame; + _Webcam.Start(); + _Paused = false; } public void Stop() diff --git a/Vocaluxe/Lib/Webcam/IWebcam.cs b/Vocaluxe/Lib/Webcam/IWebcam.cs index 75f33716..d2aa249f 100644 --- a/Vocaluxe/Lib/Webcam/IWebcam.cs +++ b/Vocaluxe/Lib/Webcam/IWebcam.cs @@ -21,6 +21,9 @@ using System.Collections.Generic; using System.Drawing; using VocaluxeLib; +using System.Drawing; +using VocaluxeLib.Draw; + namespace Vocaluxe.Lib.Webcam { struct SWebcamDevice @@ -54,7 +57,7 @@ namespace Vocaluxe.Lib.Webcam void Stop(); void Close(); - bool GetFrame(ref STexture frame); + bool GetFrame(ref CTexture frame); Bitmap GetBitmap(); SWebcamConfig GetConfig(); SWebcamDevice[] GetDevices(); diff --git a/Vocaluxe/Program.cs b/Vocaluxe/Program.cs index e6c90aea..63758783 100644 --- a/Vocaluxe/Program.cs +++ b/Vocaluxe/Program.cs @@ -240,7 +240,7 @@ namespace Vocaluxe CController.Close(); CSound.RecordCloseAll(); CSound.CloseAllStreams(); - CVideo.VdCloseAll(); + CVideo.CloseAll(); CDraw.Unload(); CDataBase.CloseConnections(); CWebcam.Close(); diff --git a/Vocaluxe/Screens/CScreenCredits.cs b/Vocaluxe/Screens/CScreenCredits.cs index 4e1e0455..c73a5df1 100644 --- a/Vocaluxe/Screens/CScreenCredits.cs +++ b/Vocaluxe/Screens/CScreenCredits.cs @@ -24,6 +24,7 @@ using System.Windows.Forms; using Vocaluxe.Base; using Vocaluxe.Base.Fonts; using VocaluxeLib; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; namespace Vocaluxe.Screens @@ -51,8 +52,8 @@ namespace Vocaluxe.Screens _Image = image; _ImgDot = imgDot; _Particle = particle; - _ParticleOffsetX = (int)Math.Round(particleOffsetX * image.Rect.W / image.Texture.Width - particle.Rect.W / 2); - _ParticleOffsetY = (int)Math.Round(particleOffsetY * image.Rect.H / image.Texture.Height - particle.Rect.H / 2); + _ParticleOffsetX = (int)Math.Round(particleOffsetX * image.Rect.W / image.Texture.OrigSize.Width - particle.Rect.W / 2); + _ParticleOffsetY = (int)Math.Round(particleOffsetY * image.Rect.H / image.Texture.OrigSize.Height - particle.Rect.H / 2); Active = true; } @@ -127,21 +128,21 @@ namespace Vocaluxe.Screens private List _Paragraphs; private List _ParagraphTexts; - private STexture _TexLogo; - private STexture _TexPerfectNoteStar; + private CTexture _TexLogo; + private CTexture _TexPerfectNoteStar; - private STexture _TexRedDot; - private STexture _TexBlueDot; + private CTexture _TexRedDot; + private CTexture _TexBlueDot; - private STexture _TexNameBrunzel; - private STexture _TexNameDarkice; - private STexture _TexNameFlokuep; - private STexture _TexNameFlamefire; - private STexture _TexNameMesand; - private STexture _TexNameBohning; - private STexture _TexNameBabene03; - private STexture _TexNamePantero; - private STexture _TexNamePinky007; + private CTexture _TexNameBrunzel; + private CTexture _TexNameDarkice; + private CTexture _TexNameFlokuep; + private CTexture _TexNameFlamefire; + private CTexture _TexNameMesand; + private CTexture _TexNameBohning; + private CTexture _TexNameBabene03; + private CTexture _TexNamePantero; + private CTexture _TexNamePinky007; public override void Init() { @@ -283,12 +284,12 @@ namespace Vocaluxe.Screens return GetNewParticleEffect(numStars, partColor, rect, _TexPerfectNoteStar, partSize, EParticleType.Star); } - private void _AddNewCreditName(STexture texture, int particleOffsetX, int particleOffsetY, bool bigParticles) + private void _AddNewCreditName(CTexture texture, int particleOffsetX, int particleOffsetY, bool bigParticles) { bool isRight = _CreditNames.Count % 2 == 0; int partRectSize = bigParticles ? 25 : 20; int partCount = bigParticles ? 8 : 6; - STexture texDot = isRight ? _TexRedDot : _TexBlueDot; + CTexture texDot = isRight ? _TexRedDot : _TexBlueDot; CStatic image = GetNewStatic(texture, new SColorF(1, 1, 1, 1), new SRectF(-1, -1, 400, 120, -4)); @@ -318,7 +319,8 @@ namespace Vocaluxe.Screens base.OnShow(); //Vocaluxe-Logo - _Logo = GetNewStatic(_TexLogo, new SColorF(1, 1, 1, 1), new SRectF((CSettings.RenderW - _TexLogo.Width) / 2, -270, _TexLogo.Width, _TexLogo.Height, -2)); + _Logo = GetNewStatic(_TexLogo, new SColorF(1, 1, 1, 1), + new SRectF((float)(CSettings.RenderW - _TexLogo.OrigSize.Width) / 2, -270, _TexLogo.OrigSize.Width, _TexLogo.OrigSize.Height, -2)); //Little stars for logo int numstars = (int)(_Logo.Rect.W * 0.25f / 2f); diff --git a/Vocaluxe/Screens/CScreenNames.cs b/Vocaluxe/Screens/CScreenNames.cs index 7293d3e3..ab05a46c 100644 --- a/Vocaluxe/Screens/CScreenNames.cs +++ b/Vocaluxe/Screens/CScreenNames.cs @@ -22,6 +22,7 @@ using System.Collections.Generic; using System.Windows.Forms; using Vocaluxe.Base; using VocaluxeLib; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; using VocaluxeLib.Profile; @@ -55,12 +56,12 @@ namespace Vocaluxe.Screens {"EqualizerPlayer1", "EqualizerPlayer2", "EqualizerPlayer3", "EqualizerPlayer4", "EqualizerPlayer5", "EqualizerPlayer6"}; private readonly string[] _SelectSlideDuetPlayer = new string[] {"SelectSlideDuetPlayer1", "SelectSlideDuetPlayer2", "SelectSlideDuetPlayer3", "SelectSlideDuetPlayer4", "SelectSlideDuetPlayer5", "SelectSlideDuetPlayer6"}; - private readonly STexture[] _OriginalPlayerAvatarTextures = new STexture[CSettings.MaxNumPlayer]; + private readonly CTexture[] _OriginalPlayerAvatarTextures = new CTexture[CSettings.MaxNumPlayer]; private bool _SelectingKeyboardActive; private bool _SelectingFast; private int _SelectingSwitchNr = -1; - private int _SelectingFastPlayerNr = 0; + private int _SelectingFastPlayerNr; private int _SelectedPlayerNr = -1; private bool _AvatarsChanged = false; private bool _ProfilesChanged = false; @@ -445,7 +446,7 @@ namespace Vocaluxe.Screens CConfig.Players[_SelectingSwitchNr] = string.Empty; //Update texture and name _Statics[_StaticPlayerAvatar[_SelectingSwitchNr]].Texture = _OriginalPlayerAvatarTextures[_SelectingSwitchNr]; - _Texts[_TextPlayer[_SelectingSwitchNr]].Text = CProfiles.GetPlayerName(-1, (_SelectingSwitchNr+1)); + _Texts[_TextPlayer[_SelectingSwitchNr]].Text = CProfiles.GetPlayerName(-1, (_SelectingSwitchNr + 1)); } CProfile[] profiles = CProfiles.GetProfiles(); @@ -467,7 +468,7 @@ namespace Vocaluxe.Screens break; } //Selected player is dropped out of area - else if (_SelectingSwitchNr > -1) + if (_SelectingSwitchNr > -1) { //Update Game-infos with new player CGame.Players[_SelectingSwitchNr].ProfileID = -1; @@ -598,7 +599,7 @@ namespace Vocaluxe.Screens else stopSelectingFast = true; } - else if(mouseEvent.MB) + else if (mouseEvent.MB) { _ResetPlayerSelections(); _SelectingFast = true; diff --git a/Vocaluxe/Screens/CScreenOptionsVideo.cs b/Vocaluxe/Screens/CScreenOptionsVideo.cs index acbd2aea..2a0f8f5f 100644 --- a/Vocaluxe/Screens/CScreenOptionsVideo.cs +++ b/Vocaluxe/Screens/CScreenOptionsVideo.cs @@ -23,6 +23,8 @@ using Vocaluxe.Base; using Vocaluxe.Lib.Webcam; using VocaluxeLib; using VocaluxeLib.Menu; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu; namespace Vocaluxe.Screens { @@ -46,7 +48,7 @@ namespace Vocaluxe.Screens private const string _ButtonExit = "ButtonExit"; private SWebcamConfig _Config; - private STexture _WebcamTexture = new STexture(-1); + private CTexture _WebcamTexture; private int _DeviceNr; private int _CapabilityNr; diff --git a/Vocaluxe/Screens/CScreenProfiles.cs b/Vocaluxe/Screens/CScreenProfiles.cs index 26b43d12..0642cf1b 100644 --- a/Vocaluxe/Screens/CScreenProfiles.cs +++ b/Vocaluxe/Screens/CScreenProfiles.cs @@ -27,6 +27,8 @@ using Vocaluxe.Base; using VocaluxeLib; using VocaluxeLib.Menu; using VocaluxeLib.Profile; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu; namespace Vocaluxe.Screens { @@ -65,7 +67,7 @@ namespace Vocaluxe.Screens private EEditMode _EditMode; - private STexture _WebcamTexture = new STexture(-1); + private CTexture _WebcamTexture; private Bitmap _Snapshot; public override void Init() @@ -223,7 +225,7 @@ namespace Vocaluxe.Screens { CProfiles.SetAvatar(_SelectSlides[_SelectSlideProfiles].ValueIndex, _SelectSlides[_SelectSlideAvatars].ValueIndex); - if (CWebcam.IsDeviceAvailable() && _WebcamTexture.Index > 0) + if (CWebcam.IsDeviceAvailable() && _WebcamTexture != null) _OnDiscardSnapshot(); } else if (_SelectSlides[_SelectSlideGuestProfile].Selected) diff --git a/Vocaluxe/Screens/CScreenScore.cs b/Vocaluxe/Screens/CScreenScore.cs index 22756d7f..6931b48c 100644 --- a/Vocaluxe/Screens/CScreenScore.cs +++ b/Vocaluxe/Screens/CScreenScore.cs @@ -369,7 +369,7 @@ namespace Vocaluxe.Screens _Statics[_StaticPointsBarBG[player, numplayer]].Visible = numplayer + 1 == CGame.NumPlayer; _Statics[_StaticAvatar[player, numplayer]].Visible = numplayer + 1 == CGame.NumPlayer; - _Statics[_StaticAvatar[player, numplayer]].Texture = new STexture(-1); + _Statics[_StaticAvatar[player, numplayer]].Texture = null; } } } diff --git a/Vocaluxe/Screens/CScreenSing.cs b/Vocaluxe/Screens/CScreenSing.cs index 61df6e3c..6db1d379 100644 --- a/Vocaluxe/Screens/CScreenSing.cs +++ b/Vocaluxe/Screens/CScreenSing.cs @@ -27,6 +27,7 @@ using System.Windows.Forms; using Vocaluxe.Base; using Vocaluxe.Base.Fonts; using VocaluxeLib; +using VocaluxeLib.Draw; using VocaluxeLib.Menu; using VocaluxeLib.Menu.SingNotes; using VocaluxeLib.Menu.SongMenu; @@ -101,9 +102,9 @@ namespace Vocaluxe.Screens private const float _Volume = 100f; private int _CurrentVideo = -1; private EAspect _VideoAspect = EAspect.Crop; - private STexture _CurrentVideoTexture = new STexture(-1); - private STexture _CurrentWebcamFrameTexture = new STexture(-1); - private STexture _Background = new STexture(-1); + private CTexture _CurrentVideoTexture; + private CTexture _CurrentWebcamFrameTexture; + private CTexture _Background; private float _CurrentTime; private float _FinishTime; @@ -400,7 +401,7 @@ namespace Vocaluxe.Screens if (_CurrentVideo != -1 && !_FadeOut && CConfig.VideosInSongs == EOffOn.TR_CONFIG_ON) { float vtime; - CVideo.VdGetFrame(_CurrentVideo, ref _CurrentVideoTexture, _CurrentTime, out vtime); + CVideo.GetFrame(_CurrentVideo, ref _CurrentVideoTexture, _CurrentTime, out vtime); } if (_Webcam) @@ -416,8 +417,8 @@ namespace Vocaluxe.Screens _FadeOut = false; _CurrentVideo = -1; - _CurrentVideoTexture = new STexture(-1); - _CurrentWebcamFrameTexture = new STexture(-1); + _CurrentVideoTexture = null; + _CurrentWebcamFrameTexture = null; _CurrentBeat = -100; _CurrentTime = 0f; _FinishTime = 0f; @@ -458,33 +459,27 @@ namespace Vocaluxe.Screens { if (_Active) { + CTexture background; + EAspect aspect = EAspect.Crop; if (_CurrentVideo != -1 && CConfig.VideosInSongs == EOffOn.TR_CONFIG_ON && !_Webcam) { - RectangleF bounds = new RectangleF(0, 0, CSettings.RenderW, CSettings.RenderH); - RectangleF rect = new RectangleF(0f, 0f, _CurrentVideoTexture.Width, _CurrentVideoTexture.Height); - CHelper.SetRect(bounds, out rect, rect.Width / rect.Height, _VideoAspect); - - CDraw.DrawTexture(_CurrentVideoTexture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, 0f), - _CurrentVideoTexture.Color, new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f), false); + background = _CurrentVideoTexture; + aspect = _VideoAspect; } else if (_Webcam) { - RectangleF bounds = new RectangleF(0, 0, CSettings.RenderW, CSettings.RenderH); - RectangleF rect = new RectangleF(0f, 0f, _CurrentWebcamFrameTexture.Width, _CurrentWebcamFrameTexture.Height); - CHelper.SetRect(bounds, out rect, rect.Width / rect.Height, _VideoAspect); - - CDraw.DrawTexture(_CurrentWebcamFrameTexture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, 0f), - _CurrentVideoTexture.Color, new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f), false); + background = _CurrentWebcamFrameTexture; + aspect = _VideoAspect; } else + background = _Background; + if (background != null) { - // Draw Background RectangleF bounds = new RectangleF(0, 0, CSettings.RenderW, CSettings.RenderH); - RectangleF rect = new RectangleF(0f, 0f, _Background.Width, _Background.Height); - CHelper.SetRect(bounds, out rect, rect.Width / rect.Height, EAspect.Crop); - - CDraw.DrawTexture(_Background, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, 0f), - _Background.Color, new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f), false); + RectangleF rect; + CHelper.SetRect(bounds, out rect, background.OrigAspect, aspect); + CDraw.DrawTexture(background, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, 0f), + background.Color, new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f)); } } @@ -561,7 +556,7 @@ namespace Vocaluxe.Screens CSound.RecordStop(); if (_CurrentVideo != -1) { - CVideo.VdClose(_CurrentVideo); + CVideo.Close(_CurrentVideo); _CurrentVideo = -1; CDraw.RemoveTexture(ref _CurrentVideoTexture); } @@ -624,15 +619,15 @@ namespace Vocaluxe.Screens CDraw.RemoveTexture(ref _CurrentVideoTexture); - if (song.VideoFileName != "") + if (!String.IsNullOrEmpty(song.VideoFileName)) { - _CurrentVideo = CVideo.VdLoad(Path.Combine(song.Folder, song.VideoFileName)); - CVideo.VdSkip(_CurrentVideo, song.Start, song.VideoGap); + _CurrentVideo = CVideo.Load(Path.Combine(song.Folder, song.VideoFileName)); + CVideo.Skip(_CurrentVideo, song.Start, song.VideoGap); _VideoAspect = song.VideoAspect; } CDraw.RemoveTexture(ref _Background); - if (song.BackgroundFileName != "") + if (!String.IsNullOrEmpty(song.BackgroundFileName)) _Background = CDraw.AddTexture(Path.Combine(song.Folder, song.BackgroundFileName)); _SingNotes[_SingBars].Reset(); @@ -705,8 +700,8 @@ namespace Vocaluxe.Screens } else { - bool lyricsOnTop = CConfig.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_TOP - || CConfig.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_BOTH + bool lyricsOnTop = CConfig.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_TOP + || CConfig.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_BOTH || (CConfig.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_DYNAMIC && _DynamicLyricsTop); _Lyrics[_LyricMainTop].Visible = lyricsOnTop; _Lyrics[_LyricSubTop].Visible = lyricsOnTop; @@ -1377,7 +1372,7 @@ namespace Vocaluxe.Screens foreach (CLine line in voice.Lines.Where(line => line.VisibleInTimeLine)) { STimeRect trect = new STimeRect {StartBeat = line.FirstNoteBeat, EndBeat = line.EndBeat}; - trect.Rect = GetNewStatic(new STexture(-1), + trect.Rect = GetNewStatic(null, new SColorF(1f, 1f, 1f, 1f), new SRectF( stat.Rect.X + stat.Rect.W * ((CGame.GetTimeFromBeats(trect.StartBeat, song.BPM) + song.Gap - song.Start) / totalTime), diff --git a/Vocaluxe/Screens/CScreenTest.cs b/Vocaluxe/Screens/CScreenTest.cs index 358fcabe..52a6ed1f 100644 --- a/Vocaluxe/Screens/CScreenTest.cs +++ b/Vocaluxe/Screens/CScreenTest.cs @@ -42,17 +42,17 @@ namespace Vocaluxe.Screens base.Init(); const string test = "Ö ÄÜabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWGXZ1234567890"; SColorF color = new SColorF(1, 0, 0, 1); - CText text = new CText(10, 50, 1, 32, 0, EAlignment.Left, EStyle.Normal, "Normal", color, "jÄNormal Text" + test, -1, 26, 0); + CText text = new CText(10, 50, 1, 32, 0, EAlignment.Left, EStyle.Normal, "Normal", color, "jÄNormal Text" + test, -1, 26, 1); _AddText(text); - text = new CText(10, 90, 1, 32, 0, EAlignment.Left, EStyle.Bold, "Normal", color, "jÄBold Text" + test, -1, 26, 0); + text = new CText(10, 90, 1, 32, 0, EAlignment.Left, EStyle.Bold, "Normal", color, "jÄBold Text" + test, -1, 26, 1); _AddText(text); - text = new CText(10, 130, 1, 32, 0, EAlignment.Left, EStyle.Italic, "Normal", color, "jÄItalic Text" + test, -1, 26, 0); + text = new CText(10, 130, 1, 32, 0, EAlignment.Left, EStyle.Italic, "Normal", color, "jÄItalic Text" + test, -1, 26, 1); _AddText(text); - text = new CText(10, 170, 1, 32, 0, EAlignment.Left, EStyle.Normal, "Outline", color, "jÄNormal Text" + test, -1, 50, 0); + text = new CText(10, 170, 1, 32, 0, EAlignment.Left, EStyle.Normal, "Outline", color, "jÄNormal Text" + test, -1, 50, 1); _AddText(text); - text = new CText(10, 210, 1, 32, 0, EAlignment.Left, EStyle.Bold, "Outline", color, "jÄBold Text" + test, -1, 100, 0); + text = new CText(10, 210, 1, 32, 0, EAlignment.Left, EStyle.Bold, "Outline", color, "jÄBold Text" + test, -1, 100, 1); _AddText(text); - text = new CText(10, 250, 1, 32, 0, EAlignment.Left, EStyle.Italic, "Outline", color, "jÄItalic Text" + test, -1, 150, 0); + text = new CText(10, 250, 1, 32, 0, EAlignment.Left, EStyle.Italic, "Outline", color, "jÄItalic Text" + test, -1, 150, 1); _AddText(text); } diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj index f89a8e6c..bf1a10cf 100644 --- a/Vocaluxe/Vocaluxe.csproj +++ b/Vocaluxe/Vocaluxe.csproj @@ -178,6 +178,7 @@ + diff --git a/VocaluxeLib/CHelper.cs b/VocaluxeLib/CHelper.cs index 22a7fbed..e23cce76 100644 --- a/VocaluxeLib/CHelper.cs +++ b/VocaluxeLib/CHelper.cs @@ -91,9 +91,9 @@ namespace VocaluxeLib public static void SetRect(RectangleF bounds, out RectangleF rect, float rectAspect, EAspect aspect) { - float rW = bounds.Right - bounds.Left; - float rH = bounds.Bottom - bounds.Top; - float rA = rW / rH; + float boundsW = bounds.Width; + float boundsH = bounds.Height; + float boundsAspect = boundsW / boundsH; float scaledWidth; float scaledHeight; @@ -101,42 +101,39 @@ namespace VocaluxeLib switch (aspect) { case EAspect.Crop: - if (rA >= rectAspect) + if (boundsAspect >= rectAspect) { - scaledWidth = rW; - scaledHeight = rH * rA / rectAspect; + scaledWidth = boundsW; + scaledHeight = boundsW / rectAspect; } else { - scaledHeight = rH; - scaledWidth = rW * rectAspect / rA; + scaledHeight = boundsH; + scaledWidth = boundsH * rectAspect; } break; case EAspect.LetterBox: - if (rectAspect >= 1) + if (boundsAspect <= rectAspect) { - scaledWidth = rW; - scaledHeight = rH * rA / rectAspect; + scaledWidth = boundsW; + scaledHeight = boundsW / rectAspect; } else { - scaledHeight = rH; - scaledWidth = rW * rectAspect / rA; + scaledHeight = boundsH; + scaledWidth = boundsH * rectAspect; } break; default: - scaledWidth = rW; - scaledHeight = rH; + scaledWidth = boundsW; + scaledHeight = boundsH; break; } - float left = (rW - scaledWidth) / 2 + bounds.Left; - float rigth = left + scaledWidth; + float left = (boundsW - scaledWidth) / 2 + bounds.Left; + float upper = (boundsH - scaledHeight) / 2 + bounds.Top; - float upper = (rH - scaledHeight) / 2 + bounds.Top; - float lower = upper + scaledHeight; - - rect = new RectangleF(left, upper, rigth - left, lower - upper); + rect = new RectangleF(left, upper, scaledWidth, scaledHeight); } public static List ListFiles(string path, string cast, bool recursive = false, bool fullpath = false) diff --git a/VocaluxeLib/Draw/CTexture.cs b/VocaluxeLib/Draw/CTexture.cs new file mode 100644 index 00000000..7382351f --- /dev/null +++ b/VocaluxeLib/Draw/CTexture.cs @@ -0,0 +1,133 @@ +using System.Drawing; +using VocaluxeLib.Menu; + +namespace VocaluxeLib.Draw +{ + public class CTexture + { + public int ID = -1; + public int PBO; + //Only used by OpenGL (the texture "name" according to the specs) + public int Name = -1; + + public string TexturePath = ""; + + /// + /// Original size (e.g. of bmp) + /// + public readonly Size OrigSize; + public float OrigAspect + { + get { return (float)OrigSize.Width / OrigSize.Height; } + } + + /// + /// Current size when drawn + /// + public SRectF Rect; + + public SColorF Color = new SColorF(1f, 1f, 1f, 1f); + + private int _W2, _H2; + private readonly bool _UseFullTexture; + /// + /// Internal texture width (on device), a power of 2 if necessary + /// + public int W2 + { + get { return _W2; } + set + { + _W2 = value; + if (_UseFullTexture) + WidthRatio = 1; + else + WidthRatio = (float)OrigSize.Width / _W2; + } + } + /// + /// Internal texture height (on device), a power of 2 if necessary + /// + public int H2 + { + get { return _H2; } + set + { + _H2 = value; + if (_UseFullTexture) + HeightRatio = 1; + else + HeightRatio = (float)OrigSize.Height / _H2; + } + } + + /// + /// Internal use. Specifies which part of texture memory is actually used + /// + public float WidthRatio { get; private set; } + /// + /// Internal use. Specifies which part of texture memory is actually used + /// + public float HeightRatio { get; private set; } + + /// + /// Actual texture space used in x direction + /// + public int UsedWidth + { + get { return (int)(_W2 * WidthRatio); } + } + + /// + /// Actual texture space used in y direction + /// + public int UsedHeight + { + get { return (int)(_H2 * HeightRatio); } + } + + /* + /// + /// Internal use. Specifies if full texture memory should be used + /// Set to true if you resized the original image to the maximum + /// + public bool UseFullTexture + { + get { return _UseFullTexture; } + set + { + _UseFullTexture = value; + if (value) + { + WidthRatio = 1; + HeightRatio = 1; + } + else + { + WidthRatio = (float)OrigSize.Width / _W2; + HeightRatio = (float)OrigSize.Height / _H2; + } + } + } +*/ + + /// + /// Creates a new texture reference + /// + /// Original width (Bitmap size) + /// Original height (Bitmap size) + /// Width in video memory + /// Height in video memory + /// True if it is using the full size of the video memory (no blank parts due to Pow-2-Issue) + public CTexture(int origWidth, int origHeight, int texWidth = 0, int texHeight = 0, bool useFullTexture = false) + { + OrigSize = new Size(origWidth, origHeight); + Rect = new SRectF(0f, 0f, origWidth, origHeight, 0f); + _UseFullTexture = useFullTexture; + + //IMPORTANT: Use setter here to calculate ratios! + W2 = (texWidth > 0) ? texWidth : origWidth; + H2 = (texHeight > 0) ? texHeight : origHeight; + } + } +} \ No newline at end of file diff --git a/VocaluxeLib/Menu/CBackground.cs b/VocaluxeLib/Menu/CBackground.cs index 11cf7124..068ea9fc 100644 --- a/VocaluxeLib/Menu/CBackground.cs +++ b/VocaluxeLib/Menu/CBackground.cs @@ -20,6 +20,7 @@ using System; using System.Drawing; using System.Xml; +using VocaluxeLib.Draw; namespace VocaluxeLib.Menu { @@ -118,7 +119,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Background color for type \"Color\" from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) writer.WriteElementString("Color", _Theme.ColorName); else { @@ -139,13 +140,13 @@ namespace VocaluxeLib.Menu public void Resume() { - if (_Theme.Type == EBackgroundTypes.Video && _Theme.VideoName != "" && CBase.Config.GetVideoBackgrounds() == EOffOn.TR_CONFIG_ON) + if (_Theme.Type == EBackgroundTypes.Video && !String.IsNullOrEmpty(_Theme.VideoName) && CBase.Config.GetVideoBackgrounds() == EOffOn.TR_CONFIG_ON) CBase.Theme.SkinVideoResume(_Theme.VideoName, _PartyModeID); } public void Pause() { - if (_Theme.VideoName != "") + if (!String.IsNullOrEmpty(_Theme.VideoName)) CBase.Theme.SkinVideoPause(_Theme.VideoName, _PartyModeID); } @@ -165,7 +166,7 @@ namespace VocaluxeLib.Menu ok = _DrawVideo(); } - if (_Theme.TextureName != "" && + if (!String.IsNullOrEmpty(_Theme.TextureName) && (_Theme.Type == EBackgroundTypes.Texture || (_Theme.Type == EBackgroundTypes.Video && (CBase.Config.GetVideoBackgrounds() == EOffOn.TR_CONFIG_OFF || !ok)))) ok = _DrawTexture(); @@ -181,7 +182,7 @@ namespace VocaluxeLib.Menu public void LoadTextures() { - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) Color = CBase.Theme.GetColor(_Theme.ColorName, _PartyModeID); } @@ -202,12 +203,12 @@ namespace VocaluxeLib.Menu private bool _DrawTexture() { - STexture texture = CBase.Theme.GetSkinTexture(_Theme.TextureName, _PartyModeID); - if (texture.Height > 0) + CTexture texture = CBase.Theme.GetSkinTexture(_Theme.TextureName, _PartyModeID); + if (texture != null) { RectangleF bounds = new RectangleF(0f, 0f, CBase.Settings.GetRenderW(), CBase.Settings.GetRenderH()); - RectangleF rect = new RectangleF(0f, 0f, texture.Width, texture.Height); - CHelper.SetRect(bounds, out rect, rect.Width / rect.Height, EAspect.Crop); + RectangleF rect; + CHelper.SetRect(bounds, out rect, texture.OrigAspect, EAspect.Crop); CBase.Drawing.DrawTexture(texture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, CBase.Settings.GetZFar() / 4)); return true; @@ -217,12 +218,12 @@ namespace VocaluxeLib.Menu private bool _DrawVideo() { - STexture videoTexture = CBase.Theme.GetSkinVideoTexture(_Theme.VideoName, _PartyModeID); - if (videoTexture.Height > 0) + CTexture videoTexture = CBase.Theme.GetSkinVideoTexture(_Theme.VideoName, _PartyModeID); + if (videoTexture != null) { RectangleF bounds = new RectangleF(0f, 0f, CBase.Settings.GetRenderW(), CBase.Settings.GetRenderH()); - RectangleF rect = new RectangleF(0f, 0f, videoTexture.Width, videoTexture.Height); - CHelper.SetRect(bounds, out rect, rect.Width / rect.Height, EAspect.Crop); + RectangleF rect; + CHelper.SetRect(bounds, out rect, videoTexture.OrigAspect, EAspect.Crop); CBase.Drawing.DrawTexture(videoTexture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, CBase.Settings.GetZFar() / 4)); return true; @@ -232,12 +233,12 @@ namespace VocaluxeLib.Menu private bool _DrawBackgroundMusicVideo() { - STexture videoTexture = CBase.BackgroundMusic.GetVideoTexture(); - if (videoTexture.Height > 0) + CTexture videoTexture = CBase.BackgroundMusic.GetVideoTexture(); + if (videoTexture != null) { RectangleF bounds = new RectangleF(0f, 0f, CBase.Settings.GetRenderW(), CBase.Settings.GetRenderH()); - RectangleF rect = new RectangleF(0f, 0f, videoTexture.Width, videoTexture.Height); - CHelper.SetRect(bounds, out rect, rect.Width / rect.Height, EAspect.Crop); + RectangleF rect; + CHelper.SetRect(bounds, out rect, videoTexture.OrigAspect, EAspect.Crop); CBase.Drawing.DrawTexture(videoTexture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, CBase.Settings.GetZFar() / 4)); return true; diff --git a/VocaluxeLib/Menu/CButton.cs b/VocaluxeLib/Menu/CButton.cs index 976da6b4..e5551a93 100644 --- a/VocaluxeLib/Menu/CButton.cs +++ b/VocaluxeLib/Menu/CButton.cs @@ -19,6 +19,7 @@ using System; using System.Xml; +using VocaluxeLib.Draw; namespace VocaluxeLib.Menu { @@ -39,8 +40,8 @@ namespace VocaluxeLib.Menu private bool _ThemeLoaded; private readonly int _PartyModeID; - public STexture Texture; - public STexture SelTexture; + public CTexture Texture; + public CTexture SelTexture; public SRectF Rect; public SColorF Color; public SColorF SelColor; @@ -79,8 +80,8 @@ namespace VocaluxeLib.Menu Text.Selected = value; } } - public bool Visible; - public bool Enabled; + public bool Visible = true; + public bool Enabled = true; public string GetThemeName() { @@ -90,28 +91,10 @@ namespace VocaluxeLib.Menu public CButton(int partyModeID) { _PartyModeID = partyModeID; - _Theme = new SThemeButton(); - Rect = new SRectF(); - Color = new SColorF(); - SelColor = new SColorF(); - Texture = new STexture(-1); - SelTexture = new STexture(-1); - - _IsSelText = false; Text = new CText(_PartyModeID); _SelText = new CText(_PartyModeID); Selected = false; - Visible = true; EditMode = false; - Enabled = true; - - _Reflection = false; - _ReflectionSpace = 0f; - _ReflectionHeight = 0f; - - _SelReflection = false; - _SelReflectionSpace = 0f; - _SelReflectionHeight = 0f; } public CButton(CButton button) @@ -131,13 +114,10 @@ namespace VocaluxeLib.Menu Texture = button.Texture; SelTexture = button.SelTexture; - _IsSelText = false; Text = new CText(button.Text); _SelText = new CText(button._SelText); Selected = false; - Visible = true; EditMode = false; - _ThemeLoaded = false; Enabled = button.Enabled; _Reflection = button._Reflection; @@ -241,7 +221,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Button color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) writer.WriteElementString("Color", _Theme.ColorName); else { @@ -253,7 +233,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Selected button color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.SelColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorName)) writer.WriteElementString("SColor", _Theme.SelColorName); else { @@ -301,11 +281,11 @@ namespace VocaluxeLib.Menu if (!Visible && CBase.Settings.GetGameState() != EGameState.EditTheme && !forceDraw) return; - STexture texture; + CTexture texture; if (!Selected && !Pressed || !Enabled) { - texture = Texture.Index != -1 ? Texture : CBase.Theme.GetSkinTexture(_Theme.TextureName, _PartyModeID); + texture = Texture ?? CBase.Theme.GetSkinTexture(_Theme.TextureName, _PartyModeID); CBase.Drawing.DrawTexture(texture, Rect, Color); @@ -319,7 +299,7 @@ namespace VocaluxeLib.Menu } else if (!_IsSelText) { - texture = Texture.Index != -1 ? Texture : CBase.Theme.GetSkinTexture(_Theme.SelTextureName, _PartyModeID); + texture = Texture ?? CBase.Theme.GetSkinTexture(_Theme.SelTextureName, _PartyModeID); CBase.Drawing.DrawTexture(texture, Rect, SelColor); @@ -333,7 +313,7 @@ namespace VocaluxeLib.Menu } else if (_IsSelText) { - texture = SelTexture.Index != -1 ? SelTexture : CBase.Theme.GetSkinTexture(_Theme.SelTextureName, _PartyModeID); + texture = SelTexture ?? CBase.Theme.GetSkinTexture(_Theme.SelTextureName, _PartyModeID); CBase.Drawing.DrawTexture(texture, Rect, SelColor); @@ -361,10 +341,10 @@ namespace VocaluxeLib.Menu { Text.LoadTextures(); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) Color = CBase.Theme.GetColor(_Theme.ColorName, _PartyModeID); - if (_Theme.SelColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorName)) SelColor = CBase.Theme.GetColor(_Theme.SelColorName, _PartyModeID); } diff --git a/VocaluxeLib/Menu/CEqualizer.cs b/VocaluxeLib/Menu/CEqualizer.cs index 5c258229..c65b42c0 100644 --- a/VocaluxeLib/Menu/CEqualizer.cs +++ b/VocaluxeLib/Menu/CEqualizer.cs @@ -175,7 +175,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Equalizer color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) writer.WriteElementString("Color", _Theme.ColorName); else { @@ -186,7 +186,7 @@ namespace VocaluxeLib.Menu } writer.WriteComment(": Equalizer color for maximal volume from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) writer.WriteElementString("MaxColor", _Theme.ColorName); else { @@ -274,10 +274,10 @@ namespace VocaluxeLib.Menu public void LoadTextures() { - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) Color = CBase.Theme.GetColor(_Theme.ColorName, _PartyModeID); - if (_Theme.MaxColorName != "") + if (!String.IsNullOrEmpty(_Theme.MaxColorName)) MaxColor = CBase.Theme.GetColor(_Theme.MaxColorName, _PartyModeID); } diff --git a/VocaluxeLib/Menu/CLyric.cs b/VocaluxeLib/Menu/CLyric.cs index a501afe3..a57b5f6a 100644 --- a/VocaluxeLib/Menu/CLyric.cs +++ b/VocaluxeLib/Menu/CLyric.cs @@ -172,7 +172,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Lyric text color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) writer.WriteElementString("Color", _Theme.ColorName); else { @@ -184,7 +184,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Highlighted lyric color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.SelColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorName)) writer.WriteElementString("SColor", _Theme.SelColorName); else { @@ -521,10 +521,10 @@ namespace VocaluxeLib.Menu public void LoadTextures() { - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) _Color = CBase.Theme.GetColor(_Theme.ColorName, _PartyModeID); - if (_Theme.SelColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorName)) _ColorProcessed = CBase.Theme.GetColor(_Theme.SelColorName, _PartyModeID); } diff --git a/VocaluxeLib/Menu/CMenu.cs b/VocaluxeLib/Menu/CMenu.cs index 9a5d6da8..3de37a98 100644 --- a/VocaluxeLib/Menu/CMenu.cs +++ b/VocaluxeLib/Menu/CMenu.cs @@ -24,6 +24,7 @@ using System.IO; using System.Text; using System.Windows.Forms; using System.Xml; +using VocaluxeLib.Draw; using VocaluxeLib.Menu.SingNotes; using VocaluxeLib.Menu.SongMenu; @@ -478,7 +479,7 @@ namespace VocaluxeLib.Menu return new CStatic(oldStatic); } - public CStatic GetNewStatic(STexture texture, SColorF color, SRectF rect) + public CStatic GetNewStatic(CTexture texture, SColorF color, SRectF rect) { return new CStatic(_PartyModeID, texture, color, rect); } @@ -523,7 +524,7 @@ namespace VocaluxeLib.Menu return new CPlaylist(_PartyModeID); } - public CParticleEffect GetNewParticleEffect(int maxNumber, SColorF color, SRectF area, STexture texture, float size, EParticleType type) + public CParticleEffect GetNewParticleEffect(int maxNumber, SColorF color, SRectF area, CTexture texture, float size, EParticleType type) { return new CParticleEffect(_PartyModeID, maxNumber, color, area, texture, size, type); } diff --git a/VocaluxeLib/Menu/CNameSelection.cs b/VocaluxeLib/Menu/CNameSelection.cs index 1f3d7038..9035a0ae 100644 --- a/VocaluxeLib/Menu/CNameSelection.cs +++ b/VocaluxeLib/Menu/CNameSelection.cs @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; using System.Windows.Forms; using System.Xml; +using VocaluxeLib.Draw; using VocaluxeLib.Profile; @@ -71,8 +72,8 @@ namespace VocaluxeLib.Menu public SRectF Rect; private readonly List _Tiles; - private STexture _TextureEmptyTile; - private STexture _TextureTileSelected; + private CTexture _TextureEmptyTile; + private CTexture _TextureTileSelected; public SColorF ColorEmptyTile; @@ -194,7 +195,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Static color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorEmptyTileName != "") + if (!String.IsNullOrEmpty(_Theme.ColorEmptyTileName)) writer.WriteElementString("ColorEmptyTile", _Theme.ColorEmptyTileName); else { @@ -225,7 +226,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Text font name"); writer.WriteElementString("Font", _Theme.NameFont); writer.WriteComment(": Text color from ColorScheme (high priority)"); - if (_Theme.NameColorName != "") + if (!String.IsNullOrEmpty(_Theme.NameColorName)) writer.WriteElementString("Color", _Theme.NameColorName); else { @@ -350,7 +351,7 @@ namespace VocaluxeLib.Menu public void HandleMouse(SMouseEvent mevent) { - for (int i = 0; i < _Tiles.Count; i++ ) + for (int i = 0; i < _Tiles.Count; i++) { if (CHelper.IsInBounds(_Tiles[i].Avatar.Rect, mevent)) { @@ -465,10 +466,10 @@ namespace VocaluxeLib.Menu _TextureEmptyTile = CBase.Theme.GetSkinTexture(_Theme.TextureEmptyTileName, _PartyModeID); _TextureTileSelected = CBase.Theme.GetSkinTexture(_Theme.TextureTileSelectedName, _PartyModeID); - if (_Theme.ColorEmptyTileName != "") + if (!String.IsNullOrEmpty(_Theme.ColorEmptyTileName)) ColorEmptyTile = CBase.Theme.GetColor(_Theme.ColorEmptyTileName, _PartyModeID); - if (_Theme.NameColorName != "") + if (!String.IsNullOrEmpty(_Theme.NameColorName)) _Theme.NameColor = CBase.Theme.GetColor(_Theme.NameColorName, _PartyModeID); } diff --git a/VocaluxeLib/Menu/CParticle.cs b/VocaluxeLib/Menu/CParticle.cs index e9a832cc..3e49902b 100644 --- a/VocaluxeLib/Menu/CParticle.cs +++ b/VocaluxeLib/Menu/CParticle.cs @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Xml; +using VocaluxeLib.Draw; namespace VocaluxeLib.Menu { @@ -45,11 +46,11 @@ namespace VocaluxeLib.Menu #region private vars private readonly int _PartyModeID; private readonly string _TextureName; - private readonly STexture _Texture; + private readonly CTexture _Texture; private SRectF _Rect; private float _Size; private SColorF _Color; - private float _Alpha; + private float _Alpha = 1; private float _Angle; //0..360° private readonly float _MaxAge; //[s] private float _Age; //[s] @@ -61,7 +62,7 @@ namespace VocaluxeLib.Menu private float _LastTime; private readonly EParticleType _Type; - private readonly Stopwatch _Timer; + private readonly Stopwatch _Timer = new Stopwatch(); #endregion private vars #region public vars @@ -115,26 +116,20 @@ namespace VocaluxeLib.Menu { _PartyModeID = partyModeID; _TextureName = textureName; - _Texture = new STexture(-1); _Color = color; _Rect = new SRectF(x, y, size, size, z); _Size = size; - _Alpha = 1f; - _Angle = 0f; _Vx = vx; _Vy = vy; _Vr = vr; _Vsize = vsize; - _LastTime = 0f; _Type = type; - _Timer = new Stopwatch(); - _Age = 0f; _MaxAge = maxage; _Rotation = (float)(CBase.Game.GetRandomDouble() * 360.0); } - public CParticle(int partyModeID, STexture texture, SColorF color, float x, float y, float size, float maxage, float z, float vx, float vy, float vr, float vsize, + public CParticle(int partyModeID, CTexture texture, SColorF color, float x, float y, float size, float maxage, float z, float vx, float vy, float vr, float vsize, EParticleType type) { _PartyModeID = partyModeID; @@ -143,17 +138,12 @@ namespace VocaluxeLib.Menu _Color = color; _Rect = new SRectF(x, y, size, size, z); _Size = size; - _Alpha = 1f; - _Angle = 0f; _Vx = vx; _Vy = vy; _Vr = vr; _Vsize = vsize; - _LastTime = 0f; _Type = type; - _Timer = new Stopwatch(); - _Age = 0f; _MaxAge = maxage; _Rotation = (float)(CBase.Game.GetRandomDouble() * 360.0); } @@ -298,7 +288,7 @@ namespace VocaluxeLib.Menu public void Draw() { // ReSharper disable ConvertIfStatementToConditionalTernaryExpression - if (_TextureName != "") + if (!String.IsNullOrEmpty(_TextureName)) // ReSharper restore ConvertIfStatementToConditionalTernaryExpression CBase.Drawing.DrawTexture(CBase.Theme.GetSkinTexture(_TextureName, _PartyModeID), _Rect, new SColorF(_Color.R, _Color.G, _Color.B, _Color.A * Alpha2 * _Alpha)); else @@ -312,7 +302,7 @@ namespace VocaluxeLib.Menu private SThemeParticleEffect _Theme; private bool _ThemeLoaded; - public STexture Texture; + public CTexture Texture; public SColorF Color; public SRectF Rect; @@ -356,7 +346,6 @@ namespace VocaluxeLib.Menu Rect = rect; Color = color; _Theme.TextureName = textureName; - Texture = new STexture(-1); _MaxNumber = maxNumber; _Size = size; _Type = type; @@ -365,7 +354,7 @@ namespace VocaluxeLib.Menu Visible = true; } - public CParticleEffect(int partyModeID, int maxNumber, SColorF color, SRectF rect, STexture texture, float size, EParticleType type) + public CParticleEffect(int partyModeID, int maxNumber, SColorF color, SRectF rect, CTexture texture, float size, EParticleType type) { _PartyModeID = partyModeID; _Theme = new SThemeParticleEffect(); @@ -435,7 +424,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": ParticleEffect color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) writer.WriteElementString("Color", _Theme.ColorName); else { @@ -546,7 +535,7 @@ namespace VocaluxeLib.Menu h = 0; CParticle star; - if (_Theme.TextureName != "") + if (!String.IsNullOrEmpty(_Theme.TextureName)) { star = new CParticle(_PartyModeID, _Theme.TextureName, Color, CBase.Game.GetRandom(w) + Rect.X - size / 4f, @@ -602,14 +591,14 @@ namespace VocaluxeLib.Menu public void UnloadTextures() { - Texture = new STexture(); + Texture = null; } public void LoadTextures() { - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) Color = CBase.Theme.GetColor(_Theme.ColorName, _PartyModeID); - if (_Theme.TextureName != "") + if (!String.IsNullOrEmpty(_Theme.TextureName)) Texture = CBase.Theme.GetSkinTexture(_Theme.TextureName, _PartyModeID); } diff --git a/VocaluxeLib/Menu/CPlaylist.cs b/VocaluxeLib/Menu/CPlaylist.cs index acc1d704..c09c3c43 100644 --- a/VocaluxeLib/Menu/CPlaylist.cs +++ b/VocaluxeLib/Menu/CPlaylist.cs @@ -373,7 +373,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Button color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorBackgroundName != "") + if (!String.IsNullOrEmpty(_Theme.ColorBackgroundName)) writer.WriteElementString("ColorBackground", _Theme.ColorBackgroundName); else { @@ -385,7 +385,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Selected paylist-entry color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.SelColorBackgroundName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorBackgroundName)) writer.WriteElementString("SColorBackground", _Theme.SelColorBackgroundName); else { @@ -464,10 +464,10 @@ namespace VocaluxeLib.Menu public void LoadTextures() { - if (_Theme.ColorBackgroundName != "") + if (!String.IsNullOrEmpty(_Theme.ColorBackgroundName)) BackgroundColor = CBase.Theme.GetColor(_Theme.ColorBackgroundName, _PartyModeID); - if (_Theme.SelColorBackgroundName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorBackgroundName)) BackgroundSelColor = CBase.Theme.GetColor(_Theme.SelColorBackgroundName, _PartyModeID); _Theme.Text1.LoadTextures(); @@ -518,7 +518,7 @@ namespace VocaluxeLib.Menu break; case Keys.Delete: case Keys.Back: - if (_Theme.ButtonPlaylistName.Text.Text != "") + if (!String.IsNullOrEmpty(_Theme.ButtonPlaylistName.Text.Text)) _Theme.ButtonPlaylistName.Text.Text = _Theme.ButtonPlaylistName.Text.Text.Remove(_Theme.ButtonPlaylistName.Text.Text.Length - 1); break; } diff --git a/VocaluxeLib/Menu/CScreenSetting.cs b/VocaluxeLib/Menu/CScreenSetting.cs index 691074f9..ffe6e98f 100644 --- a/VocaluxeLib/Menu/CScreenSetting.cs +++ b/VocaluxeLib/Menu/CScreenSetting.cs @@ -19,6 +19,7 @@ using System; using System.Xml; +using VocaluxeLib.Draw; namespace VocaluxeLib.Menu { @@ -127,7 +128,7 @@ namespace VocaluxeLib.Menu } } - private STexture _GetTextureValue(string value) + private CTexture _GetTextureValue(string value) { return CBase.Theme.GetSkinTexture(value, _PartyModeID); } diff --git a/VocaluxeLib/Menu/CSelectSlide.cs b/VocaluxeLib/Menu/CSelectSlide.cs index 488d2af6..b7f62571 100644 --- a/VocaluxeLib/Menu/CSelectSlide.cs +++ b/VocaluxeLib/Menu/CSelectSlide.cs @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Xml; +using VocaluxeLib.Draw; namespace VocaluxeLib.Menu { @@ -110,7 +111,7 @@ namespace VocaluxeLib.Menu private readonly List _ValueNames; private readonly List _ValuePartyModeIDs; - private readonly List _Textures; + private readonly List _Textures; private readonly List _ValueIndexes; private readonly List _ValueBounds = new List(); @@ -178,7 +179,7 @@ namespace VocaluxeLib.Menu MaxW = 0f; _Selected = false; - _Textures = new List(); + _Textures = new List(); _ValueIndexes = new List(); _ValueNames = new List(); _ValuePartyModeIDs = new List(); @@ -226,7 +227,7 @@ namespace VocaluxeLib.Menu MaxW = slide.MaxW; _Selected = slide._Selected; - _Textures = new List(slide._Textures); + _Textures = new List(slide._Textures); _ValueIndexes = new List(slide._ValueIndexes); _ValueNames = new List(slide._ValueNames); _ValueBounds = new List(slide._ValueBounds); @@ -411,7 +412,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": SelectSlide color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) writer.WriteElementString("Color", _Theme.ColorName); else { @@ -423,7 +424,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Selected SelectSlide color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.SelColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorName)) writer.WriteElementString("SColor", _Theme.SelColorName); else { @@ -435,7 +436,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Highlighted SelectSlide color from ColorScheme (high priority)"); writer.WriteComment("or
, , , (lower priority)"); - if (_Theme.HighlightColorName != "") + if (!String.IsNullOrEmpty(_Theme.HighlightColorName)) writer.WriteElementString("HColor", _Theme.HighlightColorName); else { @@ -447,7 +448,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Arrow color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ArrowColorName != "") + if (!String.IsNullOrEmpty(_Theme.ArrowColorName)) writer.WriteElementString("ArrowColor", _Theme.ArrowColorName); else { @@ -459,7 +460,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Selected arrow color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.SelArrowColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelArrowColorName)) writer.WriteElementString("ArrowSColor", _Theme.SelArrowColorName); else { @@ -471,7 +472,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Text color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.TextColorName != "") + if (!String.IsNullOrEmpty(_Theme.TextColorName)) writer.WriteElementString("TextColor", _Theme.TextColorName); else { @@ -483,7 +484,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Selected text color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.SelTextColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelTextColorName)) writer.WriteElementString("TextSColor", _Theme.SelTextColorName); else { @@ -530,20 +531,20 @@ namespace VocaluxeLib.Menu public void AddValue(string value, int partyModeID) { - AddValue(value, new STexture(-1), _ValueIndexes.Count, partyModeID); + AddValue(value, null, _ValueIndexes.Count, partyModeID); } - public void AddValue(string value, STexture texture) + public void AddValue(string value, CTexture texture) { AddValue(value, texture, _ValueIndexes.Count, _PartyModeID); } - private void _AddValue(string value, STexture texture, int valueIndex) + private void _AddValue(string value, CTexture texture, int valueIndex) { AddValue(value, texture, valueIndex, _PartyModeID); } - public void AddValue(string value, STexture texture, int valueIndex, int partyModeID) + public void AddValue(string value, CTexture texture, int valueIndex, int partyModeID) { _ValueNames.Add(value); _Textures.Add(texture); @@ -559,12 +560,12 @@ namespace VocaluxeLib.Menu public void AddValues(IEnumerable values) { foreach (string value in values) - _AddValue(value, new STexture(-1), _PartyModeID); + _AddValue(value, null, _PartyModeID); _ValueBounds.Clear(); } - public void AddValues(string[] values, STexture[] textures) + public void AddValues(string[] values, CTexture[] textures) { if (values.Length != textures.Length) return; @@ -588,12 +589,7 @@ namespace VocaluxeLib.Menu RenameValue(Selection, newName); } - public void RenameValue(int selection, string newName) - { - RenameValue(selection, newName, new STexture(-1)); - } - - public void RenameValue(int selection, string newName, STexture newTexture) + public void RenameValue(int selection, string newName, CTexture newTexture = null) { if (selection < 0 && selection >= _ValueNames.Count) return; @@ -696,15 +692,15 @@ namespace VocaluxeLib.Menu if (!Visible && CBase.Settings.GetGameState() != EGameState.EditTheme) return; - STexture texture = CBase.Theme.GetSkinTexture(_Theme.TextureName, _PartyModeID); - STexture textureArrowLeft = CBase.Theme.GetSkinTexture(_Theme.TextureArrowLeftName, _PartyModeID); - STexture textureArrowRight = CBase.Theme.GetSkinTexture(_Theme.TextureArrowRightName, _PartyModeID); + CTexture texture = CBase.Theme.GetSkinTexture(_Theme.TextureName, _PartyModeID); + CTexture textureArrowLeft = CBase.Theme.GetSkinTexture(_Theme.TextureArrowLeftName, _PartyModeID); + CTexture textureArrowRight = CBase.Theme.GetSkinTexture(_Theme.TextureArrowRightName, _PartyModeID); - STexture selTexture = CBase.Theme.GetSkinTexture(_Theme.SelTextureName, _PartyModeID); - STexture selTextureArrowLeft = CBase.Theme.GetSkinTexture(_Theme.SelTextureArrowLeftName, _PartyModeID); - STexture selTextureArrowRight = CBase.Theme.GetSkinTexture(_Theme.SelTextureArrowRightName, _PartyModeID); + CTexture selTexture = CBase.Theme.GetSkinTexture(_Theme.SelTextureName, _PartyModeID); + CTexture selTextureArrowLeft = CBase.Theme.GetSkinTexture(_Theme.SelTextureArrowLeftName, _PartyModeID); + CTexture selTextureArrowRight = CBase.Theme.GetSkinTexture(_Theme.SelTextureArrowRightName, _PartyModeID); - STexture highlightTexture = CBase.Theme.GetSkinTexture(_Theme.HighlightTextureName, _PartyModeID); + CTexture highlightTexture = CBase.Theme.GetSkinTexture(_Theme.HighlightTextureName, _PartyModeID); if (Selected) { @@ -791,25 +787,25 @@ namespace VocaluxeLib.Menu public void LoadTextures() { - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) Color = CBase.Theme.GetColor(_Theme.ColorName, _PartyModeID); - if (_Theme.SelColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorName)) SelColor = CBase.Theme.GetColor(_Theme.SelColorName, _PartyModeID); - if (_Theme.HighlightColorName != "") + if (!String.IsNullOrEmpty(_Theme.HighlightColorName)) HighlightColor = CBase.Theme.GetColor(_Theme.HighlightColorName, _PartyModeID); - if (_Theme.ArrowColorName != "") + if (!String.IsNullOrEmpty(_Theme.ArrowColorName)) ColorArrow = CBase.Theme.GetColor(_Theme.ArrowColorName, _PartyModeID); - if (_Theme.SelArrowColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelArrowColorName)) SelColorArrow = CBase.Theme.GetColor(_Theme.SelArrowColorName, _PartyModeID); - if (_Theme.TextColorName != "") + if (!String.IsNullOrEmpty(_Theme.TextColorName)) TextColor = CBase.Theme.GetColor(_Theme.TextColorName, _PartyModeID); - if (_Theme.SelColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorName)) SelTextColor = CBase.Theme.GetColor(_Theme.SelTextColorName, _PartyModeID); } diff --git a/VocaluxeLib/Menu/CStatic.cs b/VocaluxeLib/Menu/CStatic.cs index 8dfa8d07..159b6319 100644 --- a/VocaluxeLib/Menu/CStatic.cs +++ b/VocaluxeLib/Menu/CStatic.cs @@ -20,6 +20,7 @@ using System; using System.Drawing; using System.Xml; +using VocaluxeLib.Draw; namespace VocaluxeLib.Menu { @@ -42,10 +43,10 @@ namespace VocaluxeLib.Menu return _Theme.Name; } - private STexture _Texture; - public STexture Texture + private CTexture _Texture; + public CTexture Texture { - get { return _Texture.Index != -1 ? _Texture : CBase.Theme.GetSkinTexture(_Theme.TextureName, _PartyModeID); } + get { return _Texture ?? CBase.Theme.GetSkinTexture(_Theme.TextureName, _PartyModeID); } set { _Texture = value; } } @@ -58,35 +59,20 @@ namespace VocaluxeLib.Menu public float ReflectionHeight; public bool Selected; - public bool Visible; + public bool Visible = true; - public float Alpha; + public float Alpha = 1; public EAspect Aspect = EAspect.Stretch; public CStatic(int partyModeID) { _PartyModeID = partyModeID; - _Theme = new SThemeStatic(); - _ThemeLoaded = false; - - _Texture = new STexture(-1); - Color = new SColorF(); - Rect = new SRectF(); - Reflection = false; - ReflectionSpace = 0f; - ReflectionHeight = 0f; - - Selected = false; - Alpha = 1f; - Visible = true; } public CStatic(CStatic s) { _PartyModeID = s._PartyModeID; - _Theme = new SThemeStatic(); - _ThemeLoaded = false; _Texture = s.Texture; Color = new SColorF(s.Color); @@ -100,40 +86,21 @@ namespace VocaluxeLib.Menu Visible = s.Visible; } - public CStatic(int partyModeID, STexture texture, SColorF color, SRectF rect) + public CStatic(int partyModeID, CTexture texture, SColorF color, SRectF rect) { _PartyModeID = partyModeID; - _Theme = new SThemeStatic(); - _ThemeLoaded = false; _Texture = texture; Color = color; Rect = rect; - Reflection = false; - ReflectionSpace = 0f; - ReflectionHeight = 0f; - - Selected = false; - Alpha = 1f; - Visible = true; } public CStatic(int partyModeID, string textureSkinName, SColorF color, SRectF rect) { _PartyModeID = partyModeID; - _Theme = new SThemeStatic {TextureName = textureSkinName}; - _ThemeLoaded = false; - - _Texture = new STexture(-1); + _Theme.TextureName = textureSkinName; Color = color; Rect = rect; - Reflection = false; - ReflectionSpace = 0f; - ReflectionHeight = 0f; - - Selected = false; - Alpha = 1f; - Visible = true; } public bool LoadTheme(string xmlPath, string elementName, CXMLReader xmlReader, int skinIndex) @@ -194,7 +161,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Static color from ColorScheme (high priority)"); writer.WriteComment("or , , ,
(lower priority)"); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) writer.WriteElementString("Color", _Theme.ColorName); else { @@ -238,7 +205,7 @@ namespace VocaluxeLib.Menu public void Draw(float scale, float z, EAspect aspect, bool forceDraw = false) { - STexture texture = _Texture.Index != -1 ? _Texture : CBase.Theme.GetSkinTexture(_Theme.TextureName, _PartyModeID); + CTexture texture = Texture; SRectF bounds = new SRectF( Rect.X - Rect.W * (scale - 1f), @@ -253,7 +220,7 @@ namespace VocaluxeLib.Menu { RectangleF bounds2 = new RectangleF(bounds.X, bounds.Y, bounds.W, bounds.H); RectangleF rect2; - CHelper.SetRect(bounds2, out rect2, texture.Width / texture.Height, aspect); + CHelper.SetRect(bounds2, out rect2, texture.OrigAspect, aspect); rect.X = rect2.X; rect.Y = rect2.Y; @@ -277,7 +244,7 @@ namespace VocaluxeLib.Menu public void LoadTextures() { - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) Color = CBase.Theme.GetColor(_Theme.ColorName, _PartyModeID); } diff --git a/VocaluxeLib/Menu/CText.cs b/VocaluxeLib/Menu/CText.cs index ac8bd1c8..8299e395 100644 --- a/VocaluxeLib/Menu/CText.cs +++ b/VocaluxeLib/Menu/CText.cs @@ -169,7 +169,7 @@ namespace VocaluxeLib.Menu } /// - /// Do NOT read/write this anywhere but in _UpdateTextPosition! + /// Do NOT read/write this anywhere but in _UpdateTextPosition! /// private SRectF _Rect; public SRectF Rect @@ -396,7 +396,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Text color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) writer.WriteElementString("Color", _Theme.ColorName); else { @@ -408,7 +408,7 @@ namespace VocaluxeLib.Menu writer.WriteComment(": Selected Text color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.SelColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorName)) writer.WriteElementString("SColor", _Theme.SelColorName); else { @@ -499,8 +499,8 @@ namespace VocaluxeLib.Menu public void DrawRelative(float rx, float ry, float reflectionHeight = 0f, float reflectionSpace = 0f, float rectHeight = 0f) { - var oldReflectionSpace = ReflectionSpace; - var oldReflectionHeight = ReflectionHeight; + float oldReflectionSpace = ReflectionSpace; + float oldReflectionHeight = ReflectionHeight; if (reflectionHeight > 0) { ReflectionSpace = (rectHeight - Rect.Y - Rect.H) * 2 + reflectionSpace; @@ -521,10 +521,10 @@ namespace VocaluxeLib.Menu public void LoadTextures() { - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) Color = CBase.Theme.GetColor(_Theme.ColorName, _PartyModeID); - if (_Theme.SelColorName != "") + if (!String.IsNullOrEmpty(_Theme.SelColorName)) SelColor = CBase.Theme.GetColor(_Theme.SelColorName, _PartyModeID); } diff --git a/VocaluxeLib/Menu/IMenu.cs b/VocaluxeLib/Menu/IMenu.cs index 38f856b3..00385fb3 100644 --- a/VocaluxeLib/Menu/IMenu.cs +++ b/VocaluxeLib/Menu/IMenu.cs @@ -23,6 +23,7 @@ using System.Collections.ObjectModel; using System.Drawing; using VocaluxeLib; using VocaluxeLib.Game; +using VocaluxeLib.Draw; using VocaluxeLib.Menu.SongMenu; using VocaluxeLib.PartyModes; using VocaluxeLib.Profile; diff --git a/VocaluxeLib/Menu/SingNotes/CSingNotes.cs b/VocaluxeLib/Menu/SingNotes/CSingNotes.cs index a31cc03b..e1feb905 100644 --- a/VocaluxeLib/Menu/SingNotes/CSingNotes.cs +++ b/VocaluxeLib/Menu/SingNotes/CSingNotes.cs @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Xml; +using VocaluxeLib.Draw; using VocaluxeLib.Songs; @@ -386,9 +387,7 @@ namespace VocaluxeLib.Menu.SingNotes _PlayerNotes[n].Rect.Z ); - float f = 0.7f; - if (!note.Hit) - f = 0.4f; + float f = (note.Hit) ? 0.7f : 0.4f; _DrawNote(rect, color, f); @@ -471,39 +470,31 @@ namespace VocaluxeLib.Menu.SingNotes private void _DrawNote(SRectF rect, SColorF color, float factor = 1f) { - const int spacing = 0; + if (factor <= 0) + return; - float d = (1f - factor) / 2 * rect.H; - float dw = d; + float dh = (1f - factor) * rect.H / 2; + float dw = Math.Min(dh, rect.W / 2); - if (2 * dw > rect.W) - dw = rect.W / 2; + SRectF noteRect = new SRectF(rect.X + dw, rect.Y + dh, rect.W - 2 * dw, rect.H - 2 * dh, rect.Z); - SRectF r = new SRectF( - rect.X + dw + spacing, - rect.Y + d + spacing, - rect.W - 2 * dw - 2 * spacing, - rect.H - 2 * d - 2 * spacing, - rect.Z - ); + CTexture noteBegin = CBase.Theme.GetSkinTexture(_Theme.SkinLeftName, _PartyModeID); + CTexture noteMiddle = CBase.Theme.GetSkinTexture(_Theme.SkinMiddleName, _PartyModeID); + CTexture noteEnd = CBase.Theme.GetSkinTexture(_Theme.SkinRightName, _PartyModeID); - STexture noteBegin = CBase.Theme.GetSkinTexture(_Theme.SkinLeftName, _PartyModeID); - STexture noteMiddle = CBase.Theme.GetSkinTexture(_Theme.SkinMiddleName, _PartyModeID); - STexture noteEnd = CBase.Theme.GetSkinTexture(_Theme.SkinRightName, _PartyModeID); + //Width of each of the ends (round parts) + //Need 2 of them so use minimum + float endsW = Math.Min(noteRect.H * noteBegin.OrigAspect, noteRect.W / 2); - float dx = noteBegin.Width * r.H / noteBegin.Height; - if (2 * dx > r.W) - dx = r.W / 2; + CBase.Drawing.DrawTexture(noteBegin, new SRectF(noteRect.X, noteRect.Y, endsW, noteRect.H, noteRect.Z), color); - - CBase.Drawing.DrawTexture(noteBegin, new SRectF(r.X, r.Y, dx, r.H, r.Z), color); - - if (r.W - 2 * dx >= 2 * dx) - CBase.Drawing.DrawTexture(noteMiddle, new SRectF(r.X + dx, r.Y, r.W - 2 * dx, r.H, r.Z), color); + SRectF middleRect = new SRectF(noteRect.X + endsW, noteRect.Y, noteRect.W - 2 * endsW, noteRect.H, noteRect.Z); + if (noteRect.W >= 4 * endsW) + CBase.Drawing.DrawTexture(noteMiddle, middleRect, color); else - CBase.Drawing.DrawTexture(noteMiddle, new SRectF(r.X + dx, r.Y, 2 * dx, r.H, r.Z), color, new SRectF(r.X + dx, r.Y, r.W - 2 * dx, r.H, r.Z)); + CBase.Drawing.DrawTexture(noteMiddle, new SRectF(middleRect.X, middleRect.Y, 2 * endsW, middleRect.H, middleRect.Z), color, middleRect); - CBase.Drawing.DrawTexture(noteEnd, new SRectF(r.X + r.W - dx, r.Y, dx, r.H, r.Z), color); + CBase.Drawing.DrawTexture(noteEnd, new SRectF(noteRect.X + noteRect.W - endsW, noteRect.Y, endsW, noteRect.H, noteRect.Z), color); } private void _DrawNoteBG(SRectF rect, SColorF color, float factor, Stopwatch timer) @@ -534,11 +525,11 @@ namespace VocaluxeLib.Menu.SingNotes rect.Z ); - STexture noteBackgroundBegin = CBase.Theme.GetSkinTexture(_Theme.SkinBackgroundLeftName, _PartyModeID); - STexture noteBackgroundMiddle = CBase.Theme.GetSkinTexture(_Theme.SkinBackgroundMiddleName, _PartyModeID); - STexture noteBackgroundEnd = CBase.Theme.GetSkinTexture(_Theme.SkinBackgroundRightName, _PartyModeID); + CTexture noteBackgroundBegin = CBase.Theme.GetSkinTexture(_Theme.SkinBackgroundLeftName, _PartyModeID); + CTexture noteBackgroundMiddle = CBase.Theme.GetSkinTexture(_Theme.SkinBackgroundMiddleName, _PartyModeID); + CTexture noteBackgroundEnd = CBase.Theme.GetSkinTexture(_Theme.SkinBackgroundRightName, _PartyModeID); - float dx = noteBackgroundBegin.Width * r.H / noteBackgroundBegin.Height; + float dx = r.H * noteBackgroundBegin.OrigAspect; if (2 * dx > r.W) dx = r.W / 2; @@ -629,8 +620,8 @@ namespace VocaluxeLib.Menu.SingNotes rect.Z ); - STexture noteBegin = CBase.Theme.GetSkinTexture(_Theme.SkinLeftName, _PartyModeID); - float dx = noteBegin.Width * r.H / noteBegin.Height; + CTexture noteBegin = CBase.Theme.GetSkinTexture(_Theme.SkinLeftName, _PartyModeID); + float dx = r.H * noteBegin.OrigAspect; if (2 * dx > r.W) dx = r.W / 2; @@ -686,7 +677,7 @@ namespace VocaluxeLib.Menu.SingNotes _PlayerNotes[n].Color.B, _PlayerNotes[n].Color.A * _PlayerNotes[n].Alpha); - STexture toneHelper = CBase.Theme.GetSkinTexture(_Theme.SkinToneHelperName, _PartyModeID); + CTexture toneHelper = CBase.Theme.GetSkinTexture(_Theme.SkinToneHelperName, _PartyModeID); CBase.Drawing.DrawTexture(toneHelper, drawRect, color); diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs index b3f6fa87..5dc0dbd8 100644 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs +++ b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs @@ -22,6 +22,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Xml; +using VocaluxeLib.Draw; using VocaluxeLib.PartyModes; namespace VocaluxeLib.Menu.SongMenu @@ -104,7 +105,7 @@ namespace VocaluxeLib.Menu.SongMenu private readonly List _Streams = new List(); private int _Actsong = -1; private int _Actsongstream = -1; - protected STexture _Vidtex = new STexture(-1); + protected CTexture _Vidtex; protected bool _Initialized; protected int _LastKnownNumSongs; @@ -351,7 +352,7 @@ namespace VocaluxeLib.Menu.SongMenu writer.WriteComment(": Tile color from ColorScheme (high priority)"); writer.WriteComment("or , , , (lower priority)"); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) writer.WriteElementString("Color", _Theme.ColorName); else { @@ -438,19 +439,21 @@ namespace VocaluxeLib.Menu.SongMenu if (_Actsong != _PreviewSelected) _SelectSong(_PreviewSelected); - if (_Streams.Count > 0 && _Video != -1) + if (_Streams.Count <= 0 || _Video == -1) + return; + + if (CBase.Video.IsFinished(_Video) || CBase.Sound.IsFinished(_Actsongstream)) { - if (CBase.Video.IsFinished(_Video) || CBase.Sound.IsFinished(_Actsongstream)) - { - CBase.Video.Close(_Video); - _Video = -1; - return; - } + CBase.Video.Close(_Video); + _Video = -1; + return; + } - float time = CBase.Sound.GetPosition(_Actsongstream); + float time = CBase.Sound.GetPosition(_Actsongstream); - float vtime; - CBase.Video.GetFrame(_Video, ref _Vidtex, time, out vtime); + float vtime; + if (CBase.Video.GetFrame(_Video, ref _Vidtex, time, out vtime)) + { if (_VideoFadeTimer.ElapsedMilliseconds <= 3000L) _Vidtex.Color.A = _VideoFadeTimer.ElapsedMilliseconds / 3000f; else @@ -464,7 +467,7 @@ namespace VocaluxeLib.Menu.SongMenu public virtual void OnShow() { _Actsongstream = -1; - _Vidtex = new STexture(-1); + _Vidtex = null; } public virtual void OnHide() @@ -546,7 +549,7 @@ namespace VocaluxeLib.Menu.SongMenu { Init(); - if (_Theme.ColorName != "") + if (!String.IsNullOrEmpty(_Theme.ColorName)) _Color = CBase.Theme.GetColor(_Theme.ColorName, _PartyModeID); } diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs index 7a7710f4..7cdc4dec 100644 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs +++ b/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs @@ -22,6 +22,7 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; +using VocaluxeLib.Draw; using VocaluxeLib.PartyModes; using VocaluxeLib.Songs; @@ -38,8 +39,8 @@ namespace VocaluxeLib.Menu.SongMenu private CStatic _MedleyCalcIcon; private CStatic _MedleyTagIcon; - private STexture _CoverBigTexture; - private STexture _CoverTexture; + private CTexture _CoverBigTexture; + private CTexture _CoverTexture; private CText _Artist; private CText _Title; @@ -323,7 +324,7 @@ namespace VocaluxeLib.Menu.SongMenu { foreach (CStatic tile in _Tiles) { - if ((tile.Texture.Index != _CoverTexture.Index) && CHelper.IsInBounds(tile.Rect, mouseEvent) && !sel) + if (tile.Texture != _CoverTexture && CHelper.IsInBounds(tile.Rect, mouseEvent) && !sel) { if (mouseEvent.LB || !CBase.Songs.IsInCategory()) { @@ -371,7 +372,7 @@ namespace VocaluxeLib.Menu.SongMenu { foreach (CStatic tile in _Tiles) { - if ((tile.Texture.Index != _CoverTexture.Index) && CHelper.IsInBounds(tile.Rect, mouseEvent)) + if (tile.Texture != _CoverTexture && CHelper.IsInBounds(tile.Rect, mouseEvent)) { _EnterCategory(_PreviewSelected); mouseEvent.Handled = true; @@ -394,7 +395,7 @@ namespace VocaluxeLib.Menu.SongMenu else { // ReSharper disable ConvertIfStatementToConditionalTernaryExpression - if (tile.Texture.Index != _CoverTexture.Index) + if (tile.Texture != _CoverTexture) // ReSharper restore ConvertIfStatementToConditionalTernaryExpression tile.Draw(1f, tile.Rect.Z, EAspect.Crop); else @@ -453,18 +454,17 @@ namespace VocaluxeLib.Menu.SongMenu _TextBG.Draw(); - - if (_Vidtex.Index != -1 && _Video != -1) + if (_Vidtex != null && _Video != -1) { if (_Vidtex.Color.A < 1) _CoverBig.Draw(1f, EAspect.Crop); RectangleF bounds = new RectangleF(_CoverBig.Rect.X, _CoverBig.Rect.Y, _CoverBig.Rect.W, _CoverBig.Rect.H); - RectangleF rect = new RectangleF(0f, 0f, _Vidtex.Width, _Vidtex.Height); - CHelper.SetRect(bounds, out rect, rect.Width / rect.Height, EAspect.Crop); + RectangleF rect; + CHelper.SetRect(bounds, out rect, _Vidtex.OrigAspect, EAspect.Crop); SRectF vidRect = new SRectF(rect.X, rect.Y, rect.Width, rect.Height, _CoverBig.Rect.Z); SRectF vidRectBounds = new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f); - CBase.Drawing.DrawTexture(_Vidtex, vidRect, _Vidtex.Color, vidRectBounds, false); + CBase.Drawing.DrawTexture(_Vidtex, vidRect, _Vidtex.Color, vidRectBounds); CBase.Drawing.DrawTextureReflection(_Vidtex, vidRect, _Vidtex.Color, vidRectBounds, _CoverBig.ReflectionSpace, _CoverBig.ReflectionHeight); } else diff --git a/VocaluxeLib/Songs/CCategory.cs b/VocaluxeLib/Songs/CCategory.cs index 2f863dc6..0f20bbbf 100644 --- a/VocaluxeLib/Songs/CCategory.cs +++ b/VocaluxeLib/Songs/CCategory.cs @@ -20,14 +20,15 @@ using System.Collections.Generic; using VocaluxeLib; +using VocaluxeLib.Draw; + namespace VocaluxeLib.Songs { public class CCategory { public readonly string Name; - private STexture _CoverTextureSmall = new STexture(-1); - private STexture _CoverTextureBig = new STexture(-1); - private bool _CoverBigLoaded; + private CTexture _CoverTextureSmall; + private CTexture _CoverTextureBig; public readonly List Songs = new List(); public CCategory(string name) @@ -35,26 +36,25 @@ namespace VocaluxeLib.Songs Name = name; } - public STexture CoverTextureSmall + public CTexture CoverTextureSmall { get { return _CoverTextureSmall; } set { _CoverTextureSmall = value; } } - public STexture CoverTextureBig + public CTexture CoverTextureBig { - get { return _CoverBigLoaded ? _CoverTextureBig : _CoverTextureSmall; } + get { return _CoverTextureBig ?? _CoverTextureSmall; } set { - if (value.Index == -1) + if (value == null) return; _CoverTextureBig = value; - _CoverBigLoaded = true; } } - public CCategory(string name, STexture coverSmall, STexture coverBig) + public CCategory(string name, CTexture coverSmall, CTexture coverBig) { Name = name; CoverTextureSmall = coverSmall; diff --git a/VocaluxeLib/Songs/CSong.cs b/VocaluxeLib/Songs/CSong.cs index 98275199..2a616dfd 100644 --- a/VocaluxeLib/Songs/CSong.cs +++ b/VocaluxeLib/Songs/CSong.cs @@ -22,6 +22,8 @@ using System.Collections.Generic; using System.IO; using System.Text; using System.Text.RegularExpressions; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu.SingNotes; namespace VocaluxeLib.Songs { @@ -68,10 +70,8 @@ namespace VocaluxeLib.Songs public class CSong { - private bool _CoverSmallLoaded; - private bool _CoverBigLoaded; - private STexture _CoverTextureSmall = new STexture(-1); - private STexture _CoverTextureBig = new STexture(-1); + private CTexture _CoverTextureSmall; + private CTexture _CoverTextureBig; public SMedley Medley; @@ -95,30 +95,22 @@ namespace VocaluxeLib.Songs public bool NotesLoaded { get; private set; } - public STexture CoverTextureSmall + public CTexture CoverTextureSmall { get { - if (!_CoverSmallLoaded) + if (_CoverTextureSmall == null) LoadSmallCover(); return _CoverTextureSmall; } - set - { - _CoverTextureSmall = value; - _CoverSmallLoaded = true; - } + set { _CoverTextureSmall = value; } } - public STexture CoverTextureBig + public CTexture CoverTextureBig { - get { return _CoverBigLoaded ? _CoverTextureBig : _CoverTextureSmall; } - set - { - _CoverTextureBig = value; - _CoverBigLoaded = true; - } + get { return _CoverTextureBig ?? _CoverTextureSmall; } + set { _CoverTextureBig = value; } } public string Title = String.Empty; @@ -213,8 +205,6 @@ namespace VocaluxeLib.Songs VideoFileName = song.VideoFileName; VideoAspect = song.VideoAspect; - _CoverSmallLoaded = song._CoverSmallLoaded; - _CoverBigLoaded = song._CoverBigLoaded; NotesLoaded = song.NotesLoaded; Artist = song.Artist; @@ -749,7 +739,7 @@ namespace VocaluxeLib.Songs public void LoadSmallCover() { - if (_CoverSmallLoaded) + if (_CoverTextureSmall != null) return; if (CoverFileName != "") { @@ -758,8 +748,6 @@ namespace VocaluxeLib.Songs } else _CoverTextureSmall = CBase.Cover.GetNoCover(); - - _CoverSmallLoaded = true; } private void _CheckFiles() diff --git a/VocaluxeLib/Structs.cs b/VocaluxeLib/Structs.cs index a6384802..cfd6b351 100644 --- a/VocaluxeLib/Structs.cs +++ b/VocaluxeLib/Structs.cs @@ -23,6 +23,10 @@ using System.Drawing; using System.Windows.Forms; using VocaluxeLib.Songs; +using System.Windows.Forms; +using VocaluxeLib.Draw; +using VocaluxeLib.Menu.SingNotes; + namespace VocaluxeLib { @@ -99,45 +103,6 @@ namespace VocaluxeLib public int Y; public int Z; } - - public struct STexture - { - public int Index; - public int PBO; - public int ID; - - public string TexturePath; - - public float Width; - public float Height; - public SRectF Rect; - - public float W2; //power of 2 width - public float H2; //power of 2 height - public float WidthRatio; - public float HeightRatio; - - public SColorF Color; - - public STexture(int index) - { - Index = index; - PBO = 0; - ID = -1; - TexturePath = String.Empty; - - Width = 1f; - Height = 1f; - Rect = new SRectF(0f, 0f, 1f, 1f, 0f); - - W2 = 2f; - H2 = 2f; - WidthRatio = 0.5f; - HeightRatio = 0.5f; - - Color = new SColorF(1f, 1f, 1f, 1f); - } - } #endregion Drawing #region Inputs diff --git a/VocaluxeLib/VocaluxeLib.csproj b/VocaluxeLib/VocaluxeLib.csproj index acfc3146..25869d1a 100644 --- a/VocaluxeLib/VocaluxeLib.csproj +++ b/VocaluxeLib/VocaluxeLib.csproj @@ -131,6 +131,7 @@ +