#include <Windows.h>
#include <GL\GL.h>
#include <GL\GLU.h>
#include <GL\glut.h>
#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;
#include <conio.h>
#define BITMAP_ID 0x4D42
GLuint nombres_texturas;
int angulo;
void init(void);
void redraw(void);
void reshape(int, int);
BITMAPINFOHEADER bitmapInfoHeader;
unsigned char* bitmapData;
unsigned char* LoadBitmapFile(char *filename, BITMAPINFOHEADER *bitmapInfoHeader)
{
FILE *filePtr; // Puntero a programa
BITMAPFILEHEADER bitmapFileHeader; // Bitmap file header
unsigned char *bitmapImage; // Bitmap image data
int imageIdx = 0; // Index de la imagen
unsigned char tempRGB;
// Abrimos el archivo en binary mode
filePtr = fopen(filename,"rb");
if(filePtr == NULL)
return NULL;
// Leemos el bitmap file header
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER),1,filePtr);
// Verificamos que sea un BItmap
if(bitmapFileHeader.bfType != BITMAP_ID)
{
fclose(filePtr);
return NULL;
}
// Leemos la información del bitmap header
fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr);
// Movemos el puntero al principio del bitmap
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
// Guardamos suficiente memoria para el archivo
bitmapImage=(unsigned char*) malloc(bitmapInfoHeader->biSizeImage);
// Verificamos la memoria
if(!bitmapImage)
{
free(bitmapImage);
fclose(filePtr);
return NULL;
}
fread(bitmapImage,1,bitmapInfoHeader->biSizeImage,filePtr);
if(bitmapImage == NULL)
{
fclose(filePtr);
return NULL;
}
// Cambiamos la imagen a RGB
for(imageIdx = 0; imageIdx<(int)bitmapInfoHeader->biSizeImage; imageIdx+=3)
{
tempRGB = bitmapImage[imageIdx];
bitmapImage[imageIdx]=bitmapImage[imageIdx+2];
bitmapImage[imageIdx + 2] = tempRGB;
}
// Cerramos el archivo y devolvemos la imagen
fclose(filePtr);
return bitmapImage;
}
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0); // Color fondo pantalla
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST); // Test de profundidad !IMPORTANTE
glShadeModel(GL_SMOOTH); // Modo sombreado de poligonos
glMatrixMode(GL_MODELVIEW);
gluLookAt(3,-3,3,0,0,0,0,1,0);
glEnable(GL_TEXTURE_2D);
glGenTextures(1,&nombres_texturas); // Genero el nombre de la textura
glBindTexture(GL_TEXTURE_2D, nombres_texturas); // Activamos la textura
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
bitmapData = LoadBitmapFile("agua.bmp", &bitmapInfoHeader);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, bitmapInfoHeader.biWidth,
bitmapInfoHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, bitmapData);
}
void animacion(void)
{
angulo = (angulo+1)%360;
Sleep(50);
glutPostRedisplay();
}
void redraw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
// Activo la textura
glRotatef(angulo,0,1,0);
glBindTexture(GL_TEXTURE_2D, nombres_texturas);
// Primera cara
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,0,1);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1,0,1);
glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0);
glEnd();
// Segunda cara
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1,0,1);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1,0,-1);
glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0);
glEnd();
// Tercera cara
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1,0,-1);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1,0,-1);
glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0);
glEnd();
// Cuarta cara
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,0,-1);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1,0,1);
glTexCoord2f(0.5f, 1.0f); glVertex3f(0,2,0);
glEnd();
// Quinta cara
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1,0,1);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1,0,-1);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1,0,-1);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1,0,1);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
void reshape( int anchura, int altura)
{
glViewport(0,0,(GLsizei) anchura, (GLsizei)altura);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0, (GLfloat) anchura/(GLfloat) altura, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
}
void keyboard(unsigned char tecla, int x, int y)
{
if(tecla==27) exit(0);
if(tecla=='a') glutIdleFunc(animacion);
if(tecla=='p') glutIdleFunc(NULL);
}
void main( int argc, char*argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(320, 240);
glutCreateWindow("Mapa de Bits");
init();
glutDisplayFunc(redraw);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutIdleFunc(animacion);
glutMainLoop();
}