#include "stdafx.h" #define GL_PI 3.1415f //para SELECCION: #define CARA3 10 //nombre para seleccion de 3a cara #define BUFSIZE 512 //tamano de buffer para seleccion GLuint selectBuf[BUFSIZE]; //buffer de seleccion GLfloat xRot = 0.45f; GLfloat yRot = 0.35f; GLboolean bCull = glIsEnabled(GL_CULL_FACE); GLboolean bDepth = glIsEnabled(GL_DEPTH_TEST); GLboolean bOutline = (GLboolean)true; GLenum shademode = GL_FLAT; #define DELTATRANS 0.05f GLfloat ex = 0.0f; GLfloat ey = 75.0f; GLfloat ez = -120.0f; GLfloat delta = 0.01f; GLfloat deltaR = 0.01f; GLfloat deltatrans = DELTATRANS; #define CX 0.0f #define CZ 0.0f //para SELECCION de CARA 3: GLfloat initcolorcara3[3] = { 1.f, 0.f, 0.f }; //color inicial (rojo) GLfloat color_de_cara3[3]; //color corriente de CARA 3 GLfloat iniLuz[4] = { 0.f, 100.f, 0.f, 1.f }, Luz[4], MatSombra[16], Piso[] = { 0.f, 1.f, 0.f, 150 }, ALFA = 0.75f; #define CY Piso[3] GLfloat cx = CX, cy = CY, cz = CZ; #define checkImageWidth 256 #define checkImageHeight 256 #define subImageWidth 64 #define subImageHeight 64 static GLubyte checkImage[checkImageHeight][checkImageWidth][4]; static GLubyte otherImage[checkImageHeight][checkImageWidth][4]; static GLubyte subImage[subImageHeight][subImageWidth][4]; static GLuint texName[2]; void makeCheckImages(void) { int i, j, c; for (i = 0; i < checkImageHeight; i++) { for (j = 0; j < checkImageWidth; j++) { c = ((((i & 0x8) == 0) ^ ((j & 0x8)) == 0)) * 255; checkImage[i][j][0] = (GLubyte)c; checkImage[i][j][1] = (GLubyte)c; checkImage[i][j][2] = (GLubyte)c; checkImage[i][j][3] = (GLubyte)255; c = ((((i & 0x10) == 0) ^ ((j & 0x10)) == 0)) * 255; otherImage[i][j][0] = (GLubyte)0; otherImage[i][j][1] = (GLubyte)0; otherImage[i][j][2] = (GLubyte)c; otherImage[i][j][3] = (GLubyte)255; } } for (i = 0; i < subImageHeight; i++) { for (j = 0; j < subImageWidth; j++) { c = ((((i & 0x4) == 0) ^ ((j & 0x4)) == 0)) * 255; subImage[i][j][0] = (GLubyte)c; subImage[i][j][1] = (GLubyte)0; subImage[i][j][2] = (GLubyte)0; subImage[i][j][3] = (GLubyte)255; } } } void initColors() { for (int i = 0; i<3; i++){ color_de_cara3[i] = initcolorcara3[i]; } } void gltMakeShadowMatrix(GLfloat vPlaneEquation[], GLfloat vLightPos[], GLfloat destMat[]) { GLfloat dot; // Dot product of plane and light position dot = vPlaneEquation[0] * vLightPos[0] + vPlaneEquation[1] * vLightPos[1] + vPlaneEquation[2] * vLightPos[2] + vPlaneEquation[3] * vLightPos[3]; // Now do the projection // First column destMat[0] = dot - vLightPos[0] * vPlaneEquation[0]; destMat[4] = 0.0f - vLightPos[0] * vPlaneEquation[1]; destMat[8] = 0.0f - vLightPos[0] * vPlaneEquation[2]; destMat[12] = 0.0f - vLightPos[0] * vPlaneEquation[3]; // Second column destMat[1] = 0.0f - vLightPos[1] * vPlaneEquation[0]; destMat[5] = dot - vLightPos[1] * vPlaneEquation[1]; destMat[9] = 0.0f - vLightPos[1] * vPlaneEquation[2]; destMat[13] = 0.0f - vLightPos[1] * vPlaneEquation[3]; // Third Column destMat[2] = 0.0f - vLightPos[2] * vPlaneEquation[0]; destMat[6] = 0.0f - vLightPos[2] * vPlaneEquation[1]; destMat[10] = dot - vLightPos[2] * vPlaneEquation[2]; destMat[14] = 0.0f - vLightPos[2] * vPlaneEquation[3]; // Fourth Column destMat[3] = 0.0f - vLightPos[3] * vPlaneEquation[0]; destMat[7] = 0.0f - vLightPos[3] * vPlaneEquation[1]; destMat[11] = 0.0f - vLightPos[3] * vPlaneEquation[2]; destMat[15] = dot - vLightPos[3] * vPlaneEquation[3]; } void luz(){ glColor3f(1.0f, 1.0f, 0.0f); glPushMatrix(); glTranslatef(Luz[0], Luz[1], Luz[2]); glScalef(5.f, 5.f, 5.f); glutSolidSphere(1., 20, 20); glPopMatrix(); } void SetupRC() { initColors(); Luz[0] = iniLuz[0]; Luz[1] = iniLuz[1]; Luz[2] = iniLuz[2]; Luz[3] = iniLuz[3]; // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f); /*generar buffers de texturas*/ makeCheckImages(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glGenTextures(2, texName); glBindTexture(GL_TEXTURE_2D, texName[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage); glTexSubImage2D(GL_TEXTURE_2D, 0, 48, 170, subImageWidth, subImageHeight, GL_RGBA, GL_UNSIGNED_BYTE, subImage); glTexSubImage2D(GL_TEXTURE_2D, 0, 48, 48, subImageWidth, subImageHeight, GL_RGBA, GL_UNSIGNED_BYTE, subImage); glTexSubImage2D(GL_TEXTURE_2D, 0, 170, 48, subImageWidth, subImageHeight, GL_RGBA, GL_UNSIGNED_BYTE, subImage); glTexSubImage2D(GL_TEXTURE_2D, 0, 170, 170, subImageWidth, subImageHeight, GL_RGBA, GL_UNSIGNED_BYTE, subImage); glBindTexture(GL_TEXTURE_2D, texName[1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, otherImage); /*FIN generacion buff textures*/ // Set color shading model to flat glShadeModel(shademode); // Clockwise-wound polygons are front facing; this is reversed // because we are using triangle fans glFrontFace(GL_CW); } void cuadro_sin_color(){ glBegin(GL_QUADS); glVertex3f(1.0f, 1.0f, .0f); glVertex3f(1.0f, -1.0f, .0f); glVertex3f(-1.0f, -1.0f, .0f); glVertex3f(-1.0f, 1.0f, .0f); glEnd(); } void cuadro_con_textura_1(){ glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName[0]); glBegin(GL_QUADS); glTexCoord2f(1.0, 1.0); glVertex3f(1.0f, 1.0f, .0f); //glVertex3f( 400.0f, -150.0f, -700.0f); //glVertex3f(-2.0, -1.0, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f(1.0f, -1.0f, .0f);//glVertex3f(-400.0f, -150.0f, -700.0f); //glVertex3f(-2.0, 1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, -1.0f, .0f);//glVertex3f(-400.0f, -150.0f, 200.0f); //glVertex3f(0.0, 1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, 1.0f, .0f);//glVertex3f(400.0f, -150.0f, 200.0f);//glVertex3f(0.0, -1.0, 0.0); glEnd(); glDisable(GL_TEXTURE_2D); } void cuadro_con_textura_2(){ glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName[1]); glBegin(GL_QUADS); glTexCoord2f(0.2, 1.); glVertex3f(1.0f, 1.0f, .0f); //glVertex3f( 400.0f, -150.0f, -700.0f); //glVertex3f(-2.0, -1.0, 0.0); glTexCoord2f(.8, 1.); glVertex3f(1.0f, -1.0f, .0f);//glVertex3f(-400.0f, -150.0f, -700.0f); //glVertex3f(-2.0, 1.0, 0.0); glTexCoord2f(1.0, 0.); glVertex3f(-1.0f, -1.0f, .0f);//glVertex3f(-400.0f, -150.0f, 200.0f); //glVertex3f(0.0, 1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 1.0f, .0f);//glVertex3f(400.0f, -150.0f, 200.0f);//glVertex3f(0.0, -1.0, 0.0); glEnd(); glDisable(GL_TEXTURE_2D); } void lineas_en_piso_1(){ glBegin(GL_LINES); int L = 10; for (int i = 0; i