Removed Subrepository
This commit is contained in:
73
C#/OpenGLTutorial/Rendering/Display/Texture.cs
Normal file
73
C#/OpenGLTutorial/Rendering/Display/Texture.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
using System.IO;
|
||||
using StbiSharp;
|
||||
using static OpenGL.GL;
|
||||
|
||||
namespace OpenGLTutorial.Rendering.Display {
|
||||
public class Texture {
|
||||
|
||||
public static Texture Empty => new(null);
|
||||
|
||||
public int Width { get; private set; }
|
||||
public int Height { get; private set; }
|
||||
|
||||
private uint Address { get; set; }
|
||||
private string Path { get; }
|
||||
private bool _loaded = false;
|
||||
|
||||
public Texture(string path) {
|
||||
Path = path;
|
||||
}
|
||||
|
||||
public unsafe void Load() {
|
||||
if (_loaded) return;
|
||||
_loaded = true;
|
||||
Address = glGenTexture();
|
||||
glBindTexture(GL_TEXTURE_2D, Address);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
if (string.IsNullOrEmpty(Path)) {
|
||||
LoadEmpty();
|
||||
return;
|
||||
}
|
||||
|
||||
using var stream = File.OpenRead(Path);
|
||||
using var memoryStream = new MemoryStream();
|
||||
stream.CopyTo(memoryStream);
|
||||
StbiImage image = Stbi.LoadFromMemory(memoryStream, 0);
|
||||
int format = image.NumChannels == 3 ? GL_RGB : GL_RGBA;
|
||||
fixed(byte* data = &image.Data[0])
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, format, image.Width, image.Height, 0, format, GL_UNSIGNED_BYTE, data);
|
||||
Width = image.Width;
|
||||
Height = image.Height;
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
private unsafe void LoadEmpty() {
|
||||
byte[] pixels = {255, 255, 255, 255};
|
||||
|
||||
fixed (byte* data = &pixels[0]) {
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||||
}
|
||||
|
||||
Width = 1;
|
||||
Height = 1;
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
public void Use() {
|
||||
glBindTexture(GL_TEXTURE_2D, Address);
|
||||
}
|
||||
|
||||
public void Delete() {
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glDeleteTexture(Address);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user