83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
| using System;
 | |
| using RefreshCS;
 | |
| 
 | |
| namespace Campari
 | |
| {
 | |
|     public class Texture : IDisposable
 | |
|     {
 | |
|         public RefreshDevice Device { get; }
 | |
|         public IntPtr Handle { get; }
 | |
|         public uint Height { get; }
 | |
|         public uint Width { get; }
 | |
| 
 | |
|         public bool IsDisposed { get; private set; }
 | |
| 
 | |
|         public static Texture Load(RefreshDevice device, string path)
 | |
|         {
 | |
|             var pixels = Refresh.Refresh_Image_Load(path, out var width, out var height, out var channels);
 | |
|             IntPtr textureHandle = Refresh.Refresh_CreateTexture2D(
 | |
|                 device.Handle,
 | |
|                 Refresh.ColorFormat.R8G8B8A8,
 | |
|                 (uint) width,
 | |
|                 (uint) height,
 | |
|                 1,
 | |
|                 (uint) Refresh.TextureUsageFlagBits.SamplerBit
 | |
|             );
 | |
| 
 | |
|             Refresh.TextureSlice textureSlice;
 | |
|             textureSlice.texture = textureHandle;
 | |
|             textureSlice.rectangle.x = 0;
 | |
|             textureSlice.rectangle.y = 0;
 | |
|             textureSlice.rectangle.w = width;
 | |
|             textureSlice.rectangle.h = height;
 | |
|             textureSlice.level = 0;
 | |
|             textureSlice.layer = 0;
 | |
|             textureSlice.depth = 0;
 | |
| 
 | |
|             Refresh.Refresh_SetTextureData(
 | |
|                 device.Handle,
 | |
|                 ref textureSlice,
 | |
|                 pixels,
 | |
|                 (uint) (width * height * 4)
 | |
|             );
 | |
| 
 | |
|             return new Texture(
 | |
|                 device,
 | |
|                 textureHandle,
 | |
|                 (uint) width,
 | |
|                 (uint) height
 | |
|             );
 | |
|         }
 | |
| 
 | |
|         public Texture(RefreshDevice device, IntPtr handle, uint width, uint height)
 | |
|         {
 | |
|             Device = device;
 | |
|             Handle = handle;
 | |
|             Width = width;
 | |
|             Height = height;
 | |
|         }
 | |
| 
 | |
|         protected virtual void Dispose(bool disposing)
 | |
|         {
 | |
|             if (!IsDisposed)
 | |
|             {
 | |
|                 Refresh.Refresh_QueueDestroyTexture(Device.Handle, Handle);
 | |
|                 IsDisposed = true;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         ~Texture()
 | |
|         {
 | |
|             // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
 | |
|             Dispose(disposing: false);
 | |
|         }
 | |
| 
 | |
|         public void Dispose()
 | |
|         {
 | |
|             // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
 | |
|             Dispose(disposing: true);
 | |
|             GC.SuppressFinalize(this);
 | |
|         }
 | |
|     }
 | |
| }
 |