X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcsqcmodellib%2Fcl_model.qc;h=2c7bc2d925da89fc0c1d971ad86e2ca696cddb2c;hp=b77507bb653a53d9eb1253ceec1ac60cb3c78c91;hb=6a28c11c8abd729c7f95ad7050d204aa2453d2ff;hpb=684f569c626ee8a81b3269df66d5e36f123f450e diff --git a/qcsrc/csqcmodellib/cl_model.qc b/qcsrc/csqcmodellib/cl_model.qc index b77507bb65..2c7bc2d925 100644 --- a/qcsrc/csqcmodellib/cl_model.qc +++ b/qcsrc/csqcmodellib/cl_model.qc @@ -28,9 +28,8 @@ var float autocvar_cl_nolerp = 0; .float csqcmodel_lerpfractime; .float csqcmodel_lerpfrac2time; -void CSQCModel_InterpolateAnimation_PreNote(float sf) +void CSQCModel_InterpolateAnimation_2To4_PreNote(float sf) { -#ifdef CSQCMODEL_HAVE_TWO_FRAMES if(sf & CSQCMODEL_PROPERTY_FRAME) { self.frame3 = self.frame; @@ -47,42 +46,62 @@ void CSQCModel_InterpolateAnimation_PreNote(float sf) self.csqcmodel_lerpfrac2time = self.csqcmodel_lerpfractime; self.lerpfrac = self.csqcmodel_lerpfrac; } -#else +} +void CSQCModel_InterpolateAnimation_1To2_PreNote(float sf) +{ if(sf & CSQCMODEL_PROPERTY_FRAME) { self.frame2 = self.frame; self.frame2time = self.frame1time; } +} +void CSQCModel_InterpolateAnimation_PreNote(float sf) +{ +#ifdef CSQCMODEL_HAVE_TWO_FRAMES + CSQCModel_InterpolateAnimation_2To4_PreNote(sf); +#else + CSQCModel_InterpolateAnimation_1To2_PreNote(sf); #endif } -void CSQCModel_InterpolateAnimation_Note(float sf) +void CSQCModel_InterpolateAnimation_2To4_Note(float sf, float set_times) { -#ifdef CSQCMODEL_HAVE_TWO_FRAMES if(sf & CSQCMODEL_PROPERTY_FRAME) { - self.frame1time = time; + if(set_times) + self.frame1time = time; } if(sf & CSQCMODEL_PROPERTY_FRAME2) { - self.frame2time = time; + if(set_times) + self.frame2time = time; } if(sf & CSQCMODEL_PROPERTY_LERPFRAC) { self.csqcmodel_lerpfrac = self.lerpfrac; - self.csqcmodel_lerpfractime = time; + if(set_times) + self.csqcmodel_lerpfractime = time; } -#else +} +void CSQCModel_InterpolateAnimation_1To2_Note(float sf, float set_times) +{ if(sf & CSQCMODEL_PROPERTY_FRAME) { - self.frame1time = time; + if(set_times) + self.frame1time = time; } +} +void CSQCModel_InterpolateAnimation_Note(float sf) +{ +#ifdef CSQCMODEL_HAVE_TWO_FRAMES + CSQCModel_InterpolateAnimation_2To4_Note(sf, TRUE); +#else + CSQCModel_InterpolateAnimation_1To2_Note(sf, TRUE); #endif } -void CSQCModel_InterpolateAnimation_Do() +void CSQCModel_InterpolateAnimation_2To4_Do() { -#ifdef CSQCMODEL_HAVE_TWO_FRAMES if(autocvar_cl_nolerp || (autocvar_cl_lerpanim_maxdelta_framegroups == 0)) { self.lerpfrac = self.csqcmodel_lerpfrac; @@ -127,31 +146,42 @@ void CSQCModel_InterpolateAnimation_Do() self.frame3time = 0; } } -#else +} +void CSQCModel_InterpolateAnimation_1To2_Do() +{ if(autocvar_cl_nolerp || (autocvar_cl_lerpanim_maxdelta_framegroups == 0)) { self.lerpfrac = 0; } else { - self.lerpfrac = 1 - bound(0, (time - self.frame1time) / autocvar_cl_lerpanim_maxdelta_framegroups, 1); + if(self.frame2time == 0) // if frame2 was not previously displayed, only frame1 can make sense + self.lerpfrac = 0; + else + self.lerpfrac = 1 - bound(0, (time - self.frame1time) / autocvar_cl_lerpanim_maxdelta_framegroups, 1); } +} +void CSQCModel_InterpolateAnimation_Do() +{ +#ifdef CSQCMODEL_HAVE_TWO_FRAMES + CSQCModel_InterpolateAnimation_2To4_Do(); +#else + CSQCModel_InterpolateAnimation_1To2_Do(); #endif } void CSQCModel_Draw() { // some nice flags for CSQCMODEL_IF and the hooks - float isplayer = (self.entnum >= 1 && self.entnum <= maxclients); - float islocalplayer = (self.entnum == player_localnum + 1); - float isnolocalplayer = (isplayer && (self.entnum != player_localnum + 1)); + local noref float isplayer = (self.entnum >= 1 && self.entnum <= maxclients); + local noref float islocalplayer = (self.entnum == player_localnum + 1); + local noref float isnolocalplayer = (isplayer && (self.entnum != player_localnum + 1)); // we don't do this for the local player as that one is already handled // by CSQCPlayer_SetCamera() if(!CSQCPlayer_IsLocalPlayer()) InterpolateOrigin_Do(); - // TODO csqcplayers: run prediction here too CSQCModel_InterpolateAnimation_Do(); { CSQCMODEL_HOOK_PREDRAW } @@ -162,7 +192,7 @@ void CSQCModel_Draw() root = root.tag_entity; if(self != root) { - self.renderflags &~= RF_EXTERNALMODEL | RF_VIEWMODEL; + self.renderflags &= ~(RF_EXTERNALMODEL | RF_VIEWMODEL); self.renderflags |= (root.renderflags & (RF_EXTERNALMODEL | RF_VIEWMODEL)); } @@ -176,11 +206,14 @@ void CSQCModel_Read(float isnew) sf = ReadShort(); // some nice flags for CSQCMODEL_IF and the hooks - float isplayer = (self.entnum >= 1 && self.entnum <= maxclients); - float islocalplayer = (self.entnum == player_localnum + 1); - float isnolocalplayer = (isplayer && (self.entnum != player_localnum + 1)); + local noref float isplayer = (self.entnum >= 1 && self.entnum <= maxclients); + local noref float islocalplayer = (self.entnum == player_localnum + 1); + local noref float isnolocalplayer = (isplayer && (self.entnum != player_localnum + 1)); + self.classname = "csqcmodel"; + self.iflags |= IFLAG_ORIGIN; // interpolate origin too self.iflags |= IFLAG_ANGLES; // interpolate angles too + self.iflags |= IFLAG_VELOCITY | IFLAG_AUTOVELOCITY; // let's calculate velocity automatically { CSQCMODEL_HOOK_PREUPDATE } @@ -204,6 +237,7 @@ void CSQCModel_Read(float isnew) if(sf & CSQCMODEL_PROPERTY_MODELINDEX) setmodelindex(self, self.modelindex); // this retrieves the .model key and sets mins/maxs/absmin/absmax + // FIXME do we WANT this to override mins/maxs? if(sf & CSQCMODEL_PROPERTY_TELEPORTED) { @@ -233,7 +267,7 @@ void CSQCModel_Read(float isnew) #endif self.renderflags |= RF_EXTERNALMODEL; else - self.renderflags &~= RF_EXTERNALMODEL; + self.renderflags &= ~RF_EXTERNALMODEL; // draw it self.drawmask = MASK_NORMAL;