diff --git a/Assets/textures/atlas.png b/Assets/textures/atlas.png new file mode 100644 index 0000000..943844a Binary files /dev/null and b/Assets/textures/atlas.png differ diff --git a/Rendering/Texture.cs b/Rendering/Texture.cs new file mode 100644 index 0000000..7895720 --- /dev/null +++ b/Rendering/Texture.cs @@ -0,0 +1,35 @@ +using OpenTK.Graphics.OpenGL4; +using StbImageSharp; + +namespace VoxelEngine.Rendering; + +public sealed class Texture : IDisposable +{ + private readonly int _handle; + + public Texture(string path) + { + _handle = GL.GenTexture(); + GL.BindTexture(TextureTarget.Texture2D, _handle); + + StbImage.stbi_set_flip_vertically_on_load(1); + using FileStream stream = File.OpenRead(path); + ImageResult image = ImageResult.FromStream(stream, ColorComponents.RedGreenBlueAlpha); + + GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, + image.Width, image.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, image.Data); + + 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.ClampToEdge); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); + } + + public void Use(TextureUnit unit = TextureUnit.Texture0) + { + GL.ActiveTexture(unit); + GL.BindTexture(TextureTarget.Texture2D, _handle); + } + + public void Dispose() => GL.DeleteTexture(_handle); +}