nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: #include nuclear@0: #ifndef __APPLE__ nuclear@0: #include nuclear@0: #else nuclear@0: #include nuclear@0: #endif nuclear@0: nuclear@0: #include "cam.h" nuclear@0: #include "sdr.h" nuclear@0: #include "metasurf.h" nuclear@0: nuclear@0: #define RES 38 nuclear@0: nuclear@0: struct metaball { nuclear@0: float energy; nuclear@0: float x, y, z; nuclear@0: } mball[] = { nuclear@0: {1.0, 0, 0, 0}, nuclear@0: {0.25, 0.45, 0, 0.25}, nuclear@0: {0.15, -0.3, 0.2, 0.1} nuclear@0: }; nuclear@0: nuclear@0: int num_mballs = sizeof mball / sizeof *mball; nuclear@0: nuclear@0: float eval(float x, float y, float z); nuclear@0: float eval_cached(float x, float y, float z); nuclear@0: void vertex(float x, float y, float z); nuclear@0: void render(void); nuclear@0: void disp(void); nuclear@0: void reshape(int x, int y); nuclear@0: void keyb(unsigned char key, int x, int y); nuclear@0: void mouse(int bn, int state, int x, int y); nuclear@0: void motion(int x, int y); nuclear@0: void sball_button(int bn, int state); nuclear@0: void sball_motion(int x, int y, int z); nuclear@0: int parse_args(int argc, char **argv); nuclear@0: nuclear@0: int stereo; nuclear@0: struct metasurface *msurf; nuclear@0: float threshold = 12; nuclear@0: unsigned int sdr; nuclear@0: int bidx = 1; nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: float amb[] = {0, 0, 0, 0}; nuclear@0: float lpos[] = {-0.2, 0.2, 1, 0}; nuclear@0: nuclear@0: glutInitWindowSize(1280, 720); nuclear@0: glutInit(&argc, argv); nuclear@0: nuclear@0: if(parse_args(argc, argv) == -1) { nuclear@0: return 1; nuclear@0: } nuclear@0: glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | (stereo ? GLUT_STEREO : 0)); nuclear@0: glutCreateWindow("metasurf"); nuclear@0: nuclear@0: glutDisplayFunc(disp); nuclear@0: glutReshapeFunc(reshape); nuclear@0: glutKeyboardFunc(keyb); nuclear@0: glutMouseFunc(mouse); nuclear@0: glutMotionFunc(motion); nuclear@0: glutSpaceballButtonFunc(sball_button); nuclear@0: glutSpaceballMotionFunc(sball_motion); nuclear@0: nuclear@0: glewInit(); nuclear@0: nuclear@0: glEnable(GL_CULL_FACE); nuclear@0: glEnable(GL_DEPTH_TEST); nuclear@0: nuclear@0: glLightModelfv(GL_LIGHT_MODEL_AMBIENT, amb); nuclear@0: nuclear@0: glEnable(GL_LIGHTING); nuclear@0: glEnable(GL_LIGHT0); nuclear@0: glLightfv(GL_LIGHT0, GL_POSITION, lpos); nuclear@0: nuclear@0: glEnable(GL_NORMALIZE); nuclear@0: nuclear@0: cam_focus_dist(2.0); nuclear@0: cam_clip(0.1, 200.0); nuclear@0: cam_rotate(0, 0); nuclear@0: cam_dolly(2); nuclear@0: nuclear@0: msurf = msurf_create(); nuclear@0: msurf_eval_func(msurf, eval); nuclear@0: msurf_vertex_func(msurf, vertex); nuclear@0: msurf_threshold(msurf, threshold); nuclear@0: msurf_resolution(msurf, RES, RES, RES); nuclear@0: msurf_bounds(msurf, -1, -1, -1, 1, 1, 1); nuclear@0: nuclear@0: glClearColor(0.8, 0.8, 0.8, 1.0); nuclear@0: nuclear@0: if(!(sdr = create_program_load("sdr/vert.glsl", "sdr/frag.glsl"))) { nuclear@0: return 1; nuclear@0: } nuclear@0: nuclear@0: glutMainLoop(); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: float eval(float x, float y, float z) nuclear@0: { nuclear@0: int i; nuclear@0: float val = 0.0f; nuclear@0: nuclear@0: for(i=0; i