6 #include <cgmath/cgmath.h>
12 static const char *vsdr_src =
13 "varying vec3 v_norm, v_ldir, v_vdir;\n"
16 " gl_Position = ftransform();\n"
17 " vec3 vpos = (gl_ModelViewMatrix * gl_Vertex).xyz;\n"
19 " v_norm = gl_NormalMatrix * gl_Normal;\n"
20 " v_ldir = gl_LightSource[0].position.xyz - vpos;\n"
23 static const char *psdr_src =
24 "varying vec3 v_norm, v_ldir, v_vdir;\n"
27 " vec3 n = normalize(v_norm);\n"
28 " vec3 v = normalize(v_vdir);\n"
29 " vec3 l = normalize(v_ldir);\n"
30 " vec3 h = normalize(v + l);\n"
31 " float ndotl = max(dot(n, l), 0.0);\n"
32 " float ndoth = max(dot(n, h), 0.0);\n"
33 " float spec = pow(ndoth, gl_FrontMaterial.shininess);\n"
34 " vec3 dcol = gl_FrontMaterial.diffuse.rgb * ndotl;\n"
35 " vec3 scol = gl_FrontMaterial.specular.rgb * spec;\n"
36 " gl_FragColor = vec4(dcol + scol, 1.0);\n"
39 static int init(void);
40 static void cleanup(void);
41 static void display(void);
42 static void reshape(int x, int y);
43 static void keydown(unsigned char key, int x, int y);
44 static void mouse(int bn, int st, int x, int y);
45 static void motion(int x, int y);
47 static int win_width, win_height;
48 static cgm_vec3 view_pos;
49 static float view_theta, view_phi = 0.6, view_dist = 8;
50 static float proj_mat[16], view_mat[16];
51 static int bnstate[8];
54 static struct fracture frac;
55 static struct cmesh *mesh;
56 static unsigned int sdr;
58 static int cur, pending;
59 static int show_orig = 1;
60 static int show_points;
63 int main(int argc, char **argv)
65 glutInit(&argc, argv);
66 glutInitWindowSize(1280, 800);
67 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
68 glutCreateWindow("meshfrac");
70 glutDisplayFunc(display);
71 glutReshapeFunc(reshape);
72 glutKeyboardFunc(keydown);
74 glutMotionFunc(motion);
87 unsigned int vsdr, psdr;
88 float diffuse[] = {0.2, 0.3, 0.8, 1};
89 float specular[] = {0.8, 0.8, 0.8, 1};
94 if(!(vsdr = create_vertex_shader(vsdr_src))) {
97 if(!(psdr = create_pixel_shader(psdr_src))) {
101 if(!(sdr = create_program_link(vsdr, psdr, 0))) {
107 glEnable(GL_CULL_FACE);
108 glEnable(GL_DEPTH_TEST);
109 glEnable(GL_LIGHTING);
112 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuse);
113 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
114 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 60);
116 mesh = cmesh_alloc();
117 gen_torus(mesh, 2, 0.8, 24, 12, 1, 1);
119 if(frac_init(&frac) == -1) {
122 frac_mesh(&frac, mesh);
127 static void cleanup(void)
133 static void update(void)
138 if(frac_gen_points(&frac, 16) == -1) {
147 if(frac_build_cells(&frac) != -1) {
155 if(frac_build_shell(&frac) != -1) {
163 if(frac_build_walls(&frac) != -1) {
173 if(pending > cur) glutPostRedisplay();
177 static void display(void)
183 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
185 cgm_mtranslation(view_mat, 0, 0, -view_dist);
186 cgm_mprerotate_x(view_mat, view_phi);
187 cgm_mprerotate_y(view_mat, view_theta);
188 cgm_mpretranslate(view_mat, -view_pos.x, -view_pos.y, -view_pos.z);
189 glMatrixMode(GL_MODELVIEW);
190 glLoadMatrixf(view_mat);
197 num = frac_num_cells(&frac);
200 glPushAttrib(GL_ENABLE_BIT);
201 glDisable(GL_DEPTH_TEST);
202 glDisable(GL_LIGHTING);
204 glBlendFunc(GL_ONE, GL_ONE);
208 glColor3f(0.1, 0.8, 0.1);
209 for(i=0; i<num; i++) {
210 glVertex3fv(&frac.cells[i].pt.x);
217 assert(glGetError() == GL_NO_ERROR);
221 static void reshape(int x, int y)
225 glViewport(0, 0, x, y);
227 cgm_mperspective(proj_mat, cgm_deg_to_rad(50), (float)x / y, 0.5, 500.0);
228 glMatrixMode(GL_PROJECTION);
229 glLoadMatrixf(proj_mat);
232 static void keydown(unsigned char key, int x, int y)
251 if(key >= '1' && key <= '4') {
261 static void mouse(int bn, int st, int x, int y)
263 int bidx = bn - GLUT_LEFT_BUTTON;
265 bnstate[bidx] = st == GLUT_DOWN;
271 static void motion(int x, int y)
278 if(!(dx | dy)) return;
281 view_theta += cgm_deg_to_rad(dx * 0.5);
282 view_phi += cgm_deg_to_rad(dy * 0.5);
283 if(view_phi < -M_PI / 2) view_phi = -M_PI / 2;
284 if(view_phi > M_PI / 2) view_phi = M_PI / 2;
290 up.x = -sin(view_theta) * sin(view_phi);
291 up.y = -cos(view_phi);
292 up.z = cos(view_theta) * sin(view_phi);
293 right.x = cos(view_theta);
295 right.z = sin(view_theta);
297 view_pos.x -= (right.x * dx + up.x * dy) * 0.01;
298 view_pos.y -= up.y * dy * 0.01;
299 view_pos.z -= (right.z * dx + up.z * dy) * 0.01;
303 view_dist += dy * 0.1;
304 if(view_dist < 0) view_dist = 0;