Textura_Figura.java



import java.io.*;
/*
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.ByteOrder;
import com.sun.opengl.util.BufferUtil;
import java.awt.image.*;
import javax.imageio.*;
import javax.media.opengl.*;
import javax.media.opengl.glu.*;
import com.sun.opengl.util.*; // GLUT
import java.awt.event.*;
import javax.swing.*;
import com.sun.opengl.util.*; 
import javax.media.opengl.*;
*/


 import javax.media.opengl.GL;
 import javax.media.opengl.GLEventListener;
 import javax.media.opengl.GLAutoDrawable;
 import javax.media.opengl.glu.GLU;
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
 
 public class Textura_Figura implements GLEventListener {
    private float rotateT = 0.0f;
    private static final GLU glu = new GLU();
    
    String[] NombreDeTexturas = {"Cafe.png", "Verde.png", "Rojo.png", "Azul.png"};
    int NTexturas = NombreDeTexturas.length;
    int[] ID = new int[NTexturas];				// IDs DE LAS TEXTURAS PARA OpenGL
 
    public void display(GLAutoDrawable gLDrawable) {
        final GL gl = gLDrawable.getGL();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT);
        gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();
        gl.glTranslatef(0.0f, 0.0f, -5.0f);
 
        gl.glRotatef(rotateT, 1.0f, 0.0f, 0.0f);
        gl.glRotatef(rotateT, 0.0f, 1.0f, 0.0f);
        gl.glRotatef(rotateT, 0.0f, 0.0f, 1.0f);
        gl.glRotatef(rotateT, 0.0f, 1.0f, 0.0f);

	  gl.glBindTexture( GL.GL_TEXTURE_2D, ID[0] );			//IMAGEN DE MURO
        gl.glBegin(GL.GL_TRIANGLES);
	        // Frente
	        gl.glTexCoord2f(0.5f, 0.5f); gl.glVertex3f(0.0f, 1.0f, 0.0f);
	        gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f);
	        gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f);
	  gl.glEnd(); 

//	gl.glTexParameterfv(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
//	gl.glTexParameterfv(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
	  gl.glBindTexture( GL.GL_TEXTURE_2D, ID[1] );			//IMAGEN DE MURO
        gl.glBegin(GL.GL_TRIANGLES);
	        // DER
	      gl.glTexCoord2f(0.5f, 0.5f); gl.glVertex3f(0.0f, 1.0f, 0.0f);
		gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f);
	      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(0.0f, -1.0f, -1.0f);
        gl.glEnd(); 

	  gl.glBindTexture( GL.GL_TEXTURE_2D, ID[2] );			//IMAGEN DE MURO
        gl.glBegin(GL.GL_TRIANGLES);
	        // IZQQ
	        gl.glTexCoord2f(0.5f, 0.5f); gl.glVertex3f(0.0f, 1.0f, 0.0f);
	        gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(0.0f, -1.0f, -1.0f);
	        gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f);
         gl.glEnd();
       
	  gl.glBindTexture( GL.GL_TEXTURE_2D, ID[3] );			//IMAGEN DE MURO
        gl.glBegin(GL.GL_TRIANGLES); 	 
	       // Fondo
	        gl.glTexCoord2f(0.5f, 0.5f); gl.glVertex3f(-1.0f, -1.0f, 1.0f);
	        gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f);
	        gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(0.0f, -1.0f, -1.0f);
        gl.glEnd();
 
        rotateT += 0.2f;
    }
 
    public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged) {
    }
 
    public void init(GLAutoDrawable gLDrawable) {
        final GL gl = gLDrawable.getGL();
	final GLU glu = new GLU();
        gl.glShadeModel(GL.GL_SMOOTH);
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl.glClearDepth(1.0f);
        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glDepthFunc(GL.GL_LEQUAL);
        gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);

		gl.glEnable( GL.GL_TEXTURE_2D );					// SE HABILITA EL MANEJO DE TEXTURAS	-paso 1-	
		gl.glLightModeli( GL.GL_LIGHT_MODEL_COLOR_CONTROL, GL.GL_SEPARATE_SPECULAR_COLOR );		// SE OTORGA LUMINOSIDAD A LA TEXTURA
		gl.glGenTextures( NTexturas, ID, 0 );				// SE CREA UN VECTOR DE TEXTURAS	-paso 2-
		TextureReader.Texture Textura = null;

		for( int N_ID = 0; N_ID < NTexturas; N_ID++ ) 			// SE LEEN LOS ARCHIVOS DE LAS IMAGENES
		{
			Textura = LeerArchivoDeTextura( NombreDeTexturas[N_ID] );
			gl.glBindTexture( GL.GL_TEXTURE_2D, ID[N_ID] );			// SE ACTIVA LA TEXTURA QUE SE UTILIZA ACTUALMENTE
			CargarTexturaAOpenGL( gl, glu, Textura, GL.GL_TEXTURE_2D );
			FijarParametrosDeTextura( gl );					// FIJAR PARA TEXTURA ACTUAL
		}
    }
 
    public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) {
        final GL gl = gLDrawable.getGL();
        if(height <= 0) {
            height = 1;
        }
        final float h = (float)width / (float)height;
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(50.0f, h, 1.0, 1000.0);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }


			// ==================================================
	// SE LEE LA TEXTURA DEL ARCHIVO EN FORMATOS COMO bmp, png, jpg, etc.
	TextureReader.Texture LeerArchivoDeTextura( String filename ) 
	{
		TextureReader.Texture texture = null;
		try { texture = TextureReader.readTexture( filename ); }
		catch( IOException e ) { System.out.println(e); e.printStackTrace(); throw new RuntimeException(e); }
		return texture;
	}

	// SE CARGAN LOS DATOS DE LA TEXTURA A openGL
	private void CargarTexturaAOpenGL(GL gl, GLU glu, TextureReader.Texture texture, int target ) 
	{
		if( true ) //if ( buildMipmaps )
		{
			// Create texture with all mipmap levels.
			glu.gluBuild2DMipmaps( target, GL.GL_RGB8, texture.getWidth(), texture.getHeight(), GL.GL_RGB, GL.GL_UNSIGNED_BYTE, texture.getPixels() );
		 // GL.GL_RGB8 -FORMATO INTERNO			GL.GL_RGB -FORMATO EXTERNO DESDE LA IMAGEN		 // texture.getPixels() -DATOS DE LA IMAGEN
		}
		else
		{ gl.glTexImage2D( target,  0, GL.GL_RGBA, texture.getWidth(), texture.getHeight(), 0,  GL.GL_RGB, GL.GL_UNSIGNED_BYTE, texture.getPixels() ); }
	}
	private void FijarParametrosDeTextura( GL gl )
	{
		// if( enableHardwareAcceleratedMipmaps )
		if( false ) { gl.glTexParameterf( GL.GL_TEXTURE_2D, GL.GL_GENERATE_MIPMAP, GL.GL_TRUE ); }

		// MAPA DE LA TEXTURA
		gl.glTexParameteri( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST );
		if ( true ) //if( enableMipmapping )
			{ gl.glTexParameteri( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST_MIPMAP_NEAREST ); }
		else
			{ gl.glTexParameteri( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST ); }

		gl.glTexParameterf( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT );
		gl.glTexParameterf( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT );

		// SE HABILITA anisotropic 
		if( gl.isExtensionAvailable("GL_EXT_texture_filter_anisotropic") ) 
		{
			float max[] = new float[1];
			gl.glGetFloatv( GL.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, max, 0 );
			System.out.println("GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = "+max[0]); //ddd
			gl.glTexParameterf( GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAX_ANISOTROPY_EXT, max[0] );
		}
	}

  }