From: Rudolf Polzer Date: Tue, 15 Nov 2011 08:41:47 +0000 (+0100) Subject: move player LOD clientside X-Git-Tag: xonotic-v0.6.0~74^2~100^2~66 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=40d2f426332cdb67cccf02f91183a172e7f5333d;p=xonotic%2Fxonotic-data.pk3dir.git move player LOD clientside --- diff --git a/models/player/erebus.iqm_0.skin b/models/player/erebus.iqm_0.skin index 81c4f3bae..db776e179 100644 --- a/models/player/erebus.iqm_0.skin +++ b/models/player/erebus.iqm_0.skin @@ -1,2 +1,2 @@ -erebus,erebus -erebus.001,shadowhead +erebus,textures/common/nodraw +erebus.001,textures/common/nodraw diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh index a53f75941..add047359 100644 --- a/qcsrc/client/autocvars.qh +++ b/qcsrc/client/autocvars.qh @@ -381,3 +381,6 @@ var float autocvar_cl_eventchase_distance = 140; var float autocvar_cl_eventchase_speed = 1.3; float autocvar_cl_lerpexcess; string autocvar__togglezoom; +float autocvar_cl_playerdetailreduction; +float autocvar_cl_loddistance1 = 1024; +float autocvar_cl_loddistance2 = 4096; diff --git a/qcsrc/client/csqcmodels_hooks.qc b/qcsrc/client/csqcmodels_hooks.qc new file mode 100644 index 000000000..e7fc791ed --- /dev/null +++ b/qcsrc/client/csqcmodels_hooks.qc @@ -0,0 +1,68 @@ +.vector glowmod; +.float modelindex_lod0; +.float modelindex_lod1; +.float modelindex_lod2; + +void CSQCModels_Hook_PreDraw() +{ + // auto glowmod from colormap + self.glowmod = colormapPaletteColor(((self.colormap >= 1024) ? (self.colormap & 0xFF) : stof(getplayerkey(self.entnum - 1, "colors"))), TRUE) * 2; + + if(self.modelindex != 0) + { + // LOD + if(self.modelindex_lod0 != self.modelindex) + { + string modelname = self.model; + string s; + + // set modelindex + self.modelindex_lod0 = self.modelindex; + self.modelindex_lod1 = self.modelindex; + self.modelindex_lod2 = self.modelindex; + + // FIXME: this only supports 3-letter extensions + s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod1", substring(modelname, -4, 4)); + if(fexists(s)) + { + precache_model(s); + setmodel(self, s); + if(self.modelindex > 0) + self.modelindex_lod1 = self.modelindex; + } + + s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4)); + if(fexists(s)) + { + precache_model(s); + setmodel(self, s); + if(self.modelindex > 0) + self.modelindex_lod2 = self.modelindex; + } + + setmodel(self, modelname); // make everything normal again + } + + if(autocvar_cl_playerdetailreduction <= 0) + { + if(autocvar_cl_playerdetailreduction <= -2) + self.modelindex = self.modelindex_lod2; + else if(autocvar_cl_playerdetailreduction <= -1) + self.modelindex = self.modelindex_lod1; + else + self.modelindex = self.modelindex_lod0; + } + else + { + float distance = vlen(self.origin - other.origin); + float f = (distance + 100.0) * autocvar_cl_playerdetailreduction; + if(f > autocvar_cl_loddistance2) + self.modelindex = self.modelindex_lod2; + else if(f > autocvar_cl_loddistance1) + self.modelindex = self.modelindex_lod1; + else + self.modelindex = self.modelindex_lod0; + } + } +} + diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index f769f4ea2..1dbe50df0 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -50,6 +50,7 @@ hud_config.qc hud.qc scoreboard.qc mapvoting.qc +csqcmodels_hooks.qc rubble.qc hook.qc diff --git a/qcsrc/csqcmodel/settings.qh b/qcsrc/csqcmodel/settings.qh index e5bb86bc4..43320efbe 100644 --- a/qcsrc/csqcmodel/settings.qh +++ b/qcsrc/csqcmodel/settings.qh @@ -15,7 +15,7 @@ #define CSQCMODELS_HOOK_PREUPDATE #define CSQCMODELS_HOOK_POSTUPDATE #define CSQCMODELS_HOOK_PREDRAW \ - self.glowmod = colormapPaletteColor(((self.colormap >= 1024) ? (self.colormap & 0xFF) : stof(getplayerkey(self.entnum - 1, "colors"))), TRUE) * 2; + CSQCModels_Hook_PreDraw(); // mod must define: //vector PL_MIN = ...; diff --git a/qcsrc/server/cheats.qc b/qcsrc/server/cheats.qc index 0d95c453a..eed28b651 100644 --- a/qcsrc/server/cheats.qc +++ b/qcsrc/server/cheats.qc @@ -229,7 +229,7 @@ float CheatImpulse(float i) IS_CHEAT(i, 0, 0); FOR_EACH_PLAYER(e) { - get_model_parameters(e.playermodel, e.skinindex); + get_model_parameters(e.playermodel, e.skin); if(get_model_parameters_sex == "Female") { makevectors(e.angles); diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index e1bf18c82..cd18bc619 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -452,135 +452,10 @@ string CheckPlayerModel(string plyermodel) { return plyermodel; } -/* -============= -Client_customizeentityforclient - -LOD reduction -============= -*/ -void Client_uncustomizeentityforclient() +void setplayermodel(entity e, string modelname) { - if(self.modelindex == 0) // no need to uncustomize then - return; - self.modelindex = self.modelindex_lod0; - self.skin = self.skinindex; -} - -float Client_customizeentityforclient() -{ - entity modelsource; - - if(self.modelindex == 0) - return TRUE; - - // forcemodel stuff - -#ifdef PROFILING - float t0; - t0 = gettime(GETTIME_HIRES); // reference -#endif - - modelsource = self; - -#ifdef ALLOW_FORCEMODELS - if(other.cvar_cl_forceplayermodelsfromxonotic) - if not(self.modelindex_lod0_from_xonotic) - modelsource = other; - if(other.cvar_cl_forceplayermodels && sv_clforceplayermodels) - modelsource = other; -#endif - - self.skin = modelsource.skinindex; - -#if 0 - if(modelsource == self) - self.skin = modelsource.skinindex; - else - self.skin = mod(modelsource.skinindex, 3); // forbid the fbskins as forced skins -#endif - - // self: me - // other: the player viewing me - float distance; - float f; - - if(other.cvar_cl_playerdetailreduction <= 0) - { - if(other.cvar_cl_playerdetailreduction <= -2) - self.modelindex = modelsource.modelindex_lod2; - else if(other.cvar_cl_playerdetailreduction <= -1) - self.modelindex = modelsource.modelindex_lod1; - else - self.modelindex = modelsource.modelindex_lod0; - } - else - { - distance = vlen(self.origin - other.origin); - f = (distance + 100.0) * other.cvar_cl_playerdetailreduction; - if(f > sv_loddistance2) - self.modelindex = modelsource.modelindex_lod2; - else if(f > sv_loddistance1) - self.modelindex = modelsource.modelindex_lod1; - else - self.modelindex = modelsource.modelindex_lod0; - } - -#ifdef PROFILING - float t1; - t1 = gettime(GETTIME_HIRES); // reference - client_cefc_accumulator += (t1 - t0); -#endif - - return TRUE; -} - -void setmodel_lod(entity e, string modelname) -{ - string s; - - if(sv_loddistance1) - { - // FIXME: this only supports 3-letter extensions - s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod1", substring(modelname, -4, 4)); - if(fexists(s)) - { - setmodel(e, s); // players have high precision - self.modelindex_lod1 = self.modelindex; - } - else - self.modelindex_lod1 = -1; - - s = strcat(substring(modelname, 0, strlen(modelname)-4), "_lod2", substring(modelname, -4, 4)); - if(fexists(s)) - { - setmodel(e, s); // players have high precision - self.modelindex_lod2 = self.modelindex; - } - else - self.modelindex_lod2 = -1; - - precache_model(modelname); - setmodel(e, modelname); // players have high precision - self.modelindex_lod0 = self.modelindex; - - if(self.modelindex_lod1 < 0) - self.modelindex_lod1 = self.modelindex; - - if(self.modelindex_lod2 < 0) - self.modelindex_lod2 = self.modelindex; - } - else - { - precache_model(modelname); - setmodel(e, modelname); // players have high precision - self.modelindex_lod0 = self.modelindex; - // save it for possible player model forcing - } - - s = whichpack(self.model); - self.modelindex_lod0_from_xonotic = ((s == "") || (substring(s, 0, 4) == "data")); - + precache_model(modelname); + setmodel(e, modelname); player_setupanimsformodel(); UpdatePlayerSounds(); } @@ -719,9 +594,6 @@ void PutObserverInServer (void) self.oldvelocity = self.velocity; self.fire_endtime = -1; - if(sv_loddistance1) - SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient); - if(g_arena) { if(self.version_mismatch) @@ -795,29 +667,29 @@ void FixPlayermodel() { m1 = self.mins; m2 = self.maxs; - setmodel_lod (self, defaultmodel); + setplayermodel (self, defaultmodel); setsize (self, m1, m2); chmdl = TRUE; } - oldskin = self.skinindex; - self.skinindex = defaultskin; + oldskin = self.skin; + self.skin = defaultskin; } else { if (self.playermodel != self.model || self.playermodel == "") { self.playermodel = CheckPlayerModel(self.playermodel); // this is never "", so no endless loop m1 = self.mins; m2 = self.maxs; - setmodel_lod (self, self.playermodel); + setplayermodel (self, self.playermodel); setsize (self, m1, m2); chmdl = TRUE; } - oldskin = self.skinindex; - self.skinindex = stof(self.playerskin); + oldskin = self.skin; + self.skin = stof(self.playerskin); } - if(chmdl || oldskin != self.skinindex) + if(chmdl || oldskin != self.skin) self.species = player_getspecies(); // model or skin has changed if(!teamplay) @@ -1020,9 +892,6 @@ void PutClientInServer (void) WriteByte(MSG_ONE, TE_CSQC_SPAWN); }); - if(sv_loddistance1) - SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient); - self.model = ""; FixPlayermodel(); diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index f2e057273..e504b8f84 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -157,11 +157,7 @@ void CopyBody(float keepvelocity) self.armortype = oldself.armortype; self.model = oldself.model; self.modelindex = oldself.modelindex; - self.modelindex_lod0 = oldself.modelindex_lod0; - self.modelindex_lod0_from_xonotic = oldself.modelindex_lod0_from_xonotic; - self.modelindex_lod1 = oldself.modelindex_lod1; - self.modelindex_lod2 = oldself.modelindex_lod2; - self.skinindex = oldself.skinindex; + self.skin = oldself.skin; self.species = oldself.species; self.movetype = oldself.movetype; self.nextthink = oldself.nextthink; @@ -194,7 +190,7 @@ void CopyBody(float keepvelocity) float player_getspecies() { float s; - get_model_parameters(self.model, self.skinindex); + get_model_parameters(self.model, self.skin); s = get_model_parameters_species; get_model_parameters(string_null, 0); if(s < 0) @@ -1148,18 +1144,18 @@ float LoadPlayerSounds(string f, float first) } .float modelindex_for_playersound; -.float skinindex_for_playersound; +.float skin_for_playersound; void UpdatePlayerSounds() { if(self.modelindex == self.modelindex_for_playersound) - if(self.skinindex == self.skinindex_for_playersound) + if(self.skin == self.skin_for_playersound) return; self.modelindex_for_playersound = self.modelindex; - self.skinindex_for_playersound = self.skinindex; + self.skin_for_playersound = self.skin; ClearPlayerSounds(); LoadPlayerSounds("sound/player/default.sounds", 1); if(!autocvar_g_debug_defaultsounds) - if(!LoadPlayerSounds(get_model_datafilename(self.model, self.skinindex, "sounds"), 0)) + if(!LoadPlayerSounds(get_model_datafilename(self.model, self.skin, "sounds"), 0)) LoadPlayerSounds(get_model_datafilename(self.model, 0, "sounds"), 0); } diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index b84d03164..14468b0dc 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -319,7 +319,6 @@ float default_weapon_alpha; .float() customizeentityforclient; .float cvar_cl_handicap; -.float cvar_cl_playerdetailreduction; .float cvar_cl_clippedspectating; .float cvar_cl_autoscreenshot; .float cvar_cl_movement_track_canjump; @@ -333,8 +332,6 @@ float default_weapon_alpha; .float cvar_cl_forceplayermodelsfromxonotic; float sv_clforceplayermodels; #endif -float sv_loddistance1; -float sv_loddistance2; .float cvar_cl_gunalign; .float cvar_cl_noantilag; @@ -349,12 +346,6 @@ void AnnounceTo(entity e, string snd); .float version_nagtime; -.float modelindex_lod0; -.float modelindex_lod0_from_xonotic; -.float skinindex; -.float modelindex_lod1; -.float modelindex_lod2; - #define NUM_JUMPPADSUSED 3 .float jumppadcount; .entity jumppadsused[NUM_JUMPPADSUSED]; diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 97dd6017d..d8b5ccb3b 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -521,7 +521,6 @@ void GetCvars(float f) MUTATOR_CALLHOOK(GetCvars); GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch"); GetCvars_handleFloat(s, f, cvar_cl_autoscreenshot, "cl_autoscreenshot"); - GetCvars_handleFloat(s, f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction"); GetCvars_handleString(s, f, cvar_g_xonoticversion, "g_xonoticversion"); GetCvars_handleFloat(s, f, cvar_cl_handicap, "cl_handicap"); GetCvars_handleFloat(s, f, cvar_cl_clippedspectating, "cl_clippedspectating"); @@ -1099,11 +1098,6 @@ void readlevelcvars(void) #ifdef ALLOW_FORCEMODELS sv_clforceplayermodels = cvar("sv_clforceplayermodels"); #endif - sv_loddistance1 = cvar("sv_loddistance1"); - sv_loddistance2 = cvar("sv_loddistance2"); - - if(sv_loddistance2 <= sv_loddistance1) - sv_loddistance2 = 1073741824; // enough to turn off LOD 2 reliably sv_clones = cvar("sv_clones"); sv_gentle = cvar("sv_gentle"); @@ -1429,15 +1423,12 @@ void precache_playermodel(string m) if(substring(m, -9,5) == "_lod2") return; precache_model(m); - if(sv_loddistance1) - { - f = strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1)); - if(fexists(f)) - precache_model(f); - f = strcat(substring(m, 0, -5), "_lod2", substring(m, -4, -1)); - if(fexists(f)) - precache_model(f); - } + f = strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1)); + if(fexists(f)) + precache_model(f); + f = strcat(substring(m, 0, -5), "_lod2", substring(m, -4, -1)); + if(fexists(f)) + precache_model(f); globhandle = search_begin(strcat(m, "_*.sounds"), TRUE, FALSE); if (globhandle < 0) diff --git a/qcsrc/server/portals.qc b/qcsrc/server/portals.qc index 461f475c7..bf50c9d3c 100644 --- a/qcsrc/server/portals.qc +++ b/qcsrc/server/portals.qc @@ -7,6 +7,7 @@ .vector portal_safe_origin; .float portal_wants_to_vanish; .float portal_activatetime; +.float savemodelindex; float PlayerEdgeDistance(entity p, vector v) { @@ -479,7 +480,7 @@ float Portal_Customize() other = other.enemy; if(other == self.aiment) { - self.modelindex = self.modelindex_lod0; + self.modelindex = self.savemodelindex; } else if(IS_INDEPENDENT_PLAYER(other) || IS_INDEPENDENT_PLAYER(self.aiment)) { @@ -487,7 +488,7 @@ float Portal_Customize() } else { - self.modelindex = self.modelindex_lod0; + self.modelindex = self.savemodelindex; } return TRUE; } @@ -617,7 +618,7 @@ entity Portal_Spawn(entity own, vector org, vector ang) portal.fade_time = time + autocvar_g_balance_portal_lifetime; portal.health = autocvar_g_balance_portal_health; setmodel(portal, "models/portal.md3"); - portal.modelindex_lod0 = portal.modelindex; + portal.savemodelindex = portal.modelindex; portal.customizeentityforclient = Portal_Customize; if(!Portal_FindSafeOrigin(portal))