Finished untested texture data.

This commit is contained in:
Harrison Deng 2020-02-20 14:49:36 -05:00
parent d31a2cb744
commit 4f7c7dccb1
4 changed files with 71 additions and 20 deletions

View File

@ -1,6 +1,12 @@
using OpenTK;
namespace RecrownedGTK.Graphics { namespace RecrownedGTK.Graphics {
public interface IDrawable public interface IDrawable
{ {
void Draw(out float[] vertices, out float[] indices, out TextureData textureData); /// <summary>
/// Fills the parameters with the information needed to draw this texture.!--
/// </summary>
/// <param name="vertices">The vertices in pairs of 3 normalized in the order x, y, and z.</param>
/// <param name="textureData">The texture data to be used. Can be null.</param>
void Draw(out VertexInformation[] vertices, out TextureData textureData);
} }
} }

View File

@ -3,7 +3,7 @@ namespace RecrownedGTK.Graphics {
public Texture() { public Texture() {
} }
public void Draw(out float[] vertices, out float[] indices, out TextureData textureData) { public void Draw(out VertexInformation[] vertices, out TextureData textureData) {
throw new System.NotImplementedException(); throw new System.NotImplementedException();
//TODO: Implement this. //TODO: Implement this.
} }

View File

@ -1,35 +1,70 @@
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using OpenTK.Graphics.OpenGL; using OpenTK.Graphics.OpenGL;
using OpenTK.Graphics;
using System;
namespace RecrownedGTK.Graphics { namespace RecrownedGTK.Graphics {
public class TextureData { public class TextureData : IDisposable {
private bool disposed;
int handle; int handle;
byte[] textureData;
public byte[] ColorData { public TextureWrapMode textureWrapModeWidth, textureWrapModeHeight;
get { public Color4 borderColor;
return textureData; public TextureMinFilter textureMinFilter;
} public TextureMagFilter textureMagFilter;
}
public TextureData(string path) { public TextureData(string path) {
LoadFromPNG(path); byte[] textureData = null;
} int width;
public TextureData() { int height;
//TODO: Finish this class.
}
public TextureData(byte[] textureData, int width, int height, int mipmap = 0) {
this.textureData = textureData;
GL.TexImage2D(TextureTarget.Texture2D, mipmap, PixelInternalFormat.Rgba, width, height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, textureData);
}
public void LoadFromPNG(string path) {
using (FileStream file = new FileStream(path, FileMode.Open)) { using (FileStream file = new FileStream(path, FileMode.Open)) {
using (Bitmap bitmap = new Bitmap(file)) { using (Bitmap bitmap = new Bitmap(file)) {
ImageConverter converter = new ImageConverter(); ImageConverter converter = new ImageConverter();
textureData = (byte[]) converter.ConvertTo(bitmap, typeof(byte[])); textureData = (byte[]) converter.ConvertTo(bitmap, typeof(byte[]));
width = bitmap.Width;
height = bitmap.Height;
} }
} }
GenerateTexture(textureData, width, height);
}
public TextureData(byte[] textureData, int width, int height) {
textureWrapModeHeight = TextureWrapMode.ClampToBorder;
textureWrapModeWidth = TextureWrapMode.ClampToBorder;
textureMinFilter = TextureMinFilter.LinearMipmapLinear;
textureMagFilter = TextureMagFilter.Linear;
GenerateTexture(textureData, width, height);
}
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);
}
internal void Use() {
GL.BindTexture(TextureTarget.Texture2D, handle);
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing = false) {
if (disposed) return;
if (disposing) {
}
GL.BindTexture(TextureTarget.Texture2D, 0);
GL.DeleteTexture(handle);
disposed = true;
}
~TextureData() {
Dispose(false);
} }
} }
} }

View File

@ -0,0 +1,10 @@
using OpenTK;
using OpenTK.Graphics;
namespace RecrownedGTK.Graphics {
public struct VertexInformation {
public Vector3 vertexCoords;
public uint[] indices;
public Color4 color;
public Vector2 textureCoords;
}
}