229 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			229 lines
		
	
	
		
			8.8 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 electrosphere.renderer.texture;
 | |
| 
 | |
| import electrosphere.engine.Globals;
 | |
| import electrosphere.engine.Main;
 | |
| import electrosphere.renderer.OpenGLState;
 | |
| import electrosphere.util.FileUtils;
 | |
| 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 texturePointer;
 | |
|     int width;
 | |
|     int height;
 | |
|     boolean hasTransparency;
 | |
|     String path = "";
 | |
|     
 | |
|     
 | |
|     private Texture(){
 | |
|         
 | |
|     }
 | |
| 
 | |
|     public Texture(int pointer){
 | |
|         this.texturePointer = pointer;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Creates an in engine texture object from a java bufferedimage object
 | |
|      * @param bufferedImage The java bufferedimage object
 | |
|      */
 | |
|     public Texture(BufferedImage bufferedImage){
 | |
|         texturePointer = glGenTextures();
 | |
|         //bind the new texture
 | |
|         glBindTexture(GL_TEXTURE_2D, texturePointer);
 | |
|         //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;
 | |
|         BufferedImage image_data = bufferedImage;
 | |
|         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);
 | |
|         }
 | |
|         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.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);
 | |
|         glBindTexture(GL_TEXTURE_2D, 0);
 | |
|     }
 | |
| 
 | |
|     public Texture(String path){
 | |
|         this.path = path;
 | |
|         if(!Globals.HEADLESS){
 | |
|             //generate the texture object on gpu
 | |
|             texturePointer = glGenTextures();
 | |
|             //bind the new texture
 | |
|             glBindTexture(GL_TEXTURE_2D, texturePointer);
 | |
|             //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(FileUtils.getAssetFile(path));
 | |
|                 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(OpenGLState openGLState){
 | |
|         // openGLState.glActiveTexture(GL_TEXTURE0);
 | |
|         // openGLState.glBindTexture(GL_TEXTURE_2D, texturePointer);
 | |
|         openGLState.glBindTextureUnit(GL_TEXTURE0,texturePointer,GL_TEXTURE_2D);
 | |
|     }
 | |
|     
 | |
|     public void bind(OpenGLState openGLState, int attrib_val){
 | |
|         openGLState.glBindTextureUnit(GL_TEXTURE0 + attrib_val,texturePointer,GL_TEXTURE_2D);
 | |
|         // openGLState.glActiveTexture(GL_TEXTURE0 + attrib_val);
 | |
|         // openGLState.glBindTexture(GL_TEXTURE_2D, texturePointer);
 | |
|     }
 | |
|     
 | |
|     public boolean isTransparent(){
 | |
|         return hasTransparency;
 | |
|     }
 | |
|     
 | |
|     public String getPath(){
 | |
|         return path;
 | |
|     }
 | |
|     
 | |
|     public int getTexturePointer(){
 | |
|         return texturePointer;
 | |
|     }
 | |
| }
 |