From b76ebc61d9817d286ecb38b9ecacc32c7b92f30c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 11 Apr 2023 20:43:42 +0200 Subject: [PATCH] Stop using wxList in OpenGL penguin sample Use std::vector instead, there is no need for linked lists here. --- samples/opengl/penguin/dxfrenderer.cpp | 79 ++++++++++---------------- samples/opengl/penguin/dxfrenderer.h | 9 ++- 2 files changed, 34 insertions(+), 54 deletions(-) diff --git a/samples/opengl/penguin/dxfrenderer.cpp b/samples/opengl/penguin/dxfrenderer.cpp index 8a348120e0..b4100521e6 100644 --- a/samples/opengl/penguin/dxfrenderer.cpp +++ b/samples/opengl/penguin/dxfrenderer.cpp @@ -33,10 +33,6 @@ #include "dxfrenderer.h" -#include "wx/listimpl.cpp" -WX_DEFINE_LIST(DXFEntityList) -WX_DEFINE_LIST(DXFLayerList) - // Conversion table from AutoCAD ACI colours to RGB values static const struct { unsigned char r, g, b; } aci_to_rgb[256] = { /* 0 */ {255, 255, 255}, @@ -341,31 +337,16 @@ DXFRenderer::~DXFRenderer() void DXFRenderer::Clear() { m_loaded = false; - { - for (DXFLayerList::compatibility_iterator node = m_layers.GetFirst(); node; node = node->GetNext()) - { - DXFLayer *current = node->GetData(); - delete current; - } - } - m_layers.Clear(); - { - for (DXFEntityList::compatibility_iterator node = m_entities.GetFirst(); node; node = node->GetNext()) - { - DXFEntity *current = node->GetData(); - delete current; - } - m_entities.Clear(); - } + m_layers.clear(); + m_entities.clear(); } int DXFRenderer::GetLayerColour(const wxString& layer) const { - for (DXFLayerList::compatibility_iterator node = m_layers.GetFirst(); node; node = node->GetNext()) + for (const auto& current : m_layers) { - DXFLayer *current = node->GetData(); - if (current->name == layer) - return current->colour; + if (current.name == layer) + return current.colour; } return 7; // white } @@ -406,10 +387,10 @@ bool DXFRenderer::ParseTables(wxInputStream& stream) // flush layer if (!layer.name.IsEmpty() && layer.colour != -1) { - DXFLayer *p = new DXFLayer; - p->name = layer.name; - p->colour = layer.colour; - m_layers.Append(p); + DXFLayer p; + p.name = layer.name; + p.colour = layer.colour; + m_layers.push_back(p); } layer = DXFLayer(); inlayer = false; @@ -466,31 +447,31 @@ bool DXFRenderer::ParseEntities(wxInputStream& stream) // flush entity if (state == 1) // 3DFACE { - DXFFace *p = new DXFFace; - p->v0 = v[0]; - p->v1 = v[1]; - p->v2 = v[2]; - p->v3 = v[3]; - p->CalculateNormal(); + DXFFace p; + p.v0 = v[0]; + p.v1 = v[1]; + p.v2 = v[2]; + p.v3 = v[3]; + p.CalculateNormal(); if (colour != -1) - p->colour = colour; + p.colour = colour; else - p->colour = GetLayerColour(layer); - m_entities.Append(p); + p.colour = GetLayerColour(layer); + m_entities.push_back(p); colour = -1; layer.clear(); v[0] = v[1] = v[2] = v[3] = DXFVector(); state = 0; } else if (state == 2) // LINE { - DXFLine *p = new DXFLine; - p->v0 = v[0]; - p->v1 = v[1]; + DXFLine p; + p.v0 = v[0]; + p.v1 = v[1]; if (colour != -1) - p->colour = colour; + p.colour = colour; else - p->colour = GetLayerColour(layer); - m_entities.Append(p); + p.colour = GetLayerColour(layer); + m_entities.push_back(p); colour = -1; layer.clear(); v[0] = v[1] = v[2] = v[3] = DXFVector(); state = 0; @@ -594,9 +575,9 @@ void DXFRenderer::NormalizeEntities() // calculate current min and max boundings of object DXFVector minv(10e20f, 10e20f, 10e20f); DXFVector maxv(-10e20f, -10e20f, -10e20f); - for (DXFEntityList::compatibility_iterator node = m_entities.GetFirst(); node; node = node->GetNext()) + for (auto& entity : m_entities) { - DXFEntity *p = node->GetData(); + DXFEntity *p = &entity; if (p->type == DXFEntity::Line) { DXFLine *line = (DXFLine *)p; @@ -629,9 +610,9 @@ void DXFRenderer::NormalizeEntities() // rescale object down to [-5,5] DXFVector span(maxv.x - minv.x, maxv.y - minv.y, maxv.z - minv.z); float factor = mymin(mymin(10.0f / span.x, 10.0f / span.y), 10.0f / span.z); - for (DXFEntityList::compatibility_iterator node2 = m_entities.GetFirst(); node2; node2 = node2->GetNext()) + for (auto& entity : m_entities) { - DXFEntity *p = node2->GetData(); + DXFEntity *p = &entity; if (p->type == DXFEntity::Line) { DXFLine *line = (DXFLine *)p; @@ -662,9 +643,9 @@ void DXFRenderer::Render() const if (!m_loaded) return; - for (DXFEntityList::compatibility_iterator node = m_entities.GetFirst(); node; node = node->GetNext()) + for (const auto& entity : m_entities) { - DXFEntity *p = node->GetData(); + const DXFEntity *p = &entity; wxColour c = ACIColourToRGB(p->colour); if (p->type == DXFEntity::Line) { diff --git a/samples/opengl/penguin/dxfrenderer.h b/samples/opengl/penguin/dxfrenderer.h index 251a6ce35a..70c21b019c 100644 --- a/samples/opengl/penguin/dxfrenderer.h +++ b/samples/opengl/penguin/dxfrenderer.h @@ -11,6 +11,8 @@ #ifndef _DXFRENDERER_H_ #define _DXFRENDERER_H_ +#include + struct DXFVector { DXFVector() { x = y = z = 0.0f; } @@ -49,9 +51,6 @@ struct DXFLayer int colour; }; -WX_DECLARE_LIST(DXFEntity, DXFEntityList); -WX_DECLARE_LIST(DXFLayer, DXFLayerList); - class DXFRenderer { public: @@ -71,8 +70,8 @@ private: void NormalizeEntities(); bool m_loaded; - DXFLayerList m_layers; - DXFEntityList m_entities; + std::vector m_layers; + std::vector m_entities; }; #endif // !_DXFRENDERER_H_