1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc. 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version. 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful, 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of 111b0eae1b322d3164b83c3f6346999da8c4916fa6Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details. 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "quakedef.h" 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "r_local.h" 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define MAX_PARTICLES 2048 // default max # of particles at one 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // time 26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define ABSOLUTE_MIN_PARTICLES 512 // no fewer than this no matter what's 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // on the command line 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint ramp1[8] = {0x6f, 0x6d, 0x6b, 0x69, 0x67, 0x65, 0x63, 0x61}; 30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint ramp2[8] = {0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x68, 0x66}; 31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint ramp3[8] = {0x6d, 0x6b, 6, 5, 4, 3}; 32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichparticle_t *active_particles, *free_particles; 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichparticle_t *particles; 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint r_numparticles; 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvec3_t r_pright, r_pup, r_ppn; 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_InitParticles 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_InitParticles (void) 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich i = COM_CheckParm ("-particles"); 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (i) 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r_numparticles = (int)(Q_atoi(com_argv[i+1])); 55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (r_numparticles < ABSOLUTE_MIN_PARTICLES) 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r_numparticles = ABSOLUTE_MIN_PARTICLES; 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r_numparticles = MAX_PARTICLES; 61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particles = (particle_t *) 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Hunk_AllocName (r_numparticles * sizeof(particle_t), "particles"); 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef QUAKE2 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_DarkFieldParticles (entity_t *ent) 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j, k; 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p; 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float vel; 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t dir; 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t org; 75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich org[0] = ent->origin[0]; 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich org[1] = ent->origin[1]; 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich org[2] = ent->origin[2]; 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=-16 ; i<16 ; i+=8) 80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=-16 ; j<16 ; j+=8) 81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (k=0 ; k<32 ; k+=8) 82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!free_particles) 84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = free_particles; 86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = p->next; 87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = active_particles; 88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = p; 891b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 0.2 + (rand()&7) * 0.02; 91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 150 + rand()%6; 92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_slowgrav; 931b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[0] = j*8; 95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[1] = i*8; 96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[2] = k*8; 971b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[0] = org[0] + i + (rand()&3); 99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[1] = org[1] + j + (rand()&3); 100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[2] = org[2] + k + (rand()&3); 1011b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 1021b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich VectorNormalize (dir); 103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vel = 50 + (rand()&63); 104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorScale (dir, vel, p->vel); 105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_EntityParticles 113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define NUMVERTEXNORMALS 162 117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern float r_avertexnormals[NUMVERTEXNORMALS][3]; 118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvec3_t avelocities[NUMVERTEXNORMALS]; 119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat beamlength = 16; 120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvec3_t avelocity = {23, 7, 3}; 121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat partstep = 0.01; 122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat timescale = 0.01; 123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_EntityParticles (entity_t *ent) 125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int count; 127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p; 129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float angle; 130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float sr, sp, sy, cr, cp, cy; 131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t forward; 132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float dist; 1331b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dist = 64; 135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich count = 50; 136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichif (!avelocities[0][0]) 138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfor (i=0 ; i<NUMVERTEXNORMALS*3 ; i++) 140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichavelocities[0][i] = (rand()&255) * 0.01; 141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<NUMVERTEXNORMALS ; i++) 145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich angle = cl.time * avelocities[i][0]; 147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sy = sin(angle); 148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cy = cos(angle); 149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich angle = cl.time * avelocities[i][1]; 150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sp = sin(angle); 151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cp = cos(angle); 152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich angle = cl.time * avelocities[i][2]; 153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sr = sin(angle); 154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cr = cos(angle); 1551b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich forward[0] = cp*cy; 157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich forward[1] = cp*sy; 158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich forward[2] = -sp; 159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!free_particles) 161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = free_particles; 163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = p->next; 164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = active_particles; 165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = p; 166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 0.01; 168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 0x6f; 169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_explode; 1701b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 1711b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich p->org[0] = ent->origin[0] + r_avertexnormals[i][0]*dist + forward[0]*beamlength; 1721b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich p->org[1] = ent->origin[1] + r_avertexnormals[i][1]*dist + forward[1]*beamlength; 1731b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich p->org[2] = ent->origin[2] + r_avertexnormals[i][2]*dist + forward[2]*beamlength; 174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_ClearParticles 181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_ClearParticles (void) 184cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 1861b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = &particles[0]; 188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = NULL; 189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ;i<r_numparticles ; i++) 191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particles[i].next = &particles[i+1]; 192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particles[r_numparticles-1].next = NULL; 193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_ReadPointFile_f (void) 197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich FILE *f; 199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t org; 200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int r; 201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int c; 202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p; 203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char name[MAX_OSPATH]; 2041b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sprintf (name,"maps/%s.pts", sv.name); 206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich COM_FOpenFile (name, &f); 208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!f) 209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("couldn't open %s\n", name); 211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 2131b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("Reading %s...\n", name); 215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich c = 0; 216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for ( ;; ) 217cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 218cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r = fscanf (f,"%f %f %f\n", &org[0], &org[1], &org[2]); 219cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (r != 3) 220cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 221cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich c++; 2221b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 223cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!free_particles) 224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("Not enough free particles\n"); 226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = free_particles; 229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = p->next; 230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = active_particles; 231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = p; 2321b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = 99999; 234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = (-c)&15; 235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_static; 236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (vec3_origin, p->vel); 237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (org, p->org); 238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 239cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 240cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fclose (f); 241cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("%i points read\n", c); 242cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 243cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 244cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 245cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 246cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_ParseParticleEffect 247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 248cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichParse an effect out of the server message 249cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_ParseParticleEffect (void) 252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t org, dir; 254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, count, msgcount, color; 2551b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<3 ; i++) 257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich org[i] = MSG_ReadCoord (); 258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<3 ; i++) 259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[i] = MSG_ReadChar () * (1.0/16); 260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich msgcount = MSG_ReadByte (); 261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich color = MSG_ReadByte (); 262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichif (msgcount == 255) 264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich count = 1024; 265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichelse 266cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich count = msgcount; 2671b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 268cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich R_RunParticleEffect (org, dir, color, count); 269cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 2701b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 271cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 272cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 273cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_ParticleExplosion 274cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_ParticleExplosion (vec3_t org) 278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j; 280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p; 2811b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<1024 ; i++) 283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!free_particles) 285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = free_particles; 287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = p->next; 288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = active_particles; 289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = p; 290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 5; 292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = ramp1[0]; 293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->ramp = rand()&3; 294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (i & 1) 295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_explode; 297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = org[j] + ((rand()%32)-16); 300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[j] = (rand()%512)-256; 301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_explode2; 306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = org[j] + ((rand()%32)-16); 309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[j] = (rand()%512)-256; 310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_ParticleExplosion2 318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_ParticleExplosion2 (vec3_t org, int colorStart, int colorLength) 322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j; 324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p; 325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int colorMod = 0; 326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0; i<512; i++) 328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!free_particles) 330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = free_particles; 332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = p->next; 333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = active_particles; 334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = p; 335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 0.3; 337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = colorStart + (colorMod % colorLength); 338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich colorMod++; 339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_blob; 341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = org[j] + ((rand()%32)-16); 344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[j] = (rand()%512)-256; 345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_BlobExplosion 352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_BlobExplosion (vec3_t org) 356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j; 358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p; 3591b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 360cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<1024 ; i++) 361cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 362cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!free_particles) 363cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 364cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = free_particles; 365cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = p->next; 366cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = active_particles; 367cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = p; 368cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 369cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 1 + (rand()&8)*0.05; 370cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 371cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (i & 1) 372cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 373cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_blob; 374cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 66 + rand()%6; 375cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 376cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 377cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = org[j] + ((rand()%32)-16); 378cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[j] = (rand()%512)-256; 379cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 380cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 381cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 382cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 383cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_blob2; 384cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 150 + rand()%6; 385cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 386cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 387cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = org[j] + ((rand()%32)-16); 388cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[j] = (rand()%512)-256; 389cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 390cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 391cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 392cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 393cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 394cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 395cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 396cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_RunParticleEffect 397cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 398cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 399cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 400cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_RunParticleEffect (vec3_t org, vec3_t dir, int color, int count) 401cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 402cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j; 403cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p; 4041b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 405cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<count ; i++) 406cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 407cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!free_particles) 408cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 409cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = free_particles; 410cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = p->next; 411cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = active_particles; 412cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = p; 413cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 414cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (count == 1024) 415cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { // rocket explosion 416cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 5; 417cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = ramp1[0]; 418cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->ramp = rand()&3; 419cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (i & 1) 420cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 421cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_explode; 422cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 423cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 424cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = org[j] + ((rand()%32)-16); 425cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[j] = (rand()%512)-256; 426cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 427cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 428cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 429cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 430cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_explode2; 431cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 432cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 433cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = org[j] + ((rand()%32)-16); 434cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[j] = (rand()%512)-256; 435cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 436cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 437cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 438cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 439cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 440cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 0.1*(rand()%5); 441cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = (color&~7) + (rand()&7); 442cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_slowgrav; 443cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 444cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 445cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = org[j] + ((rand()&15)-8); 446cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[j] = dir[j]*15;// + (rand()%300)-150; 447cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 448cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 449cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 450cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 451cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 452cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 453cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 454cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 455cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_LavaSplash 456cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 457cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 458cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 459cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_LavaSplash (vec3_t org) 460cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 461cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j, k; 462cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p; 463cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float vel; 464cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t dir; 465cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 466cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=-16 ; i<16 ; i++) 467cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=-16 ; j<16 ; j++) 468cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (k=0 ; k<1 ; k++) 469cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 470cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!free_particles) 471cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 472cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = free_particles; 473cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = p->next; 474cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = active_particles; 475cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = p; 4761b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 477cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 2 + (rand()&31) * 0.02; 478cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 224 + (rand()&7); 479cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_slowgrav; 4801b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 481cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[0] = j*8 + (rand()&7); 482cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[1] = i*8 + (rand()&7); 483cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[2] = 256; 4841b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 485cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[0] = org[0] + dir[0]; 486cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[1] = org[1] + dir[1]; 487cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[2] = org[2] + (rand()&63); 4881b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 4891b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich VectorNormalize (dir); 490cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vel = 50 + (rand()&63); 491cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorScale (dir, vel, p->vel); 492cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 493cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 494cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 495cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 496cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 497cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_TeleportSplash 498cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 499cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 500cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 501cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_TeleportSplash (vec3_t org) 502cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 503cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j, k; 504cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p; 505cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float vel; 506cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t dir; 507cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 508cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=-16 ; i<16 ; i+=4) 509cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=-16 ; j<16 ; j+=4) 510cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (k=-24 ; k<32 ; k+=4) 511cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 512cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!free_particles) 513cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 514cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = free_particles; 515cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = p->next; 516cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = active_particles; 517cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = p; 5181b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 519cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 0.2 + (rand()&7) * 0.02; 520cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 7 + (rand()&7); 521cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_slowgrav; 5221b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 523cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[0] = j*8; 524cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[1] = i*8; 525cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[2] = k*8; 5261b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 527cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[0] = org[0] + i + (rand()&3); 528cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[1] = org[1] + j + (rand()&3); 529cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[2] = org[2] + k + (rand()&3); 5301b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 5311b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich VectorNormalize (dir); 532cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vel = 50 + (rand()&63); 533cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorScale (dir, vel, p->vel); 534cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 535cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 536cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 537cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_RocketTrail (vec3_t start, vec3_t end, int type) 538cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 539cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t vec; 540cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float len; 541cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int j; 542cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p; 543cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int dec; 544cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich static int tracercount; 545cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 546cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorSubtract (end, start, vec); 547cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich len = VectorNormalize (vec); 548cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (type < 128) 549cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dec = 3; 550cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 551cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 552cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dec = 1; 553cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich type -= 128; 554cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 555cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 556cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich while (len > 0) 557cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 558cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich len -= dec; 559cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 560cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!free_particles) 561cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 562cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = free_particles; 563cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = p->next; 564cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = active_particles; 565cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = p; 5661b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 567cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (vec3_origin, p->vel); 568cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 2; 569cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 570cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (type) 571cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 572cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 0: // rocket trail 573cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->ramp = (rand()&3); 574cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = ramp3[(int)p->ramp]; 575cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_fire; 576cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 577cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = start[j] + ((rand()%6)-3); 578cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 579cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 580cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 1: // smoke smoke 581cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->ramp = (rand()&3) + 2; 582cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = ramp3[(int)p->ramp]; 583cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_fire; 584cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 585cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = start[j] + ((rand()%6)-3); 586cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 587cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 588cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 2: // blood 589cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_grav; 590cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 67 + (rand()&3); 591cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 592cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = start[j] + ((rand()%6)-3); 593cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 594cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 595cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 3: 596cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 5: // tracer 597cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 0.5; 598cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_static; 599cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (type == 3) 600cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 52 + ((tracercount&4)<<1); 601cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 602cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 230 + ((tracercount&4)<<1); 6031b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 604cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich tracercount++; 605cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 606cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (start, p->org); 607cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (tracercount & 1) 608cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 609cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[0] = 30*vec[1]; 610cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[1] = 30*-vec[0]; 611cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 612cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 613cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 614cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[0] = 30*-vec[1]; 615cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[1] = 30*vec[0]; 616cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 617cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 618cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 619cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 4: // slight blood 620cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_grav; 621cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 67 + (rand()&3); 622cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 623cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = start[j] + ((rand()%6)-3); 624cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich len -= 3; 625cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 626cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 627cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 6: // voor trail 628cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = 9*16 + 8 + (rand()&3); 629cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->type = pt_static; 630cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = cl.time + 0.3; 631cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 632cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[j] = start[j] + ((rand()&15)-8); 633cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 634cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 6351b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 636cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 637cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorAdd (start, vec, start); 638cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 639cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 640cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 641cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 642cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 643cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 644cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_DrawParticles 645cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 646cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 647cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern cvar_t sv_gravity; 648cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 649cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_DrawParticles (void) 650cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 651cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particle_t *p, *kill; 652cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float grav; 653cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 654cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float time2, time3; 655cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float time1; 656cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float dvel; 657cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float frametime; 658cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES 659cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float* pPos = gVertexBuffer; 660cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned char* pColor = (unsigned char*) gColorBuffer; 661cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned char* pUV = (unsigned char*) gTexCoordBuffer; 662cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int particleIndex = 0; 663cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int maxParticleIndex = (int) sizeof(gVertexBuffer) / (sizeof(float) * 3) - 3; 664cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 665cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef GLQUAKE 666cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t up, right; 667cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float scale; 668cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 669f343e13d48b72e893dbc8f0a44c93a4977ac48b5Jack Palevich GL_Bind(particletexture); 670cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 671cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnable (GL_BLEND); 672cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 6731b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 674cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES 675cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnableClientState(GL_COLOR_ARRAY); 676f343e13d48b72e893dbc8f0a44c93a4977ac48b5Jack Palevich glVertexPointer(3, GL_FLOAT, 0, gVertexBuffer); 677cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexCoordPointer(2, GL_BYTE, 0, gTexCoordBuffer); 6781b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich glColorPointer(4, GL_UNSIGNED_BYTE, 0, gColorBuffer); 679cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); 680cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 681cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glBegin (GL_TRIANGLES); 682cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 683cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 684cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorScale (vup, 1.5, up); 685cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorScale (vright, 1.5, right); 686cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 687cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich D_StartParticles (); 688cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 689cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorScale (vright, xscaleshrink, r_pright); 690cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorScale (vup, yscaleshrink, r_pup); 691cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (vpn, r_ppn); 692cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 693cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich frametime = cl.time - cl.oldtime; 694cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich time3 = frametime * 15; 695cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich time2 = frametime * 10; // 15; 696cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich time1 = frametime * 5; 697cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich grav = frametime * sv_gravity.value * 0.05; 698cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dvel = 4*frametime; 6991b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 7001b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich for ( ;; ) 701cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 702cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich kill = active_particles; 703cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (kill && kill->die < cl.time) 704cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 705cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich active_particles = kill->next; 706cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich kill->next = free_particles; 707cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = kill; 708cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 709cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 710cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 711cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 712cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 713cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (p=active_particles ; p ; p=p->next) 714cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 715cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for ( ;; ) 716cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 717cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich kill = p->next; 718cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (kill && kill->die < cl.time) 719cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 720cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->next = kill->next; 721cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich kill->next = free_particles; 722cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free_particles = kill; 723cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 724cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 725cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 726cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 727cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 728cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef GLQUAKE 729cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // hack a scale up to keep particles from disapearing 730cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich scale = (p->org[0] - r_origin[0])*vpn[0] + (p->org[1] - r_origin[1])*vpn[1] 731cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich + (p->org[2] - r_origin[2])*vpn[2]; 732cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (scale < 20) 733cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich scale = 1; 734cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 735cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich scale = 1 + scale * 0.004; 736cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES 737cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 738cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if(particleIndex >= maxParticleIndex) 739cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 740cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glDrawArrays(GL_TRIANGLES, 0, particleIndex); 741cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particleIndex = 0; 742cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pPos = gVertexBuffer; 743cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pColor = (unsigned char*) gColorBuffer; 744cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pUV = (unsigned char*) gTexCoordBuffer; 745cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 7461b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 747cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich memcpy(pColor, (byte *)&d_8to24table[(int)p->color], 3); 748f343e13d48b72e893dbc8f0a44c93a4977ac48b5Jack Palevich pColor[3] = 255; 7491b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich pColor += 4; 750cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pUV++ = 0; 751cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pUV++ = 0; 752cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pPos++ = p->org[0]; 753cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pPos++ = p->org[1]; 754cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pPos++ = p->org[2]; 755cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 756cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich memcpy(pColor, (byte *)&d_8to24table[(int)p->color], 3); 757f343e13d48b72e893dbc8f0a44c93a4977ac48b5Jack Palevich pColor[3] = 255; 7581b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich pColor += 4; 759f343e13d48b72e893dbc8f0a44c93a4977ac48b5Jack Palevich *pUV++ = 1; 760cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pUV++ = 0; 761cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pPos++ = p->org[0] + up[0]*scale; 762cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pPos++ = p->org[1] + up[1]*scale; 763cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pPos++ = p->org[2] + up[2]*scale; 764cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 765cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich memcpy(pColor, (byte *)&d_8to24table[(int)p->color], 3); 766f343e13d48b72e893dbc8f0a44c93a4977ac48b5Jack Palevich pColor[3] = 255; 7671b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich pColor += 4; 768cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pUV++ = 0; 769f343e13d48b72e893dbc8f0a44c93a4977ac48b5Jack Palevich *pUV++ = 1; 770cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pPos++ = p->org[0] + right[0]*scale; 771cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pPos++ = p->org[1] + right[1]*scale; 772cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pPos++ = p->org[2] + right[2]*scale; 7731b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 774cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich particleIndex += 3; 7751b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 776cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 777cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glColor3ubv ((byte *)&d_8to24table[(int)p->color]); 778cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexCoord2f (0,0); 779cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glVertex3fv (p->org); 780cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexCoord2f (1,0); 781cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glVertex3f (p->org[0] + up[0]*scale, p->org[1] + up[1]*scale, p->org[2] + up[2]*scale); 782cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexCoord2f (0,1); 783cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glVertex3f (p->org[0] + right[0]*scale, p->org[1] + right[1]*scale, p->org[2] + right[2]*scale); 784cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif // !USE_OPENGLES 785cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 786cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich D_DrawParticle (p); 787cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 788cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[0] += p->vel[0]*frametime; 789cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[1] += p->vel[1]*frametime; 790cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->org[2] += p->vel[2]*frametime; 7911b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich 792cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (p->type) 793cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 794cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case pt_static: 795cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 796cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case pt_fire: 797cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->ramp += time1; 798cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (p->ramp >= 6) 799cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = -1; 800cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 801cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = ramp3[(int)p->ramp]; 802cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[2] += grav; 803cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 804cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 805cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case pt_explode: 806cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->ramp += time2; 807cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (p->ramp >=8) 808cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = -1; 809cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 810cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = ramp1[(int)p->ramp]; 811cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<3 ; i++) 812cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[i] += p->vel[i]*dvel; 813cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[2] -= grav; 814cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 815cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 816cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case pt_explode2: 817cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->ramp += time3; 818cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (p->ramp >=8) 819cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->die = -1; 820cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 821cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->color = ramp2[(int)p->ramp]; 822cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<3 ; i++) 823cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[i] -= p->vel[i]*frametime; 824cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[2] -= grav; 825cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 826cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 827cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case pt_blob: 828cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<3 ; i++) 829cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[i] += p->vel[i]*dvel; 830cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[2] -= grav; 831cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 832cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 833cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case pt_blob2: 834cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<2 ; i++) 835cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[i] -= p->vel[i]*dvel; 836cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[2] -= grav; 837cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 838cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 839cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case pt_grav: 840cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef QUAKE2 841cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[2] -= grav * 20; 842cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 843cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 844cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case pt_slowgrav: 845cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p->vel[2] -= grav; 846cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 847cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich default: 848cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 849cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 850cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 851cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 852cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef GLQUAKE 853cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES 8541b0eae1b322d3164b83c3f6346999da8c4916fa6Jack Palevich glDrawArrays(GL_TRIANGLES, 0, particleIndex); 855cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glDisableClientState(GL_COLOR_ARRAY); 856cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 857cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 858cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnd (); 859cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 860cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glDisable (GL_BLEND); 861cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 862cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 863cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich D_EndParticles (); 864cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 865cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 866cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 867