1616
1717#include " main.h"
1818
19+ #include < array>
20+ #include < vector>
1921#include < chrono>
2022#include < algorithm>
2123#include < glm/glm.hpp>
@@ -96,9 +98,9 @@ int factorial(int x)
9698class CCyclone
9799{
98100public:
99- float ** m_targetxyz;
100- float ** m_xyz;
101- float ** m_oldxyz;
101+ std::vector<std::array< float , 3 >> m_targetxyz;
102+ std::vector<std::array< float , 3 >> m_xyz;
103+ std::vector<std::array< float , 3 >> m_oldxyz;
102104 float *m_targetWidth;
103105 float *m_width;
104106 float *m_oldWidth;
@@ -110,29 +112,24 @@ class CCyclone
110112 float m_hslChange[2 ];
111113
112114 CCyclone ();
113- ~CCyclone ();
115+ ~CCyclone () = default ;
114116 void Update (CScreensaverCyclone* base);
115117
116118private:
117- sLight * m_curves = nullptr ;
119+ std::vector< sLight > m_curves;
118120};
119121
120122CCyclone::CCyclone ()
121123{
122124 int i;
123125
124126 // Initialize position stuff
125- m_curves = new sLight [std::max (gCycloneSettings .dComplexity + 3 , 50 )];
127+ m_curves.resize (std::max (gCycloneSettings .dComplexity + 3 , 50 ));
128+
129+ m_targetxyz.resize (gCycloneSettings .dComplexity +3 );
130+ m_xyz.resize (gCycloneSettings .dComplexity +3 );
131+ m_oldxyz.resize (gCycloneSettings .dComplexity +3 );
126132
127- m_targetxyz = new float *[gCycloneSettings .dComplexity +3 ];
128- m_xyz = new float *[gCycloneSettings .dComplexity +3 ];
129- m_oldxyz = new float *[gCycloneSettings .dComplexity +3 ];
130- for (i = 0 ; i < int (gCycloneSettings .dComplexity )+3 ; i++)
131- {
132- m_targetxyz[i] = new float [3 ];
133- m_xyz[i] = new float [3 ];
134- m_oldxyz[i] = new float [3 ];
135- }
136133 m_xyz[gCycloneSettings .dComplexity +2 ][0 ] = rsRandf (float (WIDTH*2 )) - float (WIDTH);
137134 m_xyz[gCycloneSettings .dComplexity +2 ][1 ] = float (HIGHT);
138135 m_xyz[gCycloneSettings .dComplexity +2 ][2 ] = rsRandf (float (WIDTH*2 )) - float (WIDTH);
@@ -184,22 +181,6 @@ CCyclone::CCyclone()
184181 m_hslChange[1 ] = 10 .0f ;
185182}
186183
187- CCyclone::~CCyclone ()
188- {
189- for (int i = 0 ; i < int (gCycloneSettings .dComplexity ) + 3 ; i++)
190- {
191- delete[] m_targetxyz[i];
192- delete[] m_xyz[i];
193- delete[] m_oldxyz[i];
194- }
195-
196- delete[] m_targetxyz;
197- delete[] m_xyz;
198- delete[] m_oldxyz;
199-
200- delete[] m_curves;
201- }
202-
203184void CCyclone::Update (CScreensaverCyclone* base)
204185{
205186 int i;
@@ -378,15 +359,15 @@ void CCyclone::Update(CScreensaverCyclone* base)
378359 m_curves[ptr ].color = glm::vec4 (0 .0f , 1 .0f , 0 .0f , 1 .0f );
379360 m_curves[ptr++].vertex = point;
380361 }
381- base->DrawEntry (GL_LINE_STRIP, m_curves, ptr);
362+ base->DrawEntry (GL_LINE_STRIP, m_curves. data () , ptr);
382363 ptr = 0 ;
383364
384365 for (i = 0 ; i < (gCycloneSettings .dComplexity +3 ); i++)
385366 {
386367 m_curves[ptr ].color = glm::vec4 (1 .0f , 0 .0f , 0 .0f , 1 .0f );
387368 m_curves[ptr++].vertex = glm::vec3 (m_xyz[i][0 ], m_xyz[i][1 ], m_xyz[i][2 ]);
388369 }
389- base->DrawEntry (GL_LINE_STRIP, m_curves, ptr);
370+ base->DrawEntry (GL_LINE_STRIP, m_curves. data () , ptr);
390371 base->m_lightingEnabled = 1 ;
391372 }
392373}
@@ -535,13 +516,22 @@ bool CScreensaverCyclone::Start()
535516 // Initialize cyclones and their particles
536517 for (i = 0 ; i < 13 ; i++)
537518 m_fact[i] = float (factorial (i));
538- m_cyclones = new CCyclone*[gCycloneSettings .dCyclones ];
539- m_particles = new CParticle*[gCycloneSettings .dParticles * gCycloneSettings .dCyclones ];
540- for (i = 0 ; i < gCycloneSettings .dCyclones ; i++)
519+
520+ m_cyclones.resize (gCycloneSettings .dCyclones );
521+ m_particles.resize (gCycloneSettings .dParticles * gCycloneSettings .dCyclones );
522+
523+ auto particles = m_particles.begin ();
524+
525+ for (auto & cyclone : m_cyclones)
541526 {
542- m_cyclones[i] = new CCyclone;
543- for (j=i*gCycloneSettings .dParticles ; j<((i+1 )*gCycloneSettings .dParticles ); j++)
544- m_particles[j] = new CParticle (m_cyclones[i]);
527+ cyclone = std::make_unique<CCyclone>();
528+
529+ std::for_each (particles, particles + gCycloneSettings .dParticles , [&cyclone](auto & particle)
530+ {
531+ particle = std::make_unique<CParticle>(cyclone.get ());
532+ });
533+
534+ particles += gCycloneSettings .dParticles ;
545535 }
546536
547537 glGenBuffers (1 , &m_vertexVBO);
@@ -565,10 +555,6 @@ void CScreensaverCyclone::Stop()
565555
566556 glDisable (GL_DEPTH_TEST);
567557 glDisable (GL_CULL_FACE);
568-
569- // Free memory
570- delete[] m_particles;
571- delete[] m_cyclones;
572558}
573559
574560void CScreensaverCyclone::Render ()
0 commit comments