98 lines
2.7 KiB
Java
98 lines
2.7 KiB
Java
|
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);
|
||
|
}
|
||
|
}
|