Improve CTexture and Drawing stuff related to that

(Don't use an ID queue, store DataSizes of texture data)
This commit is contained in:
Flamefire committed 2014-09-10 20:58:35 +02:00
1 parent e9b584d84c
commit ad18bec52c
7 files changed
+178 -201

No files matched your search

+48 -73
View File
@@ -37,7 +37,6 @@ namespace Vocaluxe.Lib.Draw
class CDirect3D : RenderForm, IDraw
{
#region private vars
private const int _MaxID = 100000;
private readonly CKeys _Keys;
private readonly CMouse _Mouse;
@@ -53,9 +52,6 @@ namespace Vocaluxe.Lib.Draw
private readonly Dictionary<int, Texture> _D3DTextures = new Dictionary<int, Texture>();
private readonly Queue<STextureQueue> _TexturesToLoad = new Queue<STextureQueue>();
private readonly Queue<int> _IDs = new Queue<int>(_MaxID);
private readonly Object _MutexTexture = new Object();
private VertexBuffer _VertexBuffer;
private IndexBuffer _IndexBuffer;
@@ -76,7 +72,6 @@ namespace Vocaluxe.Lib.Draw
private readonly Queue<Texture> _VerticesTextures = new Queue<Texture>();
private readonly Queue<SlimDX.Matrix> _VerticesRotationMatrices = new Queue<SlimDX.Matrix>();
private readonly bool _NonPowerOf2TextureSupported;
#endregion private vars
/// <summary>
@@ -86,10 +81,6 @@ namespace Vocaluxe.Lib.Draw
{
Icon = new Icon(Path.Combine(CSettings.ProgramFolder, CSettings.FileNameIcon));
//Fill Queue with 100000 IDs
for (int i = 0; i < _MaxID; i++)
_IDs.Enqueue(i);
_Keys = new CKeys();
try
{
@@ -177,10 +168,10 @@ namespace Vocaluxe.Lib.Draw
CreateFlags flags = (caps.DeviceCaps & DeviceCaps.HWTransformAndLight) != 0 ? CreateFlags.HardwareVertexProcessing : CreateFlags.SoftwareVertexProcessing;
//Check if Pow2 textures are needed
_NonPowerOf2TextureSupported = true;
_NonPowerOf2TextureSupported &= (caps.TextureCaps & TextureCaps.Pow2) == 0;
_NonPowerOf2TextureSupported &= (caps.TextureCaps & TextureCaps.NonPow2Conditional) == 0;
_NonPowerOf2TextureSupported &= (caps.TextureCaps & TextureCaps.SquareOnly) == 0;
CDrawHelper.NonPowerOf2TextureSupported = true;
CDrawHelper.NonPowerOf2TextureSupported &= (caps.TextureCaps & TextureCaps.Pow2) == 0;
CDrawHelper.NonPowerOf2TextureSupported &= (caps.TextureCaps & TextureCaps.NonPow2Conditional) == 0;
CDrawHelper.NonPowerOf2TextureSupported &= (caps.TextureCaps & TextureCaps.SquareOnly) == 0;
try
{
@@ -689,20 +680,19 @@ namespace Vocaluxe.Lib.Draw
/// </summary>
public CTexture CopyScreen()
{
CTexture texture = _GetNewTexture(_W, _H);
CTexture texture = CDrawHelper.GetNewTexture(_W, _H);
Surface backbufferSurface = _Device.GetBackBuffer(0, 0);
var 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, new Rectangle(0, 0, _W, _H), new Rectangle(0, 0, _W, _H));
backbufferSurface.Dispose();
lock (_MutexTexture)
lock (_D3DTextures)
{
texture.ID = _IDs.Dequeue();
_D3DTextures.Add(texture.ID, tex);
return texture;
}
return texture;
}
/// <summary>
@@ -711,8 +701,7 @@ namespace Vocaluxe.Lib.Draw
/// <param name="texture">The texture in which the frame is copied to</param>
public void CopyScreen(ref CTexture texture)
{
//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())
if (!_TextureExists(texture) || texture.DataSize.Width != GetScreenWidth() || texture.DataSize.Height != GetScreenHeight())
{
RemoveTexture(ref texture);
texture = CopyScreen();
@@ -860,15 +849,15 @@ namespace Vocaluxe.Lib.Draw
int w = Math.Min(bmp.Width, maxSize);
int h = Math.Min(bmp.Height, maxSize);
w = _CheckForNextPowerOf2(w);
h = _CheckForNextPowerOf2(h);
var texture = new CTexture(bmp.Width, bmp.Height, w, h, true);
CTexture texture = CDrawHelper.GetNewTexture(bmp.Width,bmp.Height,w, h);
Bitmap bmp2 = null;
byte[] data;
try
{
w = texture.W2;
h = texture.H2;
if (bmp.Width != w || bmp.Height != h)
{
//Create a new Bitmap with the new sizes
@@ -881,6 +870,7 @@ namespace Vocaluxe.Lib.Draw
g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height));
}
bmp = bmp2;
texture.DataSize = new Size(w, h);
}
//Fill the new Bitmap with the texture data
@@ -895,33 +885,32 @@ namespace Vocaluxe.Lib.Draw
bmp2.Dispose();
}
return _AddTexture(texture, w, data);
return _AddTexture(texture, data);
}
public CTexture AddTexture(int w, int h, byte[] data)
{
CTexture texture = _GetNewTexture(w, h);
return _AddTexture(texture, w, data);
CTexture texture = CDrawHelper.GetNewTexture(w, h);
return _AddTexture(texture, data);
}
private CTexture _AddTexture(CTexture texture, int w, byte[] data)
private CTexture _AddTexture(CTexture texture, byte[] data)
{
Texture t = _CreateTexture(texture.W2, texture.H2, w, data);
Texture t = _CreateTexture(texture, data);
lock (_MutexTexture)
lock (_D3DTextures)
{
texture.ID = _IDs.Dequeue();
_D3DTextures.Add(texture.ID, t);
}
return texture;
}
private Texture _CreateTexture(int textureW, int textureH, int w, byte[] data)
private Texture _CreateTexture(CTexture texture, byte[] data)
{
//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
var t = new Texture(_Device, textureW, textureH, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed);
_WriteDataToTexture(t, w, data);
var t = new Texture(_Device, texture.W2, texture.H2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed);
_WriteDataToTexture(t, texture.DataSize.Width, data);
return t;
}
@@ -946,22 +935,15 @@ namespace Vocaluxe.Lib.Draw
public CTexture EnqueueTexture(int w, int h, byte[] data)
{
CTexture texture = _GetNewTexture(w, h);
CTexture texture = CDrawHelper.GetNewTexture(w, h);
lock (_MutexTexture)
lock (_D3DTextures)
{
texture.ID = _IDs.Dequeue();
_D3DTextures.Add(texture.ID, null);
var queue = new STextureQueue(texture.ID, texture.W2, texture.H2, w, h, data);
_TexturesToLoad.Enqueue(queue);
_TexturesToLoad.Enqueue(new STextureQueue(texture, data));
}
return texture;
}
private CTexture _GetNewTexture(int w, int h)
{
return new CTexture(w, h, _CheckForNextPowerOf2(w), _CheckForNextPowerOf2(h));
}
#endregion adding
#region updating
@@ -975,10 +957,17 @@ namespace Vocaluxe.Lib.Draw
/// <returns>True if succeeded</returns>
public bool UpdateTexture(CTexture texture, int w, int h, byte[] data)
{
//Check if texture exists and extend matches
if (!_TextureExists(texture) || texture.UsedWidth != w || texture.UsedHeight != h)
if (!_TextureExists(texture))
return false;
lock (_MutexTexture)
if (texture.DataSize.Width != w || texture.DataSize.Height != h)
{
if (texture.W2 > w || texture.H2 > h)
return false; // Texture memory to small
if (texture.W2 * 0.9 < w || texture.H2 * 0.9 < h)
return false; // Texture memory to big
texture.DataSize = new Size(w, h);
}
lock (_D3DTextures)
{
_WriteDataToTexture(_D3DTextures[texture.ID], w, data);
}
@@ -1003,7 +992,7 @@ namespace Vocaluxe.Lib.Draw
/// <returns>True if the texture exists</returns>
private bool _TextureExists(CTexture texture)
{
lock (_MutexTexture)
lock (_D3DTextures)
{
return texture != null && _D3DTextures.ContainsKey(texture.ID);
}
@@ -1015,15 +1004,16 @@ namespace Vocaluxe.Lib.Draw
/// <param name="texture">The texture to be removed</param>
public void RemoveTexture(ref CTexture texture)
{
if (_TextureExists(texture))
{
lock (_MutexTexture)
if(texture==null) return;
lock (_D3DTextures)
{
_D3DTextures[texture.ID].Dispose();
_D3DTextures.Remove(texture.ID);
_IDs.Enqueue(texture.ID);
Texture t;
if (_D3DTextures.TryGetValue(texture.ID, out t))
{
if(t!=null) t.Dispose();
_D3DTextures.Remove(texture.ID);
}
}
}
texture = null;
}
@@ -1282,17 +1272,16 @@ namespace Vocaluxe.Lib.Draw
private void _CheckQueue()
{
lock (_MutexTexture)
lock (_D3DTextures)
{
while (_TexturesToLoad.Count > 0)
{
STextureQueue q = _TexturesToLoad.Dequeue();
Texture t;
if (_D3DTextures.TryGetValue(q.ID, out t) && t != null)
if (!_D3DTextures.ContainsKey(q.Texture.ID))
continue;
t = _CreateTexture(q.TextureWidth, q.TextureHeight, q.DataWidth, q.Data);
_D3DTextures[q.ID] = t;
Texture t = _CreateTexture(q.Texture, q.Data);
_D3DTextures[q.Texture.ID] = t;
}
}
}
@@ -1310,20 +1299,6 @@ namespace Vocaluxe.Lib.Draw
#endregion implementation
#region utility
/// <summary>
/// Calculates the next power of two if the device has the POW2 flag set
/// </summary>
/// <param name="n">The value of which the next power of two will be calculated</param>
/// <returns>The next power of two</returns>
private int _CheckForNextPowerOf2(int n)
{
if (_NonPowerOf2TextureSupported)
return n;
if (n < 0)
throw new ArgumentOutOfRangeException("n", "Must be positive.");
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)
{
SlimDX.Matrix originTranslation = SlimDX.Matrix.Translation(new Vector3(-(float)CSettings.RenderW / 2, (float)CSettings.RenderH / 2, 0));
+43
View File
@@ -0,0 +1,43 @@
using System;
using System.Diagnostics;
using System.Drawing;
using VocaluxeLib.Draw;
namespace Vocaluxe.Lib.Draw
{
static class CDrawHelper
{
public static bool NonPowerOf2TextureSupported;
private static readonly Object _MutexID = new object();
private static int _NextID;
/// <summary>
/// Calculates the next power of two if the device has the POW2 flag set
/// </summary>
/// <param name="n">The value of which the next power of two will be calculated</param>
/// <returns>The next power of two</returns>
private static int _CheckForNextPowerOf2(int n)
{
if (NonPowerOf2TextureSupported)
return n;
if (n < 0)
throw new ArgumentOutOfRangeException("n", "Must be positive.");
return (int)Math.Pow(2, Math.Ceiling(Math.Log(n, 2)));
}
public static CTexture GetNewTexture(int origWidth, int origHeight, int dataWidth = 0, int dataHeight = 0)
{
Debug.Assert(origWidth > 0 && origHeight > 0);
Debug.Assert(dataWidth > 0 || dataHeight <= 0);
int id;
lock (_MutexID)
{
id = _NextID++;
}
Size origSize = new Size(origWidth, origHeight);
Size dataSize = (dataHeight > 0) ? new Size(dataWidth, dataHeight) : origSize;
return new CTexture(id, origSize, dataSize, _CheckForNextPowerOf2(dataSize.Width), _CheckForNextPowerOf2(dataSize.Height));
}
}
}
+1 -1
View File
@@ -332,7 +332,7 @@ namespace Vocaluxe.Lib.Draw
private CTexture _GetNewTexture(int w, int h)
{
return new CTexture(w, h) {ID = _Bitmaps.Count - 1};
return new CTexture(_Bitmaps.Count - 1, new Size(w, h), new Size(w, h));
}
public CTexture AddTexture(string texturePath)
+37 -58
View File
@@ -63,20 +63,12 @@ namespace Vocaluxe.Lib.Draw
struct STextureQueue
{
public readonly int ID;
public readonly int TextureWidth;
public readonly int TextureHeight;
public readonly int DataWidth;
public readonly int DataHeight;
public readonly CTexture Texture;
public readonly byte[] Data;
public STextureQueue(int id, int textureWidth, int textureHeight, int dataWidth, int dataHeight, byte[] data)
public STextureQueue(CTexture texture, byte[] data)
{
ID = id;
TextureWidth = textureWidth;
TextureHeight = textureHeight;
DataWidth = dataWidth;
DataHeight = dataHeight;
Texture = texture;
Data = data;
}
}
@@ -84,8 +76,6 @@ namespace Vocaluxe.Lib.Draw
class COpenGL : Form, IDraw
{
#region private vars
private const int _MaxID = 100000;
private readonly CKeys _Keys;
private readonly CMouse _Mouse;
private bool _Run;
@@ -96,11 +86,8 @@ namespace Vocaluxe.Lib.Draw
private bool _Fullscreen;
private readonly Dictionary<int, CTexture> _Textures = new Dictionary<int, CTexture>();
private readonly Queue<int> _IDs = new Queue<int>(_MaxID);
private readonly Queue<STextureQueue> _TexturesToLoad = new Queue<STextureQueue>();
private readonly Object _MutexTexture = new Object();
private int _H = 1;
private int _W = 1;
private int _Y;
@@ -113,9 +100,6 @@ namespace Vocaluxe.Lib.Draw
{
Icon = new Icon(Path.Combine(CSettings.ProgramFolder, CSettings.FileNameIcon));
for (int i = 1; i < _MaxID; i++)
_IDs.Enqueue(i);
//Check AA Mode
CConfig.AAMode = (EAntiAliasingModes)_CheckAntiAliasingMode((int)CConfig.AAMode);
@@ -161,6 +145,8 @@ namespace Vocaluxe.Lib.Draw
ClientSize = new Size(CConfig.ScreenW, CConfig.ScreenH);
CenterToScreen();
CDrawHelper.NonPowerOf2TextureSupported = false;
}
#region Helpers
@@ -490,7 +476,7 @@ namespace Vocaluxe.Lib.Draw
public CTexture CopyScreen()
{
CTexture texture = _GetNewTexture(_W, _H);
CTexture texture = CDrawHelper.GetNewTexture(_W, _H);
texture.Name = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, texture.Name);
@@ -504,10 +490,8 @@ namespace Vocaluxe.Lib.Draw
GL.BindTexture(TextureTarget.Texture2D, 0);
// Add to Texture List
lock (_MutexTexture)
lock (_Textures)
{
texture.ID = _IDs.Dequeue();
_Textures[texture.ID] = texture;
}
@@ -517,7 +501,7 @@ namespace Vocaluxe.Lib.Draw
public void CopyScreen(ref CTexture texture)
{
//Check for actual texture sizes as it may be downsized compared to OrigSize
if (!_TextureExists(texture) || texture.UsedWidth != GetScreenWidth() || texture.UsedHeight != GetScreenHeight())
if (!_TextureExists(texture) || texture.DataSize.Width != GetScreenWidth() || texture.DataSize.Height != GetScreenHeight())
{
RemoveTexture(ref texture);
texture = CopyScreen();
@@ -691,10 +675,9 @@ namespace Vocaluxe.Lib.Draw
int w = Math.Min(bmp.Width, maxSize);
int h = Math.Min(bmp.Height, maxSize);
w = MathHelper.NextPowerOfTwo(w);
h = MathHelper.NextPowerOfTwo(h);
var texture = new CTexture(bmp.Width, bmp.Height, w, h, true) {Name = GL.GenTexture()};
CTexture texture = CDrawHelper.GetNewTexture(w, h);
texture.Name = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, texture.Name);
Bitmap bmp2 = null;
@@ -736,9 +719,8 @@ namespace Vocaluxe.Lib.Draw
// Add to Texture List
texture.TexturePath = String.Empty;
lock (_MutexTexture)
lock (_Textures)
{
texture.ID = _IDs.Dequeue();
_Textures[texture.ID] = texture;
}
@@ -747,20 +729,19 @@ namespace Vocaluxe.Lib.Draw
public CTexture AddTexture(int w, int h, byte[] data)
{
CTexture texture = _GetNewTexture(w, h);
CTexture texture = CDrawHelper.GetNewTexture(w, h);
_CreateTexture(texture, w, h, data);
_CreateTexture(texture, data);
lock (_MutexTexture)
lock (_Textures)
{
texture.ID = _IDs.Dequeue();
_Textures[texture.ID] = texture;
}
return texture;
}
private void _CreateTexture(CTexture texture, int w, int h, byte[] data)
private void _CreateTexture(CTexture texture, byte[] data)
{
if (_UsePBO)
{
@@ -782,7 +763,7 @@ namespace Vocaluxe.Lib.Draw
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.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, texture.OrigSize.Width, texture.OrigSize.Height, PixelFormat.Bgra, PixelType.UnsignedByte, data);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureParameterName.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureParameterName.ClampToEdge);
@@ -795,31 +776,32 @@ namespace Vocaluxe.Lib.Draw
public CTexture EnqueueTexture(int w, int h, byte[] data)
{
CTexture texture = _GetNewTexture(w, h);
CTexture texture = CDrawHelper.GetNewTexture(w, h);
lock (_MutexTexture)
lock (_Textures)
{
texture.ID = _IDs.Dequeue();
var queue = new STextureQueue(texture.ID, texture.W2, texture.H2, w, h, data);
var queue = new STextureQueue(texture, data);
_TexturesToLoad.Enqueue(queue);
_Textures[texture.ID] = texture;
}
return texture;
}
private static CTexture _GetNewTexture(int w, int h)
{
return new CTexture(w, h, MathHelper.NextPowerOfTwo(w), MathHelper.NextPowerOfTwo(h));
}
#endregion adding
#region updating
public bool UpdateTexture(CTexture texture, int w, int h, byte[] data)
{
//Check if texture exists and extend matches
if (!_TextureExists(texture) || texture.UsedWidth != w || texture.UsedHeight != h)
if (!_TextureExists(texture))
return false;
if (texture.DataSize.Width != w || texture.DataSize.Height != h)
{
if (texture.W2 > w || texture.H2 > h)
return false; // Texture memory to small
if (texture.W2 * 0.9 < w || texture.H2 * 0.9 < h)
return false; // Texture memory to big
texture.DataSize = new Size(w, h);
}
if (_UsePBO)
{
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, texture.PBO);
@@ -865,27 +847,25 @@ namespace Vocaluxe.Lib.Draw
public void RemoveTexture(ref CTexture texture)
{
if (_TextureExists(texture, false))
lock (_Textures)
{
lock (_MutexTexture)
if (_TextureExists(texture))
{
_IDs.Enqueue(texture.ID);
GL.DeleteTexture(texture.Name);
if (texture.PBO > 0)
GL.DeleteBuffers(1, ref texture.PBO);
_Textures.Remove(texture.ID);
}
_Textures.Remove(texture.ID);
}
texture = null;
}
private bool _TextureExists(CTexture texture, bool checkIfLoaded = true)
private bool _TextureExists(CTexture texture)
{
lock (_MutexTexture)
lock (_Textures)
{
if (texture != null && _Textures.ContainsKey(texture.ID))
if (texture != null && _Textures.ContainsKey(texture.ID) && texture.Name>0)
{
if (!checkIfLoaded || _Textures[texture.ID].Name > 0)
return true;
}
}
@@ -1154,16 +1134,15 @@ namespace Vocaluxe.Lib.Draw
private void _CheckQueue()
{
lock (_MutexTexture)
lock (_Textures)
{
while (_TexturesToLoad.Count > 0)
{
STextureQueue q = _TexturesToLoad.Dequeue();
CTexture texture;
if (!_Textures.TryGetValue(q.ID, out texture))
if (!_Textures.ContainsKey(q.Texture.ID))
continue;
_CreateTexture(texture, q.DataWidth, q.DataHeight, q.Data);
_CreateTexture(q.Texture, q.Data);
}
}
}
+1
View File
@@ -224,6 +224,7 @@
<Compile Include="Lib\Database\CDatabaseBase.cs" />
<Compile Include="Lib\Database\CHighscoreDB.cs" />
<Compile Include="Lib\Database\CResourceDB.cs" />
<Compile Include="Lib\Draw\CDrawHelper.cs" />
<Compile Include="Lib\Sound\Playback\CAudioStreamBase.cs" />
<Compile Include="Lib\Sound\Playback\CPlaybackBase.cs" />
<Compile Include="Lib\Sound\Playback\CRingBuffer.cs" />
+38 -63
View File
@@ -21,7 +21,7 @@ namespace VocaluxeLib.Draw
{
public class CTexture
{
public int ID = -1;
public readonly int ID;
public int PBO;
//Only used by OpenGL (the texture "name" according to the specs)
public int Name = -1;
@@ -29,14 +29,29 @@ namespace VocaluxeLib.Draw
public string TexturePath = "";
/// <summary>
/// Original size (e.g. of bmp)
/// Size of original image (e.g. of bmp)
/// </summary>
public readonly Size OrigSize;
public Size OrigSize;
public float OrigAspect
{
get { return (float)OrigSize.Width / OrigSize.Height; }
}
private Size _DataSize;
/// <summary>
/// Size of data used (mostly equal to OrigSize but due to resizing this might change)
/// </summary>
public Size DataSize
{
get { return _DataSize; }
set
{
_DataSize = value;
_CalcRatios();
}
}
/// <summary>
/// Current size when drawn
/// </summary>
@@ -45,7 +60,6 @@ namespace VocaluxeLib.Draw
public SColorF Color = new SColorF(1f, 1f, 1f, 1f);
private int _W2, _H2;
private readonly bool _UseFullTexture;
/// <summary>
/// Internal texture width (on device), a power of 2 if necessary
/// </summary>
@@ -55,10 +69,7 @@ namespace VocaluxeLib.Draw
set
{
_W2 = value;
if (_UseFullTexture)
WidthRatio = 1;
else
WidthRatio = (float)OrigSize.Width / _W2;
_CalcRatios();
}
}
/// <summary>
@@ -70,10 +81,7 @@ namespace VocaluxeLib.Draw
set
{
_H2 = value;
if (_UseFullTexture)
HeightRatio = 1;
else
HeightRatio = (float)OrigSize.Height / _H2;
_CalcRatios();
}
}
@@ -86,64 +94,31 @@ namespace VocaluxeLib.Draw
/// </summary>
public float HeightRatio { get; private set; }
/// <summary>
/// Actual texture space used in x direction
/// </summary>
public int UsedWidth
{
get { return (int)(_W2 * WidthRatio); }
}
/// <summary>
/// Actual texture space used in y direction
/// </summary>
public int UsedHeight
{
get { return (int)(_H2 * HeightRatio); }
}
/*
/// <summary>
/// Internal use. Specifies if full texture memory should be used
/// Set to true if you resized the original image to the maximum
/// </summary>
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;
}
}
}
*/
/// <summary>
/// Creates a new texture reference
/// </summary>
/// <param name="origWidth">Original width (Bitmap size)</param>
/// <param name="origHeight">Original height (Bitmap size)</param>
/// <param name="id">ID of the texture</param>
/// <param name="origSize">Original size (Bitmap size)</param>
/// <param name="dataSize">Size of the data used</param>
/// <param name="texWidth">Width in video memory</param>
/// <param name="texHeight">Height in video memory</param>
/// <param name="useFullTexture">True if it is using the full size of the video memory (no blank parts due to Pow-2-Issue)</param>
public CTexture(int origWidth, int origHeight, int texWidth = 0, int texHeight = 0, bool useFullTexture = false)
public CTexture(int id, Size origSize, Size dataSize, int texWidth = 0, int texHeight = 0)
{
OrigSize = new Size(origWidth, origHeight);
Rect = new SRectF(0f, 0f, origWidth, origHeight, 0f);
_UseFullTexture = useFullTexture;
ID = id;
_DataSize = dataSize;
OrigSize = origSize;
_W2 = (texWidth > 0) ? texWidth : dataSize.Width;
_H2 = (texHeight > 0) ? texHeight : dataSize.Height;
//IMPORTANT: Use setter here to calculate ratios!
W2 = (texWidth > 0) ? texWidth : origWidth;
H2 = (texHeight > 0) ? texHeight : origHeight;
Rect = new SRectF(0f, 0f, origSize.Width, origSize.Height, 0f);
_CalcRatios();
}
private void _CalcRatios()
{
WidthRatio = (float)_DataSize.Width / _W2;
HeightRatio = (float)_DataSize.Height / _H2;
}
}
}
+10 -6
View File
@@ -192,11 +192,10 @@ namespace VocaluxeLib.Menu
public void Draw(EAspect aspect, float scale = 1f, float zModify = 0f, bool forceDraw = false)
{
CTexture texture = Texture ?? new CTexture((int)Rect.W, (int)Rect.H);
CTexture texture = Texture;
SRectF bounds = Rect.Scale(scale);
SRectF rect;
if (aspect != EAspect.Stretch)
if (aspect != EAspect.Stretch && texture != null)
CHelper.SetRect(bounds, out rect, texture.OrigAspect, aspect);
else
rect = bounds;
@@ -205,9 +204,14 @@ namespace VocaluxeLib.Menu
var color = new SColorF(Color.R, Color.G, Color.B, Color.A * Alpha);
if (Visible || forceDraw || (CBase.Settings.GetProgramState() == EProgramState.EditTheme))
{
CBase.Drawing.DrawTexture(texture, rect, color, bounds);
if (Reflection)
CBase.Drawing.DrawTextureReflection(texture, rect, color, bounds, ReflectionSpace, ReflectionHeight);
if (texture != null)
{
CBase.Drawing.DrawTexture(texture, rect, color, bounds);
if (Reflection)
CBase.Drawing.DrawTextureReflection(texture, rect, color, bounds, ReflectionSpace, ReflectionHeight);
}
else
CBase.Drawing.DrawColor(color, rect);
}
if (Selected && (CBase.Settings.GetProgramState() == EProgramState.EditTheme))