package net.tylermurphy.Minecraft.Render.Data; import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.lwjgl.opengl.GL30.*; import org.lwjgl.opengl.EXTTextureFilterAnisotropic; import org.lwjgl.opengl.GL; import org.lwjgl.stb.STBImage; import org.lwjgl.system.MemoryStack; import net.tylermurphy.Minecraft.Util.Constants; public class Texture { public ByteBuffer getImage() { return image; } public int getWidth() { return width; } public int getHeight() { return height; } private ByteBuffer image; private int width, height; private static List ids = new ArrayList(); Texture(int width, int heigh, ByteBuffer image) { this.image = image; this.height = heigh; this.width = width; } public static Texture loadRawTextureData(String fileName) { ByteBuffer image; int width, height; try (MemoryStack stack = MemoryStack.stackPush()) { IntBuffer comp = stack.mallocInt(1); IntBuffer w = stack.mallocInt(1); IntBuffer h = stack.mallocInt(1); image = STBImage.stbi_load(Constants.PNG_LOCATION + fileName + ".png", w, h, comp, 4); if (image == null) { System.err.println("Couldn't load " + Constants.PNG_LOCATION + fileName + ".png"); } width = w.get(); height = h.get(); return new Texture(width, height, image); } } private static int loadImage(String fileName) { int id = glGenTextures(); Texture image = loadRawTextureData(fileName); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, id); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, image.getImage()); glGenerateMipmap(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -1); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); ids.add(id); return id; } public static int loadTexture(String fileName) { return loadImage(fileName); } public static int loadFontAtlas(String fileName) { return loadImage(fileName); } public static int loadTexture2DArray(HashMap textures){ int id = glGenTextures(); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, id); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT); if (GL.getCapabilities().GL_EXT_texture_filter_anisotropic) { float maxAnisotropy = glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT); glTexParameterf(GL_TEXTURE_2D_ARRAY, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy); } glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, textures.get(0).width, textures.get(0).height, textures.values().size(), 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer) null); for(Map.Entry entry : textures.entrySet()){ glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, entry.getKey(), entry.getValue().width, entry.getValue().height, 1, GL_RGBA, GL_UNSIGNED_BYTE, entry.getValue().getImage()); } glGenerateMipmap(GL_TEXTURE_2D_ARRAY); glBindTexture(GL_TEXTURE_2D_ARRAY, 0); ids.add(id); return id; } public static void cleanUp(){ for(int id:ids){ glDeleteTextures(id); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D_ARRAY, id); } } }