You are on page 1of 4

#include <windows.

h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <stdio.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
GLuint loadBMP(const char *);
void texturas(void);
GLuint tex,imagen;
// Data read from the header of the BMP file
unsigned char header[54]; // Each BMP file begins by a 54-bytes header
unsigned int dataPos;
// Position in the file where the actual data begi
ns
unsigned int width, height;
unsigned int imageSize; // = width*height*3
// Actual RGB data
unsigned char * data;
unsigned char Colores[4][4][3] = {
{{64,0,0}, {128,0,0}, {192,0,0}, {255,0,0}}, // Rojos
{{0,64,0}, {0,128,0}, {0,192,0}, {0,255,0}}, // Verdes
{{0,0,64}, {0,0,128}, {0,0,192}, {0,0,255}}, // Azules
{{64,64,0}, {128,128,0}, {192,192,0}, {255,255,0}} // Amarillos
};
int width2=800;
int height2=800,m=0;
GLfloat plano_s[4] = {1, 0, 0, 0};
GLfloat plano_t[4] = {0, 1, 0, 0};
void init(void)
{
const float ar=(float) width2 / (float) height2;
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.7,0.9,0.0,0.9);
glClearDepth(0.9f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glViewport(0,0,width2,height2);

glMatrixMode(GL_PROJECTION);
glFrustum(-ar,ar,-1.0,1.0,2.0,100.0);
glMatrixMode(GL_MODELVIEW);
}
static void idle(void)
{
glutPostRedisplay();
}
static void display(void)
{
const double t = glutGet(GLUT_ELAPSED_TIME)/1500.0;
const double r = 90*t;
const double m = 0.2*t;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-4.5);
glClearColor(0.0,0.0,1.0,0.9f);
glEnable(GL_TEXTURE_2D);
//Rota el cubo
glRotatef(r,1.0f,1.0f,0.0f);
glBindTexture(GL_TEXTURE_2D, tex);
glBegin(GL_QUADS);
// Frente
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,

-1.0f, 1.0f);
-1.0f, 1.0f);
1.0f, 1.0f);
1.0f, 1.0f);

glEnd();
glBegin(GL_POLYGON);
// parte de Atras
glNormal3f( 0.0f, 0.0f,-1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f,
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f,

-1.0f, -1.0f);
1.0f, -1.0f);
1.0f, -1.0f);
-1.0f, -1.0f);

glEnd();
glBegin(GL_POLYGON);
// Arriba
glNormal3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,
glEnd();

1.0f,
1.0f,
1.0f,
1.0f,

-1.0f);
1.0f);
1.0f);
-1.0f);

glBegin(GL_POLYGON);
// Abajo
glNormal3f( 0.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f,
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f,

-1.0f,
-1.0f,
-1.0f,
-1.0f,

-1.0f);
-1.0f);
1.0f);
1.0f);

glEnd();
glBegin(GL_POLYGON);
// lado Derecho
glNormal3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(
glTexCoord2f(1.0f, 1.0f); glVertex3f(
glTexCoord2f(0.0f, 1.0f); glVertex3f(
glTexCoord2f(0.0f, 0.0f); glVertex3f(

1.0f,
1.0f,
1.0f,
1.0f,

-1.0f, -1.0f);
1.0f, -1.0f);
1.0f, 1.0f);
-1.0f, 1.0f);

glBegin(GL_POLYGON);
// Lado Izquierdo
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f,
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,
glEnd();
glFlush();

-1.0f, -1.0f);
-1.0f, 1.0f);
1.0f, 1.0f);
1.0f, -1.0f);

glEnd();

glutSwapBuffers();
}
void texturas(void)
{
glGenTextures(1,&tex);
glBindTexture(GL_TEXTURE_2D,tex);
loadBMP("C:/cubo.bmp");
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, width,height, 0, GL_RGB, GL_UNSIGNED_B
YTE, data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
GLuint loadBMP(const char *direc)
{
FILE * file = fopen(direc,"rb");
if (!file)
"); return 0;}

{printf("Image could not be opened\n

if ( fread(header, 1, 54, file)!=54 ){ // If not 54 bytes read : problem


printf("Not a correct BMP file\n");

return false;
}
if ( header[0]!='B' || header[1]!='M' ){
printf("Not a correct BMP file\n");
return 0;
}
// Read ints
dataPos
=
imageSize =
width
=
height
=
//
if
Green
if

from the byte array


*(int*)&(header[0x0A]);
*(int*)&(header[0x22]);
*(int*)&(header[0x12]);
*(int*)&(header[0x16]);

Some BMP files are misformatted, guess missing information


(imageSize==0)
imageSize=width*height*3; // 3 : one byte for each Red,
and Blue component
(dataPos==0)
dataPos=54; // The BMP header is done that way

// Create a buffer
data = new unsigned char [imageSize];
// Read the actual data from the file into the buffer
fread(data,1,imageSize,file);
//Everything is in memory now, the file can be closed
fclose(file);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("cubo texturas");
init();
tex=loadBMP("C:/cubo.bmp");
texturas();
glutDisplayFunc(display);
glutIdleFunc(idle);
glEnable(GL_DECAL);
glutMainLoop();
return 0;
}

You might also like