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