diff --git a/src/org/hl/engine/graphics/Material.java b/src/org/hl/engine/graphics/Material.java new file mode 100644 index 0000000..becaef4 --- /dev/null +++ b/src/org/hl/engine/graphics/Material.java @@ -0,0 +1,44 @@ +package org.hl.engine.graphics; + +import org.hl.engine.utils.TextureLoader; +import org.lwjgl.opengl.GL11; +import org.lwjgl.openvr.Texture; + +import java.awt.image.BufferedImage; + +public class Material { + + private Texture texture; + + private BufferedImage image; + + private int width, height; + private int textureID; + + public Material(String path) { + + this.image = TextureLoader.loadImage(path); //The path is inside the jar file + + } + public void create() { + this.width = this.image.getWidth(); + this.height = this.image.getHeight(); + this.textureID = TextureLoader.loadTexture(image); + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public int getTextureID() { + return textureID; + } + + public void destroy() { + GL11.glDeleteTextures(textureID); + } +} diff --git a/src/org/hl/engine/utils/TextureLoader.java b/src/org/hl/engine/utils/TextureLoader.java new file mode 100644 index 0000000..7f3e0b7 --- /dev/null +++ b/src/org/hl/engine/utils/TextureLoader.java @@ -0,0 +1,70 @@ +package org.hl.engine.utils; + +// Original TextureLoader by Krythic (replaces SlickUtils texture loader) + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.nio.ByteBuffer; + +import javax.imageio.ImageIO; + +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL12; + +import static org.lwjgl.opengl.GL11.*; + +public class TextureLoader { + private static final int BYTES_PER_PIXEL = 4;//3 for RGB, 4 for RGBA + public static int loadTexture(BufferedImage image){ + + 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); + + //Return the texture ID so we can bind it later again + return textureID; + } + + public static BufferedImage loadImage(String loc) + { + try { + return ImageIO.read(TextureLoader.class.getResource(loc)); + } catch (IOException e) { + //Error Handling Here + System.err.println("Error with loading texture. "); + System.exit(1); + } + return null; + } +} \ No newline at end of file