package lwjglvideorenderer.opengl.lwjgl.media;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
/**
*
* @author Christopher Probst
*/
public class PBOTexture {
public static final int LITTLE_PIXEL_FORMAT = GL12.GL_BGRA;
public static final int BIG_PIXEL_FORMAT = GL11.GL_RGBA;
public static final int NATIVE_PIXEL_FORMAT = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN
? LITTLE_PIXEL_FORMAT : BIG_PIXEL_FORMAT;
private final int textureID;
private volatile int pixelFormet = NATIVE_PIXEL_FORMAT;
private int width = -1, height = -1;
public PBOTexture() {
IntBuffer buf = BufferUtils.createIntBuffer(1);
GL11.glGenTextures(buf);
buf.rewind();
textureID = buf.get();
}
public float getRatio() {
if (getWidth() == 0) {
return 0;
}
return getHeight() / (float) getWidth();
}
public int getHeight() {
return height;
}
public int getWidth() {
return width;
}
public int getPixelFormet() {
return pixelFormet;
}
public void setPixelFormet(int pixelFormet) {
this.pixelFormet = pixelFormet;
}
public void updateTexture(int x, int y, int w, int h, IntBuffer data) {
GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, x, y, w, h,
getPixelFormet(), GL11.GL_UNSIGNED_BYTE, data);
}
public void updateTexture(int x, int y, int w, int h, ByteBuffer data) {
GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, x, y, w, h,
getPixelFormet(), GL11.GL_UNSIGNED_BYTE, data);
}
public void updateTexture(int x, int y, int w, int h, long pixelBufferOffset) {
GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, x, y, w, h,
getPixelFormet(), GL11.GL_UNSIGNED_BYTE, pixelBufferOffset);
}
public void loadImage(BufferedImage image) {
DataBufferInt ints = (DataBufferInt)image.getData().getDataBuffer();
loadTexture(image.getWidth(), image.getHeight(), IntBuffer.wrap(ints.getData()));
}
public void loadTexture(int width, int height, IntBuffer data) {
this.width = width;
this.height = height;
//Use specific filters
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
//Set image data
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height,
0, getPixelFormet(), GL11.GL_UNSIGNED_BYTE, data);
}
public void loadTexture(int width, int height, ByteBuffer data) {
this.width = width;
this.height = height;
//Use specific filters
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
//Set image data
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height,
0, getPixelFormet(), GL11.GL_UNSIGNED_BYTE, data);
}
public void loadTexture(int width, int height, long pixelBufferOffset) {
this.width = width;
this.height = height;
//Use specific filters
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
//Set image data
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height,
0, getPixelFormet(), GL11.GL_UNSIGNED_BYTE, pixelBufferOffset);
}
/**
* Destroys this Texture, reclaiming all resources
*/
public void destroy() {
IntBuffer scratch = BufferUtils.createIntBuffer(1);
scratch.put(0, textureID);
GL11.glDeleteTextures(scratch);
}
/**
* @return Texture ID for this image
*/
public int getTextureID() {
return textureID;
}
/**
* Binds this image
*/
public void bind() {
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
}
public void unbind() {
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
}