nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: nuclear@6: #define CUBEMAP_FILENAME "data/cubemap2.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@6: skybox(cubemap); nuclear@5: nuclear@5: glutSwapBuffers(); nuclear@5: CHECKGLERR; nuclear@5: } nuclear@5: nuclear@5: static void skybox(const TextureCube *cubemap) nuclear@5: { nuclear@6: static Mesh *skybox; nuclear@6: nuclear@6: if(!skybox) { nuclear@6: skybox = new Mesh; nuclear@6: gen_sphere(skybox, 10.0, 12, 6); nuclear@6: } nuclear@6: 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@6: glEnable(GL_TEXTURE_CUBE_MAP); nuclear@6: nuclear@5: if(cubemap) cubemap->bind(); nuclear@5: sdrsky->bind(); nuclear@5: nuclear@6: skybox->draw(); 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: }