Skip to content

Commit

Permalink
game: update mesh no draw mask after change
Browse files Browse the repository at this point in the history
  • Loading branch information
0lvin committed Dec 16, 2024
1 parent e776eba commit 9a1cf07
Show file tree
Hide file tree
Showing 24 changed files with 127 additions and 30 deletions.
10 changes: 1 addition & 9 deletions src/client/cl_parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,15 +151,7 @@ CL_ParseDelta(const entity_xstate_t *from, entity_xstate_t *to, int number, int

if (bits & U_FM_FLAGS)
{
to->rr_mesh = 0;
for (int i = 0; i < MAX_FM_MESH_NODES; i++)
{
to->fmnodeinfo[i].flags = MSG_ReadShort(&net_message);
if (to->fmnodeinfo[i].flags & FMNI_NO_DRAW)
{
to->rr_mesh |= (1 << i);
}
}
to->rr_mesh = MSG_ReadLong(&net_message);
}

if (cls.serverProtocol != PROTOCOL_VERSION)
Expand Down
10 changes: 3 additions & 7 deletions src/common/movemsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -617,10 +617,9 @@ MSG_WriteDeltaEntity(const entity_xstate_t *from,
bits |= U_SOUND;
}

for (int i = 0; i < MAX_FM_MESH_NODES; i++)
if (to->rr_mesh != from->rr_mesh)
{
if (to->fmnodeinfo[i].flags != from->fmnodeinfo[i].flags)
bits |= U_FM_FLAGS;
bits |= U_FM_FLAGS;
}

/* write the message */
Expand Down Expand Up @@ -657,10 +656,7 @@ MSG_WriteDeltaEntity(const entity_xstate_t *from,

if (bits & U_FM_FLAGS)
{
for (int i = 0; i < MAX_FM_MESH_NODES; i++)
{
MSG_WriteShort(msg, to->fmnodeinfo[i].flags);
}
MSG_WriteLong(msg, to->rr_mesh);
}

if (IS_QII97_PROTOCOL(protocol))
Expand Down
3 changes: 2 additions & 1 deletion src/game/character/ai.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ void c_swapplayer(edict_t *Self,edict_t *Cinematic)

for (i=0;i<NUM_MESH_NODES;++i)
{
Cinematic->s.fmnodeinfo[i].flags = Self->s.fmnodeinfo[i].flags;
Cinematic->s.fmnodeinfo[i].flags = Self->s.fmnodeinfo[i].flags;
Cinematic->s.fmnodeinfo[i].skin = Self->s.fmnodeinfo[i].skin;
}

Expand All @@ -172,6 +172,7 @@ void c_swapplayer(edict_t *Self,edict_t *Cinematic)
Cinematic->s.fmnodeinfo[MESH__HELSTF].flags |= FMNI_NO_DRAW;
Cinematic->s.fmnodeinfo[MESH__BOWACTV].flags |= FMNI_NO_DRAW;
Cinematic->s.fmnodeinfo[MESH__STAFACTV].flags |= FMNI_NO_DRAW;
Cinematic->rrs.mesh = GenNoDrawInfo(Cinematic->s.fmnodeinfo);
}

#define ENT_INVISIBLE 1
Expand Down
2 changes: 1 addition & 1 deletion src/game/character/dranor/dranor.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,5 +186,5 @@ void SP_character_dranor (edict_t *self)
self->s.fmnodeinfo[MESH__HOE].flags |= FMNI_NO_DRAW;
self->s.fmnodeinfo[MESH__GAFF].flags |= FMNI_NO_DRAW;
self->health = 30;

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
}
2 changes: 2 additions & 0 deletions src/game/character/elflord/elflord.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@ void Elflord_c_anims(edict_t *self, G_Message_t *msg)
return;
}

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

SetAnim(self, curr_anim);
}

Expand Down
10 changes: 1 addition & 9 deletions src/game/effects/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -652,15 +652,7 @@ AddServerEntities(frame_t *frame)
}

// Handle flex-model nodes.

ent->rr_mesh = 0;
for (int i = 0; i < MAX_FM_MESH_NODES; i++)
{
if (s1->fmnodeinfo[i].flags & FMNI_NO_DRAW)
{
ent->rr_mesh |= (1 << i);
}
}
ent->rr_mesh = s1->rr_mesh;

// What's going on here?
// jmarshall - removed legacy prediction.
Expand Down
3 changes: 3 additions & 0 deletions src/game/g_obj.c
Original file line number Diff line number Diff line change
Expand Up @@ -708,6 +708,7 @@ void SpawnCorpse(edict_t *self)
self->s.fmnodeinfo[MESH__HAMMER].flags |= FMNI_NO_DRAW;
self->s.fmnodeinfo[MESH__HOE].flags |= FMNI_NO_DRAW;
}
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

VectorSet(self->mins,-30,-12,-2);
VectorSet(self->maxs,30,12,2);
Expand Down Expand Up @@ -956,6 +957,8 @@ void SP_obj_dying_elf(edict_t *self)
self->s.fmnodeinfo[MESH__HAMMER].flags |= FMNI_NO_DRAW;
self->s.fmnodeinfo[MESH__HANDLE].flags |= FMNI_NO_DRAW;

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

self->s.frame = FRAME_fetal1;
self->think = dying_elf_idle;
self->nextthink = level.time + FRAMETIME;
Expand Down
16 changes: 16 additions & 0 deletions src/game/g_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -1274,3 +1274,19 @@ newfindradius(edict_t *from, vec3_t org, float rad)

return NULL;
}

unsigned
GenNoDrawInfo(fmnodeinfo_t *fmnodeinfo)
{
unsigned rr_mesh = 0;
int i;

for(i = 0; i < MAX_FM_MESH_NODES; i++)
{
if (fmnodeinfo[i].flags & FMNI_NO_DRAW)
{
rr_mesh |= (1 << i);
}
}
return rr_mesh;
}
1 change: 1 addition & 0 deletions src/game/header/local.h
Original file line number Diff line number Diff line change
Expand Up @@ -2484,6 +2484,7 @@ qboolean Pickup_Sphere(edict_t * ent, edict_t * other);
#define WALL_ENTITY (struct edict_s *)1
#define AVG_VEC3T(scale) (((scale)[0] + (scale)[1] + (scale)[2]) / 3)

unsigned GenNoDrawInfo(fmnodeinfo_t *fmnodeinfo);
void G_CPrintf(edict_t* ent, int printlevel, short stringid);
void G_BCaption(int printlevel, short stringid);
void G_LevelMsgCenterPrintf(edict_t* ent, short msg);
Expand Down
11 changes: 10 additions & 1 deletion src/game/monster/assassin/assassin.c
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,8 @@ void assassindagger (edict_t *self, float right_ofs)
}
}

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

if(thrownum>1)
gi.sound (self, CHAN_WEAPON, Sounds[SND_THROW2], 1, ATTN_NORM, 0);
else if(thrownum>0)
Expand Down Expand Up @@ -664,6 +666,7 @@ void assassin_death(edict_t *self, G_Message_t *msg)
self->s.fmnodeinfo[MESH__RUPARM].flags |= FMNI_NO_DRAW;
self->s.fmnodeinfo[MESH__LKNIFE].flags |= FMNI_NO_DRAW;
self->s.fmnodeinfo[MESH__RKNIFE].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

SprayDebris(self, self->s.origin, 12, 100);
}
Expand Down Expand Up @@ -871,6 +874,7 @@ qboolean canthrownode_as (edict_t *self, int BP, int *throw_nodes)
{
*throw_nodes |= Bit_for_MeshNode_as[BP];
self->s.fmnodeinfo[BP].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
return true;
}
return false;
Expand All @@ -897,6 +901,8 @@ void assassin_dropweapon (edict_t *self, int whichknives)
ThrowWeapon(self, &handspot, BIT_RKNIFE, 0, FRAME_prtfly);//FRAME_atakc3);
self->s.fmnodeinfo[MESH__RKNIFE].flags |= FMNI_NO_DRAW;
}

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
}

int assassin_convert_hitloc_dead(int hl)
Expand Down Expand Up @@ -1310,7 +1316,7 @@ void assassin_dismember(edict_t *self, int damage, int HitLocation)
break;
}

if(self->s.fmnodeinfo[MESH__L4ARM].flags&FMNI_NO_DRAW&&
if(self->s.fmnodeinfo[MESH__L4ARM].flags&FMNI_NO_DRAW &&
self->s.fmnodeinfo[MESH__R4ARM].flags&FMNI_NO_DRAW)
{
self->monsterinfo.aiflags |= AI_COWARD;
Expand Down Expand Up @@ -1408,6 +1414,7 @@ void assassin_pause (edict_t *self)
//this gets stuck on, sometimes
self->s.fmnodeinfo[MESH__LKNIFE].flags |= FMNI_NO_DRAW;
self->s.fmnodeinfo[MESH__RKNIFE].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

if(self->monsterinfo.aiflags&AI_OVERRIDE_GUIDE)
return;
Expand Down Expand Up @@ -2079,6 +2086,7 @@ void assassinCrouchedCheckAttack (edict_t *self, float attack)
void assassinNodeOn (edict_t *self, float node)
{
self->s.fmnodeinfo[(int)node].flags &= ~FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
}

void assassinStop (edict_t *self)
Expand Down Expand Up @@ -2947,6 +2955,7 @@ void SP_monster_assassin (edict_t *self)
self->svflags |= SVF_WAIT_NOTSOLID;

self->s.fmnodeinfo[MESH__KNIFES].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

VectorCopy(self->s.origin, self->pos1);
}
1 change: 1 addition & 0 deletions src/game/monster/gkrokon/gkrokon.c
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,7 @@ qboolean canthrownode_gk (edict_t *self, int BP, int *throw_nodes)
{
*throw_nodes |= Bit_for_MeshNode_gk[BP];
self->s.fmnodeinfo[BP].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
return true;
}
return false;
Expand Down
3 changes: 3 additions & 0 deletions src/game/monster/harpy/harpy.c
Original file line number Diff line number Diff line change
Expand Up @@ -872,6 +872,8 @@ void harpy_dismember(edict_t *self, int damage, int HitLocation)
break;
}

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

if (HitLocation == hl_rwing || HitLocation == hl_lwing || HitLocation == hl_head)
{
self->monsterinfo.jump_time = level.time + 2;
Expand Down Expand Up @@ -1713,5 +1715,6 @@ SP_monster_harpy(edict_t *self)
if(irand(0,2))
self->s.fmnodeinfo[MESH_TAILSPIKES].flags |= FMNI_NO_DRAW;

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
gi.linkentity(self);
}
1 change: 1 addition & 0 deletions src/game/monster/mssithra/mssithra.c
Original file line number Diff line number Diff line change
Expand Up @@ -786,6 +786,7 @@ void SP_monster_mssithra (edict_t *self)

//Turn the goofy bolts off!
self->s.fmnodeinfo[MESH__BOLTS].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

self->dmg = 0;
self->svflags|=SVF_BOSS;
Expand Down
6 changes: 6 additions & 0 deletions src/game/monster/ogle/ogle.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ void SP_obj_corpse_ogle(edict_t *self)
self->s.fmnodeinfo[MESH__PICK].flags |= FMNI_NO_DRAW;
}

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
ObjectInit(self,40,80,MAT_FLESH,SOLID_BBOX);
}

Expand Down Expand Up @@ -507,6 +508,7 @@ void ogle_cast_off_tools_of_oppression ( edict_t *self )
ThrowWeapon(self, &vec3_origin, throw_nodes, 0, 0);
}

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
self->monsterinfo.aiflags |= AI_NO_MELEE;
}

Expand Down Expand Up @@ -1185,6 +1187,8 @@ void ogle_dismember(edict_t *self, int damage, int HitLocation)
self->s.fmnodeinfo[MESH__RLEG].skin = self->s.skinnum+1;
break;
}

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
}

void ogle_death_pain(edict_t *self, G_Message_t *msg)
Expand Down Expand Up @@ -1857,6 +1861,8 @@ void SP_monster_ogle(edict_t *self)
self->s.fmnodeinfo[MESH__PICK].flags |= FMNI_NO_DRAW;
}

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

if (self->monsterinfo.ogleflags & OF_CINEMATIC)
{
self->svflags|=SVF_FLOAT;
Expand Down
6 changes: 6 additions & 0 deletions src/game/monster/plagueelf/plagueelf.c
Original file line number Diff line number Diff line change
Expand Up @@ -867,6 +867,7 @@ qboolean canthrownode_pe (edict_t *self, int BP, int *throw_nodes)
{
*throw_nodes |= Bit_for_MeshNode_pe[BP];
self->s.fmnodeinfo[BP].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
return true;
}
return false;
Expand Down Expand Up @@ -932,6 +933,7 @@ qboolean plagueElf_dropweapon (edict_t *self, int damage)
self->s.fmnodeinfo[MESH__HANDLE].flags |= FMNI_NO_DRAW;
plagueElf_chicken(self,4,8,flrand(3,8));
}
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
return true;
}
if(!(self->s.fmnodeinfo[MESH__GAFF].flags & FMNI_NO_DRAW))
Expand All @@ -949,6 +951,7 @@ qboolean plagueElf_dropweapon (edict_t *self, int damage)
self->s.fmnodeinfo[MESH__HANDLE].flags |= FMNI_NO_DRAW;
plagueElf_chicken(self,4,8,flrand(3,8));
}
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
return true;
}
if(!(self->s.fmnodeinfo[MESH__HAMMER].flags & FMNI_NO_DRAW))
Expand All @@ -966,10 +969,12 @@ qboolean plagueElf_dropweapon (edict_t *self, int damage)
self->s.fmnodeinfo[MESH__HANDLE].flags |= FMNI_NO_DRAW;
plagueElf_chicken(self,4,8,flrand(3,8));
}
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
return true;
}
ThrowWeapon(self, &handspot, BIT_HANDLE, 0, FRAME_partfly);
self->s.fmnodeinfo[MESH__HANDLE].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
if(self->deadflag != DEAD_DEAD)
plagueElf_chicken(self,6,8,flrand(5,10));
return true;
Expand Down Expand Up @@ -2095,6 +2100,7 @@ void SP_monster_plagueElf (edict_t *self)
self->monsterinfo.aiflags |= AI_NO_MISSILE;
}

self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
self->monsterinfo.supporters = -1;

//set up my mood function
Expand Down
9 changes: 8 additions & 1 deletion src/game/monster/plaguessithra/plaguessithra.c
Original file line number Diff line number Diff line change
Expand Up @@ -1271,8 +1271,11 @@ void ssithraSplit (edict_t *self, int BodyPart)
}
}
tophalf->s.fmnodeinfo[MESH__CAPBOTTOMUPPERTORSO].flags &= ~FMNI_NO_DRAW;
tophalf->rrs.mesh = GenNoDrawInfo(tophalf->s.fmnodeinfo);

self->s.fmnodeinfo[MESH__CAPLOWERTORSO].flags &= ~FMNI_NO_DRAW;
self->s.fmnodeinfo[MESH__RIGHT2SPIKE].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

self->nextthink = 9999999999999999.0f;
}
Expand Down Expand Up @@ -1300,6 +1303,7 @@ qboolean canthrownode (edict_t *self, int BP, int *throw_nodes)
{
*throw_nodes |= Bit_for_MeshNode[BP];
self->s.fmnodeinfo[BP].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
return true;
}
return false;
Expand Down Expand Up @@ -1455,8 +1459,9 @@ void ssithra_dismember(edict_t *self, int damage, int HitLocation)
canthrownode(self, MESH__RIGHT2SPIKE,&throw_nodes);

self->s.fmnodeinfo[MESH__CAPTOPUPPERTORSO].flags &= ~FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

gore_spot[2]+=18;
gore_spot[2] += 18;
ThrowBodyPart(self, &gore_spot, throw_nodes, damage, 0);

VectorAdd(self->s.origin, gore_spot, gore_spot);
Expand Down Expand Up @@ -1518,6 +1523,7 @@ void ssithra_dismember(edict_t *self, int damage, int HitLocation)
//seal up the caps left by this split
self->s.fmnodeinfo[MESH__CAPBOTTOMUPPERTORSO].flags &= ~FMNI_NO_DRAW;
self->s.fmnodeinfo[MESH__CAPLOWERTORSO].flags &= ~FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

canthrownode(self, MESH__UPPERTORSO,&throw_nodes);
canthrownode(self, MESH__CAPBOTTOMUPPERTORSO,&throw_nodes);
Expand Down Expand Up @@ -3157,6 +3163,7 @@ void SP_monster_ssithra (edict_t *self)
alpha = false;
}
}
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

self->s.color[3] = 255;
if(alpha)//tough guy!
Expand Down
3 changes: 3 additions & 0 deletions src/game/monster/seraph/seraph.c
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,7 @@ qboolean canthrownode_so (edict_t *self, int BP, int *throw_nodes)
{
*throw_nodes |= Bit_for_MeshNode_so[BP];
self->s.fmnodeinfo[BP].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
return true;
}
return false;
Expand All @@ -776,6 +777,7 @@ void seraph_dropweapon (edict_t *self)
VectorMA(handspot,12,up,handspot);
ThrowWeapon(self, &handspot, BIT_WHIP, 0, FRAME_partfly);
self->s.fmnodeinfo[MESH__WHIP].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);
return;
}
}
Expand Down Expand Up @@ -1101,6 +1103,7 @@ void SP_monster_seraph_overlord(edict_t *self)
self->s.fmnodeinfo[MESH__LHANDGRD].flags |= FMNI_NO_DRAW;
self->s.fmnodeinfo[MESH__ARMSPIKES].flags |= FMNI_NO_DRAW;
self->s.fmnodeinfo[MESH__SHOULDPAD].flags |= FMNI_NO_DRAW;
self->rrs.mesh = GenNoDrawInfo(self->s.fmnodeinfo);

MG_InitMoods(self);

Expand Down
Loading

0 comments on commit 9a1cf07

Please sign in to comment.