Index: source/simulation2/components/CCmpRangeOverlayRenderer.cpp =================================================================== --- source/simulation2/components/CCmpRangeOverlayRenderer.cpp +++ source/simulation2/components/CCmpRangeOverlayRenderer.cpp @@ -30,6 +30,8 @@ #include "simulation2/helpers/Render.h" #include "simulation2/system/Component.h" +#include + class CCmpRangeOverlayRenderer : public ICmpRangeOverlayRenderer { public: @@ -47,11 +49,7 @@ m_Color = CColor(0.f, 0.f, 0.f, 1.f); } - ~CCmpRangeOverlayRenderer() - { - for (const RangeOverlayData& rangeOverlay : m_RangeOverlayData) - delete rangeOverlay.second; - } + ~CCmpRangeOverlayRenderer() = default; static std::string GetSchema() { @@ -79,8 +77,6 @@ void ResetRangeOverlays() { - for (const RangeOverlayData& rangeOverlay : m_RangeOverlayData) - delete rangeOverlay.second; m_RangeOverlayData.clear(); UpdateMessageSubscriptions(); m_Enabled = false; @@ -92,13 +88,14 @@ return; SOverlayDescriptor rangeOverlayDescriptor; - SOverlayTexturedLine* rangeOverlay = nullptr; rangeOverlayDescriptor.m_Radius = radius; - rangeOverlayDescriptor.m_LineTexture = CStrIntern(TEXTUREBASEPATH + texture); - rangeOverlayDescriptor.m_LineTextureMask = CStrIntern(TEXTUREBASEPATH + textureMask); + rangeOverlayDescriptor.m_LineTexture = CStrIntern(TEXTURE_BASE_PATH + texture); + rangeOverlayDescriptor.m_LineTextureMask = CStrIntern(TEXTURE_BASE_PATH + textureMask); rangeOverlayDescriptor.m_LineThickness = thickness; - m_RangeOverlayData.push_back({ rangeOverlayDescriptor, rangeOverlay }); + m_RangeOverlayData.push_back({ + rangeOverlayDescriptor, std::unique_ptr() + }); m_Enabled = true; UpdateMessageSubscriptions(); } @@ -112,11 +109,7 @@ const CMessageInterpolate& msgData = static_cast (msg); for (RangeOverlayData& rangeOverlay : m_RangeOverlayData) - { - delete rangeOverlay.second; - rangeOverlay.second = new SOverlayTexturedLine; - UpdateRangeOverlay(&rangeOverlay.first, *rangeOverlay.second, msgData.offset); - } + UpdateRangeOverlay(rangeOverlay, msgData.offset); UpdateMessageSubscriptions(); @@ -138,6 +131,12 @@ } } +private: + struct RangeOverlayData { + SOverlayDescriptor descriptor; + std::unique_ptr line; + }; + virtual void UpdateColor() { CmpPtr cmpOwnership(GetEntityHandle()); @@ -192,16 +191,16 @@ return; for (const RangeOverlayData& rangeOverlay : m_RangeOverlayData) - if (rangeOverlay.second) - { - if (culling && !rangeOverlay.second->IsVisibleInFrustum(frustum)) - continue; - collector.Submit(rangeOverlay.second); - } + { + if (!rangeOverlay.line) + continue; + if (culling && !rangeOverlay.line->IsVisibleInFrustum(frustum)) + continue; + collector.Submit(rangeOverlay.line.get()); + } } -private: - void UpdateRangeOverlay(const SOverlayDescriptor* overlayDescriptor, SOverlayTexturedLine& overlay, float frameOffset) + void UpdateRangeOverlay(RangeOverlayData& rangeOverlay, const float frameOffset) { if (!CRenderer::IsInitialised()) return; @@ -214,19 +213,19 @@ CVector2D origin; cmpPosition->GetInterpolatedPosition2D(frameOffset, origin.X, origin.Y, rotY); - overlay.m_SimContext = &GetSimContext(); - overlay.m_Color = m_Color; - overlay.CreateOverlayTexture(overlayDescriptor); + rangeOverlay.line = std::unique_ptr(new SOverlayTexturedLine); + rangeOverlay.line->m_SimContext = &GetSimContext(); + rangeOverlay.line->m_Color = m_Color; + rangeOverlay.line->CreateOverlayTexture(&rangeOverlay.descriptor); - SimRender::ConstructTexturedLineCircle(overlay, origin, overlayDescriptor->m_Radius); + SimRender::ConstructTexturedLineCircle(*rangeOverlay.line.get(), origin, rangeOverlay.descriptor.m_Radius); } bool m_EnabledInterpolate; bool m_EnabledRenderSubmit; bool m_Enabled; - const char* TEXTUREBASEPATH = "art/textures/selection/"; - typedef std::pair RangeOverlayData; + const char* TEXTURE_BASE_PATH = "art/textures/selection/"; std::vector m_RangeOverlayData; CColor m_Color; };