Renderer/src/main/java/RendererObjects/texture/Texture.java
2021-03-15 01:01:42 -04:00

137 lines
5.0 KiB
Java

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package RendererObjects.texture;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import org.lwjgl.BufferUtils;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL14.*;
import static org.lwjgl.opengl.GL30.*;
/**
*
* @author amaterasu
*/
public class Texture {
int texture_pointer;
int width;
int height;
boolean hasTransparency;
public Texture(){
}
public Texture(String path){
//generate the texture object on gpu
texture_pointer = glGenTextures();
//bind the new texture
glBindTexture(GL_TEXTURE_2D, texture_pointer);
//how are we gonna wrap the texture??
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
//set the border color to black
float borderColor[] = { 0.0f, 0.0f, 0.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
//set magnification and minification operation sampling strategies
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//load the image here
ByteBuffer data;
width = 1;
height = 1;
try {
BufferedImage image_data = ImageIO.read(new File(Thread.currentThread().getContextClassLoader().getResource(path).getFile()));
if (
image_data.getType() == BufferedImage.TYPE_3BYTE_BGR ||
image_data.getType() == BufferedImage.TYPE_INT_RGB
){
hasTransparency = false;
} else if(
image_data.getType() == BufferedImage.TYPE_4BYTE_ABGR ||
image_data.getType() == BufferedImage.TYPE_INT_ARGB
){
hasTransparency = true;
}
width = image_data.getWidth();
height = image_data.getHeight();
if(hasTransparency){
data = BufferUtils.createByteBuffer(width * height * 4);
} else {
data = BufferUtils.createByteBuffer(width * height * 3);
}
/*
imgBuffer = BufferUtils.createByteBuffer(4 * dimX * dimY);
for(int x = 0; x < dimX; x++){
for(int y = 0; y < dimY; y++){
Color temp = new Color(image_data.getRGB(x, y));
data.put((byte)(temp.getRed());
data.put((byte)(temp.getGreen());
data.put((byte)(temp.getBlue());
data.put((byte)(temp.getAlpha());
}
}
imgBuffer.flip();
*/
for(int y = height - 1; y > -1; y--){
for(int x = 0; x < width; x++){
Color temp = new Color(image_data.getRGB(x, y), true);
data.put((byte)temp.getRed());
data.put((byte)temp.getGreen());
data.put((byte)temp.getBlue());
if(hasTransparency){
data.put((byte)temp.getAlpha());
}
// data[x * y * 3 + 0] = temp.getRed();
// data[x * y * 3 + 1] = temp.getGreen();
// data[x * y * 3 + 2] = temp.getBlue();
}
}
} catch (IOException ex) {
ex.printStackTrace();
hasTransparency = false;
data = BufferUtils.createByteBuffer(3);
data.put((byte)0);
data.put((byte)0);
data.put((byte)0);
}
data.flip();
//call if width != height so opengl figures out how to unpack it properly
if(width != height){
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}
//buffer the texture information
if(hasTransparency){
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
} else {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
}
glGenerateMipmap(GL_TEXTURE_2D);
//OPTIONAL free the original image data now that it's on the gpu
System.gc();
}
public void bind(){
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_pointer);
}
public void bind(int attrib_val){
glActiveTexture(GL_TEXTURE0 + attrib_val);
glBindTexture(GL_TEXTURE_2D, texture_pointer);
}
public boolean isTransparent(){
return hasTransparency;
}
}