mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-13 17:47:12 -04:00
Implement ability to perform partial update of textures on both graphics api backends. Partially addresses #44.
This commit is contained in:
parent
1aff357e80
commit
f33428a531
@ -162,9 +162,14 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
|
|
||||||
public override int CreateTexture( int width, int height, IntPtr scan0 ) {
|
public override int CreateTexture( int width, int height, IntPtr scan0 ) {
|
||||||
D3D.Texture texture = device.CreateTexture( width, height, 0, Usage.None, Format.A8R8G8B8, Pool.Managed );
|
D3D.Texture texture = device.CreateTexture( width, height, 0, Usage.None, Format.A8R8G8B8, Pool.Managed );
|
||||||
texture.SetData( scan0, width * height * 4, 0, LockFlags.None );
|
texture.SetData( 0, LockFlags.None, scan0, width * height * 4 );
|
||||||
return GetOrExpand( ref textures, texture, texBufferSize );
|
return GetOrExpand( ref textures, texture, texBufferSize );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void UpdateTexturePart( int texId, int texX, int texY, FastBitmap part ) {
|
||||||
|
D3D.Texture texture = textures[texId];
|
||||||
|
texture.SetPartData( 0, LockFlags.None, part.Scan0, texX, texY, part.Width, part.Height );
|
||||||
|
}
|
||||||
|
|
||||||
public override void BindTexture( int texId ) {
|
public override void BindTexture( int texId ) {
|
||||||
device.SetTexture( 0, textures[texId] );
|
device.SetTexture( 0, textures[texId] );
|
||||||
|
@ -44,6 +44,8 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
|
|
||||||
public abstract int CreateTexture( int width, int height, IntPtr scan0 );
|
public abstract int CreateTexture( int width, int height, IntPtr scan0 );
|
||||||
|
|
||||||
|
public abstract void UpdateTexturePart( int texId, int texX, int texY, FastBitmap part );
|
||||||
|
|
||||||
public abstract void BindTexture( int texId );
|
public abstract void BindTexture( int texId );
|
||||||
|
|
||||||
public abstract void DeleteTexture( ref int texId );
|
public abstract void DeleteTexture( ref int texId );
|
||||||
|
@ -159,9 +159,15 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
GlPixelFormat.Bgra, PixelType.UnsignedByte, scan0 );
|
GlPixelFormat.Bgra, PixelType.UnsignedByte, scan0 );
|
||||||
return texId;
|
return texId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void BindTexture( int texture ) {
|
public override void BindTexture( int texture ) {
|
||||||
GL.BindTexture( TextureTarget.Texture2D, texture );
|
GL.BindTexture( TextureTarget.Texture2D, texture );
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void UpdateTexturePart( int texId, int texX, int texY, FastBitmap part ) {
|
||||||
|
GL.BindTexture( TextureTarget.Texture2D, texId );
|
||||||
|
GL.TexSubImage2D( TextureTarget.Texture2D, 0, texX, texY, part.Width, part.Height,
|
||||||
|
GlPixelFormat.Bgra, PixelType.UnsignedByte, part.Scan0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
public unsafe override void DeleteTexture( ref int texId ) {
|
public unsafe override void DeleteTexture( ref int texId ) {
|
||||||
@ -403,14 +409,6 @@ namespace ClassicalSharp.GraphicsAPI {
|
|||||||
if( value ) GL.Enable( cap );
|
if( value ) GL.Enable( cap );
|
||||||
else GL.Disable( cap );
|
else GL.Disable( cap );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateTexturePart( int texId, int x, int y, FastBitmap part ) {
|
|
||||||
GL.Enable( EnableCap.Texture2D );
|
|
||||||
GL.BindTexture( TextureTarget.Texture2D, texId );
|
|
||||||
GL.TexSubImage2D( TextureTarget.Texture2D, 0, x, y, part.Width, part.Height,
|
|
||||||
GlPixelFormat.Bgra, PixelType.UnsignedByte, part.Scan0 );
|
|
||||||
GL.Disable( EnableCap.Texture2D );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
@ -106,12 +106,35 @@ namespace SharpDX.Direct3D9 {
|
|||||||
return lockedRect;
|
return lockedRect;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetData( IntPtr data, int bytes, int level, LockFlags flags ) {
|
public LockedRectangle LockRectangle(int level, D3DRect rect, LockFlags flags) {
|
||||||
|
LockedRectangle lockedRect = new LockedRectangle();
|
||||||
|
int res = Interop.Calli(comPointer, level, (IntPtr)(void*)&lockedRect, (IntPtr)(void*)&rect, (int)flags,(*(IntPtr**)comPointer)[19]);
|
||||||
|
if( res < 0 ) { throw new SharpDXException( res ); }
|
||||||
|
return lockedRect;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetData( int level, LockFlags flags, IntPtr data,int bytes ) {
|
||||||
LockedRectangle rect = LockRectangle( level, flags );
|
LockedRectangle rect = LockRectangle( level, flags );
|
||||||
MemUtils.memcpy( data, rect.DataPointer, bytes );
|
MemUtils.memcpy( data, rect.DataPointer, bytes );
|
||||||
UnlockRectangle( level );
|
UnlockRectangle( level );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetPartData( int level, LockFlags flags, IntPtr data, int x, int y, int width, int height ) {
|
||||||
|
D3DRect partRect;
|
||||||
|
partRect.Left = x; partRect.Top = y;
|
||||||
|
partRect.Right = x + width; partRect.Bottom = y + height;
|
||||||
|
LockedRectangle rect = LockRectangle( level, partRect, flags );
|
||||||
|
|
||||||
|
// We need to copy scanline by scanline, as generally rect.stride != data.stride
|
||||||
|
byte* src = (byte*)data, dst = (byte*)rect.DataPointer;
|
||||||
|
for( int yy = 0; yy < height; yy++ ) {
|
||||||
|
MemUtils.memcpy( (IntPtr)src, (IntPtr)dst, width * 4 );
|
||||||
|
src += width * 4;
|
||||||
|
dst += rect.Pitch;
|
||||||
|
}
|
||||||
|
UnlockRectangle( level );
|
||||||
|
}
|
||||||
|
|
||||||
public void UnlockRectangle(int level) {
|
public void UnlockRectangle(int level) {
|
||||||
int res = Interop.Calli(comPointer, level,(*(IntPtr**)comPointer)[20]);
|
int res = Interop.Calli(comPointer, level,(*(IntPtr**)comPointer)[20]);
|
||||||
if( res < 0 ) { throw new SharpDXException( res ); }
|
if( res < 0 ) { throw new SharpDXException( res ); }
|
||||||
|
@ -50,5 +50,11 @@ namespace SharpDX {
|
|||||||
public IntPtr DataPointer;
|
public IntPtr DataPointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[StructLayout( LayoutKind.Sequential )]
|
||||||
|
public struct D3DRect {
|
||||||
|
public int Left;
|
||||||
|
public int Top;
|
||||||
|
public int Right;
|
||||||
|
public int Bottom;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user