From: Rudolf Polzer Date: Thu, 14 Oct 2010 11:06:47 +0000 (+0200) Subject: LOD support for misc_clientmodel (untested) X-Git-Tag: xonotic-v0.1.0preview~307^2~3 X-Git-Url: https://de.git.xonotic.org/?a=commitdiff_plain;h=5fb3a7d73f152938f7eee4225686189b6d251418;p=xonotic%2Fxonotic-data.pk3dir.git LOD support for misc_clientmodel (untested) --- diff --git a/qcsrc/client/wall.qc b/qcsrc/client/wall.qc index 7690c05f8..2e1cd8d8a 100644 --- a/qcsrc/client/wall.qc +++ b/qcsrc/client/wall.qc @@ -1,12 +1,39 @@ .float lip; .float bgmscriptangular; +.float lodmodelindex, lodmodelindex2; +.float loddistance1, loddistance2; void Ent_Wall_Draw() { float f; + float d; vector save; var .vector fld; + if(self.lodmodelindex1) + { + d = cvar("loddebug"); + if(d > 0) + { + if(d == 1) + self.modelindex = self.lodmodelindex0; + else if(d == 2 || !self.lodmodelindex2) + self.modelindex = self.lodmodelindex1; + else // if(d == 3) + self.modelindex = self.lodmodelindex2; + } + else + { + d = vlen(NearestPointOnBox(self, view_origin) - view_origin); + if(d < self.loddistance1) + self.modelindex = self.lodmodelindex0; + else if(!self.lodmodelindex2 || d < self.loddistance2) + self.modelindex = self.lodmodelindex1; + else + self.modelindex = self.lodmodelindex2; + } + } + InterpolateOrigin_Do(); if(self.bgmscriptangular) @@ -77,7 +104,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) diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index f33512f23..1efc0e373 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -1919,3 +1919,19 @@ vector vec2(vector v) v_z = 0; return v; } + +#ifndef MENUQC +vector NearestPointOnBox(entity box, vector org) +{ + vector m1, m2, nearest; + + m1 = box.mins + box.origin; + m2 = box.maxs + box.origin; + + nearest_x = bound(m1_x, org_x, m2_x); + nearest_y = bound(m1_y, org_y, m2_y); + nearest_z = bound(m1_z, org_z, m2_z); + + return nearest; +} +#endif diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh index 767092cc7..77b3e0320 100644 --- a/qcsrc/common/util.qh +++ b/qcsrc/common/util.qh @@ -238,3 +238,7 @@ switch(id) { \ HUD_Panel_GetName_Part2(id) vector vec2(vector v); + +#ifndef MENUQC +vector NearestPointOnBox(entity box, vector org); +#endif diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index 7108fd3db..76cb78614 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -850,20 +850,6 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float } } -vector NearestPointOnBox(entity box, vector org) -{ - vector m1, m2, nearest; - - m1 = box.mins + box.origin; - m2 = box.maxs + box.origin; - - nearest_x = bound(m1_x, org_x, m2_x); - nearest_y = bound(m1_y, org_y, m2_y); - nearest_z = bound(m1_z, org_z, m2_z); - - return nearest; -} - void Damage_RecordDamage(entity attacker, float deathtype, float damage) { float weaponid; diff --git a/qcsrc/server/g_models.qc b/qcsrc/server/g_models.qc index 0f0bba6e6..bc996fd32 100644 --- a/qcsrc/server/g_models.qc +++ b/qcsrc/server/g_models.qc @@ -57,6 +57,8 @@ float g_clientmodel_genericsendentity (entity to, float sf) sf |= 0x20; if(self.colormap != 0) sf |= 0x40; + if(self.lodmodelindex1) + sf |= 0x80; WriteByte(MSG_ENTITY, ENT_CLIENT_WALL); WriteByte(MSG_ENTITY, sf); @@ -86,7 +88,16 @@ float g_clientmodel_genericsendentity (entity to, float sf) if(sf & 8) { - WriteShort(MSG_ENTITY, self.modelindex); + if(sf & 0x80) + { + WriteShort(MSG_ENTITY, self.lodmodelindex0); + WriteShort(MSG_ENTITY, bound(0, self.loddistance1, 65535)); + WriteShort(MSG_ENTITY, self.lodmodelindex1); + WriteShort(MSG_ENTITY, bound(0, self.loddistance2, 65535)); + WriteShort(MSG_ENTITY, self.lodmodelindex2); + } + else + WriteShort(MSG_ENTITY, self.modelindex); WriteByte(MSG_ENTITY, self.solid); WriteShort(MSG_ENTITY, floor(self.scale * 256)); if(sf & 0x20) @@ -124,7 +135,7 @@ float g_clientmodel_genericsendentity (entity to, float sf) if(!self.solid) self.solid = (sol); else if(self.solid < 0) self.solid = SOLID_NOT; #define G_CLIENTMODEL_INIT(sol) \ - SetBrushEntityModelNoLOD(); \ + SetBrushEntityModel(); \ if(!self.scale) self.scale = self.modelscale; \ self.use = g_clientmodel_setcolormaptoactivator; \ InitializeEntity(self, g_clientmodel_dropbyspawnflags, INITPRIO_DROPTOFLOOR); \ diff --git a/qcsrc/server/g_subs.qc b/qcsrc/server/g_subs.qc index 1d1f0bb9b..5d8401df9 100644 --- a/qcsrc/server/g_subs.qc +++ b/qcsrc/server/g_subs.qc @@ -605,7 +605,6 @@ float angc (float a1, float a2) .float loddistance1; .float loddistance2; -vector NearestPointOnBox(entity box, vector org); float LOD_customize() { float d; @@ -615,7 +614,7 @@ float LOD_customize() d = cvar("loddebug"); if(d == 1) self.modelindex = self.lodmodelindex0; - else if(d == 2) + else if(d == 2 || !self.lodmodelindex2) self.modelindex = self.lodmodelindex1; else // if(d == 3) self.modelindex = self.lodmodelindex2; @@ -695,7 +694,8 @@ void LODmodel_attach() } if(self.lodmodelindex1) - SetCustomizer(self, LOD_customize, LOD_uncustomize); + if not(self.SendEntity) + SetCustomizer(self, LOD_customize, LOD_uncustomize); } void SetBrushEntityModel()