Remove disabled elements when simulating. Fix crash when kill_part is run on elements with invalid types

This commit is contained in:
Simon Robertshaw 2012-08-18 17:08:24 +01:00
parent 69b788ba7d
commit 7018e46fac
2 changed files with 11 additions and 7 deletions

View File

@ -2477,7 +2477,7 @@ void Simulation::kill_part(int i)//kills particle number i
if (parts[i].type == PT_NONE)
return;
if(elementCount[parts[i].type] && parts[i].type)
if(parts[i].type > 0 && parts[i].type < PT_NUM && elementCount[parts[i].type] && parts[i].type)
elementCount[parts[i].type]--;
if (parts[i].type == PT_STKM)
{
@ -3352,7 +3352,7 @@ void Simulation::update_particles_i(int start, int inc)
if (parts[i].type)
{
t = parts[i].type;
if (t<0 || t>=PT_NUM)
if (t<0 || t>=PT_NUM || !elements[i].Enabled)
{
kill_part(i);
continue;
@ -4588,11 +4588,14 @@ Simulation::Simulation():
memcpy(platent, platentT, latentCount * sizeof(unsigned int));
free(platentT);
elements = new Element[PT_NUM];
//elements = new Element[PT_NUM];
std::vector<Element> elementList = GetElements();
for(int i = 0; i < elementList.size(); i++)
for(int i = 0; i < PT_NUM; i++)
{
if(i < elementList.size())
elements[i] = elementList[i];
else
elements[i] = Element_NONE();
}
tools = GetTools();

View File

@ -20,11 +20,11 @@
#include "WallType.h"
#include "GOLMenu.h"
#include "MenuSection.h"
#include "elements/Element.h"
#define CHANNELS ((int)(MAX_TEMP-73)/100+2)
class Snapshot;
class Element;
class SimTool;
class Brush;
struct SimulationSample;
@ -47,7 +47,8 @@ public:
Air * air;
std::vector<sign> signs;
Element * elements;
Element elements[PT_NUM];
//Element * elements;
std::vector<SimTool*> tools;
unsigned int * platent;
wall_type wtypes[UI_WALLCOUNT];