spawnparams/spawnorg/spawnvel

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@938 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
TimeServ 2005-04-02 20:44:12 +00:00
parent 940f2ede3c
commit 87287f9d12
2 changed files with 69 additions and 22 deletions

View file

@ -311,7 +311,7 @@ void M_Menu_Particles_f (void)
int y = 32; int y = 32;
menu_t *menu; menu_t *menu;
int mgt; int mgt;
extern cvar_t r_bouncysparks, r_part_rain, gl_part_torch, gl_part_flame, gl_part_trifansparks; extern cvar_t r_bouncysparks, r_part_rain, gl_part_torch, gl_part_flame;
static const char *r_part_rain_options[] = { static const char *r_part_rain_options[] = {
"off", "off",

View file

@ -185,6 +185,10 @@ typedef struct part_type_s {
float scalefactor; float scalefactor;
float invscalefactor; float invscalefactor;
float spawnparam1;
float spawnparam2;
/* float spawnparam3; */
float offsetup; // make this into a vec3_t later with dir, possibly for mdls float offsetup; // make this into a vec3_t later with dir, possibly for mdls
enum {SM_BOX, SM_CIRCLE, SM_BALL, SM_SPIRAL, SM_TRACER, SM_TELEBOX, SM_LAVASPLASH, SM_UNICIRCLE, SM_FIELD} spawnmode; enum {SM_BOX, SM_CIRCLE, SM_BALL, SM_SPIRAL, SM_TRACER, SM_TELEBOX, SM_LAVASPLASH, SM_UNICIRCLE, SM_FIELD} spawnmode;
@ -602,6 +606,7 @@ void P_ParticleEffect_f(void)
else if (!strcmp(var, "emitstart")) else if (!strcmp(var, "emitstart"))
ptype->emitstart = atof(value); ptype->emitstart = atof(value);
// old names
else if (!strcmp(var, "areaspread")) else if (!strcmp(var, "areaspread"))
ptype->areaspread = atof(value); ptype->areaspread = atof(value);
else if (!strcmp(var, "areaspreadvert")) else if (!strcmp(var, "areaspreadvert"))
@ -610,6 +615,31 @@ void P_ParticleEffect_f(void)
ptype->offsetspread = atof(value); ptype->offsetspread = atof(value);
else if (!strcmp(var, "offsetspreadvert")) else if (!strcmp(var, "offsetspreadvert"))
ptype->offsetspreadvert = atof(value); ptype->offsetspreadvert = atof(value);
// new names
else if (!strcmp(var, "spawnorg"))
{
ptype->areaspreadvert = ptype->areaspread = atof(value);
if (Cmd_Argc()>2)
ptype->areaspreadvert = atof(Cmd_Argv(2));
}
else if (!strcmp(var, "spawnvel"))
{
ptype->offsetspreadvert = ptype->offsetspread = atof(value);
if (Cmd_Argc()>2)
ptype->offsetspreadvert = atof(Cmd_Argv(2));
}
// spawn mode param fields
else if (!strcmp(var, "spawnparam1"))
ptype->spawnparam1 = atof(value);
else if (!strcmp(var, "spawnparam2"))
ptype->spawnparam2 = atof(value);
/* else if (!strcmp(var, "spawnparam3"))
ptype->spawnparam3 = atof(value); */
else if (!strcmp(var, "up")) else if (!strcmp(var, "up"))
ptype->offsetup = atof(value); ptype->offsetup = atof(value);
else if (!strcmp(var, "rampmode")) else if (!strcmp(var, "rampmode"))
@ -1583,7 +1613,7 @@ int P_RunParticleEffectTypeString (vec3_t org, vec3_t dir, float count, char *na
int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum) int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
{ {
part_type_t *ptype = &part_type[typenum]; part_type_t *ptype = &part_type[typenum];
int i, j, k, l; int i, j, k, l, spawnspc;
float m; float m;
particle_t *p; particle_t *p;
beamseg_t *b, *bfirst; beamseg_t *b, *bfirst;
@ -1603,6 +1633,8 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
{ {
// init spawn specific variables // init spawn specific variables
b = bfirst = NULL; b = bfirst = NULL;
spawnspc = 8;
switch (ptype->spawnmode) switch (ptype->spawnmode)
{ {
case SM_UNICIRCLE: case SM_UNICIRCLE:
@ -1614,11 +1646,22 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
m = 0; m = 0;
else else
m = (M_PI*2)/m; m = (M_PI*2)/m;
if (ptype->spawnparam1) /* use for weird shape hacks */
m *= ptype->spawnparam1;
break; break;
case SM_TELEBOX: case SM_TELEBOX:
spawnspc = 4;
l = -ptype->areaspreadvert; l = -ptype->areaspreadvert;
case SM_LAVASPLASH: case SM_LAVASPLASH:
j = k = -ptype->areaspread; j = k = -ptype->areaspread;
if (ptype->spawnparam1)
m = ptype->spawnparam1;
else
m = 0.55752; /* default weird number for tele/lavasplash used in vanilla Q1 */
if (ptype->spawnparam2)
spawnspc = (int)ptype->spawnparam2;
break; break;
case SM_FIELD: case SM_FIELD:
if (!avelocities[0][0]) if (!avelocities[0][0])
@ -1722,23 +1765,23 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
ofsvec[1] = j; ofsvec[1] = j;
ofsvec[2] = l+4; ofsvec[2] = l+4;
VectorNormalize(ofsvec); VectorNormalize(ofsvec);
VectorScale(ofsvec, 1.0-(frandom())*0.55752, ofsvec); VectorScale(ofsvec, 1.0-(frandom())*m, ofsvec);
// org is just like the original // org is just like the original
arsvec[0] = j + (rand()&3); arsvec[0] = j + (rand()%spawnspc);
arsvec[1] = k + (rand()&3); arsvec[1] = k + (rand()%spawnspc);
arsvec[2] = l + (rand()&3); arsvec[2] = l + (rand()%spawnspc);
// advance telebox loop // advance telebox loop
j += 4; j += spawnspc;
if (j >= ptype->areaspread) if (j >= ptype->areaspread)
{ {
j = -ptype->areaspread; j = -ptype->areaspread;
k += 4; k += spawnspc;
if (k >= ptype->areaspread) if (k >= ptype->areaspread)
{ {
k = -ptype->areaspread; k = -ptype->areaspread;
l += 4; l += spawnspc;
if (l >= ptype->areaspreadvert) if (l >= ptype->areaspreadvert)
l = -ptype->areaspreadvert; l = -ptype->areaspreadvert;
} }
@ -1746,8 +1789,8 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
break; break;
case SM_LAVASPLASH: case SM_LAVASPLASH:
// calc directions, org with temp vector // calc directions, org with temp vector
ofsvec[0] = k*8 + (rand()&7); ofsvec[0] = k*spawnspc + (rand()%spawnspc);
ofsvec[1] = j*8 + (rand()&7); ofsvec[1] = j*spawnspc + (rand()%spawnspc);
ofsvec[2] = 256; ofsvec[2] = 256;
arsvec[0] = ofsvec[0]; arsvec[0] = ofsvec[0];
@ -1755,9 +1798,9 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
arsvec[2] = frandom()*ptype->areaspreadvert; arsvec[2] = frandom()*ptype->areaspreadvert;
VectorNormalize(ofsvec); VectorNormalize(ofsvec);
VectorScale(ofsvec, 1.0-(frandom())*0.55752, ofsvec); VectorScale(ofsvec, 1.0-(frandom())*m, ofsvec);
// advance splash loop // advance splash loop (fix this)
j++; j++;
if (j >= ptype->areaspread) if (j >= ptype->areaspread)
{ {
@ -2083,6 +2126,7 @@ int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t *ts)
float randvel = ptype->randomvel; float randvel = ptype->randomvel;
float step; float step;
float stop; float stop;
float tdegree = 1/50; /* MSVC whine */
if (!ptype->loaded) if (!ptype->loaded)
return 1; return 1;
@ -2118,9 +2162,9 @@ int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t *ts)
{ {
VectorVectors(vec, right, up); VectorVectors(vec, right, up);
//nice idea, stops areaspread/offsetspread being so seperate. // precalculate degree of rotation
// VectorScale(right, ptype->offsetspread, right); if (ptype->spawnparam1)
// VectorScale(up, ptype->offsetspread, up); tdegree = ptype->spawnparam1*M_PI/180; /* degrees per quake unit */
} }
if (ts) if (ts)
@ -2193,7 +2237,10 @@ int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t *ts)
p->color = 0; p->color = 0;
// if (ptype->spawnmode == SM_TRACER) // if (ptype->spawnmode == SM_TRACER)
tcount = (int)(len * ptype->count); if (ptype->spawnparam1)
tcount = (int)(len * ptype->count / ptype->spawnparam1);
else
tcount = (int)(len * ptype->count);
if (ptype->colorindex >= 0) if (ptype->colorindex >= 0)
{ {
@ -2259,15 +2306,15 @@ int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t *ts)
{ {
float tsin, tcos; float tsin, tcos;
tcos = cos(len/50)*ptype->areaspread; tcos = cos(len*tdegree)*ptype->areaspread;
tsin = sin(len/50)*ptype->areaspread; tsin = sin(len*tdegree)*ptype->areaspread;
p->org[0] = start[0] + right[0]*tcos + up[0]*tsin; p->org[0] = start[0] + right[0]*tcos + up[0]*tsin;
p->org[1] = start[1] + right[1]*tcos + up[1]*tsin; p->org[1] = start[1] + right[1]*tcos + up[1]*tsin;
p->org[2] = start[2] + right[2]*tcos + up[2]*tsin; p->org[2] = start[2] + right[2]*tcos + up[2]*tsin;
tcos = cos(len/50)*ptype->offsetspread; tcos = cos(len*tdegree)*ptype->offsetspread;
tsin = sin(len/50)*ptype->offsetspread; tsin = sin(len*tdegree)*ptype->offsetspread;
p->vel[0] = vec[0]*veladd+crandom()*randvel + right[0]*tcos + up[0]*tsin; p->vel[0] = vec[0]*veladd+crandom()*randvel + right[0]*tcos + up[0]*tsin;
p->vel[1] = vec[1]*veladd+crandom()*randvel + right[1]*tcos + up[1]*tsin; p->vel[1] = vec[1]*veladd+crandom()*randvel + right[1]*tcos + up[1]*tsin;