]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/csqcmodellib/cl_model.qc
Fix compilation with gmqcc.
[xonotic/xonotic-data.pk3dir.git] / qcsrc / csqcmodellib / cl_model.qc
index b77507bb653a53d9eb1253ceec1ac60cb3c78c91..2c7bc2d925da89fc0c1d971ad86e2ca696cddb2c 100644 (file)
@@ -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;