//fprintf(stderr, "movie_advance: all done\n");}/*---------------------------------------------------------------------*//* +-------------------------------------------------------------------+ | +-------------------------------------------------------------------+ *//*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//*---------------------------------------------------------------------*/#undef TEST_MODE#ifdef TEST_MODEint main(int argc, char *argv[]){ puts("Hello world, this is 'movie_common.c' by SUPREME PARTiCLES.\n"); return(0);}#endif /* TEST_MODE *//* trackBall - A simple trackball (not with proper rotations). *//** A simple trackball with spin = left button pan = middle button zoom = left + middle Doesn't have proper trackball rotation, ie axes which remain fixed in the scene. We should use the trackball code from 4Dgifts. *//* +-------------------------------------------------------------------+ | 'TRACKBALL2.C' (c) SUPREME PARTiCLES | | COMPANY : SUPREME PARTiCLES | PROJECT : | PART OF : | KEYWORDS : | DESCRIPTION : | | | AUTHOR : Michael Saup | DATE : Wed Aug 20 14:56:45 1997 | MODIFIED BY : | UPDATE : this code is from bigtest.c originated from GLUT-test/ | | VERSION : V 0.1 beta | STATUS : in Development / Testing / Updating | SOFTWARE : MIPS cc / SGI | HARDWARE : Silicon Graphics | | EMAIL : supreme.particles@pobox.com | WWW : www.rz.uni-frankfurt.de/~supreme | +-------------------------------------------------------------------+ */#include#include#include#include#include "trackball_simple.h"static const char __MS_Copyright__[81] = "TRACKBALL2.C by Michael Saup (c) SUPREME PARTiCLES [Wed Aug 20 14:56:45 1997]";/* +-------------------------------------------------------------------+ | TYPEDEFS | +-------------------------------------------------------------------+ *//* +-------------------------------------------------------------------+ | VARIABLES | +-------------------------------------------------------------------+ */#define Boolean GLboolean#define TRUE GL_TRUE#define FALSE GL_FALSEBoolean leftDown = FALSE; /* left button down ? */Boolean middleDown = FALSE; /* middle button down ? *//* +-------------------------------------------------------------------+ | PROTOTYPES | +-------------------------------------------------------------------+ *//* +-------------------------------------------------------------------+ | FUNCTIONS | +-------------------------------------------------------------------+ */#if 0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! drawScene(void) { glPushMatrix(); trackBall(APPLY, 0, 0, 0, 0); /* Apply continuous spinning */ glRotatef(angle, 0, 1, 0); glPopMatrix(); glutSwapBuffers(); } case 'r': trackBall(RESET, 0, 0, 0, 0); break; void mouseFunc(int button, int state, int x, int y) { trackBall(MOUSEBUTTON, button, state, x, y); } void motionFunc(int x, int y) { trackBall(MOUSEMOTION, 0, 0, x, y); glutPostRedisplay(); } !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#endif/* +-------------------------------------------------------------------+ | +-------------------------------------------------------------------+ *//* +-------------------------------------------------------------------+ | +-------------------------------------------------------------------+ */#define STARTROTATE(x, y) \{ \ startMX = x; \ startMY = y; \}#define STOPROTATE(x, y) \{ \ steadyXangle = varXangle; \ steadyYangle = varYangle; \}#define STARTPAN(x, y) \{ \ startMX = x; \ startMY = y; \}#define STOPPAN(x, y) \{ \ steadyX = varX; \ steadyY = varY; \}#define STARTZOOM(x, y) \{ \ startMX = x; \ startMY = y; \}#define STOPZOOM(x, y) \{ \ steadyZ = varZ; \} static float steadyXangle = 0.0, steadyYangle = 0.0;/* +-------------------------------------------------------------------+ | +-------------------------------------------------------------------+ */void trackBall(int mode, int button, int state, int x, int y){ static int startMX = 0, startMY = 0; /* initial mouse pos */ static int deltaMX = 0, deltaMY = 0; /* initial mouse pos */ static float varXangle = 0.0, varYangle = 0.0; static float steadyX = 0.0, steadyY = 0.0, steadyZ = 0.0; static float varX = 0.0, varY = 0.0, varZ = 0.0;#if 0 fprintf(stderr, "trackBall: %5d %5d %5d %5d %5d\n", mode, button, state, x, y);#endif#if 0 fprintf(stderr, "trackBall: %d varXYangle: %.3f %.3f steadyXangle: %.3f %.3f\n", mode, varXangle, varYangle, steadyXangle, steadyYangle);#endif#if 0 fprintf(stderr, "trackBall: deltaMXY: %3d %3d\n", deltaMX, deltaMY);#endif switch (mode) { case TB_RESET: steadyXangle = steadyYangle = steadyX = steadyY = steadyZ = 0.0; break; case TB_MOUSEBUTTON: if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && !middleDown) { STARTROTATE(x, y); leftDown = TRUE; } else if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && middleDown) { STOPPAN(x, y); STARTZOOM(x, y); leftDown = TRUE; } else if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN && !leftDown) { STARTPAN(x, y); middleDown = TRUE; } else if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN && leftDown) { STOPROTATE(x, y); STARTZOOM(x, y); middleDown = TRUE; } else if (state == GLUT_UP && button == GLUT_LEFT_BUTTON && !middleDown) { STOPROTATE(x, y); leftDown = FALSE; } else if (state == GLUT_UP && button == GLUT_LEFT_BUTTON && middleDown) { STOPZOOM(x, y); STARTROTATE(x, y); leftDown = FALSE; } else if (state == GLUT_UP && button == GLUT_MIDDLE_BUTTON && !leftDown) { STOPPAN(x, y); middleDown = FALSE; } else if (state == GLUT_UP && button == GLUT_MIDDLE_BUTTON && leftDown) { STOPZOOM(x, y); STARTROTATE(x, y); middleDown = FALSE; } break; case TB_APPLY: if (leftDown && !middleDown) { glTranslatef(steadyX, steadyY, steadyZ); glRotatef(varXangle, 0, 1, 0); glRotatef(varYangle, 1, 0, 0); } /* Middle button pan */ else if (middleDown && !leftDown) { glTranslatef(varX, varY, steadyZ); glRotatef(steadyXangle, 0, 1, 0); glRotatef(steadyYangle, 1, 0, 0); } /* Left + middle zoom. */ else if (leftDown && middleDown) { glTranslatef(steadyX, steadyY, varZ); glRotatef(steadyXangle, 0, 1, 0); glRotatef(steadyYangle, 1, 0, 0); } /* Nothing down. */ else { glTranslatef(steadyX, steadyY, steadyZ); glRotatef(steadyXangle, 0, 1, 0); glRotatef(steadyYangle, 1, 0, 0); } break; case TB_MOUSEMOTION: deltaMX = x - startMX; deltaMY = startMY - y; if (leftDown && !middleDown) { varXangle = steadyXangle + deltaMX; varYangle = steadyYangle + deltaMY; } else if (middleDown && !leftDown) { varX = steadyX + deltaMX / 100.0; varY = steadyY + deltaMY / 100.0; } else if (leftDown && middleDown) { varZ = steadyZ - deltaMY / 50.0; } break; }}/*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//* +-------------------------------------------------------------------+ | MS: not quite correct so lah lah...... | +-------------------------------------------------------------------+ */void trackBallAngles(float *x, float *y, float *z){ #define FAC 11.0f static float oldx = 0, oldy = 0, oldz = 0; static float dx = 0, dy = 0; if(leftDown) return; if(steadyXangle != oldx) { dx = steadyXangle - oldx; oldx = steadyXangle; } if(steadyYangle != oldy) { dy = steadyYangle - oldy; oldy = steadyYangle; } *x = dy / FAC; *y = dx / FAC; *z = 0.0;}/*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//* +-------------------------------------------------------------------+