mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-22 12:01:25 +00:00
Added EF_BRIGHTFIELD to classic particles.
fix r_softwarebanding fix r_waterstyle git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4842 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
bed989f529
commit
f13a87f021
16 changed files with 241 additions and 100 deletions
|
@ -2890,6 +2890,8 @@ static void CL_TransitionPacketEntities(int newsequence, packet_entities_t *newp
|
||||||
float *snew__origin;
|
float *snew__origin;
|
||||||
float *sold__origin;
|
float *sold__origin;
|
||||||
|
|
||||||
|
qboolean isnew;
|
||||||
|
|
||||||
vec3_t move;
|
vec3_t move;
|
||||||
|
|
||||||
float a1, a2;
|
float a1, a2;
|
||||||
|
@ -2927,8 +2929,6 @@ static void CL_TransitionPacketEntities(int newsequence, packet_entities_t *newp
|
||||||
rag_removedeltaent(le);
|
rag_removedeltaent(le);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (!sold) //I'm lazy
|
|
||||||
sold = snew;
|
|
||||||
|
|
||||||
if (snew->number >= cl.maxlerpents)
|
if (snew->number >= cl.maxlerpents)
|
||||||
{
|
{
|
||||||
|
@ -2941,6 +2941,14 @@ static void CL_TransitionPacketEntities(int newsequence, packet_entities_t *newp
|
||||||
le->sequence = newsequence;
|
le->sequence = newsequence;
|
||||||
le->entstate = snew;
|
le->entstate = snew;
|
||||||
|
|
||||||
|
if (!sold)
|
||||||
|
{
|
||||||
|
isnew = true;
|
||||||
|
sold = snew; //don't crash if anything tries poking sold
|
||||||
|
}
|
||||||
|
else
|
||||||
|
isnew = false;
|
||||||
|
|
||||||
if (snew->u.q1.pmovetype)
|
if (snew->u.q1.pmovetype)
|
||||||
{
|
{
|
||||||
if (!cl.do_lerp_players)
|
if (!cl.do_lerp_players)
|
||||||
|
@ -2948,7 +2956,7 @@ static void CL_TransitionPacketEntities(int newsequence, packet_entities_t *newp
|
||||||
entity_state_t *from;
|
entity_state_t *from;
|
||||||
float age;
|
float age;
|
||||||
packet_entities_t *latest;
|
packet_entities_t *latest;
|
||||||
if (sold == snew)
|
if (isnew)
|
||||||
{
|
{
|
||||||
/*keep trails correct*/
|
/*keep trails correct*/
|
||||||
le->isnew = true;
|
le->isnew = true;
|
||||||
|
@ -2998,12 +3006,12 @@ static void CL_TransitionPacketEntities(int newsequence, packet_entities_t *newp
|
||||||
VectorSubtract(snew__origin, sold__origin, move);
|
VectorSubtract(snew__origin, sold__origin, move);
|
||||||
if (DotProduct(move, move) > 200*200 || snew->modelindex != sold->modelindex)
|
if (DotProduct(move, move) > 200*200 || snew->modelindex != sold->modelindex)
|
||||||
{
|
{
|
||||||
sold = snew; //teleported?
|
isnew = true; //disable lerping (and indirectly trails)
|
||||||
VectorClear(move);
|
VectorClear(move);
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorCopy(le->origin, le->lastorigin);
|
VectorCopy(le->origin, le->lastorigin);
|
||||||
if (sold == snew)
|
if (isnew)
|
||||||
{
|
{
|
||||||
//new this frame (or we noticed something changed significantly)
|
//new this frame (or we noticed something changed significantly)
|
||||||
VectorCopy(snew__origin, le->origin);
|
VectorCopy(snew__origin, le->origin);
|
||||||
|
@ -3075,7 +3083,7 @@ static void CL_TransitionPacketEntities(int newsequence, packet_entities_t *newp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CL_UpdateNetFrameLerpState(sold == snew, snew->frame, le);
|
CL_UpdateNetFrameLerpState(isnew, snew->frame, le);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3584,8 +3592,16 @@ void CL_LinkPacketEntities (void)
|
||||||
if (model2)
|
if (model2)
|
||||||
CL_AddVWeapModel (ent, model2);
|
CL_AddVWeapModel (ent, model2);
|
||||||
|
|
||||||
|
//figure out which trail this entity is using
|
||||||
|
trailef = model->particletrail;
|
||||||
|
trailidx = model->traildefaultindex;
|
||||||
|
if (state->effects & EF_HASPARTICLETRAIL)
|
||||||
|
P_DefaultTrail (state->effects, modelflags, &trailef, &trailidx);
|
||||||
|
if (state->u.q1.traileffectnum)
|
||||||
|
trailef = CL_TranslateParticleFromServer(state->u.q1.traileffectnum);
|
||||||
|
|
||||||
// add automatic particle trails
|
// add automatic particle trails
|
||||||
if (!model || (!(modelflags&~MF_ROTATE) && model->particletrail<0 && model->particleeffect<0 && state->u.q1.traileffectnum==0))
|
if (!model || (!(modelflags&~MF_ROTATE) && trailef < 0))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!cls.allow_anyparticles && !(modelflags & ~MF_ROTATE))
|
if (!cls.allow_anyparticles && !(modelflags & ~MF_ROTATE))
|
||||||
|
@ -3609,14 +3625,6 @@ void CL_LinkPacketEntities (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//figure out which trail this entity is using
|
|
||||||
trailef = model->particletrail;
|
|
||||||
trailidx = model->traildefaultindex;
|
|
||||||
if (state->effects & 0xff800000)
|
|
||||||
P_DefaultTrail (modelflags, &trailef, &trailidx);
|
|
||||||
if (state->u.q1.traileffectnum)
|
|
||||||
trailef = CL_TranslateParticleFromServer(state->u.q1.traileffectnum);
|
|
||||||
|
|
||||||
//and emit it
|
//and emit it
|
||||||
if (trailef == P_INVALID || pe->ParticleTrail (old_origin, ent->origin, trailef, ent->keynum, ent->axis, &(le->trailstate)))
|
if (trailef == P_INVALID || pe->ParticleTrail (old_origin, ent->origin, trailef, ent->keynum, ent->axis, &(le->trailstate)))
|
||||||
if (model->traildefaultindex >= 0)
|
if (model->traildefaultindex >= 0)
|
||||||
|
@ -4977,6 +4985,7 @@ Made up of: clients, packet_entities, nails, and tents
|
||||||
*/
|
*/
|
||||||
void CL_ClearEntityLists(void)
|
void CL_ClearEntityLists(void)
|
||||||
{
|
{
|
||||||
|
cl_framecount++;
|
||||||
if (cl_numvisedicts+128 >= cl_maxvisedicts)
|
if (cl_numvisedicts+128 >= cl_maxvisedicts)
|
||||||
{
|
{
|
||||||
int newnum = cl_maxvisedicts + 256;
|
int newnum = cl_maxvisedicts + 256;
|
||||||
|
@ -4994,6 +5003,7 @@ void CL_ClearEntityLists(void)
|
||||||
}
|
}
|
||||||
void CL_FreeVisEdicts(void)
|
void CL_FreeVisEdicts(void)
|
||||||
{
|
{
|
||||||
|
cl_framecount++;
|
||||||
BZ_Free(cl_visedicts);
|
BZ_Free(cl_visedicts);
|
||||||
cl_visedicts = NULL;
|
cl_visedicts = NULL;
|
||||||
cl_maxvisedicts = 0;
|
cl_maxvisedicts = 0;
|
||||||
|
|
|
@ -211,6 +211,7 @@ int rtlights_first, rtlights_max;
|
||||||
int cl_numvisedicts;
|
int cl_numvisedicts;
|
||||||
int cl_maxvisedicts;
|
int cl_maxvisedicts;
|
||||||
entity_t *cl_visedicts;
|
entity_t *cl_visedicts;
|
||||||
|
int cl_framecount;
|
||||||
|
|
||||||
scenetris_t *cl_stris;
|
scenetris_t *cl_stris;
|
||||||
vecV_t *fte_restrict cl_strisvertv;
|
vecV_t *fte_restrict cl_strisvertv;
|
||||||
|
|
|
@ -489,7 +489,7 @@ void P_LoadedModel(model_t *mod)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mod->particletrail == P_INVALID)
|
if (mod->particletrail == P_INVALID)
|
||||||
P_DefaultTrail(mod->flags, &mod->particletrail, &mod->traildefaultindex);
|
P_DefaultTrail(0, mod->flags, &mod->particletrail, &mod->traildefaultindex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CL_RefreshCustomTEnts(void);
|
void CL_RefreshCustomTEnts(void);
|
||||||
|
|
|
@ -952,6 +952,7 @@ char *CL_TryingToConnect(void);
|
||||||
|
|
||||||
void CL_ExecInitialConfigs(char *defaultexec);
|
void CL_ExecInitialConfigs(char *defaultexec);
|
||||||
|
|
||||||
|
extern int cl_framecount; //number of times the entity lists have been cleared+reset.
|
||||||
extern int cl_numvisedicts;
|
extern int cl_numvisedicts;
|
||||||
extern int cl_maxvisedicts;
|
extern int cl_maxvisedicts;
|
||||||
extern entity_t *cl_visedicts;
|
extern entity_t *cl_visedicts;
|
||||||
|
|
|
@ -39,6 +39,8 @@ typedef enum {
|
||||||
TRACER2_TRAIL,
|
TRACER2_TRAIL,
|
||||||
VOOR_TRAIL,
|
VOOR_TRAIL,
|
||||||
|
|
||||||
|
BRIGHTFIELD_POINT,
|
||||||
|
|
||||||
BLOBEXPLOSION_POINT,
|
BLOBEXPLOSION_POINT,
|
||||||
LAVASPLASH_POINT,
|
LAVASPLASH_POINT,
|
||||||
EXPLOSION_POINT,
|
EXPLOSION_POINT,
|
||||||
|
@ -64,7 +66,9 @@ typedef struct cparticle_s
|
||||||
pt_blob,
|
pt_blob,
|
||||||
pt_blob2,
|
pt_blob2,
|
||||||
pt_grav,
|
pt_grav,
|
||||||
pt_slowgrav
|
pt_slowgrav,
|
||||||
|
|
||||||
|
pt_oneframe
|
||||||
} type;
|
} type;
|
||||||
unsigned int rgb;
|
unsigned int rgb;
|
||||||
struct cparticle_s *next;
|
struct cparticle_s *next;
|
||||||
|
@ -77,6 +81,8 @@ static int r_numparticles;
|
||||||
static cparticle_t *particles, *fte_restrict active_particles, *free_particles;
|
static cparticle_t *particles, *fte_restrict active_particles, *free_particles;
|
||||||
extern cvar_t r_part_density, r_part_classic_expgrav;
|
extern cvar_t r_part_density, r_part_classic_expgrav;
|
||||||
|
|
||||||
|
static unsigned int particleframe;
|
||||||
|
|
||||||
extern qbyte default_quakepal[]; /*for ramps more than anything else*/
|
extern qbyte default_quakepal[]; /*for ramps more than anything else*/
|
||||||
static int ramp1[8] = {0x6f, 0x6d, 0x6b, 0x69, 0x67, 0x65, 0x63, 0x61};
|
static int ramp1[8] = {0x6f, 0x6d, 0x6b, 0x69, 0x67, 0x65, 0x63, 0x61};
|
||||||
static int ramp2[8] = {0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x68, 0x66};
|
static int ramp2[8] = {0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x68, 0x66};
|
||||||
|
@ -130,6 +136,8 @@ static int PClassic_FindParticleType(const char *name)
|
||||||
return TELEPORTSPLASH_POINT;
|
return TELEPORTSPLASH_POINT;
|
||||||
if (!stricmp("te_muzzleflash", name))
|
if (!stricmp("te_muzzleflash", name))
|
||||||
return MUZZLEFLASH_POINT;
|
return MUZZLEFLASH_POINT;
|
||||||
|
if (!stricmp("ef_brightfield", name))
|
||||||
|
return BRIGHTFIELD_POINT;
|
||||||
|
|
||||||
return P_INVALID;
|
return P_INVALID;
|
||||||
}
|
}
|
||||||
|
@ -176,6 +184,9 @@ static qboolean PClassic_Query(int type, int body, char *outstr, int outstrlen)
|
||||||
case TELEPORTSPLASH_POINT:
|
case TELEPORTSPLASH_POINT:
|
||||||
n = "te_teleport";
|
n = "te_teleport";
|
||||||
break;
|
break;
|
||||||
|
case BRIGHTFIELD_POINT:
|
||||||
|
n = "ef_brightfield";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!n)
|
if (!n)
|
||||||
|
@ -329,6 +340,27 @@ static void PClassic_ClearParticles (void)
|
||||||
particles[r_numparticles - 1].next = NULL;
|
particles[r_numparticles - 1].next = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//some particles (brightfield) must last only one frame
|
||||||
|
static void PClassic_ClearPerFrame(void)
|
||||||
|
{
|
||||||
|
if (particleframe != -1 && particleframe != cl_framecount)
|
||||||
|
{
|
||||||
|
cparticle_t **link, *kill;
|
||||||
|
for (link = &active_particles; *link; )
|
||||||
|
{
|
||||||
|
if ((*link)->type == pt_oneframe)
|
||||||
|
{
|
||||||
|
kill = *link;
|
||||||
|
*link = kill->next;
|
||||||
|
kill->next = free_particles;
|
||||||
|
free_particles = kill;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
link = &(*link)->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//draws all the active particles.
|
//draws all the active particles.
|
||||||
static void PClassic_DrawParticles(void)
|
static void PClassic_DrawParticles(void)
|
||||||
{
|
{
|
||||||
|
@ -351,6 +383,12 @@ static void PClassic_DrawParticles(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (particleframe != -1 && particleframe != cl_framecount)
|
||||||
|
{
|
||||||
|
PClassic_ClearPerFrame();
|
||||||
|
particleframe = -1;
|
||||||
|
}
|
||||||
|
|
||||||
r_partscale = 0.004 * tan (r_refdef.fov_x * (M_PI / 180) * 0.5f);
|
r_partscale = 0.004 * tan (r_refdef.fov_x * (M_PI / 180) * 0.5f);
|
||||||
VectorScale (vup, 1.5, up);
|
VectorScale (vup, 1.5, up);
|
||||||
VectorScale (vright, 1.5, right);
|
VectorScale (vright, 1.5, right);
|
||||||
|
@ -486,6 +524,7 @@ static void PClassic_DrawParticles(void)
|
||||||
|
|
||||||
switch (p->type)
|
switch (p->type)
|
||||||
{
|
{
|
||||||
|
case pt_oneframe:
|
||||||
case pt_static:
|
case pt_static:
|
||||||
break;
|
break;
|
||||||
case pt_fire:
|
case pt_fire:
|
||||||
|
@ -743,6 +782,126 @@ static void Classic_TeleportSplash (vec3_t org)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define NUMVERTEXNORMALS 162
|
||||||
|
//vec3_t avelocity = {23, 7, 3};
|
||||||
|
//float partstep = 0.01;
|
||||||
|
//float timescale = 0.01;
|
||||||
|
static vec3_t avelocities[NUMVERTEXNORMALS];
|
||||||
|
static void Classic_BrightField (vec3_t org)
|
||||||
|
{
|
||||||
|
extern float r_avertexnormals[NUMVERTEXNORMALS][3];
|
||||||
|
float beamlength = 16;
|
||||||
|
|
||||||
|
int count;
|
||||||
|
int i;
|
||||||
|
cparticle_t *p;
|
||||||
|
float angle;
|
||||||
|
float sr, sp, sy, cr, cp, cy;
|
||||||
|
vec3_t forward;
|
||||||
|
float dist;
|
||||||
|
|
||||||
|
PClassic_ClearPerFrame();
|
||||||
|
particleframe = cl_framecount;
|
||||||
|
|
||||||
|
dist = 64;
|
||||||
|
count = 50;
|
||||||
|
|
||||||
|
if (!avelocities[0][0])
|
||||||
|
{
|
||||||
|
for (i=0 ; i<NUMVERTEXNORMALS*3 ; i++)
|
||||||
|
avelocities[0][i] = (rand()&255) * 0.01;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0 ; i<NUMVERTEXNORMALS ; i++)
|
||||||
|
{
|
||||||
|
if (!free_particles)
|
||||||
|
return;
|
||||||
|
p = free_particles;
|
||||||
|
free_particles = p->next;
|
||||||
|
p->next = active_particles;
|
||||||
|
active_particles = p;
|
||||||
|
|
||||||
|
angle = cl.time * avelocities[i][0];
|
||||||
|
sy = sin(angle);
|
||||||
|
cy = cos(angle);
|
||||||
|
angle = cl.time * avelocities[i][1];
|
||||||
|
sp = sin(angle);
|
||||||
|
cp = cos(angle);
|
||||||
|
angle = cl.time * avelocities[i][2];
|
||||||
|
sr = sin(angle);
|
||||||
|
cr = cos(angle);
|
||||||
|
|
||||||
|
forward[0] = cp*cy;
|
||||||
|
forward[1] = cp*sy;
|
||||||
|
forward[2] = -sp;
|
||||||
|
|
||||||
|
p->die = cl.time;// + 0.01;
|
||||||
|
p->rgb = d_8to24rgbtable[0x6f];
|
||||||
|
p->type = pt_oneframe;
|
||||||
|
|
||||||
|
p->org[0] = org[0] + r_avertexnormals[i][0]*dist + forward[0]*beamlength;
|
||||||
|
p->org[1] = org[1] + r_avertexnormals[i][1]*dist + forward[1]*beamlength;
|
||||||
|
p->org[2] = org[2] + r_avertexnormals[i][2]*dist + forward[2]*beamlength;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//svc_tempentity support: this is the function that handles 'special' point effects.
|
||||||
|
//use the trail state so fast/slow frames keep the correct particle counts on certain every-frame effects
|
||||||
|
static int PClassic_RunParticleEffectState (vec3_t org, vec3_t dir, float count, int typenum, trailstate_t **tsk)
|
||||||
|
{
|
||||||
|
switch(typenum)
|
||||||
|
{
|
||||||
|
case BRIGHTFIELD_POINT:
|
||||||
|
Classic_BrightField(org);
|
||||||
|
break;
|
||||||
|
case BLOBEXPLOSION_POINT:
|
||||||
|
Classic_BlobExplosion(org);
|
||||||
|
break;
|
||||||
|
case LAVASPLASH_POINT:
|
||||||
|
Classic_LavaSplash(org);
|
||||||
|
break;
|
||||||
|
case EXPLOSION_POINT:
|
||||||
|
Classic_ParticleExplosion(org);
|
||||||
|
break;
|
||||||
|
case TELEPORTSPLASH_POINT:
|
||||||
|
Classic_TeleportSplash(org);
|
||||||
|
break;
|
||||||
|
case MUZZLEFLASH_POINT:
|
||||||
|
{
|
||||||
|
dlight_t *dl = CL_AllocDlight (0);
|
||||||
|
if (dir)
|
||||||
|
VectorCopy(dir, dl->axis[0]);
|
||||||
|
else
|
||||||
|
VectorSet(dir, 0, 0, 1);
|
||||||
|
VectorVectors(dl->axis[0], dl->axis[1], dl->axis[2]);
|
||||||
|
VectorInverse(dl->axis[1]);
|
||||||
|
if (dir)
|
||||||
|
VectorMA (org, 15, dl->axis[0], dl->origin);
|
||||||
|
else
|
||||||
|
VectorCopy (org, dl->origin);
|
||||||
|
|
||||||
|
dl->radius = 200 + (rand()&31);
|
||||||
|
dl->minlight = 32;
|
||||||
|
dl->die = cl.time + 0.1;
|
||||||
|
dl->color[0] = 1.5;
|
||||||
|
dl->color[1] = 1.3;
|
||||||
|
dl->color[2] = 1.0;
|
||||||
|
|
||||||
|
dl->channelfade[0] = 1.5;
|
||||||
|
dl->channelfade[1] = 0.75;
|
||||||
|
dl->channelfade[2] = 0.375;
|
||||||
|
dl->decay = 1000;
|
||||||
|
#ifdef RTLIGHTS
|
||||||
|
dl->lightcolourscales[2] = 4;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static float Classic_ParticleTrail (vec3_t start, vec3_t end, float leftover, effect_type_t type)
|
static float Classic_ParticleTrail (vec3_t start, vec3_t end, float leftover, effect_type_t type)
|
||||||
{
|
{
|
||||||
vec3_t point, delta, dir;
|
vec3_t point, delta, dir;
|
||||||
|
@ -751,6 +910,12 @@ static float Classic_ParticleTrail (vec3_t start, vec3_t end, float leftover, ef
|
||||||
cparticle_t *p;
|
cparticle_t *p;
|
||||||
static int tracercount;
|
static int tracercount;
|
||||||
|
|
||||||
|
if (type >= BRIGHTFIELD_POINT)
|
||||||
|
{
|
||||||
|
PClassic_RunParticleEffectState(end, vec3_origin, 1, type, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
VectorCopy (start, point);
|
VectorCopy (start, point);
|
||||||
VectorSubtract (end, start, delta);
|
VectorSubtract (end, start, delta);
|
||||||
if (!(len = VectorLength (delta)))
|
if (!(len = VectorLength (delta)))
|
||||||
|
@ -882,60 +1047,6 @@ static int PClassic_ParticleTrail (vec3_t startpos, vec3_t end, int type, int dl
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//svc_tempentity support: this is the function that handles 'special' point effects.
|
|
||||||
//use the trail state so fast/slow frames keep the correct particle counts on certain every-frame effects
|
|
||||||
static int PClassic_RunParticleEffectState (vec3_t org, vec3_t dir, float count, int typenum, trailstate_t **tsk)
|
|
||||||
{
|
|
||||||
switch(typenum)
|
|
||||||
{
|
|
||||||
case BLOBEXPLOSION_POINT:
|
|
||||||
Classic_BlobExplosion(org);
|
|
||||||
break;
|
|
||||||
case LAVASPLASH_POINT:
|
|
||||||
Classic_LavaSplash(org);
|
|
||||||
break;
|
|
||||||
case EXPLOSION_POINT:
|
|
||||||
Classic_ParticleExplosion(org);
|
|
||||||
break;
|
|
||||||
case TELEPORTSPLASH_POINT:
|
|
||||||
Classic_TeleportSplash(org);
|
|
||||||
break;
|
|
||||||
case MUZZLEFLASH_POINT:
|
|
||||||
{
|
|
||||||
dlight_t *dl = CL_AllocDlight (0);
|
|
||||||
if (dir)
|
|
||||||
VectorCopy(dir, dl->axis[0]);
|
|
||||||
else
|
|
||||||
VectorSet(dir, 0, 0, 1);
|
|
||||||
VectorVectors(dl->axis[0], dl->axis[1], dl->axis[2]);
|
|
||||||
VectorInverse(dl->axis[1]);
|
|
||||||
if (dir)
|
|
||||||
VectorMA (org, 15, dl->axis[0], dl->origin);
|
|
||||||
else
|
|
||||||
VectorCopy (org, dl->origin);
|
|
||||||
|
|
||||||
dl->radius = 200 + (rand()&31);
|
|
||||||
dl->minlight = 32;
|
|
||||||
dl->die = cl.time + 0.1;
|
|
||||||
dl->color[0] = 1.5;
|
|
||||||
dl->color[1] = 1.3;
|
|
||||||
dl->color[2] = 1.0;
|
|
||||||
|
|
||||||
dl->channelfade[0] = 1.5;
|
|
||||||
dl->channelfade[1] = 0.75;
|
|
||||||
dl->channelfade[2] = 0.375;
|
|
||||||
dl->decay = 1000;
|
|
||||||
#ifdef RTLIGHTS
|
|
||||||
dl->lightcolourscales[2] = 4;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//svc_particle support: add X particles with the given colour, velocity, and aproximate origin.
|
//svc_particle support: add X particles with the given colour, velocity, and aproximate origin.
|
||||||
static void PClassic_RunParticleEffect (vec3_t org, vec3_t dir, int color, int count)
|
static void PClassic_RunParticleEffect (vec3_t org, vec3_t dir, int color, int count)
|
||||||
{
|
{
|
||||||
|
|
|
@ -818,14 +818,29 @@ static void P_SelectableTrail(int *trailid, int *trailpalidx, cvar_t *selection,
|
||||||
|
|
||||||
|
|
||||||
//figure out which particle trail to use for the given model, filling in its values as required.
|
//figure out which particle trail to use for the given model, filling in its values as required.
|
||||||
void P_DefaultTrail (unsigned int modelflags, int *trailid, int *trailpalidx)
|
void P_DefaultTrail (unsigned int entityeffects, unsigned int modelflags, int *trailid, int *trailpalidx)
|
||||||
{
|
{
|
||||||
// TODO: EF_BRIGHTFIELD should probably be handled in here somewhere
|
// TODO: EF_BRIGHTFIELD should probably be handled in here somewhere
|
||||||
// TODO: make trail default color into RGB values instead of indexes
|
// TODO: make trail default color into RGB values instead of indexes
|
||||||
if (!pe)
|
if (!pe)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (modelflags & MF_ROCKET)
|
if (entityeffects & EF_BRIGHTFIELD)
|
||||||
|
{
|
||||||
|
*trailid = P_FindParticleType("EF_BRIGHTFIELD");
|
||||||
|
*trailpalidx = 70;
|
||||||
|
}
|
||||||
|
else if (entityeffects & DPEF_FLAME)
|
||||||
|
{
|
||||||
|
*trailid = P_FindParticleType("EF_FLAME");
|
||||||
|
*trailpalidx = 70;
|
||||||
|
}
|
||||||
|
else if (entityeffects & DPEF_STARDUST)
|
||||||
|
{
|
||||||
|
*trailid = P_FindParticleType("EF_STARDUST");
|
||||||
|
*trailpalidx = 70;
|
||||||
|
}
|
||||||
|
else if (modelflags & MF_ROCKET)
|
||||||
P_SelectableTrail(trailid, trailpalidx, &r_rockettrail, P_FindParticleType("TR_ROCKET"), 109, P_FindParticleType("TR_GRENADE"), 6);
|
P_SelectableTrail(trailid, trailpalidx, &r_rockettrail, P_FindParticleType("TR_ROCKET"), 109, P_FindParticleType("TR_GRENADE"), 6);
|
||||||
else if (modelflags & MF_GRENADE)
|
else if (modelflags & MF_GRENADE)
|
||||||
P_SelectableTrail(trailid, trailpalidx, &r_grenadetrail, P_FindParticleType("TR_GRENADE"), 6, P_FindParticleType("TR_ROCKET"), 109);
|
P_SelectableTrail(trailid, trailpalidx, &r_grenadetrail, P_FindParticleType("TR_GRENADE"), 6, P_FindParticleType("TR_ROCKET"), 109);
|
||||||
|
|
|
@ -99,7 +99,7 @@ struct msurface_s;
|
||||||
void P_InitParticleSystem(void);
|
void P_InitParticleSystem(void);
|
||||||
void P_Shutdown(void);
|
void P_Shutdown(void);
|
||||||
void P_LoadedModel(struct model_s *mod); /*checks a model's various effects*/
|
void P_LoadedModel(struct model_s *mod); /*checks a model's various effects*/
|
||||||
void P_DefaultTrail (unsigned int modelflags, int *trailid, int *trailpalidx);
|
void P_DefaultTrail (unsigned int entityeffects, unsigned int modelflags, int *trailid, int *trailpalidx);
|
||||||
void P_EmitEffect (vec3_t pos, int type, trailstate_t **tsk);//this is just a wrapper
|
void P_EmitEffect (vec3_t pos, int type, trailstate_t **tsk);//this is just a wrapper
|
||||||
|
|
||||||
#define P_FindParticleType pe->FindParticleType
|
#define P_FindParticleType pe->FindParticleType
|
||||||
|
|
|
@ -1130,7 +1130,7 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass)
|
||||||
if (shaderstate.curtexnums && TEXLOADED(shaderstate.curtexnums->paletted))
|
if (shaderstate.curtexnums && TEXLOADED(shaderstate.curtexnums->paletted))
|
||||||
t = shaderstate.curtexnums->paletted;
|
t = shaderstate.curtexnums->paletted;
|
||||||
else
|
else
|
||||||
t = missing_texture;
|
t = r_whiteimage;
|
||||||
break;
|
break;
|
||||||
case T_GEN_NORMALMAP:
|
case T_GEN_NORMALMAP:
|
||||||
t = (shaderstate.curtexnums && TEXLOADED(shaderstate.curtexnums->bump))?shaderstate.curtexnums->bump:missing_texture_normal;
|
t = (shaderstate.curtexnums && TEXLOADED(shaderstate.curtexnums->bump))?shaderstate.curtexnums->bump:missing_texture_normal;
|
||||||
|
|
|
@ -1208,13 +1208,7 @@ void Mod_FinishTexture(texture_t *tx, const char *loadname)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unsigned int maps = 0;
|
unsigned int maps = 0;
|
||||||
if (r_softwarebanding.ival)
|
|
||||||
maps |= SHADER_HASPALETTED;
|
maps |= SHADER_HASPALETTED;
|
||||||
if (!r_softwarebanding.ival
|
|
||||||
#ifdef RTLIGHTS
|
|
||||||
|| r_shadow_realtime_world.ival || r_shadow_realtime_dlight.ival
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
maps |= SHADER_HASDIFFUSE;
|
maps |= SHADER_HASDIFFUSE;
|
||||||
if (r_fb_bmodels.ival)
|
if (r_fb_bmodels.ival)
|
||||||
maps |= SHADER_HASFULLBRIGHT;
|
maps |= SHADER_HASFULLBRIGHT;
|
||||||
|
|
|
@ -162,20 +162,20 @@ m*_t structures are in-memory
|
||||||
#define EF_BLUE (1<<6)
|
#define EF_BLUE (1<<6)
|
||||||
#define EF_RED (1<<7)
|
#define EF_RED (1<<7)
|
||||||
#define H2EF_NODRAW (1<<7) //this is going to get complicated... emulated server side.
|
#define H2EF_NODRAW (1<<7) //this is going to get complicated... emulated server side.
|
||||||
#define _DPEF_NOGUNBOB (1<<8) //viewmodel attachment does not bob
|
#define DPEF_NOGUNBOB_ (1<<8) //viewmodel attachment does not bob
|
||||||
#define EF_FULLBRIGHT (1<<9) //abslight=1
|
#define EF_FULLBRIGHT (1<<9) //abslight=1
|
||||||
#define _DPEF_FLAME (1<<10) //'onfire'
|
#define DPEF_FLAME (1<<10) //'onfire'
|
||||||
#define _DPEF_STARDUST (1<<11) //'showering sparks'
|
#define DPEF_STARDUST (1<<11) //'showering sparks'
|
||||||
#define DPEF_NOSHADOW (1<<12) //doesn't cast a shadow
|
#define DPEF_NOSHADOW (1<<12) //doesn't cast a shadow
|
||||||
#define EF_NODEPTHTEST (1<<13) //shows through walls.
|
#define EF_NODEPTHTEST (1<<13) //shows through walls.
|
||||||
#define _DPEF_SELECTABLE (1<<14) //highlights when prydoncursored
|
#define DPEF_SELECTABLE_ (1<<14) //highlights when prydoncursored
|
||||||
#define _DPEF_DOUBLESIDED (1<<15) //disables culling
|
#define DPEF_DOUBLESIDED_ (1<<15) //disables culling
|
||||||
#define _DPEF_NOSELFSHADOW (1<<16) //doesn't cast shadows on any noselfshadow entities.
|
#define DPEF_NOSELFSHADOW_ (1<<16) //doesn't cast shadows on any noselfshadow entities.
|
||||||
#define _DPEF_DYNAMICMODELLIGHT (1<<17)
|
#define DPEF_DYNAMICMODELLIGHT_ (1<<17)
|
||||||
#define EF_UNUSED18 (1<<18)
|
#define EF_UNUSED18 (1<<18)
|
||||||
#define EF_UNUSED19 (1<<19)
|
#define EF_UNUSED19 (1<<19)
|
||||||
#define _DPEF_RESTARTANIM_BIT (1<<20) //exact semantics seems odd
|
#define DPEF_RESTARTANIM_BIT_ (1<<20) //exact semantics seems odd
|
||||||
#define _DPEF_TELEPORT_BIT (1<<21) //disable lerping while set
|
#define DPEF_TELEPORT_BIT_ (1<<21) //disable lerping while set
|
||||||
#define DPEF_LOWPRECISION (1<<22) //part of the protocol/server, not the client itself.
|
#define DPEF_LOWPRECISION (1<<22) //part of the protocol/server, not the client itself.
|
||||||
#define EF_NOMODELFLAGS (1<<23)
|
#define EF_NOMODELFLAGS (1<<23)
|
||||||
#define EF_MF_ROCKET (1<<24)
|
#define EF_MF_ROCKET (1<<24)
|
||||||
|
@ -187,6 +187,8 @@ m*_t structures are in-memory
|
||||||
#define EF_MF_TRACER2 (1u<<30)
|
#define EF_MF_TRACER2 (1u<<30)
|
||||||
#define EF_MF_TRACER3 (1u<<31)
|
#define EF_MF_TRACER3 (1u<<31)
|
||||||
|
|
||||||
|
#define EF_HASPARTICLETRAIL (0xff800000 | EF_BRIGHTFIELD|DPEF_FLAME|DPEF_STARDUST)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
|
|
|
@ -2235,7 +2235,7 @@ static void Shaderpass_Map (shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||||
|
|
||||||
if (pass->tcgen == TC_GEN_UNSPECIFIED)
|
if (pass->tcgen == TC_GEN_UNSPECIFIED)
|
||||||
pass->tcgen = TC_GEN_BASE;
|
pass->tcgen = TC_GEN_BASE;
|
||||||
if (!*shader->mapname && pass->tcgen == TC_GEN_BASE)
|
if (!*shader->mapname && *token != '$' && pass->tcgen == TC_GEN_BASE)
|
||||||
Q_strncpyz(shader->mapname, token, sizeof(shader->mapname));
|
Q_strncpyz(shader->mapname, token, sizeof(shader->mapname));
|
||||||
pass->anim_frames[0] = Shader_FindImage (token, flags);
|
pass->anim_frames[0] = Shader_FindImage (token, flags);
|
||||||
}
|
}
|
||||||
|
@ -3879,7 +3879,10 @@ done:;
|
||||||
if (best)
|
if (best)
|
||||||
{
|
{
|
||||||
if (best->texgen == T_GEN_ANIMMAP || best->texgen == T_GEN_SINGLEMAP)
|
if (best->texgen == T_GEN_ANIMMAP || best->texgen == T_GEN_SINGLEMAP)
|
||||||
|
{
|
||||||
|
if (best->anim_frames[0] && *best->anim_frames[0]->ident != '$')
|
||||||
s->defaulttextures.base = best->anim_frames[0];
|
s->defaulttextures.base = best->anim_frames[0];
|
||||||
|
}
|
||||||
#ifndef NOMEDIA
|
#ifndef NOMEDIA
|
||||||
else if (pass->texgen == T_GEN_VIDEOMAP && pass->cin)
|
else if (pass->texgen == T_GEN_VIDEOMAP && pass->cin)
|
||||||
s->defaulttextures.base = Media_UpdateForShader(best->cin);
|
s->defaulttextures.base = Media_UpdateForShader(best->cin);
|
||||||
|
@ -4293,7 +4296,7 @@ void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *subpath, unsigned
|
||||||
if (!TEXVALID(tex->bump) && *shader->mapname)
|
if (!TEXVALID(tex->bump) && *shader->mapname)
|
||||||
tex->bump = R_LoadHiResTexture(va("%s_norm", shader->mapname), NULL, imageflags|IF_TRYBUMP);
|
tex->bump = R_LoadHiResTexture(va("%s_norm", shader->mapname), NULL, imageflags|IF_TRYBUMP);
|
||||||
if (!TEXVALID(tex->bump))
|
if (!TEXVALID(tex->bump))
|
||||||
tex->bump = Image_GetTexture(va("%s_norm", imagename), subpath, imageflags|IF_TRYBUMP, r_shadow_bumpscale_basetexture.ival?mipdata[0]:NULL, palette, width, height, TF_HEIGHT8PAL);
|
tex->bump = Image_GetTexture(va("%s_norm", imagename), subpath, imageflags|IF_TRYBUMP, (r_shadow_bumpscale_basetexture.ival||*imagename=='*')?mipdata[0]:NULL, palette, width, height, TF_HEIGHT8PAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loadflags & SHADER_HASTOPBOTTOM)
|
if (loadflags & SHADER_HASTOPBOTTOM)
|
||||||
|
|
|
@ -277,7 +277,7 @@ extern entity_t r_worldentity;
|
||||||
extern vec3_t r_entorigin;
|
extern vec3_t r_entorigin;
|
||||||
extern entity_t *currententity;
|
extern entity_t *currententity;
|
||||||
extern int r_visframecount; // ??? what difs?
|
extern int r_visframecount; // ??? what difs?
|
||||||
extern int r_framecount;
|
extern int r_framecount; //number of scenes drawn (specifically, number of times the world is frustum culled)
|
||||||
|
|
||||||
extern qboolean r_loadbumpmapping;
|
extern qboolean r_loadbumpmapping;
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,8 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#define s_refractdepth s_t3\n"
|
"#define s_refractdepth s_t3\n"
|
||||||
|
|
||||||
"uniform float cvar_r_glsl_turbscale;\n"
|
"uniform float cvar_r_glsl_turbscale;\n"
|
||||||
|
"uniform sampler2D s_normalmap;\n"
|
||||||
|
"uniform sampler2D s_diffuse;\n"
|
||||||
"uniform sampler2D s_refract; //refract\n"
|
"uniform sampler2D s_refract; //refract\n"
|
||||||
"uniform sampler2D s_reflect; //reflection\n"
|
"uniform sampler2D s_reflect; //reflection\n"
|
||||||
"uniform sampler2D s_refractdepth; //refraction depth\n"
|
"uniform sampler2D s_refractdepth; //refraction depth\n"
|
||||||
|
|
|
@ -46,6 +46,8 @@ void main (void)
|
||||||
#define s_refractdepth s_t3
|
#define s_refractdepth s_t3
|
||||||
|
|
||||||
uniform float cvar_r_glsl_turbscale;
|
uniform float cvar_r_glsl_turbscale;
|
||||||
|
uniform sampler2D s_normalmap;
|
||||||
|
uniform sampler2D s_diffuse;
|
||||||
uniform sampler2D s_refract; //refract
|
uniform sampler2D s_refract; //refract
|
||||||
uniform sampler2D s_reflect; //reflection
|
uniform sampler2D s_reflect; //reflection
|
||||||
uniform sampler2D s_refractdepth; //refraction depth
|
uniform sampler2D s_refractdepth; //refraction depth
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#define MAX_STATS 32
|
#define MAX_STATS 32
|
||||||
#define STAT_HEALTH 0
|
#define STAT_HEALTH 0
|
||||||
#define STAT_FRAGS 1
|
#define STAT_FRAGS 1
|
||||||
#define STAT_WEAPON 2
|
#define STAT_WEAPONMODELI 2
|
||||||
#define STAT_AMMO 3
|
#define STAT_AMMO 3
|
||||||
#define STAT_ARMOR 4
|
#define STAT_ARMOR 4
|
||||||
#define STAT_WEAPONFRAME 5
|
#define STAT_WEAPONFRAME 5
|
||||||
|
|
|
@ -798,7 +798,7 @@ void ParseUserInfo(cluster_t *cluster, viewer_t *viewer)
|
||||||
|
|
||||||
void NewNQClient(cluster_t *cluster, netadr_t *addr)
|
void NewNQClient(cluster_t *cluster, netadr_t *addr)
|
||||||
{
|
{
|
||||||
sv_t *initialserver;
|
// sv_t *initialserver;
|
||||||
int header;
|
int header;
|
||||||
int len;
|
int len;
|
||||||
int i;
|
int i;
|
||||||
|
@ -873,7 +873,7 @@ void NewNQClient(cluster_t *cluster, netadr_t *addr)
|
||||||
|
|
||||||
void NewQWClient(cluster_t *cluster, netadr_t *addr, char *connectmessage)
|
void NewQWClient(cluster_t *cluster, netadr_t *addr, char *connectmessage)
|
||||||
{
|
{
|
||||||
sv_t *initialserver;
|
// sv_t *initialserver;
|
||||||
viewer_t *viewer;
|
viewer_t *viewer;
|
||||||
|
|
||||||
char qport[32];
|
char qport[32];
|
||||||
|
@ -1609,7 +1609,7 @@ void SendNQClientData(sv_t *tv, viewer_t *v, netmsg_t *msg)
|
||||||
if (bits & SU_ARMOR)
|
if (bits & SU_ARMOR)
|
||||||
WriteByte (msg, pl->stats[STAT_ARMOR]);
|
WriteByte (msg, pl->stats[STAT_ARMOR]);
|
||||||
if (bits & SU_WEAPON)
|
if (bits & SU_WEAPON)
|
||||||
WriteByte (msg, pl->stats[STAT_WEAPON]);
|
WriteByte (msg, pl->stats[STAT_WEAPONMODELI]);
|
||||||
|
|
||||||
WriteShort (msg, pl->stats[STAT_HEALTH]);
|
WriteShort (msg, pl->stats[STAT_HEALTH]);
|
||||||
WriteByte (msg, pl->stats[STAT_AMMO]);
|
WriteByte (msg, pl->stats[STAT_AMMO]);
|
||||||
|
|
Loading…
Reference in a new issue