void igvInterfaz::crear_mundo(void) { /* Crear la escena */ cout << "Creando escena principal..." << endl; escena = new Escena(); cout << "\nCreando escena secundaria..." << endl; escena_secundaria = new Escena(); cout << "--------------------------------------\nMuseo creado correctamente" << endl; /* Crear cámaras */ float v[] = {5,1,2}; float v2[] = {5,1,1}; interfaz.camara.set(IGV_PERSPECTIVA, igvPunto3D(v2[0],v2[1],v2[2]),igvPunto3D(v[0],v[1],v[2]),igvPunto3D(0,1.0,0), 45, 1.78, 0.001, 200); interfaz.camara_secundaria.set(IGV_PARALELA, igvPunto3D(1,1,5),igvPunto3D(1,1,1),igvPunto3D(0,1.0,0), 2*-0.8, 2*0.8, 2*-0.45, 2*0.45, -3, 200); /* Calculo el ángulo de visión */ float vector[] = {v[0]-v2[0], v[1]-v2[1], v[2]-v2[2]}; float prodesc = vector[0]*-1 + vector[1]*0 + vector[2]*0; float modulos = sqrt(vector[0]*vector[0] + vector[1]*vector[1] + vector[2]*vector[2]) * 1; float coseno = prodesc / modulos; angulo_vision = - acos(coseno) * 180/PI; glutSetCursor(GLUT_CURSOR_NONE); vsync = true; setVSync(vsync); }
void igvInterfaz::crear_mundo(void) { // crear cámaras interfaz.camara.set(IGV_PARALELA, igvPunto3D(3.0 * FACTOR_ESCALA, 2.0 * FACTOR_ESCALA, 4.0 * FACTOR_ESCALA), igvPunto3D(0, 0, 0), igvPunto3D(0, 1.0, 0), -1 * 3, 1 * 3, -1 * 3, 1 * 3, -1 * 3, 200); camara.znear = camara.P0[2] - 1; }
void igvInterfaz::pintar_minimapa() { int ancho_museo = interfaz.escena->museo.getAncho(), alto_museo = interfaz.escena->museo.getAlto(); /* Creamos un viewport para el mapilla */ glViewport(interfaz.ancho_ventana-(ancho_museo*10),0, ancho_museo*10, alto_museo*10); /* Creamos una cámara para ver el mapa desde el frente */ igvCamara c; c.set(IGV_PARALELA, igvPunto3D(0,0,1),igvPunto3D(0,0,0),igvPunto3D(0,1.0,0), -1, ancho_museo, -1, alto_museo, -3, 5); c.aplicar(); /* Pintamos el mapa */ glDisable(GL_TEXTURE_2D); GLfloat blanco[] = {1,1,1,1}; GLfloat verde[] = {0,0.5,0,0.5}; GLfloat rojo[] = {0.5,0,0,0.5}; GLfloat amarillo[] = {1,1,0,0.5}; glPointSize(10); glBegin(GL_POINTS); glMaterialfv(GL_FRONT,GL_EMISSION,rojo); glNormal3f(0,1,0); glVertex3f(ancho_museo-interfaz.camara.P0[0],interfaz.camara.P0[2],0); for (int i=0; i<ancho_museo; ++i) { for (int j=0; j<alto_museo; ++j) { if (interfaz.escena->museo(ancho_museo-1-i,j) == LIBRE || interfaz.escena->museo(ancho_museo-1-i, j) >= HAB_1) { glMaterialfv(GL_FRONT,GL_EMISSION,verde); glVertex3f(i,j,0); } else if (interfaz.escena->museo(ancho_museo-1-i, j) == PUERTA_CERRADA || interfaz.escena->museo(ancho_museo-1-i, j) == PUERTA_ABIERTA) { glMaterialfv(GL_FRONT,GL_EMISSION,amarillo); glVertex3f(i,j,0); } else { glMaterialfv(GL_FRONT,GL_EMISSION,blanco); glVertex3f(i,j,0); } } } glEnd(); }
void igvInterfaz::inicializarVistas() { igvInterfaz::vistas[0][0] = igvPunto3D(3, 2, 4); //perspectiva igvInterfaz::vistas[1][0] = igvPunto3D(0, 0, 6); //perfil igvInterfaz::vistas[2][0] = igvPunto3D(6, 0, 0); //alzado igvInterfaz::vistas[3][0] = igvPunto3D(0, 6, 0); //planta igvInterfaz::vistas[0][1] = igvInterfaz::vistas[1][1] = igvInterfaz::vistas[2][1] = igvPunto3D(0, 1, 0); igvInterfaz::vistas[3][1] = igvPunto3D(1, 0, 0); }
void igvInterfaz::set_glutDisplayFunc() { GLuint lista_impactos[1024]; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // borra la ventana y el z-buffer if (interfaz.objeto_seleccionado == -1) { glDisable(GL_LIGHT0); glDisable(GL_LIGHT1); glDisable(GL_LIGHT2); glDisable(GL_LIGHT3); glDisable(GL_LIGHT4); glDisable(GL_LIGHT5); glDisable(GL_LIGHT6); glDisable(GL_LIGHT7); interfaz.pintar_minimapa(); } glViewport(0, 0, interfaz.get_ancho_ventana(), interfaz.get_alto_ventana()); if (interfaz.modo == IGV_SELECCIONAR) interfaz.inicia_seleccion(1024,lista_impactos); if (interfaz.escena->getSeleccion() >= 0) { interfaz.camara_secundaria.aplicar(); /* Escultura */ if (interfaz.objeto_seleccionado >= 0 && interfaz.objeto_seleccionado < 10000) { cout << interfaz.objeto_seleccionado << endl; igvFuenteLuz luz_fija(GL_LIGHT0, igvPunto3D(1,1,3), igvColor(1,1,1,1), igvColor(1,1,1,1), igvColor(1,1,1,1), 1, 0, 0, igvPunto3D(0,0,-1), 90, 5); luz_fija.encender(); luz_fija.aplicar(); interfaz.escena_secundaria->pintar_escultura(interfaz.escena->getSeleccion(), 1,1,1); } /* Cuadro */ else if (interfaz.objeto_seleccionado >= 10000 && interfaz.objeto_seleccionado < 20000) { igvFuenteLuz luz_fija(GL_LIGHT0, igvPunto3D(1,1,3), igvColor(1,1,1,1), igvColor(1,1,1,1), igvColor(1,1,1,1), 1, 0, 0, igvPunto3D(0,0,-1), 90, 5); luz_fija.encender(); luz_fija.aplicar(); interfaz.escena_secundaria->pintar_cuadro(interfaz.escena->getSeleccion()%10000, 1,1,1, 0,0,1); } /* Botón */ else if (interfaz.objeto_seleccionado >= 20000 && interfaz.objeto_seleccionado < 30000) { interfaz.escena->setModoLadron(!interfaz.escena->isModoLadron()); interfaz.escena->setSeleccion(-1); interfaz.objeto_seleccionado = -1; interfaz.set_glutDisplayFunc(); } /* Puerta */ else { interfaz.puerta_activa = interfaz.objeto_seleccionado%10000; interfaz.abriendo_puerta = !interfaz.abriendo_puerta; interfaz.escena->setSeleccion(-1); interfaz.objeto_seleccionado = -1; interfaz.set_glutDisplayFunc(); } } else { interfaz.camara.aplicar(); interfaz.escena->visualizar(); } if (interfaz.modo == IGV_SELECCIONAR) interfaz.finaliza_seleccion(1024,lista_impactos); else { /* Pintar el punto de mira */ glViewport(interfaz.ancho_ventana/2-10, interfaz.alto_ventana/2-10, 20, 20); igvCamara c; c.set(IGV_PARALELA, igvPunto3D(0,0,1),igvPunto3D(0,0,-1),igvPunto3D(0,1,0), -1,1.5, -1,1.5, -3, 3); c.aplicar(); GLfloat verde[]={0,1,0,1.0}; glMaterialfv(GL_FRONT, GL_EMISSION, verde); glBegin(GL_LINES); glVertex3f(-1,0,0); glVertex3f(1,0,0); glVertex3f(0,-1,0); glVertex3f(0,1,0); glEnd(); glutSwapBuffers(); } }