package globalgamejam.render; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL12.*; import java.awt.*; import java.awt.image.*; import java.io.*; import java.nio.*; import javax.imageio.*; import org.lwjgl.*; import org.lwjgl.opengl.GL12; /** * Class created by MrDev023 (Florian RICHER) on 14/01/2017 */ public class Texture { private static final int BYTES_PER_PIXEL = 4;//3 for RGB, 4 for RGBA public int width, height; int id; public Texture(int width,int height,int id){ this.id = id; this.width = width; this.height = height; } public static Texture loadFont(String text, Color color, String font, int size){ Font f_font = new Font(font, Font.PLAIN, size); // to get the width of the text BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); FontMetrics fm = img.getGraphics().getFontMetrics(f_font); int width = fm.stringWidth(text); int height = fm.getHeight(); final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); // makeTransparent(image); Graphics g = image.getGraphics(); g.setFont(f_font); g.setColor(color); g.drawString(text, 0, size); g.dispose(); int[] pixels = new int[image.getWidth() * image.getHeight()]; image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB for(int y = 0; y < image.getHeight(); y++){ for(int x = 0; x < image.getWidth(); x++){ int pixel = pixels[y * image.getWidth() + x]; buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component buffer.put((byte) (pixel & 0xFF)); // Blue component buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA } } buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS // You now have a ByteBuffer filled with the color data of each pixel. // Now just create a texture ID and bind it. Then you can load it using // whatever OpenGL method you want, for example: int textureID = glGenTextures(); //Generate texture ID glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID //Setup wrap mode glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); //Setup texture scaling filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //Send texel data to OpenGL glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); glBindTexture(GL_TEXTURE_2D, 0); return new Texture(image.getWidth(),image.getHeight(),textureID); } public static Texture loadTexture(String path){ try { BufferedImage image = ImageIO.read(new File(path)); int width = image.getWidth(); int height = image.getHeight(); int[] pixels = new int[width * height]; image.getRGB(0, 0, width, height, pixels, 0,width); int[] data = new int[pixels.length]; for (int i = 0; i < data.length; i++) { int a = (pixels[i] & 0xff000000) >> 24; int r = (pixels[i] & 0xff0000) >> 16; int g = (pixels[i] & 0xff00) >> 8; int b = (pixels[i] & 0xff); data[i] = a << 24 | b << 16 | g << 8 | r; } IntBuffer buffer = BufferUtils.createIntBuffer(data.length); buffer.put(data); buffer.flip(); int id = glGenTextures(); glBindTexture(GL_TEXTURE_2D, id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); glBindTexture(GL_TEXTURE_2D, 0); System.out.println("Texture loaded ! " + width + "x" + height + " id:" + id); return new Texture(width, height, id); } catch (IOException e) { e.printStackTrace(); return null; } } public int getWidth() { return width; } public int getHeight() { return height; } public int getID(){ return id; } public void bind(){ if(!glIsEnabled(GL_TEXTURE_2D))glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, id); } public void unbind(){ glBindTexture(GL_TEXTURE_2D, 0); } public void destroy(){ glDeleteTextures(id); } }