]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
LOD support for misc_clientmodel (untested)
authorRudolf Polzer <divverent@alientrap.org>
Thu, 14 Oct 2010 11:06:47 +0000 (13:06 +0200)
committerRudolf Polzer <divverent@alientrap.org>
Thu, 14 Oct 2010 11:06:47 +0000 (13:06 +0200)
qcsrc/client/wall.qc
qcsrc/common/util.qc
qcsrc/common/util.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_models.qc
qcsrc/server/g_subs.qc

index 7690c05f8d1f10006e898c4644f7f686732b53ca..2e1cd8d8a7847abc000ada7229fb5a0ca96c1516 100644 (file)
@@ -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)
index f33512f2355f8823669f1140b691dfe779be7282..1efc0e3738a06a4d9e5c33cd5681571c0d1b0444 100644 (file)
@@ -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
index 767092cc7532c689710cc82421abd15497d5d146..77b3e03202817a61ef6325761c764ce0de357aff 100644 (file)
@@ -238,3 +238,7 @@ switch(id) { \
 HUD_Panel_GetName_Part2(id)
 
 vector vec2(vector v);
+
+#ifndef MENUQC
+vector NearestPointOnBox(entity box, vector org);
+#endif
index 7108fd3dbea18530d278c237c753405fe912db39..76cb7861498c7820ea603c9ad2b118b4f8f48951 100644 (file)
@@ -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;
index 0f0bba6e6d36fb335a5afa4485d6b2fd79e373f2..bc996fd321647183b1824eb233d052dae33e69a9 100644 (file)
@@ -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); \
index 1d1f0bb9bd0f1bfee26d37846ad17085026bbdb4..5d8401df98e934d637822e419582270db3484c14 100644 (file)
@@ -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()