/* +-------------------------------------------------------------------+ | 'GLUT_SAUP.C' (c) SUPREME PARTiCLES | | COMPANY : SUPREME PARTiCLES | PROJECT : | PART OF : | KEYWORDS : | DESCRIPTION : | | | AUTHOR : Michael Saup | DATE : Sat Jan 10 21:55:37 1998 | MODIFIED BY : | UPDATE : | | VERSION : V 0.1 beta | STATUS : in Development / Testing / Updating | SOFTWARE : MIPS cc / SGI | HARDWARE : Silicon Graphics | +-------------------------------------------------------------------+ */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "glut_saup.h"/* +-------------------------------------------------------------------+ | TYPEDEFS | +-------------------------------------------------------------------+ *//* +-------------------------------------------------------------------+ | VARIABLES | +-------------------------------------------------------------------+ *//* +-------------------------------------------------------------------+ | PROTOTYPES | +-------------------------------------------------------------------+ *//* +-------------------------------------------------------------------+ | FUNCTIONS | +-------------------------------------------------------------------+ */void GLUT_print_extensions(void){ char *str = (char*)glGetString(GL_EXTENSIONS); fprintf(stderr, "GL_EXTENSIONS:\n\t"); while(*str) { if(*str == 32) fprintf(stderr, "\n\t"); else fprintf(stderr, "%c", *str); str++; } fprintf(stderr, "\n\n");}/*---------------------------------------------------------------------*/void GLUT_check_extension(char *str){ if(!glutExtensionSupported(str)) { fprintf(stderr, "GLUT_check_extension: not supported: %s\n", str); exit(1); } fprintf(stderr, "GLUT_check_extension: \"%s\" okay\n", str);}/*---------------------------------------------------------------------*/void GLUT_noborder(void)/* * changed fullscreen file in glut distribution... * should be implemented in 3.7 or not??? */{ int posx = glutGet(GLUT_WINDOW_X); int posy = glutGet(GLUT_WINDOW_Y); fprintf(stderr, "GLUT_noborder: faked it all together\n");/* removes decorations now and puts in on upper left corner */ glutFullScreen(); glutPositionWindow(posx, posy);}/* +-------------------------------------------------------------------+ | +-------------------------------------------------------------------+ */void GLUT_viewport(int w, int h, double asp_w, double asp_h){ int dummy; GLUT_viewport_correct(w, h, asp_w, asp_h, &dummy;, &dummy;);}/*---------------------------------------------------------------------*/void GLUT_viewport_correct( int w, int h, double asp_w, double asp_h, int *view_xsize, int *view_ysize){/* void glViewport( GLint x, GLint y, GLsizei width, GLsizei height )*/ double aspect = asp_w / asp_h; float xsize, ysize; fprintf(stderr, "GLUT_viewport_correct: %f %f aspect: %f\n", asp_w, asp_h, aspect); if(w>h) { xsize = w; ysize = xsize / aspect; glViewport(0, (h - ysize) / 2.0, xsize, ysize); *view_xsize = (int)xsize; *view_ysize = (int)ysize; fprintf(stderr, "GLUT_viewport_correct: xysize: %f %f\n", xsize, ysize); } else { fprintf(stderr, "\nERR: GLUT_viewport_correct: w #include #include #include "movie_common.h"/--------------------------------------------------------------+ | typedefs | +-------------------------------------------------------------------+ */---------------------------------------------------------------+ | variables | +-------------------------------------------------------------------+ */---------------------------------------------------------------+ | variables | +-------------------------------------------------------------------+ */vo_movie *mv[max_movies]; /* +-------------------------------------------------------------------+ | prototypes | +-------------------------------------------------------------------+ */---------------------------------------------------------------+ | functions | +-------------------------------------------------------------------+ */vo_movie *movie_open(char *name){ static fvo_movie *mv_tmp="NULL;" mv_tmp="FVO_movie_open(name);" fvo_movie_define_texture(mv_tmp, fvo_movie_texture_texmap); /* ??? */mv_tmp);}/--------------------------------------------------------------*/ie_load(void)/s all movies */ fprintf(stderr, "movie_load:\n");/ark all movies... */0;iindex != -1) && mv[play->index] ) { return( mv[play->index] ); } else { return(NULL); }}/*---------------------------------------------------------------------*/FVO_MOVIE *movie_index_to_pointer(long index){ index = CLAMP(index, 0, MAX_MOVIES-1); //fprintf(stderr, "movie_index_to_pointer: %ld --> %p\n", index, mv[index]); return(mv[index]);}/*---------------------------------------------------------------------*/void movie_loop(FVO_MOVIE *movie, FVO_MOVIE_PLAY *play){ static short init = 0; if(!movie) return; if(play->loop_all) { FVO_movie_set_loop_full(movie); } else { /* set a new loop */ if(!init || ntime_passed(TIME_SLOT_MOVIE_LOOP, play->loop_milli ) ) /* multiple slots!!!! */ { #if 0 /* successive */ long start = (movie->loop_start + play->loop_len) % movie->frame_len; long end = MIN(movie->frame_len, start + play->loop_len); #else /* random */ long range = movie->frame_len - play->loop_len; int start = RANDOM(range); int end = start + play->loop_len; #endif FVO_movie_set_loop(movie, start, end); } //FVO_movie_set_loop(movie, movie->loop_start, movie->loop_end); } init = 1;}/*---------------------------------------------------------------------*/void movie_advance(FVO_MOVIE *movie, FVO_MOVIE_PLAY *play, short updated)/* * advance the current movie dep. on mode */{ //fprintf(stderr, "movie_advance: %s\n", movie->name); if(!movie) { //fprintf(stderr, "movie_advance: NULL --> return\n"); return; } if(play->speed == 0.0) return; /* modes... */ if(play->mode == MOVIE_MODE_STEP) { FVO_movie_read_nextframe(movie); } else if(play->mode == MOVIE_MODE_RAND) { FVO_movie_read_randframe(movie); } else if(play->mode == MOVIE_MODE_PLAY) { FVO_movie_read_timeframe(movie, play->speed); } else /* MOVIE_MODE_PUNCH */ { float punch_speed, tmp_speed; if(updated) punch_speed = play->speed /*1.0 */; else punch_speed = 0; //tmp_speed = ndecay(DECAY_SLOT_PUNCH, punch_speed, DECAY_SLOT_PUNCH_MILLI, 1.0); tmp_speed = ndecay(11, punch_speed, 666, 1.0); tmp_speed = MAX(0.1, tmp_speed); FVO_movie_read_timeframe(movie, tmp_speed); /////pixel_color_scale(tmp_speed, tmp_speed, tmp_speed); if(play->mode == MOVIE_MODE_PUNCH_NOJUMP) FVO_movie_mark_time(movie); /* no more jumps */ } /* set texture ??? */ //FVO_movie_bind_texture(movie); //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;}/*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//*---------------------------------------------------------------------*//* +-------------------------------------------------------------------+