recrownedgtk/RecrownedGTK/Graphics/TextureData.cs
Harrison 9c19b21ffb Removed PNG loader from the TextureData.
In support of new loading pipeline.
2020-04-17 22:07:38 -05:00

78 lines
2.9 KiB
C#

using System.Drawing;
using System.IO;
using OpenTK.Graphics.OpenGL;
using OpenTK.Graphics;
using System;
namespace RecrownedGTK.Graphics {
/// <summary>
/// Represents the texture for any given vertice.
/// Contains bytes that form the texture.
/// </summary>
public class TextureData : IDisposable {
private bool disposed;
int handle;
public readonly int width, height;
public TextureWrapMode textureWrapModeWidth, textureWrapModeHeight;
public Color4 borderColor;
public TextureMinFilter textureMinFilter;
public TextureMagFilter textureMagFilter;
/// <summary>
/// Generates a texture using a byte array of the texture data.
/// </summary>
/// <param name="textureData">The byte array representing the texture.</param>
/// <param name="width">The width of the texture.</param>
/// <param name="height">The height of the texture.</param>
public TextureData(byte[] textureData, int width, int height) {
textureWrapModeHeight = TextureWrapMode.ClampToBorder;
textureWrapModeWidth = TextureWrapMode.ClampToBorder;
textureMinFilter = TextureMinFilter.LinearMipmapLinear;
textureMagFilter = TextureMagFilter.Linear;
this.width = width;
this.height = height;
GenerateTexture(textureData, width, height);
}
/// <summary>
/// Generates a texture in the OpenGL context.
/// </summary>
/// <param name="textureData">Byte array representing the texture.</param>
/// <param name="width">Width of the texture.</param>
/// <param name="height">Height of the texture.</param>
private void GenerateTexture(byte[] textureData, int width, int height) {
if (handle != 0) throw new InvalidOperationException("This texture data already holds a texture.");
handle = GL.GenTexture();
Use();
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, width, height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, textureData);
GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
}
/// <summary>
/// Binds the OpenGL texture.
/// </summary>
internal void Use() {
GL.BindTexture(TextureTarget.Texture2D, handle);
}
/// <summary>
/// Removes texture data from memory.
/// </summary>
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (disposed) return;
if (disposing) {
}
GL.BindTexture(TextureTarget.Texture2D, 0);
GL.DeleteTexture(handle);
disposed = true;
}
~TextureData() {
Dispose(false);
}
}
}