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] );
}
}
}