From 48e7c2d994aa0367411c2aafb0f01e2ff2d2cef9 Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Sun, 8 Oct 2023 13:08:18 -0500 Subject: [PATCH] - Proper heap handling of `HWSprite` pointer - Added `Construct()` method and ensure it's called when created from any means --- src/playsim/p_effect.cpp | 17 +++++++++++------ src/playsim/p_effect.h | 1 + src/rendering/hwrenderer/scene/hw_bsp.cpp | 6 ++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/playsim/p_effect.cpp b/src/playsim/p_effect.cpp index 61c61c4d5..efee1c5ba 100644 --- a/src/playsim/p_effect.cpp +++ b/src/playsim/p_effect.cpp @@ -991,13 +991,13 @@ void P_DisconnectEffect (AActor *actor) // //=========================================================================== -DZSprite::DZSprite() +void DZSprite::Construct() { PT = {}; PT.sprite = this; - Pos = Vel = {0,0,0}; - Offset = {0,0}; - Scale = {1,1}; + Pos = Vel = { 0,0,0 }; + Offset = { 0,0 }; + Scale = { 1,1 }; Roll = 0.0; Alpha = 1.0; LightLevel = -1; @@ -1009,6 +1009,11 @@ DZSprite::DZSprite() scolor = 0xffffff; } +DZSprite::DZSprite() +{ + Construct(); +} + void DZSprite::CallPostBeginPlay() { PT.texture = Texture; @@ -1018,7 +1023,7 @@ void DZSprite::CallPostBeginPlay() void DZSprite::OnDestroy() { PT.alpha = 0.0; // stops all rendering. - spr = nullptr; + if (spr) delete spr; Super::OnDestroy(); } @@ -1038,7 +1043,7 @@ DZSprite* DZSprite::NewZSprite(FLevelLocals* Level, PClass* type) } DZSprite *zs = static_cast(Level->CreateThinker(type, STAT_SPRITE)); - + zs->Construct(); return zs; } diff --git a/src/playsim/p_effect.h b/src/playsim/p_effect.h index d0a0ed883..e79729d3b 100644 --- a/src/playsim/p_effect.h +++ b/src/playsim/p_effect.h @@ -176,6 +176,7 @@ public: DZSprite(); + void Construct(); void CallPostBeginPlay() override; void OnDestroy() override; diff --git a/src/rendering/hwrenderer/scene/hw_bsp.cpp b/src/rendering/hwrenderer/scene/hw_bsp.cpp index 59d1784fe..29616d256 100644 --- a/src/rendering/hwrenderer/scene/hw_bsp.cpp +++ b/src/rendering/hwrenderer/scene/hw_bsp.cpp @@ -608,10 +608,8 @@ void HWDrawInfo::RenderParticles(subsector_t *sub, sector_t *front) if (clipres == PClip_InFront) continue; } if (!sp->spr) - { - HWSprite sprite; - sp->spr = &sprite; - } + sp->spr = new HWSprite(); + sp->spr->ProcessParticle(this, &sp->PT, front); } for (int i = Level->ParticlesInSubsec[sub->Index()]; i != NO_PARTICLE; i = Level->Particles[i].snext)