From b847316ec0048fc889d1cf17256e91a4a2f5ca3a Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Fri, 14 Jul 2023 18:08:29 -0700 Subject: [PATCH] DecalGroups: precache decal groups up front to avoid loading and frames where decals are white/invisible. --- src/client/defs.h | 1 + src/client/entry.qc | 5 +++++ src/gs-entbase/decals.h | 4 ++++ src/gs-entbase/shared/decals.qc | 14 +++++++++++--- src/shared/decalgroups.h | 1 + src/shared/decalgroups.qc | 15 +++++++++++++++ 6 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/client/defs.h b/src/client/defs.h index 5e69550b..9cba734f 100644 --- a/src/client/defs.h +++ b/src/client/defs.h @@ -99,6 +99,7 @@ var bool g_net_debug = false; #define PRINT_CHAT 3 var bool g_dlight_cached = false; +var bool g_client_world_loaded = false; const float MASK_GLOWS = 16; var bool g_focus; diff --git a/src/client/entry.qc b/src/client/entry.qc index 46f6b468..c06fc489 100644 --- a/src/client/entry.qc +++ b/src/client/entry.qc @@ -575,6 +575,11 @@ CSQC_WorldLoaded(void) ent.Respawn(); } + g_client_world_loaded = true; + + /* wad files will most likely have loaded now */ + DecalGroups_Precache(); + print("Client world initialized.\n"); } diff --git a/src/gs-entbase/decals.h b/src/gs-entbase/decals.h index 4228b3e3..bf0cf8a3 100644 --- a/src/gs-entbase/decals.h +++ b/src/gs-entbase/decals.h @@ -90,3 +90,7 @@ decal_pickwall(entity dself, vector vpos) decal Decals_Next(vector pos); void Decals_Place(vector pos, string dname); + +#ifdef CLIENT +string Decal_Precache(string decalTex); +#endif diff --git a/src/gs-entbase/shared/decals.qc b/src/gs-entbase/shared/decals.qc index 299dd7e0..af1ea4f3 100644 --- a/src/gs-entbase/shared/decals.qc +++ b/src/gs-entbase/shared/decals.qc @@ -144,9 +144,7 @@ decal::BuildShader(void) if (!m_strTexture || !m_strTexture) return; - m_strShader = sprintf("decal_%s", m_strTexture); - shader_buff = sprintf(g_decal_shader, m_strTexture); - shaderforname(m_strShader, shader_buff); + m_strShader = Decal_Precache(m_strTexture); } #endif @@ -276,6 +274,16 @@ void Decals_Place(vector pos, string dname) } #ifdef CLIENT +string +Decal_Precache(string decalTex) +{ + string shaderName = sprintf("decal_%s", decalTex); + string shaderBuff = sprintf(g_decal_shader, decalTex); + precache_pic(decalTex); /* precache */ + shaderforname(shaderName, shaderBuff); + return shaderName; +} + void Decal_Reload(void) { diff --git a/src/shared/decalgroups.h b/src/shared/decalgroups.h index 3f505b66..13bb54e3 100644 --- a/src/shared/decalgroups.h +++ b/src/shared/decalgroups.h @@ -32,5 +32,6 @@ void DecalGroups_Place(string group, vector org); int DecalGroups_NumForName(string group); #ifdef CLIENT +void DecalGroups_Precache(void); void DecalGroups_Receive(void); #endif \ No newline at end of file diff --git a/src/shared/decalgroups.qc b/src/shared/decalgroups.qc index afe97e69..bbbfcf46 100644 --- a/src/shared/decalgroups.qc +++ b/src/shared/decalgroups.qc @@ -149,6 +149,21 @@ DecalGroups_Init(void) } #ifdef CLIENT +void +DecalGroups_Precache(void) +{ + if (g_client_world_loaded == false) + return; + + for (int i = 0; i < g_decalgroup_count; i++) { + int c = tokenizebyseparator(g_decalgroup[i].materials, ";"); + + for (int x = 0; x < c; x++) { + Decal_Precache(argv(x)); + } + } +} + void DecalGroups_PlaceGroupID(int index, vector org) {