Improved CTexture creation
This commit is contained in:
1 parent
e43f5e7b0a
commit
dd96b61cae
12 files changed
+52
-53
No files matched your search
@@ -166,6 +166,8 @@ namespace Vocaluxe.Base
|
||||
|
||||
CVideo.GetFrame(_VideoStream, ref _VideoTexture, videoTime, out videoTime);
|
||||
}
|
||||
if (_VideoTexture == null)
|
||||
return;
|
||||
RectangleF bounds = new RectangleF(0f, 0f, CSettings.RenderW, CSettings.RenderH);
|
||||
RectangleF rect;
|
||||
CHelper.SetRect(bounds, out rect, _VideoTexture.OrigAspect, EAspect.Crop);
|
||||
|
||||
@@ -679,21 +679,21 @@ namespace Vocaluxe.Lib.Draw
|
||||
/// </summary>
|
||||
public CTexture CopyScreen()
|
||||
{
|
||||
CTexture texture = new CTexture(-1, _W, _H) {W2 = _CheckForNextPowerOf2(_W), H2 = _CheckForNextPowerOf2(_H)};
|
||||
CTexture texture = _GetNewTexture(_W, _H);
|
||||
|
||||
Surface backbufferSurface = _Device.GetBackBuffer(0, 0);
|
||||
Texture tex = new Texture(_Device, _W, _H, 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, new Rectangle(0, 0, _W, _H), new Rectangle(0, 0, _W, _H));
|
||||
backbufferSurface.Dispose();
|
||||
lock (_MutexTexture)
|
||||
{
|
||||
_D3DTextures.Add(_IDs.Peek(), tex);
|
||||
texture.Index = _IDs.Dequeue();
|
||||
_D3DTextures.Add(texture.Index, tex);
|
||||
|
||||
_Textures[texture.Index] = texture;
|
||||
return texture;
|
||||
}
|
||||
return texture;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -856,16 +856,11 @@ namespace Vocaluxe.Lib.Draw
|
||||
break;
|
||||
}
|
||||
|
||||
CTexture texture = new CTexture(-1, bmp.Width, bmp.Height) {UseFullTexture = true};
|
||||
|
||||
int w = Math.Min(bmp.Width, maxSize);
|
||||
int h = Math.Min(bmp.Height, maxSize);
|
||||
w = _CheckForNextPowerOf2(w);
|
||||
h = _CheckForNextPowerOf2(h);
|
||||
|
||||
texture.W2 = w;
|
||||
texture.H2 = h;
|
||||
|
||||
Bitmap bmp2 = null;
|
||||
byte[] data;
|
||||
try
|
||||
@@ -896,12 +891,13 @@ namespace Vocaluxe.Lib.Draw
|
||||
bmp2.Dispose();
|
||||
}
|
||||
|
||||
CTexture texture = new CTexture(bmp.Width, bmp.Height, w, h,true);
|
||||
return _AddTexture(texture, w, data);
|
||||
}
|
||||
|
||||
public CTexture AddTexture(int w, int h, byte[] data)
|
||||
{
|
||||
CTexture texture = new CTexture(-1, w, h) {W2 = _CheckForNextPowerOf2(w), H2 = _CheckForNextPowerOf2(h)};
|
||||
CTexture texture = _GetNewTexture(w, h);
|
||||
return _AddTexture(texture, w, data);
|
||||
}
|
||||
|
||||
@@ -936,8 +932,6 @@ namespace Vocaluxe.Lib.Draw
|
||||
rect.Data.Position += rect.Pitch;
|
||||
}
|
||||
t.UnlockRectangle(0);
|
||||
|
||||
texture.TexturePath = String.Empty;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
@@ -950,7 +944,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
public CTexture EnqueueTexture(int w, int h, byte[] data)
|
||||
{
|
||||
CTexture texture = new CTexture(-1, w, h);
|
||||
CTexture texture = _GetNewTexture(w, h);
|
||||
STextureQueue queue = new STextureQueue {Data = data, Height = h, Width = w};
|
||||
|
||||
lock (_MutexTexture)
|
||||
@@ -963,6 +957,11 @@ namespace Vocaluxe.Lib.Draw
|
||||
}
|
||||
return texture;
|
||||
}
|
||||
|
||||
private CTexture _GetNewTexture(int w, int h)
|
||||
{
|
||||
return new CTexture(w, h, _CheckForNextPowerOf2(w), _CheckForNextPowerOf2(h));
|
||||
}
|
||||
#endregion adding
|
||||
|
||||
#region updating
|
||||
|
||||
@@ -291,7 +291,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
{
|
||||
Bitmap bmp = new Bitmap(_Backbuffer);
|
||||
_Bitmaps.Add(bmp);
|
||||
CTexture texture = new CTexture(_Bitmaps.Count - 1, bmp.Width, bmp.Height);
|
||||
CTexture texture = _GetNewTexture(bmp.Width, bmp.Height);
|
||||
|
||||
// Add to Texture List
|
||||
_Textures[texture.Index] = texture;
|
||||
@@ -335,7 +335,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
{
|
||||
Bitmap bmp2 = new Bitmap(bmp);
|
||||
_Bitmaps.Add(bmp2);
|
||||
CTexture texture = new CTexture(_Bitmaps.Count - 1, bmp.Width, bmp.Height);
|
||||
CTexture texture = _GetNewTexture(bmp.Width, bmp.Height);
|
||||
|
||||
// Add to Texture List
|
||||
_Textures[texture.Index] = texture;
|
||||
@@ -343,6 +343,11 @@ namespace Vocaluxe.Lib.Draw
|
||||
return texture;
|
||||
}
|
||||
|
||||
private CTexture _GetNewTexture(int w, int h)
|
||||
{
|
||||
return new CTexture(w, h) {Index = _Bitmaps.Count - 1};
|
||||
}
|
||||
|
||||
public CTexture AddTexture(string texturePath)
|
||||
{
|
||||
if (File.Exists(texturePath))
|
||||
|
||||
@@ -491,14 +491,11 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
public CTexture CopyScreen()
|
||||
{
|
||||
CTexture texture = new CTexture(-1, _W, _H);
|
||||
CTexture texture = _GetNewTexture(_W, _H);
|
||||
|
||||
int id = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, id);
|
||||
texture.ID = id;
|
||||
|
||||
texture.W2 = MathHelper.NextPowerOfTwo(texture.OrigSize.Width);
|
||||
texture.H2 = MathHelper.NextPowerOfTwo(texture.OrigSize.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);
|
||||
@@ -699,20 +696,16 @@ namespace Vocaluxe.Lib.Draw
|
||||
break;
|
||||
}
|
||||
|
||||
CTexture texture = new CTexture(-1, bmp.Width, bmp.Height) {UseFullTexture = true};
|
||||
|
||||
int id = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, id);
|
||||
texture.ID = id;
|
||||
|
||||
int w = Math.Min(bmp.Width, maxSize);
|
||||
int h = Math.Min(bmp.Height, maxSize);
|
||||
w = MathHelper.NextPowerOfTwo(w);
|
||||
h = MathHelper.NextPowerOfTwo(h);
|
||||
|
||||
texture.W2 = w;
|
||||
texture.H2 = h;
|
||||
CTexture texture = new CTexture(bmp.Width, bmp.Height, w, h, true);
|
||||
|
||||
int id = GL.GenTexture();
|
||||
GL.BindTexture(TextureTarget.Texture2D, id);
|
||||
texture.ID = id;
|
||||
Bitmap bmp2 = null;
|
||||
try
|
||||
{
|
||||
@@ -764,9 +757,9 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
public CTexture AddTexture(int w, int h, byte[] data)
|
||||
{
|
||||
CTexture texture = new CTexture(-1, w, h);
|
||||
CTexture texture = _GetNewTexture(w, h);
|
||||
|
||||
_CreateTexture(texture, data);
|
||||
_CreateTexture(texture, w, h, data);
|
||||
|
||||
lock (_MutexTexture)
|
||||
{
|
||||
@@ -777,10 +770,8 @@ namespace Vocaluxe.Lib.Draw
|
||||
return texture;
|
||||
}
|
||||
|
||||
private void _CreateTexture(CTexture texture, byte[] data)
|
||||
private void _CreateTexture(CTexture texture, int w, int h, byte[] data)
|
||||
{
|
||||
int w = texture.OrigSize.Width;
|
||||
int h = texture.OrigSize.Height;
|
||||
if (_UsePBO)
|
||||
{
|
||||
try
|
||||
@@ -801,9 +792,6 @@ namespace Vocaluxe.Lib.Draw
|
||||
GL.BindTexture(TextureTarget.Texture2D, id);
|
||||
texture.ID = id;
|
||||
|
||||
texture.W2 = MathHelper.NextPowerOfTwo(w);
|
||||
texture.H2 = MathHelper.NextPowerOfTwo(h);
|
||||
|
||||
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);
|
||||
@@ -818,14 +806,11 @@ namespace Vocaluxe.Lib.Draw
|
||||
//GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
|
||||
GL.Ext.GenerateMipmap(GenerateMipmapTarget.Texture2D);
|
||||
GL.BindTexture(TextureTarget.Texture2D, 0);
|
||||
|
||||
// Add to Texture List
|
||||
texture.TexturePath = String.Empty;
|
||||
}
|
||||
|
||||
public CTexture EnqueueTexture(int w, int h, byte[] data)
|
||||
{
|
||||
CTexture texture = new CTexture(-1, w, h);
|
||||
CTexture texture = _GetNewTexture(w, h);
|
||||
STextureQueue queue = new STextureQueue {Data = data, Height = h, Width = w};
|
||||
|
||||
lock (_MutexTexture)
|
||||
@@ -838,6 +823,11 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
private CTexture _GetNewTexture(int w, int h)
|
||||
{
|
||||
return new CTexture(w, h, MathHelper.NextPowerOfTwo(w), MathHelper.NextPowerOfTwo(h));
|
||||
}
|
||||
#endregion adding
|
||||
|
||||
#region updating
|
||||
@@ -1183,7 +1173,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
continue;
|
||||
|
||||
if (q.Width == texture.OrigSize.Width && q.Height == texture.OrigSize.Height)
|
||||
_CreateTexture(texture, q.Data);
|
||||
_CreateTexture(texture, q.Width, q.Height, q.Data);
|
||||
else
|
||||
CLog.LogError("Wrong texture size in queue!");
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using VocaluxeLib.Draw;
|
||||
using VocaluxeLib.Menu;
|
||||
|
||||
namespace Vocaluxe.Lib.Video
|
||||
{
|
||||
|
||||
@@ -26,7 +26,6 @@ using System.Threading;
|
||||
using Vocaluxe.Base;
|
||||
using Vocaluxe.Lib.Video.Acinerella;
|
||||
using VocaluxeLib.Draw;
|
||||
using VocaluxeLib.Menu;
|
||||
|
||||
namespace Vocaluxe.Lib.Video
|
||||
{
|
||||
|
||||
@@ -21,7 +21,6 @@ using System;
|
||||
using Vocaluxe.Base;
|
||||
using Vocaluxe.Lib.Video.Gstreamer;
|
||||
using VocaluxeLib.Draw;
|
||||
using VocaluxeLib.Menu;
|
||||
|
||||
namespace Vocaluxe.Lib.Video
|
||||
{
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#endregion
|
||||
|
||||
using VocaluxeLib.Draw;
|
||||
using VocaluxeLib.Menu;
|
||||
|
||||
namespace Vocaluxe.Lib.Video
|
||||
{
|
||||
|
||||
@@ -25,7 +25,6 @@ using System.Drawing.Imaging;
|
||||
using System.Runtime.InteropServices;
|
||||
using Vocaluxe.Base;
|
||||
using VocaluxeLib.Draw;
|
||||
using VocaluxeLib.Menu;
|
||||
|
||||
namespace Vocaluxe.Lib.Webcam
|
||||
{
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using VocaluxeLib.Draw;
|
||||
using VocaluxeLib.Menu;
|
||||
|
||||
namespace Vocaluxe.Lib.Webcam
|
||||
{
|
||||
|
||||
@@ -22,7 +22,6 @@ using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
using Vocaluxe.Base;
|
||||
using VocaluxeLib.Draw;
|
||||
using VocaluxeLib.Menu;
|
||||
using VocaluxeLib.Menu.SongMenu;
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ namespace VocaluxeLib.Draw
|
||||
/// </summary>
|
||||
public float HeightRatio { get; private set; }
|
||||
|
||||
/*
|
||||
/// <summary>
|
||||
/// Internal use. Specifies if full texture memory should be used
|
||||
/// Set to true if you resized the original image to the maximum
|
||||
@@ -87,16 +88,25 @@ namespace VocaluxeLib.Draw
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
public CTexture(int index, int origWidth = 1, int origHeight = 1)
|
||||
/// <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="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)
|
||||
{
|
||||
Index = index;
|
||||
|
||||
OrigSize = new Size(origWidth, origHeight);
|
||||
Rect = new SRectF(0f, 0f, origWidth, origHeight, 0f);
|
||||
_UseFullTexture = useFullTexture;
|
||||
|
||||
_W2 = origWidth;
|
||||
_H2 = origHeight;
|
||||
//IMPORTANT: Use setter here to calculate ratios!
|
||||
W2 = (texWidth > 0) ? texWidth : origWidth;
|
||||
H2 = (texHeight > 0) ? texHeight : origHeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user