X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fwall.qc;h=211af4cb0889593380acdfa9785149ae76a5d52d;hb=a665ad7acf62cab3306dabd4ce8bb4862b4ab21c;hp=7690c05f8d1f10006e898c4644f7f686732b53ca;hpb=6af4e73de035e6bbed9ba2d60e0768c43dc66f2a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/wall.qc b/qcsrc/client/wall.qc index 7690c05f8..211af4cb0 100644 --- a/qcsrc/client/wall.qc +++ b/qcsrc/client/wall.qc @@ -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; }