nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: nuclear@5: #define CUBEMAP_FILENAME "data/cubemap3.jpg" nuclear@5: nuclear@5: static bool init(); nuclear@5: static void cleanup(); nuclear@5: static void display(); nuclear@5: static void skybox(const TextureCube *cubemap = 0); nuclear@5: static void reshape(int x, int y); nuclear@5: static void keyboard(unsigned char key, int x, int y); nuclear@5: static void mouse(int bn, int st, int x, int y); nuclear@5: static void motion(int x, int y); nuclear@5: nuclear@5: static float cam_theta, cam_phi; nuclear@5: nuclear@5: static TextureCube *cubemap; nuclear@5: static ShaderProg *sdrsky; nuclear@5: nuclear@5: int main(int argc, char **argv) nuclear@5: { nuclear@5: glutInit(&argc, argv); nuclear@5: glutInitWindowSize(800, 600); nuclear@5: glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); nuclear@5: glutCreateWindow("cubemap"); nuclear@5: nuclear@5: glutDisplayFunc(display); nuclear@5: glutReshapeFunc(reshape); nuclear@5: glutKeyboardFunc(keyboard); nuclear@5: glutMouseFunc(mouse); nuclear@5: glutMotionFunc(motion); nuclear@5: nuclear@5: if(!init()) { nuclear@5: return 1; nuclear@5: } nuclear@5: atexit(cleanup); nuclear@5: nuclear@5: glutMainLoop(); nuclear@5: return 0; nuclear@5: } nuclear@5: nuclear@5: static bool init() nuclear@5: { nuclear@5: glewInit(); nuclear@5: nuclear@5: glEnable(GL_DEPTH_TEST); nuclear@5: //glEnable(GL_CULL_FACE); nuclear@5: nuclear@5: cubemap = new TextureCube; nuclear@5: if(!cubemap->load(CUBEMAP_FILENAME)) { nuclear@5: fatal_log("Failed to load cubemap: %s\n", CUBEMAP_FILENAME); nuclear@5: return false; nuclear@5: } nuclear@5: nuclear@5: if(!(sdrsky = get_sdrprog("sdr/sky.v.glsl", "sdr/sky.p.glsl"))) { nuclear@5: fatal_log("failed to load skybox shader\n"); nuclear@5: return false; nuclear@5: } nuclear@5: nuclear@5: return true; nuclear@5: } nuclear@5: nuclear@5: static void cleanup() nuclear@5: { nuclear@5: delete cubemap; nuclear@5: } nuclear@5: nuclear@5: static void display() nuclear@5: { nuclear@5: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); nuclear@5: nuclear@5: Matrix4x4 view_matrix; nuclear@5: view_matrix.rotate(Vector3(1, 0, 0), M_PI * cam_phi / 180.0); nuclear@5: view_matrix.rotate(Vector3(0, 1, 0), M_PI * cam_theta / 180.0); nuclear@5: set_view_matrix(view_matrix); nuclear@5: nuclear@5: setup_gl_matrices(); nuclear@5: nuclear@5: skybox(); nuclear@5: nuclear@5: /*glBegin(GL_QUADS); nuclear@5: glColor3f(1, 1, 1); nuclear@5: glNormal3f(0, 1, 0); nuclear@5: glVertex3f(-0.8, -1, 0.8); nuclear@5: glVertex3f(0.8, -1, 0.8); nuclear@5: glVertex3f(0.8, -1, -0.8); nuclear@5: glVertex3f(-0.8, -1, -0.8); nuclear@5: glEnd();*/ nuclear@5: nuclear@5: glutSwapBuffers(); nuclear@5: CHECKGLERR; nuclear@5: } nuclear@5: nuclear@5: static void skybox(const TextureCube *cubemap) nuclear@5: { nuclear@5: glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT); nuclear@5: glDisable(GL_DEPTH_TEST); nuclear@5: glDisable(GL_CULL_FACE); nuclear@5: glDisable(GL_LIGHTING); nuclear@5: nuclear@5: if(cubemap) cubemap->bind(); nuclear@5: sdrsky->bind(); nuclear@5: nuclear@5: glBegin(GL_QUADS); nuclear@5: // +X nuclear@5: glColor3f(1, 0, 0); nuclear@5: glVertex3f(1, -1, 1); nuclear@5: glVertex3f(1, -1, -1); nuclear@5: glVertex3f(1, 1, -1); nuclear@5: glVertex3f(1, 1, 1); nuclear@5: // -Z nuclear@5: glColor3f(0, 1, 0); nuclear@5: glVertex3f(1, -1, -1); nuclear@5: glVertex3f(-1, -1, -1); nuclear@5: glVertex3f(-1, 1, -1); nuclear@5: glVertex3f(1, 1, -1); nuclear@5: // -X nuclear@5: glColor3f(0, 0, 1); nuclear@5: glVertex3f(-1, -1, -1); nuclear@5: glVertex3f(-1, -1, 1); nuclear@5: glVertex3f(-1, 1, 1); nuclear@5: glVertex3f(-1, 1, -1); nuclear@5: // +Z nuclear@5: glColor3f(1, 1, 0); nuclear@5: glVertex3f(-1, -1, 1); nuclear@5: glVertex3f(1, -1, 1); nuclear@5: glVertex3f(1, 1, 1); nuclear@5: glVertex3f(-1, 1, 1); nuclear@5: // +Y nuclear@5: glColor3f(0, 1, 1); nuclear@5: glVertex3f(-1, 1, 1); nuclear@5: glVertex3f(1, 1, 1); nuclear@5: glVertex3f(1, 1, -1); nuclear@5: glVertex3f(-1, 1, -1); nuclear@5: // -Y nuclear@5: glColor3f(1, 0, 1); nuclear@5: glVertex3f(-1, -1, -1); nuclear@5: glVertex3f(1, -1, -1); nuclear@5: glVertex3f(1, -1, 1); nuclear@5: glVertex3f(-1, -1, 1); nuclear@5: glEnd(); nuclear@5: nuclear@5: glUseProgram(0); nuclear@5: glPopAttrib(); nuclear@5: } nuclear@5: nuclear@5: static void reshape(int x, int y) nuclear@5: { nuclear@5: glViewport(0, 0, x, y); nuclear@5: nuclear@5: Matrix4x4 proj; nuclear@5: proj.set_perspective(M_PI / 4.0, (float)x / (float)y, 0.5, 500.0); nuclear@5: set_projection_matrix(proj); nuclear@5: } nuclear@5: nuclear@5: static void keyboard(unsigned char key, int x, int y) nuclear@5: { nuclear@5: switch(key) { nuclear@5: case 27: nuclear@5: exit(0); nuclear@5: } nuclear@5: } nuclear@5: nuclear@5: static bool bnstate[16]; nuclear@5: static int prev_x, prev_y; nuclear@5: nuclear@5: static void mouse(int bn, int st, int x, int y) nuclear@5: { nuclear@5: bnstate[bn - GLUT_LEFT_BUTTON] = st == GLUT_DOWN; nuclear@5: prev_x = x; nuclear@5: prev_y = y; nuclear@5: } nuclear@5: nuclear@5: static void motion(int x, int y) nuclear@5: { nuclear@5: int dx = x - prev_x; nuclear@5: int dy = y - prev_y; nuclear@5: prev_x = x; nuclear@5: prev_y = y; nuclear@5: nuclear@5: if(!dx && !dy) return; nuclear@5: nuclear@5: if(bnstate[0]) { nuclear@5: cam_theta += dx * 0.5; nuclear@5: cam_phi += dy * 0.5; nuclear@5: cam_phi = std::max(-90.0f, std::min(90.0f, cam_phi)); nuclear@5: glutPostRedisplay(); nuclear@5: } nuclear@5: }