mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/PCK-Studio.git
synced 2026-05-29 10:24:34 +00:00
67 lines
2.1 KiB
C#
67 lines
2.1 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using OpenTK;
|
|
using OpenTK.Graphics.OpenGL;
|
|
|
|
namespace PckStudio.Rendering
|
|
{
|
|
internal class Texture2D : IDisposable
|
|
{
|
|
private int _id;
|
|
|
|
public Texture2D(string filepath)
|
|
: this(Image.FromFile(filepath))
|
|
{
|
|
|
|
}
|
|
|
|
public Texture2D(Image image)
|
|
: this(new Bitmap(image))
|
|
{
|
|
|
|
}
|
|
|
|
private Texture2D(Bitmap bitmap)
|
|
{
|
|
_id = GL.GenTexture();
|
|
GL.BindTexture(TextureTarget.Texture2D, _id);
|
|
|
|
GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
|
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
|
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
|
|
|
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorder);
|
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToBorder);
|
|
|
|
var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
|
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, bitmap.Width, bitmap.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
|
|
bitmap.UnlockBits(data);
|
|
|
|
GL.BindTexture(TextureTarget.Texture2D, 0);
|
|
}
|
|
|
|
public void Bind(int slot)
|
|
{
|
|
Debug.Assert(slot >= 0 || slot < 32, "Slot is out of range");
|
|
slot = MathHelper.Clamp(slot, 0, 31);
|
|
GL.ActiveTexture(TextureUnit.Texture0 + slot);
|
|
GL.BindTexture(TextureTarget.Texture2D, _id);
|
|
}
|
|
|
|
[Conditional("DEBUG")]
|
|
public void Unbind()
|
|
{
|
|
GL.BindTexture(TextureTarget.Texture2D, 0);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Unbind();
|
|
GL.DeleteTexture(_id);
|
|
}
|
|
|
|
}
|
|
}
|