From 88e5084f3807b33e7a5d6bd215180a4feea1a591 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sun, 27 Jun 2021 09:55:48 +0200 Subject: [PATCH] Client: Added Entities_RendererRestarted, giving entity classes a chance to reload their assets. env_glow and prop_rope support in this commit. --- src/client/entities.qc | 9 +++++++++ src/client/entry.qc | 1 + src/gs-entbase/client/env_glow.qc | 26 +++++++++++++++++++++----- src/gs-entbase/client/prop_rope.qc | 21 ++++++++++++++++----- src/gs-entbase/shared/baseentity.h | 1 + src/gs-entbase/shared/baseentity.qc | 6 ++++++ 6 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/client/entities.qc b/src/client/entities.qc index 31c1c30f..d6dc8802 100644 --- a/src/client/entities.qc +++ b/src/client/entities.qc @@ -78,3 +78,12 @@ Entities_ParseLump(void) return (0); } + +void +Entities_RendererRestarted(void) +{ + for (entity b = world; (b = findfloat(b, ::isCSQC, TRUE));) { + CBaseEntity pf = (CBaseEntity) b; + pf.RendererRestarted(); + } +} diff --git a/src/client/entry.qc b/src/client/entry.qc index 42b84fa8..81ab1660 100644 --- a/src/client/entry.qc +++ b/src/client/entry.qc @@ -138,6 +138,7 @@ CSQC_RendererRestarted(string rstr) Decal_Reload(); FX_Init(); Sky_Update(TRUE); + Entities_RendererRestarted(); } /* this is so that profile_csqc reports more accurate statistics as to diff --git a/src/gs-entbase/client/env_glow.qc b/src/gs-entbase/client/env_glow.qc index 9dbd47d8..ac234c7f 100644 --- a/src/gs-entbase/client/env_glow.qc +++ b/src/gs-entbase/client/env_glow.qc @@ -39,8 +39,22 @@ class env_glow:CBaseEntity void(void) env_glow; virtual float() predraw; virtual void(string, string) SpawnKey; + virtual void(void) RendererRestarted; }; +void +env_glow::RendererRestarted(void) +{ + if (!model && m_strSprite) { + precache_pic(m_strSprite); + m_vecSize = drawgetimagesize(m_strSprite) / 2; + } else { + precache_model(model); + m_strSprite = spriteframe(model, 0, 0.0f); + m_vecSize = drawgetimagesize(m_strSprite) / 2; + } +} + float env_glow::predraw(void) { @@ -52,8 +66,12 @@ env_glow::predraw(void) pSeat = &g_seats[s]; vecPlayer = pSeat->m_vecPredictedOrigin; + #warning "FTE broke this completely, in Half-Life BSP, partially in Q3 BSP, consult engine guru" + /* FIXME: READ ABOVE WARNING */ +#if 0 if (checkpvs(vecPlayer, this) == FALSE) return (PREDRAW_NEXT); +#endif other = world; traceline(this.origin, vecPlayer, MOVE_OTHERONLY, this); @@ -121,15 +139,12 @@ env_glow::SpawnKey(string strField, string strKey) switch (strField) { case "material": case "shader": + model = __NULL__; m_strSprite = strKey; - precache_pic(m_strSprite); - m_vecSize = drawgetimagesize(m_strSprite) / 2; break; case "sprite": case "model": - precache_model(strKey); - m_strSprite = sprintf("%s_0.tga", strKey); - m_vecSize = drawgetimagesize(m_strSprite) / 2; + model = strKey; break; case "scale": m_flScale = stof(strKey); @@ -160,4 +175,5 @@ env_glow::env_glow(void) setorigin(this, origin); effects &= ~EF_NOSHADOW; Init(); + RendererRestarted(); } diff --git a/src/gs-entbase/client/prop_rope.qc b/src/gs-entbase/client/prop_rope.qc index 1e87d49e..ce143539 100644 --- a/src/gs-entbase/client/prop_rope.qc +++ b/src/gs-entbase/client/prop_rope.qc @@ -47,6 +47,7 @@ class prop_rope:CBaseEntity void(void) prop_rope; virtual float() predraw; virtual void(string, string) SpawnKey; + virtual void(void) RendererRestarted; #ifndef ROPE_RIBBON virtual void(vector, vector, int) draw_segment; @@ -54,7 +55,8 @@ class prop_rope:CBaseEntity }; #ifndef ROPE_RIBBON -void prop_rope::draw_segment(vector start, vector end, int flip) +void +prop_rope::draw_segment(vector start, vector end, int flip) { vector fsize = [2,2]; vector lit1 = /*[0.1,0.1,0.1] */ getlight(start) / 255; @@ -105,7 +107,8 @@ void prop_rope::draw_segment(vector start, vector end, int flip) } #endif -float prop_rope::predraw(void) +float +prop_rope::predraw(void) { vector pos1; vector pos2; @@ -205,7 +208,8 @@ float prop_rope::predraw(void) return (PREDRAW_NEXT); } -void prop_rope::SpawnKey(string strField, string strKey) +void +prop_rope::SpawnKey(string strField, string strKey) { switch (strField) { case "sag": @@ -216,7 +220,6 @@ void prop_rope::SpawnKey(string strField, string strKey) break; case "shader": m_strShader = strKey; - precache_pic(m_strShader); break; case "swingfactor": m_flSwingFactor = stof(strKey); @@ -226,7 +229,14 @@ void prop_rope::SpawnKey(string strField, string strKey) } } -void prop_rope::prop_rope(void) +void +prop_rope::RendererRestarted(void) +{ + precache_pic(m_strShader); +} + +void +prop_rope::prop_rope(void) { m_flSwingFactor = random(); m_flSag = 15.0f; @@ -234,4 +244,5 @@ void prop_rope::prop_rope(void) m_strShader = "textures/props/wire_default"; drawmask = MASK_ENGINE; Init(); + RendererRestarted(); } diff --git a/src/gs-entbase/shared/baseentity.h b/src/gs-entbase/shared/baseentity.h index 8264fb31..55c1fd0b 100644 --- a/src/gs-entbase/shared/baseentity.h +++ b/src/gs-entbase/shared/baseentity.h @@ -37,6 +37,7 @@ class CBaseEntity virtual float(void) predraw; virtual void(void) postdraw; virtual void(void) MakeStatic; + virtual void(void) RendererRestarted; #endif #ifdef SERVER diff --git a/src/gs-entbase/shared/baseentity.qc b/src/gs-entbase/shared/baseentity.qc index 243a5448..49bf2321 100644 --- a/src/gs-entbase/shared/baseentity.qc +++ b/src/gs-entbase/shared/baseentity.qc @@ -23,6 +23,12 @@ string __fullspawndata; string Sentences_GetSamples(string); string Sentences_ProcessSample(string); +void +CBaseEntity::RendererRestarted(void) +{ + +}; + #ifdef GS_RENDERFX void CBaseEntity::RenderFXPass(void)