#include "event.h" #include "util3d.h" #include "grafx.h" #include "geom.h" #include "geom_menu.h" #include "disp_menu.h" #include "params.h" #ifndef WIN32 #include #endif EventState gevent; static int num_demo_files; unsigned int idle_counter = 0; static int idle_loops; #ifndef WIN32 static struct timeval prev_time; #endif int HandleButtonCB(struct Togl *togl, int argc, char *argv[]) { Tcl_Interp *interp = Togl_Interp(togl); int button, state, x, y; /* error checking */ if (argc != 6) { Tcl_SetResult(interp, "wrong # args: should be \"pathName HandleButton ?b? ?s? ?x? ?y?\"", TCL_STATIC); return TCL_ERROR; } idle_counter = 0; button = atoi(argv[2]); state = atoi(argv[3]); x = atoi(argv[4]); y = atoi(argv[5]); if (button == LEFT_BUTTON) { if (state == BUTTON_DOWN) { gevent.leftmouse_down = 1; gevent.mpos1[X] = gevent.mpos2[X] = x; gevent.mpos1[Y] = gevent.mpos2[Y] = y; } else if (state == BUTTON_UP) { gevent.leftmouse_down = 0; gevent.mspeed = ABS(gevent.mpos1[X] - gevent.mpos2[X]) * ABS(gevent.mpos1[Y] - gevent.mpos2[Y]); gstate.axis = '\0'; } } else if (button == MIDDLE_BUTTON) { if (state == BUTTON_DOWN) { gevent.middlemouse_down = 1; gevent.mpos1[X] = gevent.mpos2[X] = x; gevent.mpos1[Y] = gevent.mpos2[Y] = y; gstate.axis = '\0'; } else if (state == BUTTON_UP) { gevent.middlemouse_down = 0; } } else if (button == RIGHT_BUTTON) { if (state == BUTTON_DOWN) { gevent.rightmouse_down = 1; gevent.mpos1[X] = gevent.mpos2[X] = x; gevent.mpos1[Y] = gevent.mpos2[Y] = y; gstate.axis = '\0'; } else if (state == BUTTON_UP) { gevent.rightmouse_down = 0; } } Togl_PostRedisplay(togl); /* Let result string equal value */ strcpy(interp->result, argv[2]); return TCL_OK; } int HandleMotionCB(struct Togl *togl, int argc, char *argv[]) { Tcl_Interp *interp = Togl_Interp(togl); int button, x, y; float mdx, mdy; static int counter = 0; /* error checking */ if (argc != 5) { Tcl_SetResult(interp, "wrong # args: should be \"pathName HandleMotion ?button? ?x? ?y?\"", TCL_STATIC); return TCL_ERROR; } idle_counter = 0; button = atoi(argv[2]); x = atoi(argv[3]); y = atoi(argv[4]); gevent.mpos1[X] = x; gevent.mpos1[Y] = y; mdx = (float)(gevent.mpos2[X] - gevent.mpos1[X]); mdy = (float)(gevent.mpos2[Y] - gevent.mpos1[Y]); if ((button == LEFT_BUTTON) && gevent.leftmouse_down) { gstate.xrot = -mdy; gstate.yrot = -mdx; gstate.axis = 'x'; } if ((button == MIDDLE_BUTTON) && gevent.middlemouse_down) { gstate.dx += -mdx * 0.01f; gstate.dy += mdy * 0.01f; } if ((button == RIGHT_BUTTON) && gevent.rightmouse_down) { gstate.scale_factor = gstate.scale_factor*(1.0f+0.01f*mdy); //gstate.scale_factor = gstate.scale_factor*(1.0f+0.025f*mdy); } gevent.mpos2[X] = gevent.mpos1[X]; gevent.mpos2[Y] = gevent.mpos1[Y]; Togl_PostRedisplay(togl); /* Let result string equal value */ strcpy(interp->result, argv[2]); return TCL_OK; } void SetDemoParameters() { FILE *fp; char str[256]; fp = fopen("Demos/demo.param", "r"); if (fp == NULL) { printf("Cannot open file Demos/demo.param\n"); exit(0); } if (fscanf(fp, "%s %d\n", str, &num_demo_files) != 2) { fclose(fp); exit(0); } if (fscanf(fp, "%s %d\n", str, &idle_loops) != 2) { fclose(fp); exit(0); } fclose(fp); } void SetDemo(struct Togl *togl) { Tcl_Interp *interp = Togl_Interp(togl); char str[256]; if (num_demo_files >= 1) { sprintf(str, "Demos/demo%d.txt", (rand() % num_demo_files) + 1); if (LoadParams(str) == 1) { ProccessParams(togl); Togl_PostRedisplay(togl); } } } void DynamicsCB(struct Togl *togl) { #ifdef WIN32 static int set_demo_param = 1; if (set_demo_param == 1) { SetDemoParameters(); set_demo_param = 0; } idle_counter += 10; if (idle_counter >= idle_loops) { SetDemo(togl); idle_counter = 0; } #else static int first = 1; struct timeval cur_time; if (first) { gettimeofday(&prev_time); SetDemoParameters(); first = 0; } else { gettimeofday(&cur_time); idle_counter += cur_time.tv_sec - prev_time.tv_sec; prev_time.tv_sec = cur_time.tv_sec; if (idle_counter >= idle_loops) { SetDemo(togl); idle_counter = 0; } } #endif if (!gstate.auto_rotate && !gstate.auto_wobble) return; glPushMatrix(); glLoadIdentity(); if (gstate.auto_rotate) { glRotatef(gstate.xrot, 1.0f, 0.0f, 0.0f); glRotatef(gstate.yrot, 0.0f, 1.0f, 0.0f); } if (gstate.auto_wobble) { int wobble_last = gstate.wobble_step; float t0, t1, theta; gstate.wobble_step++; if (gstate.wobble_step > gstate.wobble_steps) gstate.wobble_step = -gstate.wobble_step; //gstate.wobble_step = 0; t0 = (2.0f * M_PI * (float)wobble_last) / (float)gstate.wobble_steps; t1 = (2.0f * M_PI * (float)gstate.wobble_step) / (float)gstate.wobble_steps; theta = gstate.wobble_angle * (cosf(t1) -cosf(t0)); glRotatef(theta, 0.0f, 1.0f, 0.0f); } glMultMatrixf(cm); glGetFloatv(GL_MODELVIEW_MATRIX, cm); glPopMatrix(); Togl_PostRedisplay(togl); }