package com.gnarly.engine.texture; import static org.lwjgl.opengl.GL11.GL_CLAMP; import static org.lwjgl.opengl.GL11.GL_NEAREST; import static org.lwjgl.opengl.GL11.GL_RGBA; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER; import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_S; import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_T; import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; import static org.lwjgl.opengl.GL11.glBindTexture; import static org.lwjgl.opengl.GL11.glDeleteTextures; import static org.lwjgl.opengl.GL11.glGenTextures; import static org.lwjgl.opengl.GL11.glTexImage2D; import static org.lwjgl.opengl.GL11.glTexParameterf; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import javax.imageio.ImageIO; import org.lwjgl.BufferUtils; import com.gnarly.engine.display.Window; public class Texture { protected int id, width, height; public Texture(String name) { BufferedImage bi = null; try { bi = ImageIO.read(new File("res/img/" + Window.resolution + "/" + name)); } catch (IOException e) { try { bi = ImageIO.read(new File("res/img/const/" + name)); } catch (IOException ex) { e.printStackTrace(); } } if (bi != null) { width = bi.getWidth(); height = bi.getHeight(); int[] pixels = bi.getRGB(0, 0, width, height, null, 0, width); ByteBuffer buffer = BufferUtils.createByteBuffer(width * height * 4); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { int pixel = pixels[i * width + j]; buffer.put((byte)((pixel >> 16) & 0xFF)); // Red buffer.put((byte)((pixel >> 8) & 0xFF)); // Green buffer.put((byte)((pixel ) & 0xFF)); // Blue buffer.put((byte)((pixel >> 24) & 0xFF)); // Alpha } } buffer.flip(); id = glGenTextures(); bind(); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); unbind(); } } public Texture(int id, int width, int height) { this.id = id; this.width = width; this.height = height; } public int getWidth() { return width; } public int getHeight() { return height; } public void bind() { glBindTexture(GL_TEXTURE_2D, id); } public void unbind() { glBindTexture(GL_TEXTURE_2D, 0); } public void destroy() { glDeleteTextures(id); } }