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