m_accel/m_accel_noforce/m_threshold_noforce added, m_filter fixed up
added particle fields inwater and spawnchance changed particle field timelimit -> spawntime emit state is now kept (fixes rid# 1015648 FINALLY) git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1203 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
c30d79eb31
commit
83cc102208
22 changed files with 390 additions and 255 deletions
|
@ -1520,6 +1520,7 @@ void CL_LinkPacketEntities (void)
|
|||
}
|
||||
|
||||
cl_numvisedicts++;
|
||||
|
||||
ent->visframe = 0;
|
||||
|
||||
ent->keynum = s1->number;
|
||||
|
@ -1636,6 +1637,7 @@ void CL_LinkPacketEntities (void)
|
|||
if (i == cl_oldnumvisedicts)
|
||||
{
|
||||
P_DelinkTrailstate(&(cl.lerpents[s1->number].trailstate));
|
||||
P_DelinkTrailstate(&(cl.lerpents[s1->number].emitstate));
|
||||
continue; // not in last message
|
||||
}
|
||||
|
||||
|
|
|
@ -124,6 +124,7 @@ typedef struct
|
|||
vec3_t start, end;
|
||||
int particleeffect;
|
||||
trailstate_t *trailstate;
|
||||
trailstate_t *emitstate;
|
||||
} beam_t;
|
||||
|
||||
beam_t cl_beams[MAX_BEAMS];
|
||||
|
@ -334,6 +335,8 @@ void CL_AddBeam (int tent, int ent, vec3_t start, vec3_t end) //fixme: use TE_ n
|
|||
|
||||
model_t *m;
|
||||
int btype, etype;
|
||||
vec3_t impact, normal;
|
||||
vec3_t extra;
|
||||
|
||||
switch(tent)
|
||||
{
|
||||
|
@ -384,17 +387,11 @@ void CL_AddBeam (int tent, int ent, vec3_t start, vec3_t end) //fixme: use TE_ n
|
|||
|
||||
if (cls.state == ca_active && etype >= 0)
|
||||
{
|
||||
vec3_t impact, normal;
|
||||
vec3_t extra;
|
||||
VectorSubtract(end, start, normal);
|
||||
VectorNormalize(normal);
|
||||
VectorMA(end, 4, normal, extra); //extend the end-point by four
|
||||
if (TraceLineN(start, extra, impact, normal))
|
||||
{
|
||||
P_RunParticleEffectType(impact, normal, 1, etype);
|
||||
R_AddDecals(end);
|
||||
R_AddStain(end, -10, -10, -10, 20);
|
||||
}
|
||||
if (!TraceLineN(start, extra, impact, normal))
|
||||
etype = -1;
|
||||
}
|
||||
|
||||
b = CL_NewBeam(ent, -1);
|
||||
|
@ -413,6 +410,13 @@ void CL_AddBeam (int tent, int ent, vec3_t start, vec3_t end) //fixme: use TE_ n
|
|||
b->particleeffect = btype;
|
||||
VectorCopy (start, b->start);
|
||||
VectorCopy (end, b->end);
|
||||
|
||||
if (etype >= 0)
|
||||
{
|
||||
P_RunParticleEffectState (impact, normal, 1, etype, &(b->emitstate));
|
||||
R_AddDecals(end);
|
||||
R_AddStain(end, -10, -10, -10, 20);
|
||||
}
|
||||
}
|
||||
void CL_ParseBeam (int tent)
|
||||
{
|
||||
|
@ -2242,6 +2246,7 @@ void CL_UpdateBeams (void)
|
|||
if (b->endtime < cl.time)
|
||||
{
|
||||
P_DelinkTrailstate(&b->trailstate);
|
||||
P_DelinkTrailstate(&b->emitstate);
|
||||
b->model = NULL;
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -391,6 +391,7 @@ typedef struct {
|
|||
vec3_t origin;
|
||||
vec3_t angles;
|
||||
trailstate_t *trailstate; //when to next throw out a trail
|
||||
trailstate_t *emitstate; //when to next emit
|
||||
unsigned short frame;
|
||||
} lerpents_t;
|
||||
//
|
||||
|
|
|
@ -290,8 +290,8 @@ void IN_Init (void)
|
|||
}
|
||||
void IN_Move (usercmd_t *cmd, int pnum) //add mouse movement to cmd
|
||||
{
|
||||
mouse_x *= sensitivity.value;
|
||||
mouse_y *= sensitivity.value;
|
||||
mouse_x *= sensitivity.value*in_sensitivity;
|
||||
mouse_y *= sensitivity.value*in_sensitivity;
|
||||
|
||||
|
||||
if (!cl.paused && mouseactive)
|
||||
|
|
|
@ -50,10 +50,14 @@ HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion,
|
|||
|
||||
// mouse variables
|
||||
cvar_t m_filter = {"m_filter","0"};
|
||||
cvar_t m_accel = {"m_accel", "0"};
|
||||
cvar_t m_forcewheel = {"m_forcewheel", "1"};
|
||||
cvar_t in_mwhook = {"in_mwhook","0", NULL, CVAR_ARCHIVE};
|
||||
cvar_t in_dinput = {"in_dinput","0", NULL, CVAR_ARCHIVE};
|
||||
|
||||
cvar_t m_accel_noforce = {"m_accel_noforce", "0"};
|
||||
cvar_t m_threshold_noforce = {"m_threshold_noforce", "0"};
|
||||
|
||||
cvar_t cl_keypad = {"cl_keypad", "0"};
|
||||
|
||||
typedef struct {
|
||||
|
@ -89,7 +93,7 @@ mouse_t serialmouse;
|
|||
//int mouse_x, mouse_y, old_mouse_x, old_mouse_y, mx_accum, my_accum;
|
||||
|
||||
static qboolean restore_spi;
|
||||
static int originalmouseparms[3], newmouseparms[3] = {0, 0, 1};
|
||||
static int originalmouseparms[3], newmouseparms[3] = {0, 0, 0};
|
||||
qboolean mouseinitialized;
|
||||
static qboolean mouseparmsvalid, mouseactivatetoggle;
|
||||
static qboolean mouseshowtoggle = 1;
|
||||
|
@ -1115,21 +1119,14 @@ void IN_StartupMouse (void)
|
|||
|
||||
if (mouseparmsvalid)
|
||||
{
|
||||
if ( COM_CheckParm ("-noforcemspd") )
|
||||
if ( m_accel_noforce.value )
|
||||
newmouseparms[2] = originalmouseparms[2];
|
||||
|
||||
if ( COM_CheckParm ("-noforcemaccel") )
|
||||
if ( m_threshold_noforce.value )
|
||||
{
|
||||
newmouseparms[0] = originalmouseparms[0];
|
||||
newmouseparms[1] = originalmouseparms[1];
|
||||
}
|
||||
|
||||
if ( COM_CheckParm ("-noforcemparms") )
|
||||
{
|
||||
newmouseparms[0] = originalmouseparms[0];
|
||||
newmouseparms[1] = originalmouseparms[1];
|
||||
newmouseparms[2] = originalmouseparms[2];
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USINGRAWINPUT
|
||||
|
@ -1199,11 +1196,29 @@ void IN_Init (void)
|
|||
|
||||
// mouse variables
|
||||
Cvar_Register (&m_filter, "Input stuff");
|
||||
Cvar_Register (&m_accel, "Input stuff");
|
||||
Cvar_Register (&m_forcewheel, "Input stuff");
|
||||
Cvar_Register (&in_mwhook, "Input stuff");
|
||||
|
||||
Cvar_Register (&in_dinput, "Input stuff");
|
||||
|
||||
Cvar_Register (&m_accel_noforce, "Input stuff");
|
||||
Cvar_Register (&m_threshold_noforce, "Input stuff");
|
||||
|
||||
// this looks strange but quake cmdline definitions
|
||||
// and MS documentation don't agree with each other
|
||||
if (COM_CheckParm ("-noforcemspd"))
|
||||
Cvar_Set(&m_accel_noforce, "1");
|
||||
|
||||
if (COM_CheckParm ("-noforcemaccel"))
|
||||
Cvar_Set(&m_threshold_noforce, "1");
|
||||
|
||||
if (COM_CheckParm ("-noforcemparms"))
|
||||
{
|
||||
Cvar_Set(&m_accel_noforce, "1");
|
||||
Cvar_Set(&m_threshold_noforce, "1");
|
||||
}
|
||||
|
||||
if (COM_CheckParm ("-dinput"))
|
||||
Cvar_Set(&in_dinput, "1");
|
||||
|
||||
|
@ -1311,7 +1326,7 @@ static void ProcessMouse(mouse_t *mouse, usercmd_t *cmd, int pnum)
|
|||
extern int mousemove_x, mousemove_y;
|
||||
|
||||
int mx, my;
|
||||
double mouse_x, mouse_y;
|
||||
double mouse_x, mouse_y, mouse_deltadist;
|
||||
|
||||
int i;
|
||||
|
||||
|
@ -1380,8 +1395,9 @@ static void ProcessMouse(mouse_t *mouse, usercmd_t *cmd, int pnum)
|
|||
|
||||
if (m_filter.value)
|
||||
{
|
||||
mouse_x = (mx + mouse->old_delta[0]) * 0.5;
|
||||
mouse_y = (my + mouse->old_delta[1]) * 0.5;
|
||||
double fraction = bound(0, m_filter.value, 2) * 0.5;
|
||||
mouse_x = (mx*(1-fraction) + mouse->old_delta[0]*fraction);
|
||||
mouse_y = (my*(1-fraction) + mouse->old_delta[1]*fraction);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1392,8 +1408,14 @@ static void ProcessMouse(mouse_t *mouse, usercmd_t *cmd, int pnum)
|
|||
mouse->old_delta[0] = mx;
|
||||
mouse->old_delta[1] = my;
|
||||
|
||||
mouse_x *= sensitivity.value*in_sensitivityscale;
|
||||
mouse_y *= sensitivity.value*in_sensitivityscale;
|
||||
if (m_accel.value) {
|
||||
mouse_deltadist = sqrt(mx*mx + my*my);
|
||||
mouse_x *= (mouse_deltadist*m_accel.value + sensitivity.value*in_sensitivityscale);
|
||||
mouse_y *= (mouse_deltadist*m_accel.value + sensitivity.value*in_sensitivityscale);
|
||||
} else {
|
||||
mouse_x *= sensitivity.value*in_sensitivityscale;
|
||||
mouse_y *= sensitivity.value*in_sensitivityscale;
|
||||
}
|
||||
|
||||
if (cl.stats[pnum][STAT_VIEWZOOM])
|
||||
{
|
||||
|
|
|
@ -311,7 +311,7 @@ void M_Menu_Particles_f (void)
|
|||
int y = 32;
|
||||
menu_t *menu;
|
||||
int mgt;
|
||||
extern cvar_t r_bouncysparks, r_part_rain, gl_part_torch, gl_part_flame;
|
||||
extern cvar_t r_bouncysparks, r_part_rain, gl_part_flame;
|
||||
|
||||
static const char *r_part_rain_options[] = {
|
||||
"off",
|
||||
|
@ -369,8 +369,7 @@ void M_Menu_Particles_f (void)
|
|||
// MC_AddSlider(menu, 16, y, " exp spark count", &r_particles_in_explosion, 16, 1024);y+=8;
|
||||
MC_AddCvarCombo(menu, 16, y, " texture emittance", &r_part_rain, r_part_rain_options, r_part_rain_values);y+=8;
|
||||
|
||||
MC_AddCvarCombo(menu, 16, y, " WallTorch effect", &gl_part_torch, gl_part_effects_ops, gl_part_effects_vals);y+=8;
|
||||
MC_AddCvarCombo(menu, 16, y, " Open flame effect", &gl_part_flame, gl_part_effects_ops, gl_part_effects_vals);y+=8;
|
||||
MC_AddCvarCombo(menu, 16, y, " model emitters", &gl_part_flame, gl_part_effects_ops, gl_part_effects_vals);y+=8;
|
||||
|
||||
|
||||
menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 200, 32, NULL, false);
|
||||
|
|
|
@ -1875,25 +1875,25 @@ static void PF_cl_te_gunshotquad (progfuncs_t *prinst, struct globalvars_s *pr_g
|
|||
{
|
||||
float *pos = G_VECTOR(OFS_PARM0);
|
||||
if (P_RunParticleEffectTypeString(pos, vec3_origin, 1, "te_gunshotquad"))
|
||||
if (P_RunParticleEffectType(pos, NULL, 2, pt_gunshot))
|
||||
P_RunParticleEffect (pos, vec3_origin, 0, 40);
|
||||
if (P_RunParticleEffectType(pos, NULL, 1, pt_gunshot))
|
||||
P_RunParticleEffect (pos, vec3_origin, 0, 20);
|
||||
}
|
||||
static void PF_cl_te_spikequad (progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
float *pos = G_VECTOR(OFS_PARM0);
|
||||
if (P_RunParticleEffectTypeString(pos, vec3_origin, 1, "te_spikequad"))
|
||||
if (P_RunParticleEffectType(pos, NULL, 2, pt_spike))
|
||||
if (P_RunParticleEffectType(pos, NULL, 20, pt_gunshot))
|
||||
P_RunParticleEffect (pos, vec3_origin, 0, 20);
|
||||
if (P_RunParticleEffectType(pos, NULL, 1, pt_spike))
|
||||
if (P_RunParticleEffectType(pos, NULL, 10, pt_gunshot))
|
||||
P_RunParticleEffect (pos, vec3_origin, 0, 10);
|
||||
}
|
||||
static void PF_cl_te_superspikequad (progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
float *pos = G_VECTOR(OFS_PARM0);
|
||||
if (P_RunParticleEffectTypeString(pos, vec3_origin, 1, "te_superspikequad"))
|
||||
if (P_RunParticleEffectType(pos, NULL, 2, pt_superspike))
|
||||
if (P_RunParticleEffectType(pos, NULL, 4, pt_spike))
|
||||
if (P_RunParticleEffectType(pos, NULL, 40, pt_gunshot))
|
||||
P_RunParticleEffect (pos, vec3_origin, 0, 40);
|
||||
if (P_RunParticleEffectType(pos, NULL, 1, pt_superspike))
|
||||
if (P_RunParticleEffectType(pos, NULL, 2, pt_spike))
|
||||
if (P_RunParticleEffectType(pos, NULL, 20, pt_gunshot))
|
||||
P_RunParticleEffect (pos, vec3_origin, 0, 20);
|
||||
}
|
||||
static void PF_cl_te_explosionquad (progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
|
|
|
@ -132,6 +132,7 @@ cvar_t r_part_sparks_trifan = {"r_part_sparks_trifan", "1"};
|
|||
cvar_t r_part_sparks_textured = {"r_part_sparks_textured", "1"};
|
||||
cvar_t r_part_beams = {"r_part_beams", "1"};
|
||||
cvar_t r_part_beams_textured = {"r_part_beams_textured", "1"};
|
||||
cvar_t r_part_contentswitch = {"r_part_contentswitch", "1"};
|
||||
|
||||
static float particletime;
|
||||
|
||||
|
@ -173,7 +174,8 @@ typedef struct part_type_s {
|
|||
float randomvelvert;
|
||||
float randscale;
|
||||
|
||||
float timelimit;
|
||||
float spawntime;
|
||||
float spawnchance;
|
||||
|
||||
enum {PT_NORMAL, PT_SPARK, PT_SPARKFAN, PT_TEXTUREDSPARK, PT_BEAM, PT_DECAL} type;
|
||||
blendmode_t blendmode;
|
||||
|
@ -186,6 +188,7 @@ typedef struct part_type_s {
|
|||
int texturenum;
|
||||
int assoc;
|
||||
int cliptype;
|
||||
int inwater;
|
||||
float clipcount;
|
||||
int emit;
|
||||
float emittime;
|
||||
|
@ -428,6 +431,7 @@ void P_ParticleEffect_f(void)
|
|||
ptype->skytris = st;
|
||||
strcpy(ptype->name, Cmd_Argv(1));
|
||||
ptype->assoc=-1;
|
||||
ptype->inwater = -1;
|
||||
ptype->cliptype = -1;
|
||||
ptype->emit = -1;
|
||||
ptype->alpha = 1;
|
||||
|
@ -438,6 +442,7 @@ void P_ParticleEffect_f(void)
|
|||
ptype->rotationstartrand = M_PI-ptype->rotationstartmin;
|
||||
ptype->rotationmin = 0; //but don't spin
|
||||
ptype->rotationrand = 0;
|
||||
ptype->spawnchance = 1;
|
||||
|
||||
while(1)
|
||||
{
|
||||
|
@ -456,9 +461,10 @@ void P_ParticleEffect_f(void)
|
|||
var = Cmd_Argv(0);
|
||||
value = Cmd_Argv(1);
|
||||
|
||||
// TODO: switch this mess to some sort of binary tree to increase
|
||||
// parse speed
|
||||
if (!strcmp(var, "texture"))
|
||||
Q_strncpyz(ptype->texname, value, sizeof(ptype->texname));
|
||||
|
||||
else if (!strcmp(var, "rotationstart"))
|
||||
{
|
||||
ptype->rotationstartmin = atof(value)*M_PI/180;
|
||||
|
@ -539,7 +545,14 @@ void P_ParticleEffect_f(void)
|
|||
ptype = &part_type[pnum];
|
||||
ptype->assoc = assoc;
|
||||
}
|
||||
|
||||
else if (!strcmp(var, "inwater"))
|
||||
{
|
||||
// the underwater effect switch should only occur for
|
||||
// 1 level so the standard assoc check works
|
||||
assoc = CheckAssosiation(value, pnum);
|
||||
ptype = &part_type[pnum];
|
||||
ptype->inwater = assoc;
|
||||
}
|
||||
else if (!strcmp(var, "colorindex"))
|
||||
ptype->colorindex = atoi(value);
|
||||
else if (!strcmp(var, "colorrand"))
|
||||
|
@ -682,8 +695,10 @@ void P_ParticleEffect_f(void)
|
|||
Con_DPrintf("isbeam is deprechiated, use type beam\n");
|
||||
ptype->type = PT_BEAM;
|
||||
}
|
||||
else if (!strcmp(var, "timelimit"))
|
||||
ptype->timelimit = atof(value);
|
||||
else if (!strcmp(var, "spawntime"))
|
||||
ptype->spawntime = atof(value);
|
||||
else if (!strcmp(var, "spawnchance"))
|
||||
ptype->spawnchance = atof(value);
|
||||
else if (!strcmp(var, "cliptype"))
|
||||
{
|
||||
assoc = P_ParticleTypeForName(value);//careful - this can realloc all the particle types
|
||||
|
@ -919,7 +934,8 @@ void P_AssosiateEffect_f (void)
|
|||
}
|
||||
effectnum = P_AllocateParticleType(effectname);
|
||||
model->particleeffect = effectnum;
|
||||
model->particleengulphs = atoi(Cmd_Argv(3));
|
||||
if (atoi(Cmd_Argv(3)))
|
||||
model->engineflags |= MDLF_ENGULPHS;
|
||||
|
||||
P_SetModified(); //make it appear in f_modified.
|
||||
}
|
||||
|
@ -946,14 +962,14 @@ void P_AssosiateTrail_f (void)
|
|||
model = Mod_FindName(modelname);
|
||||
effectnum = P_AllocateParticleType(effectname);
|
||||
model->particletrail = effectnum;
|
||||
model->nodefaulttrail = true; //we could have assigned the trail to a model that wasn't loaded.
|
||||
model->engineflags |= MDLF_NODEFAULTTRAIL; //we could have assigned the trail to a model that wasn't loaded.
|
||||
|
||||
P_SetModified(); //make it appear in f_modified.
|
||||
}
|
||||
|
||||
void P_DefaultTrail (model_t *model)
|
||||
{
|
||||
if (model->nodefaulttrail == true)
|
||||
if (model->engineflags & MDLF_NODEFAULTTRAIL)
|
||||
return;
|
||||
|
||||
if (model->flags & EF_ROCKET)
|
||||
|
@ -1166,6 +1182,7 @@ void P_InitParticles (void)
|
|||
Cvar_Register(&r_part_sparks_textured, particlecvargroupname);
|
||||
Cvar_Register(&r_part_beams, particlecvargroupname);
|
||||
Cvar_Register(&r_part_beams_textured, particlecvargroupname);
|
||||
Cvar_Register(&r_part_contentswitch, particlecvargroupname);
|
||||
|
||||
pt_explosion = P_AllocateParticleType("te_explosion");
|
||||
pt_pointfile = P_AllocateParticleType("pe_pointfile");
|
||||
|
@ -1284,7 +1301,7 @@ void P_NewServer(void)
|
|||
{
|
||||
mod->particleeffect = -1;
|
||||
mod->particletrail = -1;
|
||||
mod->nodefaulttrail = false;
|
||||
mod->engineflags &= ~MDLF_NODEFAULTTRAIL;
|
||||
|
||||
P_DefaultTrail(mod);
|
||||
}
|
||||
|
@ -1632,6 +1649,71 @@ void P_DarkFieldParticles (float *org, qbyte colour)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// Trailstate functions
|
||||
static void P_CleanTrailstate(trailstate_t *ts)
|
||||
{
|
||||
// clear LASTSEG flag from lastbeam so it can be reused
|
||||
if (ts->lastbeam)
|
||||
{
|
||||
ts->lastbeam->flags &= ~BS_LASTSEG;
|
||||
ts->lastbeam->flags |= BS_NODRAW;
|
||||
}
|
||||
|
||||
// clean structure
|
||||
memset(ts, 0, sizeof(trailstate_t));
|
||||
}
|
||||
|
||||
void P_DelinkTrailstate(trailstate_t **tsk)
|
||||
{
|
||||
trailstate_t *ts;
|
||||
trailstate_t *assoc;
|
||||
|
||||
if (*tsk == NULL)
|
||||
return; // not linked to a trailstate
|
||||
|
||||
ts = *tsk; // store old pointer
|
||||
*tsk = NULL; // clear pointer
|
||||
|
||||
if (ts->key != tsk)
|
||||
return; // prevent overwrite
|
||||
|
||||
assoc = ts->assoc; // store assoc
|
||||
P_CleanTrailstate(ts); // clean directly linked trailstate
|
||||
|
||||
// clean trailstates assoc linked
|
||||
while (assoc)
|
||||
{
|
||||
ts = assoc->assoc;
|
||||
P_CleanTrailstate(assoc);
|
||||
assoc = ts;
|
||||
}
|
||||
}
|
||||
|
||||
static trailstate_t *P_NewTrailstate(trailstate_t **key)
|
||||
{
|
||||
trailstate_t *ts;
|
||||
|
||||
// bounds check here in case r_numtrailstates changed
|
||||
if (ts_cycle >= r_numtrailstates)
|
||||
ts_cycle = 0;
|
||||
|
||||
// get trailstate
|
||||
ts = trailstates + ts_cycle;
|
||||
|
||||
// clear trailstate
|
||||
P_CleanTrailstate(ts);
|
||||
|
||||
// set key
|
||||
ts->key = key;
|
||||
|
||||
// advance index cycle
|
||||
ts_cycle++;
|
||||
|
||||
// return clean trailstate
|
||||
return ts;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_EntityParticles
|
||||
|
@ -1747,29 +1829,16 @@ R_BlobExplosion
|
|||
|
||||
===============
|
||||
*/
|
||||
void P_BlobExplosion (vec3_t org)
|
||||
{
|
||||
P_RunParticleEffectType(org, NULL, 1, pt_blob);
|
||||
}
|
||||
|
||||
int P_RunParticleEffectTypeString (vec3_t org, vec3_t dir, float count, char *name)
|
||||
{
|
||||
int type = P_FindParticleType(name);
|
||||
if (type < 0)
|
||||
return 1;
|
||||
|
||||
return P_RunParticleEffectType(org, dir, count, type);
|
||||
}
|
||||
|
||||
int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent, vec3_t tangent2, float size, float **out);
|
||||
int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
|
||||
int P_RunParticleEffectState (vec3_t org, vec3_t dir, float count, int typenum, trailstate_t **tsk)
|
||||
{
|
||||
part_type_t *ptype = &part_type[typenum];
|
||||
int i, j, k, l, spawnspc;
|
||||
float m;
|
||||
float m, pcount;
|
||||
particle_t *p;
|
||||
beamseg_t *b, *bfirst;
|
||||
vec3_t ofsvec, arsvec; // offsetspread vec, areaspread vec
|
||||
trailstate_t *ts;
|
||||
|
||||
if (typenum < 0 || typenum >= numparticletypes)
|
||||
return 1;
|
||||
|
@ -1777,6 +1846,39 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
|
|||
if (!ptype->loaded)
|
||||
return 1;
|
||||
|
||||
// inwater check, switch only once
|
||||
if (r_part_contentswitch.value && ptype->inwater >= 0)
|
||||
{
|
||||
int cont;
|
||||
cont = cl.worldmodel->hulls[0].funcs.HullPointContents(&cl.worldmodel->hulls[0], org);
|
||||
|
||||
if (cont & FTECONTENTS_WATER)
|
||||
ptype = &part_type[ptype->inwater];
|
||||
}
|
||||
|
||||
// trailstate allocation/deallocation
|
||||
if (tsk)
|
||||
{
|
||||
// if *tsk = NULL get a new one
|
||||
if (*tsk == NULL)
|
||||
{
|
||||
ts = P_NewTrailstate(tsk);
|
||||
*tsk = ts;
|
||||
}
|
||||
else
|
||||
{
|
||||
ts = *tsk;
|
||||
|
||||
if (ts->key != tsk) // trailstate was overwritten
|
||||
{
|
||||
ts = P_NewTrailstate(tsk); // so get a new one
|
||||
*tsk = ts;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
ts = NULL;
|
||||
|
||||
if (ptype->type == PT_DECAL)
|
||||
{
|
||||
clippeddecal_t *d;
|
||||
|
@ -1868,11 +1970,14 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
|
|||
// init spawn specific variables
|
||||
b = bfirst = NULL;
|
||||
spawnspc = 8;
|
||||
pcount = count*ptype->count;
|
||||
if (ts)
|
||||
pcount += ts->emittime;
|
||||
|
||||
switch (ptype->spawnmode)
|
||||
{
|
||||
case SM_UNICIRCLE:
|
||||
m = (count*ptype->count);
|
||||
m = pcount;
|
||||
if (ptype->type == PT_BEAM)
|
||||
m--;
|
||||
|
||||
|
@ -1910,9 +2015,25 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
|
|||
default: //others don't need intitialisation
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// time limit (for completeness)
|
||||
if (ptype->spawntime && ts)
|
||||
{
|
||||
if (ts->statetime > particletime)
|
||||
return 0; // timelimit still in effect
|
||||
|
||||
ts->statetime = particletime + ptype->spawntime; // record old time
|
||||
}
|
||||
|
||||
// random chance for point effects
|
||||
if (ptype->spawnchance < frandom())
|
||||
{
|
||||
i = ceil(pcount);
|
||||
break;
|
||||
}
|
||||
|
||||
// particle spawning loop
|
||||
for (i = 0; i < count*ptype->count; i++)
|
||||
for (i = 0; i < pcount; i++)
|
||||
{
|
||||
if (!free_particles)
|
||||
break;
|
||||
|
@ -2138,15 +2259,68 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
|
|||
}
|
||||
}
|
||||
|
||||
// save off emit times in trailstate
|
||||
if (ts)
|
||||
ts->emittime = pcount - i;
|
||||
|
||||
// go to next associated effect
|
||||
if (ptype->assoc < 0)
|
||||
break;
|
||||
|
||||
// new trailstate
|
||||
if (ts)
|
||||
{
|
||||
tsk = &(ts->assoc);
|
||||
// if *tsk = NULL get a new one
|
||||
if (*tsk == NULL)
|
||||
{
|
||||
ts = P_NewTrailstate(tsk);
|
||||
*tsk = ts;
|
||||
}
|
||||
else
|
||||
{
|
||||
ts = *tsk;
|
||||
|
||||
if (ts->key != tsk) // trailstate was overwritten
|
||||
{
|
||||
ts = P_NewTrailstate(tsk); // so get a new one
|
||||
*tsk = ts;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ptype = &part_type[ptype->assoc];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void P_BlobExplosion (vec3_t org)
|
||||
{
|
||||
P_RunParticleEffectType(org, NULL, 1, pt_blob);
|
||||
}
|
||||
|
||||
int P_RunParticleEffectTypeString (vec3_t org, vec3_t dir, float count, char *name)
|
||||
{
|
||||
int type = P_FindParticleType(name);
|
||||
if (type < 0)
|
||||
return 1;
|
||||
|
||||
return P_RunParticleEffectType(org, dir, count, type);
|
||||
}
|
||||
|
||||
void P_EmitEffect (vec3_t pos, int type, trailstate_t **tsk)
|
||||
{
|
||||
#ifdef SIDEVIEWS
|
||||
if (r_secondaryview) //this is called when the models are actually drawn.
|
||||
return;
|
||||
#endif
|
||||
if (cl.paused)
|
||||
return;
|
||||
|
||||
P_RunParticleEffectState(pos, NULL, host_frametime, type, tsk);
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_RunParticleEffect
|
||||
|
@ -2414,77 +2588,12 @@ void CLQ2_RailTrail (vec3_t start, vec3_t end)
|
|||
P_ParticleTrail(start, end, rt_railtrail, NULL);
|
||||
}
|
||||
|
||||
// Trailstate functions
|
||||
static void P_CleanTrailstate(trailstate_t *ts)
|
||||
{
|
||||
// clear LASTSEG flag from lastbeam so it can be reused
|
||||
if (ts->lastbeam)
|
||||
{
|
||||
ts->lastbeam->flags &= ~BS_LASTSEG;
|
||||
ts->lastbeam->flags |= BS_NODRAW;
|
||||
}
|
||||
|
||||
// clean structure
|
||||
memset(ts, 0, sizeof(trailstate_t));
|
||||
}
|
||||
|
||||
void P_DelinkTrailstate(trailstate_t **tsk)
|
||||
{
|
||||
trailstate_t *ts;
|
||||
trailstate_t *assoc;
|
||||
|
||||
if (*tsk == NULL)
|
||||
return; // not linked to a trailstate
|
||||
|
||||
ts = *tsk; // store old pointer
|
||||
*tsk = NULL; // clear pointer
|
||||
|
||||
if (ts->key != tsk)
|
||||
return; // prevent overwrite
|
||||
|
||||
assoc = ts->assoc; // store assoc
|
||||
P_CleanTrailstate(ts); // clean directly linked trailstate
|
||||
|
||||
// clean trailstates assoc linked
|
||||
while (assoc)
|
||||
{
|
||||
ts = assoc->assoc;
|
||||
P_CleanTrailstate(assoc);
|
||||
assoc = ts;
|
||||
}
|
||||
}
|
||||
|
||||
static trailstate_t *P_NewTrailstate(trailstate_t **key)
|
||||
{
|
||||
trailstate_t *ts;
|
||||
|
||||
// bounds check here in case r_numtrailstates changed
|
||||
if (ts_cycle >= r_numtrailstates)
|
||||
ts_cycle = 0;
|
||||
|
||||
// get trailstate
|
||||
ts = trailstates + ts_cycle;
|
||||
|
||||
// clear trailstate
|
||||
P_CleanTrailstate(ts);
|
||||
|
||||
// set key
|
||||
ts->key = key;
|
||||
|
||||
// advance index cycle
|
||||
ts_cycle++;
|
||||
|
||||
// return clean trailstate
|
||||
return ts;
|
||||
}
|
||||
|
||||
int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t **tsk)
|
||||
static int P_ParticleTrailDraw (vec3_t startpos, vec3_t end, part_type_t *ptype, trailstate_t **tsk)
|
||||
{
|
||||
vec3_t vec, vstep, right, up, start;
|
||||
float len;
|
||||
int tcount;
|
||||
particle_t *p;
|
||||
part_type_t *ptype = &part_type[type];
|
||||
beamseg_t *b;
|
||||
beamseg_t *bfirst;
|
||||
trailstate_t *ts;
|
||||
|
@ -2495,12 +2604,6 @@ int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t **tsk)
|
|||
float stop;
|
||||
float tdegree = 2*M_PI/256; /* MSVC whine */
|
||||
|
||||
if (type < 0 || type >= numparticletypes)
|
||||
return 1; //bad value
|
||||
|
||||
if (!ptype->loaded)
|
||||
return 1;
|
||||
|
||||
VectorCopy(startpos, start);
|
||||
|
||||
// trailstate allocation/deallocation
|
||||
|
@ -2535,15 +2638,19 @@ int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t **tsk)
|
|||
}
|
||||
|
||||
// time limit for trails
|
||||
if (ptype->timelimit && ts)
|
||||
if (ptype->spawntime && ts)
|
||||
{
|
||||
if (ts->statetime > particletime)
|
||||
return 0; // timelimit still in effect
|
||||
|
||||
ts->statetime = particletime + ptype->timelimit; // record old time
|
||||
ts->statetime = particletime + ptype->spawntime; // record old time
|
||||
ts = NULL; // clear trailstate so we don't save length/lastseg
|
||||
}
|
||||
|
||||
// random chance for trails
|
||||
if (ptype->spawnchance < frandom())
|
||||
return 0; // don't spawn but return success
|
||||
|
||||
if (!ptype->die)
|
||||
ts = NULL;
|
||||
|
||||
|
@ -2793,16 +2900,27 @@ int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t **tsk)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void P_TorchEffect (vec3_t pos, int type)
|
||||
int P_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t **tsk)
|
||||
{
|
||||
#ifdef SIDEVIEWS
|
||||
if (r_secondaryview) //this is called when the models are actually drawn.
|
||||
return;
|
||||
#endif
|
||||
if (cl.paused)
|
||||
return;
|
||||
part_type_t *ptype = &part_type[type];
|
||||
|
||||
P_RunParticleEffectType(pos, NULL, host_frametime, type);
|
||||
if (type < 0 || type >= numparticletypes)
|
||||
return 1; //bad value
|
||||
|
||||
if (!ptype->loaded)
|
||||
return 1;
|
||||
|
||||
// inwater check, switch only once
|
||||
if (r_part_contentswitch.value && ptype->inwater >= 0)
|
||||
{
|
||||
int cont;
|
||||
cont = cl.worldmodel->hulls[0].funcs.HullPointContents(&cl.worldmodel->hulls[0], startpos);
|
||||
|
||||
if (cont & FTECONTENTS_WATER)
|
||||
ptype = &part_type[ptype->inwater];
|
||||
}
|
||||
|
||||
return P_ParticleTrailDraw (startpos, end, ptype, tsk);
|
||||
}
|
||||
|
||||
void CLQ2_BubbleTrail (vec3_t start, vec3_t end)
|
||||
|
|
|
@ -93,7 +93,6 @@ cvar_t gl_font = {"gl_font", ""};
|
|||
cvar_t gl_conback = {"gl_conback", ""};
|
||||
cvar_t gl_smoothfont = {"gl_smoothfont", "1"};
|
||||
cvar_t gl_part_flame = {"gl_part_flame", "1"};
|
||||
cvar_t gl_part_torch = {"gl_part_torch", "1"};
|
||||
cvar_t r_part_rain = {"r_part_rain", "0"};
|
||||
|
||||
cvar_t r_bouncysparks = {"r_bouncysparks", "0"};
|
||||
|
@ -266,7 +265,6 @@ void GLRenderer_Init(void)
|
|||
Cvar_Register (&r_shadow_realtime_world_lightmaps, GLRENDEREROPTIONS);
|
||||
|
||||
Cvar_Register (&gl_part_flame, GRAPHICALNICETIES);
|
||||
Cvar_Register (&gl_part_torch, GRAPHICALNICETIES);
|
||||
|
||||
Cvar_Register (&gl_keeptjunctions, GLRENDEREROPTIONS);
|
||||
Cvar_Register (&gl_reporttjunctions, GLRENDEREROPTIONS);
|
||||
|
|
|
@ -67,9 +67,12 @@ typedef struct trailstate_s {
|
|||
struct beamseg_s *lastbeam; // last beam pointer (flagged with BS_LASTSEG)
|
||||
union {
|
||||
float lastdist; // last distance used with particle effect
|
||||
float statetime; // time to emit effect again
|
||||
float statetime; // time to emit effect again (used by spawntime field)
|
||||
};
|
||||
union {
|
||||
float laststop; // last stopping point for particle effect
|
||||
float emittime; // used by r_effect emitters
|
||||
};
|
||||
float laststop; // last stopping point for particle effect
|
||||
} trailstate_t;
|
||||
|
||||
// !!! if this is changed, it must be changed in d_ifacea.h too !!!
|
||||
|
@ -154,7 +157,7 @@ void P_RunParticleEffect4 (vec3_t org, float radius, int color, int effect, int
|
|||
|
||||
void P_DarkFieldParticles (float *org, qbyte colour);
|
||||
void P_EntityParticles (float *org, qbyte colour, float *radius); //nq's EF_BRIGHTFIELD
|
||||
void P_TorchEffect (vec3_t pos, int type); //particles centered around a model, called every frame for those models.
|
||||
void P_EmitEffect (vec3_t pos, int type, trailstate_t **tsk); //particles centered around a model, called every frame for those models.
|
||||
|
||||
//functions that spawn point effects (basically just pass throughs)
|
||||
void P_BlobExplosion (vec3_t org); //tarbaby explosion or TF emp.
|
||||
|
@ -169,8 +172,9 @@ int P_ParticleTrail (vec3_t start, vec3_t end, int type, trailstate_t **trailsta
|
|||
void P_DefaultTrail (struct model_s *model); //fills in the default particle properties for a loaded model. Should already have the model flags set.
|
||||
|
||||
//the core spawn function for point effects
|
||||
int P_RunParticleEffectType(vec3_t org, vec3_t dir, float count, int type); //1 if failed.
|
||||
int P_RunParticleEffectState (vec3_t org, vec3_t dir, float count, int typenum, trailstate_t **tsk); //1 if failed
|
||||
int P_RunParticleEffectTypeString (vec3_t org, vec3_t dir, float count, char *name); //1 if failed.
|
||||
#define P_RunParticleEffectType(a,b,c,d) P_RunParticleEffectState(a,b,c,d,NULL)
|
||||
|
||||
void P_EmitSkyEffectTris(struct model_s *mod, struct msurface_s *fa);
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ typedef struct
|
|||
|
||||
|
||||
|
||||
extern cvar_t gl_part_flame, gl_part_torch, r_fullbrightSkins, r_fb_models;
|
||||
extern cvar_t gl_part_flame, r_fullbrightSkins, r_fb_models;
|
||||
extern cvar_t r_noaliasshadows;
|
||||
void R_TorchEffect (vec3_t pos, int type);
|
||||
void GLMod_FloodFillSkin( qbyte *skin, int skinwidth, int skinheight );
|
||||
|
|
|
@ -486,7 +486,7 @@ model_t *GLMod_FindName (char *name)
|
|||
mod->needload = true;
|
||||
mod_numknown++;
|
||||
mod->particleeffect = -1;
|
||||
mod->nodefaulttrail = false;
|
||||
mod->particletrail = -1;
|
||||
}
|
||||
|
||||
return mod;
|
||||
|
@ -1307,7 +1307,7 @@ void GLMod_LoadLighting (lump_t *l)
|
|||
{
|
||||
qbyte *luxdata = NULL;
|
||||
int mapcomeswith24bitcolouredlighting = false;
|
||||
loadmodel->rgblighting = false;
|
||||
loadmodel->engineflags &= ~MDLF_RGBLIGHTING;
|
||||
|
||||
//lit file light intensity is made to match the world's light intensity.
|
||||
if (cls.allow_lightmapgamma)
|
||||
|
@ -1419,7 +1419,7 @@ void GLMod_LoadLighting (lump_t *l)
|
|||
|
||||
//load it
|
||||
loadmodel->lightdata = litdata+8;
|
||||
loadmodel->rgblighting = true;
|
||||
loadmodel->engineflags |= MDLF_RGBLIGHTING;
|
||||
|
||||
|
||||
//now some cheat protection.
|
||||
|
@ -1458,16 +1458,16 @@ void GLMod_LoadLighting (lump_t *l)
|
|||
//failed to find
|
||||
}
|
||||
if (mapcomeswith24bitcolouredlighting)
|
||||
loadmodel->rgblighting = true;
|
||||
loadmodel->engineflags |= MDLF_RGBLIGHTING;
|
||||
|
||||
#ifdef RUNTIMELIGHTING
|
||||
else if (r_loadlits.value == 2 && !lightmodel && (loadmodel->rgblighting != true || (!luxdata && gl_bumpmappingpossible)))
|
||||
else if (r_loadlits.value == 2 && !lightmodel && (!(loadmodel->engineflags & MDLF_RGBLIGHTING) || (!luxdata && gl_bumpmappingpossible)))
|
||||
{
|
||||
qbyte *litdata = NULL;
|
||||
int i;
|
||||
qbyte *normal;
|
||||
writelitfile = !loadmodel->rgblighting;
|
||||
loadmodel->rgblighting = true;
|
||||
writelitfile = !(loadmodel->engineflags & MDLF_RGBLIGHTING);
|
||||
loadmodel->engineflags |= MDLF_RGBLIGHTING;
|
||||
loadmodel->lightdata = Hunk_AllocName ( l->filelen*3+8, loadname);
|
||||
strcpy(loadmodel->lightdata, "QLIT");
|
||||
((int*)loadmodel->lightdata)[1] = LittleLong(1);
|
||||
|
@ -1505,7 +1505,7 @@ void GLMod_LoadLighting (lump_t *l)
|
|||
|
||||
if (loadmodel->lightdata)
|
||||
{
|
||||
if (loadmodel->rgblighting && r_lightmap_saturation.value != 1.0f)
|
||||
if ((loadmodel->engineflags & MDLF_RGBLIGHTING) && r_lightmap_saturation.value != 1.0f)
|
||||
{
|
||||
// desaturate lightmap according to cvar
|
||||
SaturateR8G8B8(loadmodel->lightdata, l->filelen, r_lightmap_saturation.value);
|
||||
|
@ -1527,7 +1527,7 @@ void GLMod_LoadLighting (lump_t *l)
|
|||
*out++ = lmgamma[*in++];
|
||||
}
|
||||
|
||||
if (loadmodel->rgblighting && r_lightmap_saturation.value != 1.0f)
|
||||
if ((loadmodel->engineflags & MDLF_RGBLIGHTING) && r_lightmap_saturation.value != 1.0f)
|
||||
SaturateR8G8B8(loadmodel->lightdata, l->filelen, r_lightmap_saturation.value);
|
||||
}
|
||||
//memcpy (loadmodel->lightdata, mod_base + l->fileofs, l->filelen);
|
||||
|
@ -1879,7 +1879,7 @@ void GLMod_LoadFaces (lump_t *l)
|
|||
i = LittleLong(in->lightofs);
|
||||
if (i == -1)
|
||||
out->samples = NULL;
|
||||
else if (loadmodel->rgblighting && loadmodel->fromgame != fg_halflife)
|
||||
else if ((loadmodel->engineflags & MDLF_RGBLIGHTING) && loadmodel->fromgame != fg_halflife)
|
||||
out->samples = loadmodel->lightdata + i*3;
|
||||
else
|
||||
out->samples = loadmodel->lightdata + i;
|
||||
|
|
|
@ -710,12 +710,9 @@ typedef struct model_s
|
|||
synctype_t synctype;
|
||||
|
||||
int flags;
|
||||
int engineflags;
|
||||
int particleeffect;
|
||||
qboolean particleengulphs;
|
||||
int particletrail;
|
||||
qboolean nodefaulttrail;
|
||||
|
||||
qboolean rgblighting; //.lit, halflife.
|
||||
|
||||
//
|
||||
// volume occupied by the model graphics
|
||||
|
@ -793,6 +790,10 @@ typedef struct model_s
|
|||
|
||||
} model_t;
|
||||
|
||||
#define MDLF_ENGULPHS 0x1 // particle effect engulphs model (don't draw)
|
||||
#define MDLF_NODEFAULTTRAIL 0x2
|
||||
#define MDLF_RGBLIGHTING 0x4
|
||||
|
||||
//============================================================================
|
||||
/*
|
||||
void Mod_Init (void);
|
||||
|
|
|
@ -1856,18 +1856,12 @@ void PPL_BaseEntTextures(void)
|
|||
if (!currententity->model)
|
||||
continue;
|
||||
|
||||
|
||||
if (cls.allow_anyparticles || currententity->visframe) //allowed or static
|
||||
{
|
||||
if (currententity->model->particleeffect>=0)
|
||||
if (currententity->model->engineflags & MDLF_ENGULPHS)
|
||||
{
|
||||
if (currententity->model->particleengulphs)
|
||||
{
|
||||
if (gl_part_flame.value)
|
||||
{ //particle effect is addedin GLR_DrawEntitiesOnList. Is this so wrong?
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (gl_part_flame.value)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2856,15 +2850,10 @@ void PPL_DrawEntFullBrights(void)
|
|||
|
||||
if (cls.allow_anyparticles || currententity->visframe) //allowed or static
|
||||
{
|
||||
if (currententity->model->particleeffect>=0)
|
||||
if (currententity->model->engineflags & MDLF_ENGULPHS)
|
||||
{
|
||||
if (currententity->model->particleengulphs)
|
||||
{
|
||||
if (gl_part_flame.value)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (gl_part_flame.value)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3919,15 +3908,10 @@ void PPL_DrawShadowMeshes(dlight_t *dl)
|
|||
|
||||
if (cls.allow_anyparticles || currententity->visframe) //allowed or static
|
||||
{
|
||||
if (currententity->model->particleeffect>=0)
|
||||
if (currententity->model->engineflags & MDLF_ENGULPHS)
|
||||
{
|
||||
if (currententity->model->particleengulphs)
|
||||
{
|
||||
if (gl_part_flame.value)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (gl_part_flame.value)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -617,7 +617,7 @@ int GLRecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end)
|
|||
r = 0;
|
||||
if (lightmap)
|
||||
{
|
||||
if (cl.worldmodel->rgblighting)
|
||||
if (cl.worldmodel->engineflags & MDLF_RGBLIGHTING)
|
||||
{
|
||||
lightmap += (dt * ((surf->extents[0]>>4)+1) + ds)*3;
|
||||
|
||||
|
@ -780,7 +780,7 @@ float *GLRecursiveLightPoint3C (mnode_t *node, vec3_t start, vec3_t end)
|
|||
{
|
||||
if (cl.worldmodel->deluxdata)
|
||||
{
|
||||
if (cl.worldmodel->rgblighting)
|
||||
if (cl.worldmodel->engineflags & MDLF_RGBLIGHTING)
|
||||
{
|
||||
deluxmap = surf->samples - cl.worldmodel->lightdata + cl.worldmodel->deluxdata;
|
||||
|
||||
|
@ -841,7 +841,7 @@ float *GLRecursiveLightPoint3C (mnode_t *node, vec3_t start, vec3_t end)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (cl.worldmodel->rgblighting)
|
||||
if (cl.worldmodel->engineflags & MDLF_RGBLIGHTING)
|
||||
{
|
||||
lightmap += (dt * ((surf->extents[0]>>4)+1) + ds)*3;
|
||||
for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
|
||||
|
|
|
@ -110,7 +110,6 @@ cvar_t r_novis = {"r_novis","0"};
|
|||
//cvar_t r_netgraph = {"r_netgraph","0"};
|
||||
|
||||
extern cvar_t gl_part_flame;
|
||||
extern cvar_t gl_part_torch;
|
||||
|
||||
cvar_t gl_clear = {"gl_clear","0"};
|
||||
cvar_t gl_cull = {"gl_cull","1"};
|
||||
|
@ -788,24 +787,13 @@ void GLR_DrawEntitiesOnList (void)
|
|||
|
||||
if (cls.allow_anyparticles || currententity->visframe) //allowed or static
|
||||
{
|
||||
if (currententity->model->particleeffect>=0)
|
||||
if (gl_part_flame.value)
|
||||
{
|
||||
if (currententity->model->particleengulphs)
|
||||
{
|
||||
if (gl_part_flame.value)
|
||||
{
|
||||
P_TorchEffect(currententity->origin, currententity->model->particleeffect);
|
||||
currententity->model = NULL;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gl_part_torch.value)
|
||||
{
|
||||
P_TorchEffect(currententity->origin, currententity->model->particleeffect);
|
||||
}
|
||||
}
|
||||
P_EmitEffect (currententity->origin,
|
||||
currententity->model->particleeffect,
|
||||
&(cl.lerpents[currententity->keynum].emitstate));
|
||||
if (currententity->model->engineflags & MDLF_ENGULPHS)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -642,7 +642,7 @@ void GLR_BuildDeluxMap (msurface_t *surf, qbyte *dest)
|
|||
goto store;
|
||||
}
|
||||
|
||||
if (currentmodel->rgblighting)
|
||||
if (currentmodel->engineflags & MDLF_RGBLIGHTING)
|
||||
deluxmap = surf->samples - currentmodel->lightdata + currentmodel->deluxdata;
|
||||
else
|
||||
deluxmap = (surf->samples - currentmodel->lightdata)*3 + currentmodel->deluxdata;
|
||||
|
@ -659,7 +659,7 @@ void GLR_BuildDeluxMap (msurface_t *surf, qbyte *dest)
|
|||
// add all the lightmaps
|
||||
if (lightmap)
|
||||
{
|
||||
if (currentmodel->rgblighting)
|
||||
if (currentmodel->engineflags & MDLF_RGBLIGHTING)
|
||||
{
|
||||
deluxmap = surf->samples - currentmodel->lightdata + currentmodel->deluxdata;
|
||||
|
||||
|
@ -839,7 +839,7 @@ void GLR_BuildLightMap (msurface_t *surf, qbyte *dest, qbyte *deluxdest, stmap *
|
|||
}
|
||||
// memset(blocklights, 255, sizeof(blocklights));
|
||||
}
|
||||
else if (currentmodel->rgblighting) //rgb
|
||||
else if (currentmodel->engineflags & MDLF_RGBLIGHTING) //rgb
|
||||
{
|
||||
for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
|
||||
maps++)
|
||||
|
@ -928,7 +928,7 @@ void GLR_BuildLightMap (msurface_t *surf, qbyte *dest, qbyte *deluxdest, stmap *
|
|||
// add all the lightmaps
|
||||
if (lightmap)
|
||||
{
|
||||
if (currentmodel->rgblighting) //rgb
|
||||
if (currentmodel->engineflags & MDLF_RGBLIGHTING) //rgb
|
||||
for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
|
||||
maps++)
|
||||
{
|
||||
|
@ -3753,7 +3753,7 @@ void GL_BuildLightmaps (void)
|
|||
if (cl.worldmodel->fromgame == fg_doom)
|
||||
return; //no lightmaps.
|
||||
|
||||
if (cl.worldmodel->rgblighting || cl.worldmodel->deluxdata || r_loadlits.value)
|
||||
if ((cl.worldmodel->engineflags & MDLF_RGBLIGHTING) || cl.worldmodel->deluxdata || r_loadlits.value)
|
||||
gl_lightmap_format = GL_RGB;
|
||||
else
|
||||
gl_lightmap_format = GL_LUMINANCE;
|
||||
|
|
|
@ -84,6 +84,8 @@ extern cvar_t _windowed_mouse;
|
|||
|
||||
#ifndef SWQUAKE
|
||||
cvar_t m_filter = {"m_filter", "0"};
|
||||
cvar_t m_accel = {"m_accel", "0"};
|
||||
|
||||
#ifdef IN_XFLIP
|
||||
cvar_t in_xflip = {"in_xflip", "0"};
|
||||
#endif
|
||||
|
@ -933,17 +935,10 @@ void IN_MouseMove (usercmd_t *cmd, int pnum)
|
|||
{
|
||||
extern int mouseusedforgui, mousecursor_x, mousecursor_y;
|
||||
extern int mousemove_x, mousemove_y;
|
||||
float mx, my;
|
||||
|
||||
if (m_filter.value)
|
||||
{
|
||||
mouse_x = (mouse_x + old_mouse_x) * 0.5;
|
||||
mouse_y = (mouse_y + old_mouse_y) * 0.5;
|
||||
}
|
||||
old_mouse_x = mouse_x;
|
||||
old_mouse_y = mouse_y;
|
||||
|
||||
mouse_x *= sensitivity.value;
|
||||
mouse_y *= sensitivity.value;
|
||||
mx = mouse_x;
|
||||
my = mouse_y;
|
||||
|
||||
if (mouseusedforgui || (key_dest == key_menu && m_state == m_complex) || UI_MenuState())
|
||||
{
|
||||
|
@ -967,6 +962,24 @@ void IN_MouseMove (usercmd_t *cmd, int pnum)
|
|||
UI_MousePosition(mousecursor_x, mousecursor_y);
|
||||
}
|
||||
|
||||
if (m_filter.value)
|
||||
{
|
||||
float fraction = bound(0, m_filter.value, 2) * 0.5;
|
||||
mouse_x = (mouse_x*(1-fraction) + old_mouse_x*fraction);
|
||||
mouse_y = (mouse_y*(1-fraction) + old_mouse_y*fraction);
|
||||
}
|
||||
old_mouse_x = mx;
|
||||
old_mouse_y = my;
|
||||
|
||||
if (m_accel.value) {
|
||||
mouse_deltadist = sqrt(mx*mx + my*my);
|
||||
mouse_x *= (mouse_deltadist*m_accel.value + sensitivity.value*in_sensitivityscale);
|
||||
mouse_y *= (mouse_deltadist*m_accel.value + sensitivity.value*in_sensitivityscale);
|
||||
} else {
|
||||
mouse_x *= sensitivity.value*in_sensitivityscale;
|
||||
mouse_y *= sensitivity.value*in_sensitivityscale;
|
||||
}
|
||||
|
||||
#ifdef IN_XFLIP
|
||||
if(in_xflip.value) mouse_x *= -1;
|
||||
#endif
|
||||
|
|
|
@ -664,7 +664,7 @@ R_DrawEntitiesOnList
|
|||
*/
|
||||
void SWR_DrawEntitiesOnList (void)
|
||||
{
|
||||
extern cvar_t gl_part_flame, gl_part_torch;
|
||||
extern cvar_t gl_part_flame;
|
||||
int i, j;
|
||||
int lnum;
|
||||
alight_t lighting;
|
||||
|
@ -699,23 +699,13 @@ void SWR_DrawEntitiesOnList (void)
|
|||
|
||||
if (cls.allow_anyparticles || currententity->visframe) //allowed or static
|
||||
{
|
||||
if (currententity->model->particleeffect>=0)
|
||||
if (gl_part_flame.value)
|
||||
{
|
||||
if (currententity->model->particleengulphs)
|
||||
{
|
||||
if (gl_part_flame.value)
|
||||
{
|
||||
P_TorchEffect(currententity->origin, currententity->model->particleeffect);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gl_part_torch.value)
|
||||
{
|
||||
P_TorchEffect(currententity->origin, currententity->model->particleeffect);
|
||||
}
|
||||
}
|
||||
P_EmitEffect (currententity->origin,
|
||||
currententity->model->particleeffect,
|
||||
&(cl.lerpents[currententity->keynum].emitstate));
|
||||
if (currententity->model->engineflags & MDLF_ENGULPHS)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -171,7 +171,6 @@ Performance monitoring tool
|
|||
==============
|
||||
*/
|
||||
#define MAX_TIMINGS 100
|
||||
extern float mouse_x, mouse_y;
|
||||
int graphval;
|
||||
void R_TimeGraph (void)
|
||||
{
|
||||
|
|
|
@ -246,7 +246,6 @@ model_t *SWMod_FindName (char *name)
|
|||
mod->needload = true;
|
||||
mod_numknown++;
|
||||
mod->particleeffect = -1;
|
||||
mod->nodefaulttrail = false;
|
||||
}
|
||||
|
||||
return mod;
|
||||
|
|
|
@ -140,6 +140,7 @@ int shmget (key_t key, size_t size, int shmflg)
|
|||
#endif
|
||||
|
||||
cvar_t m_filter = {"m_filter","0", NULL, CVAR_ARCHIVE};
|
||||
cvar_t m_accel = {"m_accel", "0"};
|
||||
#ifdef IN_XFLIP
|
||||
cvar_t in_xflip = {"in_xflip", "0"};
|
||||
#endif
|
||||
|
@ -1254,6 +1255,7 @@ void IN_Init (void)
|
|||
{
|
||||
Cvar_Register (&_windowed_mouse, "input controls");
|
||||
Cvar_Register (&m_filter, "input controls");
|
||||
Cvar_Register (&m_accel, "input controls");
|
||||
#ifdef IN_XFLIP
|
||||
Cvar_Register (&in_xflip, "input controls");
|
||||
#endif
|
||||
|
@ -1287,6 +1289,8 @@ void IN_Commands (void)
|
|||
extern int mousecursor_x, mousecursor_y;
|
||||
void IN_Move (usercmd_t *cmd, int pnum)
|
||||
{
|
||||
float mx, my;
|
||||
|
||||
if (!mouse_avail)
|
||||
{
|
||||
mousecursor_x = p_mouse_x; //absolute offsets.
|
||||
|
@ -1309,16 +1313,24 @@ void IN_Move (usercmd_t *cmd, int pnum)
|
|||
if (mousecursor_y > vid.height)
|
||||
mousecursor_y = vid.height;
|
||||
|
||||
if (m_filter.value) {
|
||||
mouse_x = (mouse_x + old_mouse_x) * 0.5;
|
||||
mouse_y = (mouse_y + old_mouse_y) * 0.5;
|
||||
if (m_filter.value)
|
||||
{
|
||||
float fraction = bound(0, m_filter.value, 2) * 0.5;
|
||||
mouse_x = (mouse_x*(1-fraction) + old_mouse_x*fraction);
|
||||
mouse_y = (mouse_y*(1-fraction) + old_mouse_y*fraction);
|
||||
}
|
||||
|
||||
old_mouse_x = mouse_x;
|
||||
old_mouse_y = mouse_y;
|
||||
old_mouse_x = mx;
|
||||
old_mouse_y = my;
|
||||
|
||||
mouse_x *= sensitivity.value;
|
||||
mouse_y *= sensitivity.value;
|
||||
if (m_accel.value) {
|
||||
mouse_deltadist = sqrt(mx*mx + my*my);
|
||||
mouse_x *= (mouse_deltadist*m_accel.value + sensitivity.value*in_sensitivityscale);
|
||||
mouse_y *= (mouse_deltadist*m_accel.value + sensitivity.value*in_sensitivityscale);
|
||||
} else {
|
||||
mouse_x *= sensitivity.value*in_sensitivityscale;
|
||||
mouse_y *= sensitivity.value*in_sensitivityscale;
|
||||
}
|
||||
|
||||
#ifdef IN_XFLIP
|
||||
if(in_xflip.value) mouse_x *= -1;
|
||||
|
|
Loading…
Reference in a new issue