]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/wall.qc
Merge remote-tracking branch 'origin/master' into samual/notification_updates
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / wall.qc
index 7690c05f8d1f10006e898c4644f7f686732b53ca..211af4cb0889593380acdfa9785149ae76a5d52d 100644 (file)
@@ -1,20 +1,49 @@
 .float lip;
 .float bgmscriptangular;
+.float lodmodelindex0, lodmodelindex1, lodmodelindex2;
+.float loddistance1, loddistance2;
+.vector saved;
 
 void Ent_Wall_Draw()
 {
        float f;
-       vector save;
        var .vector fld;
 
-       InterpolateOrigin_Do();
-
        if(self.bgmscriptangular)
                fld = angles;
        else
                fld = origin;
-       
-       save = self.fld;
+       self.fld = self.saved;
+
+       if(self.lodmodelindex1)
+       {
+               if(autocvar_cl_modeldetailreduction <= 0)
+               {
+                       if(self.lodmodelindex2 && autocvar_cl_modeldetailreduction <= -2)
+                               self.modelindex = self.lodmodelindex2;
+                       else if(autocvar_cl_modeldetailreduction <= -1)
+                               self.modelindex = self.lodmodelindex1;
+                       else
+                               self.modelindex = self.lodmodelindex0;
+               }
+               else
+               {
+                       float distance = vlen(NearestPointOnBox(self, view_origin) - view_origin);
+                       f = (distance * current_viewzoom + 100.0) * autocvar_cl_modeldetailreduction;
+                       f *= 1.0 / bound(0.01, view_quality, 1);
+                       if(self.lodmodelindex2 && f > self.loddistance2)
+                               self.modelindex = self.lodmodelindex2;
+                       else if(f > self.loddistance1)
+                               self.modelindex = self.lodmodelindex1;
+                       else
+                               self.modelindex = self.lodmodelindex0;
+               }
+       }
+
+       InterpolateOrigin_Do();
+
+       self.saved = self.fld;
+
        f = BGMScript(self);
        if(f >= 0)
        {
@@ -28,9 +57,9 @@ void Ent_Wall_Draw()
                self.alpha = 1;
 
        if(self.alpha >= ALPHA_MIN_VISIBLE)
-               R_AddEntity(self);
-
-       self.fld = save;
+               self.drawmask = MASK_NORMAL;
+       else
+               self.drawmask = 0;
 }
 
 void Ent_Wall_Remove()
@@ -43,8 +72,16 @@ void Ent_Wall_Remove()
 void Ent_Wall()
 {
        float f;
+       var .vector fld;
+
        InterpolateOrigin_Undo();
-       self.iflags = IFLAG_ANGLES;
+       self.iflags = IFLAG_ANGLES | IFLAG_ORIGIN;
+
+       if(self.bgmscriptangular)
+               fld = angles;
+       else
+               fld = origin;
+       self.fld = self.saved;
 
        f = ReadByte();
 
@@ -61,6 +98,7 @@ void Ent_Wall()
                self.origin_x = ReadCoord();
                self.origin_y = ReadCoord();
                self.origin_z = ReadCoord();
+               setorigin(self, self.origin);
        }
 
        if(f & 4)
@@ -77,7 +115,20 @@ void Ent_Wall()
 
        if(f & 8)
        {
-               self.modelindex = ReadShort();
+               if(f & 0x80)
+               {
+                       self.lodmodelindex0 = ReadShort();
+                       self.loddistance1 = ReadShort();
+                       self.lodmodelindex1 = ReadShort();
+                       self.loddistance2 = ReadShort();
+                       self.lodmodelindex2 = ReadShort();
+               }
+               else
+               {
+                       self.modelindex = ReadShort();
+                       self.loddistance1 = 0;
+                       self.loddistance2 = 0;
+               }
                self.solid = ReadByte();
                self.scale = ReadShort() / 256.0;
                if(f & 0x20)
@@ -91,6 +142,7 @@ void Ent_Wall()
                }
                else
                        self.mins = self.maxs = '0 0 0';
+               setsize(self, self.mins, self.maxs);
 
                if(self.bgmscript)
                        strunzone(self.bgmscript);
@@ -121,6 +173,8 @@ void Ent_Wall()
 
        InterpolateOrigin_Note();
 
+       self.saved = self.fld;
+
        self.entremove = Ent_Wall_Remove;
        self.draw = Ent_Wall_Draw;
 }