You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
2.1 KiB

  1. using OpenTK.Graphics.OpenGL4;
  2. using OpenTK.Mathematics;
  3. using System.Runtime.CompilerServices;
  4. namespace SemiColinGames;
  5. public class Texture : IDisposable {
  6. public int Handle;
  7. public Vector2i Size;
  8. private static int maxHandle = -1;
  9. private bool disposedValue = false;
  10. public Texture(Image<Rgba32> image) {
  11. Size = new Vector2i(image.Width, image.Height);
  12. byte[] pixelBytes = new byte[Size.X * Size.Y * Unsafe.SizeOf<Rgba32>()];
  13. image.CopyPixelDataTo(pixelBytes);
  14. Handle = GL.GenTexture();
  15. if (Handle > maxHandle) {
  16. // Console.WriteLine("GL.GenTexture #" + Handle);
  17. maxHandle = Handle;
  18. }
  19. GL.ActiveTexture(TextureUnit.Texture0);
  20. GL.BindTexture(TextureTarget.Texture2D, Handle);
  21. GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Size.X, Size.Y, 0, PixelFormat.Rgba, PixelType.UnsignedByte, pixelBytes);
  22. //GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) TextureMinFilter.LinearMipmapLinear);
  23. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) TextureMinFilter.Linear);
  24. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) TextureMagFilter.Nearest);
  25. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) TextureWrapMode.ClampToBorder);
  26. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int) TextureWrapMode.ClampToBorder);
  27. float[] borderColor = { 0.0f, 0.0f, 0.0f, 1.0f };
  28. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, borderColor);
  29. // FIXME: should we use mipmaps?
  30. //GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
  31. }
  32. protected virtual void Dispose(bool disposing) {
  33. if (!disposedValue) {
  34. GL.DeleteTexture(Handle);
  35. disposedValue = true;
  36. }
  37. }
  38. ~Texture() {
  39. if (!disposedValue) {
  40. Console.WriteLine("~Texture(): resource leak? Dispose() should be called manually.");
  41. }
  42. }
  43. public void Dispose() {
  44. Dispose(true);
  45. GC.SuppressFinalize(this);
  46. }
  47. }