#ifndef _PARTICLES_H_ #define _PARTICLES_H_ extern int pt_gunshot, ptdp_gunshotquad, pt_spike, ptdp_spikequad, pt_superspike, ptdp_superspikequad, pt_wizspike, pt_knightspike, pt_explosion, ptdp_explosionquad, pt_tarexplosion, pt_teleportsplash, pt_lavasplash, ptdp_smallflash, ptdp_flamejet, ptdp_flame, ptdp_blood, ptdp_spark, ptdp_plasmaburn, ptdp_tei_g3, ptdp_tei_smoke, ptdp_tei_bigexplosion, ptdp_tei_plasmahit, ptdp_stardust, rt_rocket, rt_grenade, rt_blood, rt_wizspike, rt_slightblood, rt_knightspike, rt_vorespike, rtdp_nexuizplasma, rtdp_glowtrail, ptqw_blood, ptqw_lightningblood, rtqw_railtrail, //common to zquake/fuhquake/fte ptfte_bullet, ptfte_superbullet; #ifdef Q2CLIENT /*WARNING: must match cl_tent.c*/ typedef enum { /*MUST start with standard q2 te effects*/ Q2TE_GUNSHOT = 0, //0 Q2TE_BLOOD, Q2TE_BLASTER, Q2TE_RAILTRAIL, Q2TE_SHOTGUN, Q2TE_EXPLOSION1, Q2TE_EXPLOSION2, Q2TE_ROCKET_EXPLOSION, Q2TE_GRENADE_EXPLOSION, Q2TE_SPARKS, Q2TE_SPLASH, //10 Q2TE_BUBBLETRAIL, Q2TE_SCREEN_SPARKS, Q2TE_SHIELD_SPARKS, Q2TE_BULLET_SPARKS, Q2TE_LASER_SPARKS, Q2TE_PARASITE_ATTACK, Q2TE_ROCKET_EXPLOSION_WATER, Q2TE_GRENADE_EXPLOSION_WATER, Q2TE_MEDIC_CABLE_ATTACK, Q2TE_BFG_EXPLOSION, //20 Q2TE_BFG_BIGEXPLOSION, Q2TE_BOSSTPORT, // used as '22' in a map, so DON'T RENUMBER!!! Q2TE_BFG_LASER, Q2TE_GRAPPLE_CABLE, Q2TE_WELDING_SPARKS, Q2TE_GREENBLOOD, Q2TE_BLUEHYPERBLASTER, Q2TE_PLASMA_EXPLOSION, Q2TE_TUNNEL_SPARKS, //ROGUE Q2TE_BLASTER2, //30 Q2TE_RAILTRAIL2, Q2TE_FLAME, Q2TE_LIGHTNING, Q2TE_DEBUGTRAIL, Q2TE_PLAIN_EXPLOSION, Q2TE_FLASHLIGHT, Q2TE_FORCEWALL, Q2TE_HEATBEAM, Q2TE_MONSTER_HEATBEAM, Q2TE_STEAM, //40 Q2TE_BUBBLETRAIL2, Q2TE_MOREBLOOD, Q2TE_HEATBEAM_SPARKS, Q2TE_HEATBEAM_STEAM, Q2TE_CHAINFIST_SMOKE, Q2TE_ELECTRIC_SPARKS, Q2TE_TRACKER_EXPLOSION, Q2TE_TELEPORT_EFFECT, Q2TE_DBALL_GOAL, Q2TE_WIDOWBEAMOUT, //50 Q2TE_NUKEBLAST, Q2TE_WIDOWSPLASH, Q2TE_EXPLOSION1_BIG, Q2TE_EXPLOSION1_NP, Q2TE_FLECHETTE, //ROGUE //CODERED CRTE_LEADERBLASTER, //56 CRTE_BLASTER_MUZZLEFLASH, CRTE_BLUE_MUZZLEFLASH, CRTE_SMART_MUZZLEFLASH, CRTE_LEADERFIELD, //60 CRTE_DEATHFIELD, CRTE_BLASTERBEAM, CRTE_STAIN, CRTE_FIRE, CRTE_CABLEGUT, CRTE_SMOKE, //CODERED #define Q2TE_MAX CRTE_SMOKE /*splashes are somewhat special, but are dynamically indexed*/ Q2SPLASH_UNKNOWN, //0 Q2SPLASH_SPARKS, //1 Q2SPLASH_BLUE_WATER, //2 Q2SPLASH_BROWN_WATER, //3 Q2SPLASH_SLIME, //4 Q2SPLASH_LAVA, //5 Q2SPLASH_BLOOD, //6 #define Q2SPLASH_MAX Q2SPLASH_BLOOD /*free form*/ /*WARNING: must match cl_tent.c*/ Q2RT_BLASTERTRAIL, Q2RT_BLASTERTRAIL2, Q2RT_GIB, Q2RT_GREENGIB, Q2RT_ROCKET, Q2RT_GRENADE, Q2RT_TRAP, Q2RT_FLAG1, Q2RT_FLAG2, Q2RT_TAGTRAIL, Q2RT_TRACKER, Q2RT_IONRIPPER, Q2RT_PLASMA, Q2PT_BFGPARTICLES, Q2PT_FLIES, Q2PT_TRAP, Q2PT_TRACKERSHELL, Q2PT_RESPAWN, Q2PT_PLAYER_TELEPORT, Q2PT_FOOTSTEP, Q2PT_MAX } q2particleeffects_t; extern int pt_q2[]; #endif struct beamseg_s; typedef struct trailstate_s { struct trailstate_s **key; // key to check if ts has been overwriten struct trailstate_s *assoc; // assoc linked trail struct beamseg_s *lastbeam; // last beam pointer (flagged with BS_LASTSEG) union { float lastdist; // last distance used with particle effect float statetime; // time to emit effect again (used by spawntime field) } state1; union { float laststop; // last stopping point for particle effect float emittime; // used by r_effect emitters } state2; } trailstate_t; #define PARTICLE_Z_CLIP 8.0 typedef enum { BM_BLEND/*SRC_ALPHA ONE_MINUS_SRC_ALPHA*/, BM_BLENDCOLOUR/*SRC_COLOR ONE_MINUS_SRC_COLOR*/, BM_ADDA/*SRC_ALPHA ONE*/, BM_ADDC/*GL_SRC_COLOR GL_ONE*/, BM_SUBTRACT/*SRC_ALPHA ONE_MINUS_SRC_COLOR*/, BM_INVMODA/*ZERO ONE_MINUS_SRC_ALPHA*/, BM_INVMODC/*ZERO ONE_MINUS_SRC_COLOR*/, BM_PREMUL/*ONE ONE_MINUS_SRC_ALPHA*/, BM_RTSMOKE /*special shader generation that causes these particles to be lit up by nearby rtlights, instead of just being fullbright junk*/ } blendmode_t; #define frandom() (rand()*(1.0f/(float)RAND_MAX)) #define crandom() (rand()*(2.0f/(float)RAND_MAX)-1.0f) #define hrandom() (rand()*(1.0f/(float)RAND_MAX)-0.5f) #define P_INVALID -1 #define P_RunParticleEffectType(a,b,c,d) P_RunParticleEffectState(a,b,c,d,NULL) // used for callback extern cvar_t r_particlesdesc; extern cvar_t r_particlesystem; struct model_s; struct msurface_s; void P_InitParticleSystem(void); void P_ShutdownParticleSystem(void); void P_Shutdown(void); void P_LoadedModel(struct model_s *mod); /*checks a model's various effects*/ void P_DefaultTrail (unsigned int entityeffects, unsigned int modelflags, int *trailid, int *trailpalidx); void P_EmitEffect (vec3_t pos, vec3_t orientation[3], unsigned int modeleflags, int type, trailstate_t **tsk);//this is just a wrapper int P_FindParticleType(const char *efname); #ifdef PSET_SCRIPT void PScript_ClearSurfaceParticles(struct model_s *mod); #endif #define P_RunParticleEffectTypeString pe->RunParticleEffectTypeString #define P_ParticleTrail pe->ParticleTrail #define P_RunParticleEffectState pe->RunParticleEffectState #define P_RunParticleWeather pe->RunParticleWeather #define P_RunParticleCube pe->RunParticleCube #define P_RunParticleEffect pe->RunParticleEffect #define P_RunParticleEffect2 pe->RunParticleEffect2 #define P_RunParticleEffect3 pe->RunParticleEffect3 #define P_RunParticleEffect4 pe->RunParticleEffect4 #define P_RunParticleEffectPalette pe->RunParticleEffectPalette #define P_ParticleTrailIndex pe->ParticleTrailIndex #define P_InitParticles pe->InitParticles #define P_DelinkTrailstate pe->DelinkTrailstate #define P_ClearParticles pe->ClearParticles #define P_DrawParticles pe->DrawParticles typedef struct { char *name1; char *name2; int (*FindParticleType) (const char *name); qboolean (*ParticleQuery) (int type, int body, char *outstr, int outstrlen); int (*RunParticleEffectTypeString) (vec3_t org, vec3_t dir, float count, char *name); int (*ParticleTrail) (vec3_t startpos, vec3_t end, int type, float timeinterval, int dlkey, vec3_t dlaxis[3], trailstate_t **tsk); int (*RunParticleEffectState) (vec3_t org, vec3_t dir, float count, int typenum, trailstate_t **tsk); void (*RunParticleWeather) (vec3_t minb, vec3_t maxb, vec3_t dir, float count, int colour, char *efname); void (*RunParticleCube) (int typenum, vec3_t minb, vec3_t maxb, vec3_t dir_min, vec3_t dir_max, float count, int colour, qboolean gravity, float jitter); //typenum may be P_INVALID void (*RunParticleEffect) (vec3_t org, vec3_t dir, int color, int count); void (*RunParticleEffect2) (vec3_t org, vec3_t dmin, vec3_t dmax, int color, int effect, int count); void (*RunParticleEffect3) (vec3_t org, vec3_t box, int color, int effect, int count); void (*RunParticleEffect4) (vec3_t org, float radius, int color, int effect, int count); void (*RunParticleEffectPalette) (const char *nameprefix, vec3_t org, vec3_t dir, int color, int count); void (*ParticleTrailIndex) (vec3_t start, vec3_t end, int type, float timeinterval, int color, int crnd, trailstate_t **tsk); //P_INVALID is fine for the type here, you'll get a default trail. qboolean (*InitParticles) (void); void (*ShutdownParticles) (void); void (*DelinkTrailstate) (trailstate_t **tsk); void (*ClearParticles) (void); void (*DrawParticles) (void); } particleengine_t; extern particleengine_t *pe; #endif