#include "stdafx.h" bool alterar_vista_de_cara; #define CARA_DESTINGUIDA 111 #define BUFSIZE 512 GLuint selectBuf[BUFSIZE]; GLfloat colors[][3] = { {0.0,0.0,0.0},{1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0} }; #define GL_PI 3.1415f 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; GLfloat ex = 0.0f; GLfloat ey = 0.0f; GLfloat ez = -120.0f; GLfloat delta = 0.01f; GLfloat deltaR = 0.01f; GLfloat pos_luz[4] = { 0., 25., 0, 1. }; GLfloat piso[4] = { 0. , 1., 0., 25 }; GLfloat MatrizSombra[16]; #define checkImageWidth 256 #define checkImageHeight 256 #define subImageWidth 64 #define subImageHeight 64 static GLuint texName[1]; static GLubyte checkImage[checkImageHeight][checkImageWidth][4]; static GLubyte subImage[subImageHeight][subImageWidth][4]; 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; } } 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 cuadrado_con_texura() { glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName[0]); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex2f(1., 1.); glTexCoord2f(0.0, 1.0); glVertex2f(-1., 1.); glTexCoord2f(1.0, 1.0); glVertex2f(-1., -1.); glTexCoord2f(1.0, 0.0); glVertex2f(1., -1.); glEnd(); glDisable(GL_TEXTURE_2D); } void cuadrado() { glBegin(GL_QUADS); glVertex2f(1., 1.); glVertex2f(-1., 1.); glVertex2f(-1., -1.); glVertex2f(1., -1.); glEnd(); } void colorcube1_sin_color() { /* cara 1 */ glPushMatrix(); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); /* cara 2 */ glPushMatrix(); glRotatef(90., 0., 1., 0.); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); /* cara 3 */ glPushMatrix(); glRotatef(180., 0., 1., 0.); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); /* cara 4 */ glPushMatrix(); glRotatef(-90., 0., 1., 0.); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); /* cara 5 */ glPushMatrix(); glRotatef(90., 0., 0., 1.); glRotatef(-90., 0., 1., 0.); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); /* cara 6 */ glPushMatrix(); glRotatef(-90., 0., 0., 1.); glRotatef(-90., 0., 1., 0.); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); } void colorcube1(void) { /* cara 1 */ glColor3fv(colors[1]); glPushMatrix(); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); /* cara 2 */ glColor3fv(colors[3]); glPushMatrix(); glRotatef(90., 0., 1., 0.); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); /* cara 3 */ glPushName(CARA_DESTINGUIDA); glPushMatrix(); glRotatef(180., 0., 1., 0.); glTranslatef(0., 0., 1.); if (alterar_vista_de_cara) cuadrado_con_texura(); else { glColor3fv(colors[2]); cuadrado(); } glPopMatrix(); glPopName(); /* cara 4 */ glColor3fv(colors[7]); glPushMatrix(); glRotatef(-90., 0., 1., 0.); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); /* cara 5 */ glColor3fv(colors[6]); glPushMatrix(); glRotatef(90., 0., 0., 1.); glRotatef(-90., 0., 1., 0.); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); /* cara 6 */ glColor3fv(colors[5]); glPushMatrix(); glRotatef(-90., 0., 0., 1.); glRotatef(-90., 0., 1., 0.); glTranslatef(0., 0., 1.); cuadrado(); glPopMatrix(); } 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 SetupRC() { alterar_vista_de_cara = true; // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f); makeCheckImages(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glGenTextures(1, 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); // 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 foco() { glPushMatrix(); glTranslatef(pos_luz[0]/*0.*/, pos_luz[1] /*25.*/, pos_luz[2] /*0.*/); glColor3f(1.f, 1.f, 0.); glutSolidSphere(1., 20, 20); glPopMatrix(); } #define NUMLIN 10 void lineas_piso() { glColor3f(1., 1., 1.); glBegin(GL_LINES); for (int i = 0; i < NUMLIN; i++) { glVertex3f(-1. + i * 2. / (NUMLIN - 1.), -1., 0); glVertex3f(-1. + i * 2. / (NUMLIN - 1.), 1., 0); glVertex3f(-1., 1. - i * 2. / (NUMLIN - 1.), 0); glVertex3f(1., 1. - i * 2. / (NUMLIN - 1.), 0); } glEnd(); } #define ALFA 0.5 #define ALFA1 0.75 void Piso() { glPushMatrix(); glTranslatef(0., -piso[3]/*-25.*/, 0.); glRotatef(90., 1., 0., 0.); glScalef(40., 40., 40.); glColor4f(0.8f, 0.8f, 0.8f, ALFA1); cuadrado(); glDisable(GL_DEPTH_TEST); lineas_piso(); if (bDepth) glEnable(GL_DEPTH_TEST); glPopMatrix(); } void Objetos() { glPushMatrix(); glScalef(10., 10., 10.); colorcube1(); glPopMatrix(); } void Objetos_sin_color() { glPushMatrix(); glScalef(10., 10., 10.); colorcube1_sin_color();//colorcube1(); glPopMatrix(); } void SombradeMiMundo(GLfloat datosdeLuz[], GLfloat datosdePlano[]) { glColor4f(0.4, 0.4, 0.4, ALFA); glPushMatrix(); gltMakeShadowMatrix(datosdePlano, datosdeLuz, MatrizSombra); glMultMatrixf(MatrizSombra); Objetos_sin_color(); glPopMatrix(); } void Stencil_config() { // turning off writing to the color buffer and depth buffer so we only // write to stencil buffer glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glDepthMask(GL_FALSE); //// enable stencil buffer //glEnable(GL_STENCIL_TEST); // write a one to the stencil buffer everywhere we are about to draw glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF); // this is to always pass a one to the stencil buffer where we draw glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); // render the plane which the shadow will be on // color and depth buffer are disabled, only the stencil buffer // will be modified //DrawFloor(0,0,0); Piso(); // turn the color and depth buffers back on glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDepthMask(GL_TRUE); // until stencil test is diabled, only write to areas where the // stencil buffer has a one. This is to draw the shadow only on // the floor. glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF); // don't modify the contents of the stencil buffer glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); } // Called to draw scene void RenderScene(GLint mode) { glMatrixMode(GL_PROJECTION); if (mode == GL_RENDER) glLoadIdentity(); glInitNames(); //inicializar pila de nombres para seleccion //glOrtho (-100.0, 100.0, -100, 100, -270.0, 270.0); //glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); gluPerspective(60.0, 1.0, 1.5, 500.0); glMatrixMode(GL_MODELVIEW); // Reset coordinate system glLoadIdentity(); gluLookAt(ex, ey, ez, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // Clear the window and the depth buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // Turn culling on if flag is set if (bCull) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); // Enable depth testing if flag is set if (bDepth) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); // Draw the back side as a wireframe only, if flag is set if (bOutline)glPolygonMode(GL_BACK, GL_LINE); else glPolygonMode(GL_BACK, GL_FILL); // Save matrix state and do the rotation glPushMatrix(); glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f); /*mundo virtual REFLEJADO*/ // enable stencil buffer glEnable(GL_STENCIL_TEST); Stencil_config(); glFrontFace(GL_CCW); glPushMatrix(); glTranslatef(0.0f, -piso[3]/*ALTURA_PISO*/, 0.0f); glScalef(1.0f, -1.0f, 1.0f); glTranslatef(0.0f, piso[3]/*- ALTURA_PISO*/, 0.0f); /*foco*/ foco(); /*cubo*/ Objetos(); glPopMatrix(); glFrontFace(GL_CW); // enable stencil buffer glDisable(GL_STENCIL_TEST); /*FIN: mundo REFLEJADO*/ /*mundo virtual*/ /*foco*/ foco(); /*piso*/ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Piso(); glDisable(GL_BLEND); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // enable stencil buffer glEnable(GL_STENCIL_TEST); Stencil_config(); glDisable(GL_DEPTH_TEST); SombradeMiMundo(pos_luz, piso); if (bDepth) glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); glDisable(GL_STENCIL_TEST); /*cubo*/ Objetos(); glPopMatrix(); // Flush drawing commands glFlush(); //glutSwapBuffers(); } void display(void) //<- envoltura a RenderScene() para seleccion { glClear(GL_COLOR_BUFFER_BIT); RenderScene(GL_RENDER); } // Called by GLUT library when the window has changed size void ChangeSize(GLsizei w, GLsizei h) { // Set Viewport to window dimensions glViewport(0, 0, (GLsizei)w, (GLsizei)h); //glMatrixMode(GL_PROJECTION); //glLoadIdentity(); ////glOrtho (-100.0, 100.0, -100, 100, -270.0, 270.0); ////glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); //gluPerspective(60.0, 1.0, 1.5, 500.0); //glMatrixMode (GL_MODELVIEW); } void SpecialKeys(int key, int x, int y) { GLfloat dx, dz; if (key == GLUT_KEY_UP) {//increase distance from camera to origin ex *= (1.0f + deltaR); ey *= (1.0f + deltaR); ez *= (1.0f + deltaR); } if (key == GLUT_KEY_DOWN) {//reduce distance from camera to origin (close up) ex *= (1.0f - deltaR); ey *= (1.0f - deltaR); ez *= (1.0f - deltaR); } if (key == GLUT_KEY_LEFT) //Rotate camera around origin in Oxz plane { dx = -ez; dz = ex; GLfloat s = sqrtf(ex*ex + ey * ey + ez * ez); ex += delta * dx; ez += delta * dz; GLfloat s1 = sqrtf(ex*ex + ey * ey + ez * ez) / s; ex /= s1; ey /= s1; ey /= s1; } if (key == GLUT_KEY_RIGHT) //Rotate camera around origin in Oxz plane { dx = -ez; dz = ex; GLfloat s = sqrtf(ex*ex + ey * ey + ez * ez); ex -= delta * dx; ez -= delta * dz; GLfloat s1 = sqrtf(ex*ex + ey * ey + ez * ez) / s; ex /= s1; ey /= s1; ey /= s1; } if (key == GLUT_KEY_F1) bCull = !bCull; if (key == GLUT_KEY_F2)bDepth = !bDepth; if (key == GLUT_KEY_F3)bOutline = !bOutline; if (key == GLUT_KEY_F4) { if (shademode == GL_FLAT) { shademode = GL_SMOOTH; } else { if (shademode == GL_SMOOTH) { shademode = GL_FLAT; } }; glShadeModel(shademode); } /*control de altura del foco*/ if (key == GLUT_KEY_F7) pos_luz[1] *= (1. + delta); if (key == GLUT_KEY_F8) pos_luz[1] *= (1. - delta); /*control de altura de la camara*/ if (key == GLUT_KEY_F5) ey += 15.*delta; if (key == GLUT_KEY_F6) ey -= 15.*delta; // Refresh the Window glutPostRedisplay(); // Refresh the Window glutPostRedisplay(); } void anallizename(int name) { int i; if (name == CARA_DESTINGUIDA) { alterar_vista_de_cara = !alterar_vista_de_cara; } glutPostRedisplay(); } void processHits(GLint hits, GLuint buffer[]) { unsigned int i, j; GLuint names, *ptr; ptr = (GLuint *)buffer; for (i = 0; i < hits; i++) { /* for each hit */ names = *ptr; ptr += 3; for (j = 0; j < names; j++) /* for each name */ anallizename(*ptr++); } } /*seleccionar una cara del cubo*/ void pickCara_del_Cubo(int button, int state, int x, int y) { GLint hits; GLint viewport[4]; if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN) return; glGetIntegerv(GL_VIEWPORT, viewport); glSelectBuffer(BUFSIZE, selectBuf); (void)glRenderMode(GL_SELECT); glInitNames(); glPushName(0); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); /* create 5x5 pixel picking region near cursor location */ gluPickMatrix((GLdouble)x, (GLdouble)(viewport[3] - y), 5.0, 5.0, viewport); /*inicio: restaurar la matrix de proyeccion*/ RenderScene(GL_SELECT); glMatrixMode(GL_PROJECTION); glPopMatrix(); /*FIN restaurar la matrix de proyeccion*/ glMatrixMode(GL_MODELVIEW); hits = glRenderMode(GL_RENDER); processHits(hits, selectBuf); glutPostRedisplay(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(/*GLUT_DOUBLE*/GLUT_SINGLE | GLUT_RGB | GLUT_STENCIL); glutInitWindowSize(200, 200); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutReshapeFunc(ChangeSize); glutSpecialFunc(SpecialKeys); glutMouseFunc(pickCara_del_Cubo); SetupRC(); glutMainLoop(); return 0; } //#include "stdafx.h" // //GLfloat colors[][3] = { {0.0,0.0,0.0},{1.0,0.0,0.0}, //{1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, //{1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0} }; // //#define GL_PI 3.1415f // //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; // //GLfloat ex = 0.0f; //GLfloat ey = 0.0f; //GLfloat ez = -120.0f; //GLfloat delta = 0.01f; //GLfloat deltaR = 0.01f; // //GLfloat pos_luz[4] = { 0., 25., 0, 1. }; //GLfloat piso[4] = { 0. , 1., 0., /*-25.*/25 }; //GLfloat MatrizSombra[16]; // //void cuadrado() { // glBegin(GL_QUADS); // glVertex2f(1., 1.); // glVertex2f(-1., 1.); // glVertex2f(-1., -1.); // glVertex2f(1., -1.); // glEnd(); // //} // //void colorcube1_sin_color() { // /* cara 1 */ // // glPushMatrix(); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); // // /* cara 2 */ // // glPushMatrix(); // glRotatef(90., 0., 1., 0.); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); // // /* cara 3 */ // // glPushMatrix(); // glRotatef(180., 0., 1., 0.); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); // // /* cara 4 */ // // glPushMatrix(); // glRotatef(-90., 0., 1., 0.); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); // // // /* cara 5 */ // // glPushMatrix(); // glRotatef(90., 0., 0., 1.); // glRotatef(-90., 0., 1., 0.); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); // // /* cara 6 */ // // glPushMatrix(); // glRotatef(-90., 0., 0., 1.); // glRotatef(-90., 0., 1., 0.); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); //} // //void colorcube1(void) //{ // // /* cara 1 */ // glColor3fv(colors[1]); // glPushMatrix(); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); // // /* cara 2 */ // glColor3fv(colors[3]); // glPushMatrix(); // glRotatef(90., 0., 1., 0.); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); // // /* cara 3 */ // glColor3fv(colors[2]); // glPushMatrix(); // glRotatef(180., 0., 1., 0.); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); // // /* cara 4 */ // glColor3fv(colors[7]); // glPushMatrix(); // glRotatef(-90., 0., 1., 0.); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); // // // /* cara 5 */ // glColor3fv(colors[6]); // glPushMatrix(); // glRotatef(90., 0., 0., 1.); // glRotatef(-90., 0., 1., 0.); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); // // /* cara 6 */ // glColor3fv(colors[5]); // glPushMatrix(); // glRotatef(-90., 0., 0., 1.); // glRotatef(-90., 0., 1., 0.); // glTranslatef(0., 0., 1.); // cuadrado(); // glPopMatrix(); //} // // // // //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 SetupRC() //{ // // Black background // glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // // //// Set drawing color to green // //glColor3f(0.0f, 1.0f, 0.0f); // // // 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 foco() //{ // glPushMatrix(); // glTranslatef(pos_luz[0]/*0.*/, pos_luz[1] /*25.*/, pos_luz[2] /*0.*/); // glColor3f(1.f, 1.f, 0.); // glutSolidSphere(1., 20, 20); // glPopMatrix(); //} // //#define NUMLIN 10 //void lineas_piso() { // glColor3f(1., 1., 1.); // glBegin(GL_LINES); // for (int i = 0; i < NUMLIN; i++) // { // glVertex3f(-1. + i * 2. / (NUMLIN - 1.), -1., 0); // glVertex3f(-1. + i * 2. / (NUMLIN - 1.), 1., 0); // // glVertex3f(-1., 1. - i * 2. / (NUMLIN - 1.), 0); // glVertex3f(1., 1. - i * 2. / (NUMLIN - 1.), 0); // } // glEnd(); //} // //#define ALFA 0.5 //#define ALFA1 0.75 //void Piso() { // glPushMatrix(); // glTranslatef(0., -piso[3]/*-25.*/, 0.); // glRotatef(90., 1., 0., 0.); // glScalef(40., 40., 40.); // glColor4f(0.8f, 0.8f, 0.8f, ALFA1); // cuadrado(); // glDisable(GL_DEPTH_TEST); // lineas_piso(); // if (bDepth) glEnable(GL_DEPTH_TEST); // glPopMatrix(); //} // //void Objetos() //{ // glPushMatrix(); // glScalef(10., 10., 10.); // colorcube1(); // glPopMatrix(); //} // //void Objetos_sin_color() //{ // glPushMatrix(); // glScalef(10., 10., 10.); // colorcube1_sin_color();//colorcube1(); // glPopMatrix(); //} // // //void SombradeMiMundo(GLfloat datosdeLuz[], GLfloat datosdePlano[]) { // // glColor4f(0.4, 0.4, 0.4, ALFA); // glPushMatrix(); // gltMakeShadowMatrix(datosdePlano, datosdeLuz, MatrizSombra); // glMultMatrixf(MatrizSombra); // Objetos_sin_color(); // glPopMatrix(); //} // //void Stencil_config() //{ // // turning off writing to the color buffer and depth buffer so we only // // write to stencil buffer // glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // glDepthMask(GL_FALSE); // // //// enable stencil buffer // //glEnable(GL_STENCIL_TEST); // // // write a one to the stencil buffer everywhere we are about to draw // glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF); // // // this is to always pass a one to the stencil buffer where we draw // glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); // // // render the plane which the shadow will be on // // color and depth buffer are disabled, only the stencil buffer // // will be modified // //DrawFloor(0,0,0); // Piso(); // // // turn the color and depth buffers back on // glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // glDepthMask(GL_TRUE); // // // until stencil test is diabled, only write to areas where the // // stencil buffer has a one. This is to draw the shadow only on // // the floor. // glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF); // // // don't modify the contents of the stencil buffer // glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // //} //// Called to draw scene // //void RenderScene(void) //{ // // Reset coordinate system // // glLoadIdentity(); // gluLookAt(ex, ey, ez, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // // GLfloat x, y, angle; // Storage for coordinates and angles // int iPivot = 1; // Used to flag alternating colors // // // Clear the window and the depth buffer // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // // // Turn culling on if flag is set // if (bCull) glEnable(GL_CULL_FACE); // else glDisable(GL_CULL_FACE); // // // Enable depth testing if flag is set // if (bDepth) glEnable(GL_DEPTH_TEST); // else glDisable(GL_DEPTH_TEST); // // // Draw the back side as a wireframe only, if flag is set // if (bOutline)glPolygonMode(GL_BACK, GL_LINE); // else glPolygonMode(GL_BACK, GL_FILL); // // // Save matrix state and do the rotation // glPushMatrix(); // glRotatef(xRot, 1.0f, 0.0f, 0.0f); // glRotatef(yRot, 0.0f, 1.0f, 0.0f); // // /*mundo REFLEJADO*/ // // enable stencil buffer // glEnable(GL_STENCIL_TEST); // Stencil_config(); // glFrontFace(GL_CCW); // // // glPushMatrix(); // glTranslatef(0.0f, -piso[3]/*ALTURA_PISO*/, 0.0f); // glScalef(1.0f, -1.0f, 1.0f); // glTranslatef(0.0f, piso[3]/*- ALTURA_PISO*/, 0.0f); // /*foco*/ // foco(); // /*cubo*/ // Objetos(); // glPopMatrix(); // // glFrontFace(GL_CW); // // enable stencil buffer // glDisable(GL_STENCIL_TEST); // /*FIN: mundo REFLEJADO*/ // // /*mundo virtual*/ // // /*foco*/ // foco(); // /*piso*/ // glEnable(GL_BLEND); // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Piso(); // glDisable(GL_BLEND); // // glEnable(GL_BLEND); // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // // // enable stencil buffer // glEnable(GL_STENCIL_TEST); // Stencil_config(); // glDisable(GL_DEPTH_TEST); // SombradeMiMundo(/*GLfloat datosdeLuz[]*/pos_luz, /*GLfloat datosdePlano[]*/piso); // if (bDepth) glEnable(GL_DEPTH_TEST); // glDisable(GL_BLEND); // glDisable(GL_STENCIL_TEST); // // /*cubo*/ // Objetos(); // // glPopMatrix(); // // // Flush drawing commands // glFlush(); // //glutSwapBuffers(); //} // //// Called by GLUT library when the window has changed size // //void ChangeSize(GLsizei w, GLsizei h) //{ // Set Viewport to window dimensions // glViewport(0, 0, (GLsizei)w, (GLsizei)h); // // glMatrixMode(GL_PROJECTION); // glLoadIdentity(); // // //glOrtho (-100.0, 100.0, -100, 100, -270.0, 270.0); // //glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); // gluPerspective(60.0, 1.0, 1.5, 500.0); // glMatrixMode(GL_MODELVIEW); //} // // // //void SpecialKeys(int key, int x, int y) //{ // GLfloat dx, dz; // // // if (key == GLUT_KEY_UP) // {//increase distance from camera to origin // ex *= (1.0f + deltaR); ey *= (1.0f + deltaR); ez *= (1.0f + deltaR); // } // // if (key == GLUT_KEY_DOWN) // {//reduce distance from camera to origin (close up) // ex *= (1.0f - deltaR); ey *= (1.0f - deltaR); ez *= (1.0f - deltaR); // } // // if (key == GLUT_KEY_LEFT) // //Rotate camera around origin in Oxz plane // { // dx = -ez; dz = ex; // GLfloat s = sqrtf(ex*ex + ey * ey + ez * ez); // ex += delta * dx; ez += delta * dz; // GLfloat s1 = sqrtf(ex*ex + ey * ey + ez * ez) / s; // ex /= s1; ey /= s1; ey /= s1; // } // // if (key == GLUT_KEY_RIGHT) // //Rotate camera around origin in Oxz plane // { // dx = -ez; dz = ex; // GLfloat s = sqrtf(ex*ex + ey * ey + ez * ez); // ex -= delta * dx; ez -= delta * dz; // GLfloat s1 = sqrtf(ex*ex + ey * ey + ez * ez) / s; // ex /= s1; ey /= s1; ey /= s1; // } // // // if (key == GLUT_KEY_F1) bCull = !bCull; // if (key == GLUT_KEY_F2)bDepth = !bDepth; // if (key == GLUT_KEY_F3)bOutline = !bOutline; // if (key == GLUT_KEY_F4) // { // if (shademode == GL_FLAT) { shademode = GL_SMOOTH; } // else { if (shademode == GL_SMOOTH) { shademode = GL_FLAT; } }; // glShadeModel(shademode); // } // // /*control de altura del foco*/ // if (key == GLUT_KEY_F7) pos_luz[1] *= (1. + delta); // if (key == GLUT_KEY_F8) pos_luz[1] *= (1. - delta); // // /*control de altura de la camara*/ // if (key == GLUT_KEY_F5) ey += 15.*delta; // if (key == GLUT_KEY_F6) ey -= 15.*delta; // // Refresh the Window // glutPostRedisplay(); // // // // Refresh the Window // glutPostRedisplay(); //} // // ///////////////////////////////////////////////////////////// // // // //int main(int argc, char** argv) //{ // glutInit(&argc, argv); // glutInitDisplayMode(/*GLUT_DOUBLE*/GLUT_SINGLE | GLUT_RGB | GLUT_STENCIL); // glutInitWindowSize(200, 200); // glutInitWindowPosition(100, 100); // glutCreateWindow(argv[0]); // glutDisplayFunc(RenderScene); // glutReshapeFunc(ChangeSize); // glutSpecialFunc(SpecialKeys); // // SetupRC(); // glutMainLoop(); // return 0; //} //