nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "sdr.h" nuclear@0: nuclear@0: #ifdef FREEGLUT nuclear@0: #include nuclear@0: #define MOUSEWHEEL nuclear@0: #endif nuclear@0: nuclear@0: void redraw(void); nuclear@0: void set_material_color(float r, float g, float b, float a); nuclear@0: void setup_lights(void); nuclear@0: void key_handler(unsigned char key, int x, int y); nuclear@0: void key_up_handler(unsigned char key, int x, int y); nuclear@0: void skey_handler(int key, int x, int y); nuclear@0: void button_handler(int bn, int state, int x, int y); nuclear@0: void mouse_handler(int x, int y); nuclear@0: void reshape(int x, int y); nuclear@0: #ifdef MOUSEWHEEL nuclear@0: void wheel_handler(int unk, int dir, int x, int y); nuclear@0: #endif nuclear@0: void menu_handler(int val); nuclear@0: void init_sdr(void); nuclear@0: nuclear@0: int xres, yres; nuclear@0: nuclear@0: float cam_x, cam_y = 0.6, cam_z = 4; nuclear@0: float cam_rot, cam_pitch = 35.0; nuclear@0: nuclear@0: float pan_offs = 0.025; nuclear@0: nuclear@0: unsigned int prog; nuclear@0: nuclear@0: float roughness = 0.24; nuclear@0: float specularity = 0.86; nuclear@0: float ior = 3.2; nuclear@0: float spec_pow = 60.0; nuclear@0: nuclear@0: enum {DSDR_LAMBERT, DSDR_OREN_NAYAR}; nuclear@0: enum {SSDR_PHONG, SSDR_BLINN, SSDR_COOK_TORR}; nuclear@0: nuclear@0: int dif_sdr = DSDR_OREN_NAYAR; nuclear@0: int spec_sdr = SSDR_COOK_TORR; nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: unsigned int vs, ps, pslib; nuclear@0: int dif_menu, spec_menu, i; nuclear@0: nuclear@0: for(i=1; i (b) ? (a) : (b)) nuclear@0: nuclear@0: void mouse_handler(int x, int y) nuclear@0: { nuclear@0: if(pbn == GLUT_LEFT_BUTTON) { nuclear@0: if(mod_rough || mod_spec || mod_ior || mod_spow) { nuclear@0: float dx = (float)(x - prev_x) / (float)xres; nuclear@0: nuclear@0: if(mod_rough) { nuclear@0: roughness = MAX(0.0, MIN(roughness + dx, 1.0)); nuclear@0: printf("roughness: %.3f\n", roughness); nuclear@0: } nuclear@0: if(mod_spec) { nuclear@0: specularity = MAX(0.0, MIN(specularity + dx, 1.0)); nuclear@0: printf("specularity: %.3f\n", specularity); nuclear@0: } nuclear@0: if(mod_ior) { nuclear@0: ior = MAX(ior + dx, 0.0); nuclear@0: printf("ior: %.3f\n", ior); nuclear@0: } nuclear@0: if(mod_spow) { nuclear@0: spec_pow = MAX(spec_pow + dx * 50.0, 0.01); nuclear@0: printf("specular power: %.3f\n", spec_pow); nuclear@0: } nuclear@0: } else { nuclear@0: /* nuclear@0: cam_x += (float)(prev_x - x) * pan_offs; nuclear@0: cam_y += (float)(y - prev_y) * pan_offs; nuclear@0: */ nuclear@0: } nuclear@0: nuclear@0: prev_x = x; nuclear@0: prev_y = y; nuclear@0: glutPostRedisplay(); nuclear@0: nuclear@0: } else if(pbn == GLUT_MIDDLE_BUTTON) { nuclear@0: cam_rot += (float)(x - prev_x) / 2.0f; nuclear@0: cam_pitch += (float)(y - prev_y) / 2.0f; nuclear@0: if(cam_pitch > 90.0) cam_pitch = 90.0; nuclear@0: if(cam_pitch < -90.0) cam_pitch = -90.0; nuclear@0: nuclear@0: prev_x = x; nuclear@0: prev_y = y; nuclear@0: glutPostRedisplay(); nuclear@0: nuclear@0: } else if(pbn == GLUT_RIGHT_BUTTON) { nuclear@0: /* nuclear@0: cam_z -= (float)(prev_y - y) / 2.0f; nuclear@0: prev_y = y; nuclear@0: glutPostRedisplay(); nuclear@0: */ nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void reshape(int x, int y) nuclear@0: { nuclear@0: glViewport(0, 0, x, y); nuclear@0: xres = x; nuclear@0: yres = y; nuclear@0: nuclear@0: glMatrixMode(GL_PROJECTION); nuclear@0: glLoadIdentity(); nuclear@0: gluPerspective(45.0, (float)xres / (float)yres, 1.0, 100.0); nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: } nuclear@0: nuclear@0: #ifdef MOUSEWHEEL nuclear@0: void wheel_handler(int unk, int dir, int x, int y) nuclear@0: { nuclear@0: if(dir > 0) { nuclear@0: cam_z -= pan_offs * 5.0; nuclear@0: } else { nuclear@0: cam_z += pan_offs * 5.0; nuclear@0: } nuclear@0: glutPostRedisplay(); nuclear@0: } nuclear@0: #endif nuclear@0: nuclear@0: void menu_handler(int val) nuclear@0: { nuclear@0: if(val < 10) { nuclear@0: dif_sdr = val; nuclear@0: } else { nuclear@0: spec_sdr = val - 10; nuclear@0: } nuclear@0: glutPostRedisplay(); nuclear@0: }