/* pyro.h Header file for PyroTechnics Copyright (c) 1998, Mike Oliphant and Rob Clark */ #include #ifdef WIN32 #include #define RRand(range) (random(MAXINT)%range) #else #define RRand(range) (random()%range) #endif /* ifdef WIN32 */ #if defined WIN32 || defined __EMX__ /*os2*/ #define STRCASECMP stricmp #else #define STRCASECMP strcasecmp #endif /* if defined WIN32 || defined __EMX__ */ #define Rand() (double)rand()/(double)RAND_MAX #define Square(x) (x*x) #define VecLen(x,y,z) sqrt(Square(x)+Square(y)+Square(z)) #define WIDTH 640 #define HEIGHT 480 #define GRAVITY -.0003 #define MAXWORKS 8 #define WORKPROB .04 #define GRNDLVL -2.0 #define MAXPARTKINDS 5 #define TIMESCALE 70.0 /* Should normalize values so this can be 1.0 */ #define FPSPRINT 30 struct Particle; struct Firework; typedef struct Firework Firework; typedef struct Particle Particle; struct Particle { double x,y,z; double dx,dy,dz; double odx,ody,odz; double mx,my,mz; double speed; double r,g,b,a; double mr,mg,mb,ma; double rval; double expvel,expveldev; double xexpfact,yexpfact,zexpfact; double airres; double decrate; double traillen; void (*cfunc)(Particle *part,Firework *work); void (*mfunc)(Particle *part,Firework *work); }; struct PT_Template { double r,g,b,a; double expvel,expveldev; double xexpfact,yexpfact,zexpfact; double airres; double decrate; double traillen; void (*cfunc)(Particle *part,Firework *work); void (*mfunc)(Particle *part,Firework *work); }; typedef struct PT_Template PT_Template; struct Firework { double x,y,z; double dx,dy,dz; long int explodetime; double timer; double launchvel,launchveldev; double sidevel; double dyexplode; int exploded; int trailpos; int numparts; int numkinds; int flags; int current_part; double spark_int; double last_spark_time; PT_Template **ptemplates; Particle *parts; Firework *nextwork; }; /* Firework flags */ #define WORK_SPARKLER 1 struct FW_Template { char *name; double x,y,z; double launchvel,launchveldev; double sidevel; double dyexplode; int numparts; int numkinds; int flags; PT_Template *ptemplates[MAXPARTKINDS]; }; typedef struct FW_Template FW_Template; Firework *NewWork(FW_Template *template); void DeleteWork(Firework *work); GLubyte *read_JPEG_file(char *); /* Position modulation functions */ void xz_wobble(Particle *part,Firework *work); /* Color modulation functions */ void redmod(Particle *part,Firework *work); void flash(Particle *part,Firework *work); void fallcol(Particle *part,Firework *work); /* Parser functions */ int ParseDisplayFile(char *filename); int CheckDisplay(); void UpdateDisplay(double elapsed); Firework *GetWork(void); void RestartDisplay(void); /* Particles */ extern PT_Template pt_white; extern PT_Template pt_red; extern PT_Template pt_inside; extern PT_Template pt_outside; extern PT_Template pt_purple; extern PT_Template pt_cyan; extern PT_Template pt_cyanring; extern PT_Template pt_xz_wobble; extern PT_Template pt_rg; extern PT_Template pt_yellow; extern PT_Template pt_lilyel; extern PT_Template pt_rb; extern PT_Template pt_yellgrn; extern PT_Template pt_purpblue; extern PT_Template pt_bluexline; extern PT_Template pt_blueyline; extern PT_Template pt_bluezline; extern PT_Template pt_whitespark; extern PT_Template pt_goldenspark; extern PT_Template pt_rgspark; extern PT_Template pt_cyanvertring; extern PT_Template pt_rbspark; /* Fireworks */ extern FW_Template fw_white; extern FW_Template fw_rednwhite; extern FW_Template fw_innout; extern FW_Template fw_spray; extern FW_Template fw_xz_wobble; extern FW_Template fw_rg; extern FW_Template fw_lilyel; extern FW_Template fw_rb; extern FW_Template fw_purple; extern FW_Template fw_cyan; extern FW_Template fw_yellow; extern FW_Template fw_ring; extern FW_Template fw_yellgrn; extern FW_Template fw_puprblue; extern FW_Template fw_cross; extern FW_Template fw_whitespark; extern FW_Template fw_goldenspark; extern FW_Template fw_rgspark; extern FW_Template fw_vertring; extern FW_Template fw_rbspark; #define NUMWORKS 20 extern FW_Template *Fireworks[];