nuclear@4: #include nuclear@4: nuclear@4: #ifndef __APPLE__ nuclear@4: #include nuclear@4: #else nuclear@4: #include nuclear@4: #endif nuclear@4: nuclear@4: #include "metasurf.h" nuclear@4: nuclear@4: float eval(float x, float y, float z); nuclear@4: void disp(void); nuclear@4: void reshape(int x, int y); nuclear@4: void keyb(unsigned char key, int x, int y); nuclear@4: nuclear@4: struct metasurface *ms; nuclear@4: nuclear@4: int main(int argc, char **argv) nuclear@4: { nuclear@4: float ldir[] = {-0.3, 0.3, 1, 0}; nuclear@4: nuclear@4: glutInitWindowSize(800, 600); nuclear@4: glutInit(&argc, argv); nuclear@4: glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); nuclear@4: glutCreateWindow("metasurf example: simple"); nuclear@4: nuclear@4: glutDisplayFunc(disp); nuclear@4: glutReshapeFunc(reshape); nuclear@4: glutKeyboardFunc(keyb); nuclear@4: nuclear@4: glEnable(GL_DEPTH_TEST); nuclear@4: glEnable(GL_CULL_FACE); nuclear@4: nuclear@4: glEnable(GL_LIGHTING); nuclear@4: glEnable(GL_LIGHT0); nuclear@4: glLightfv(GL_LIGHT0, GL_POSITION, ldir); nuclear@4: nuclear@4: glEnable(GL_NORMALIZE); nuclear@4: nuclear@4: ms = msurf_create(); nuclear@4: /* consider anything below the threshold (0 by default) to be inside */ nuclear@4: msurf_inside(ms, MSURF_LESS); nuclear@4: /* set the evaluation callback */ nuclear@4: msurf_eval_func(ms, eval); nuclear@4: /* pass any vertices and normals generated directly to OpenGL */ nuclear@4: msurf_vertex_func(ms, glVertex3f); nuclear@4: msurf_normal_func(ms, glNormal3f); nuclear@4: /* slightly increase the bounds to avoid clipping the unit sphere */ nuclear@4: msurf_bounds(ms, -1.1, -1.1, -1.1, 1.1, 1.1, 1.1); nuclear@4: nuclear@4: glutMainLoop(); nuclear@4: return 0; nuclear@4: } nuclear@4: nuclear@4: /* the unit sphere is implicitly defined as the locus of points in R3 satisfying nuclear@4: * the equation: x^2 + y^2 + z^2 - 1 = 0 nuclear@4: */ nuclear@4: float eval(float x, float y, float z) nuclear@4: { nuclear@4: return (x * x + y * y + z * z) - 1.0; nuclear@4: } nuclear@4: nuclear@4: void disp(void) nuclear@4: { nuclear@4: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); nuclear@4: nuclear@4: glMatrixMode(GL_MODELVIEW); nuclear@4: glLoadIdentity(); nuclear@4: glTranslatef(0, 0, -3); nuclear@4: nuclear@4: glBegin(GL_TRIANGLES); nuclear@4: msurf_polygonize(ms); nuclear@4: glEnd(); nuclear@4: nuclear@4: glutSwapBuffers(); nuclear@4: } nuclear@4: nuclear@4: void reshape(int x, int y) nuclear@4: { nuclear@4: glMatrixMode(GL_PROJECTION); nuclear@4: glLoadIdentity(); nuclear@4: gluPerspective(45.0, (float)x / (float)y, 0.5, 500.0); nuclear@4: } nuclear@4: nuclear@4: void keyb(unsigned char key, int x, int y) nuclear@4: { nuclear@4: switch(key) { nuclear@4: case 27: nuclear@4: exit(0); nuclear@4: nuclear@4: case 'w': nuclear@4: { nuclear@4: static int wire; nuclear@4: wire = !wire; nuclear@4: glPolygonMode(GL_FRONT_AND_BACK, wire ? GL_LINE : GL_FILL); nuclear@4: glutPostRedisplay(); nuclear@4: } nuclear@4: break; nuclear@4: nuclear@4: default: nuclear@4: break; nuclear@4: } nuclear@4: }