From 8671332e601329afc608cefde79184ce2fbc0ba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20B=C3=A1lint=20Misius?= Date: Sun, 2 Jun 2019 17:06:18 +0200 Subject: [PATCH] Fix transition properties not being validated Also clean up some more of the Lua API code, again. Eww. --- src/lua/LuaScriptInterface.cpp | 233 +++++++++++++--------------- src/lua/LuaScriptInterface.h | 2 - src/simulation/Particle.cpp | 33 ++-- src/simulation/Particle.h | 2 +- src/simulation/StructProperty.h | 15 +- src/simulation/elements/Element.cpp | 73 ++++----- src/simulation/elements/Element.h | 2 +- 7 files changed, 175 insertions(+), 185 deletions(-) diff --git a/src/lua/LuaScriptInterface.cpp b/src/lua/LuaScriptInterface.cpp index 830872dc3..269e8db70 100644 --- a/src/lua/LuaScriptInterface.cpp +++ b/src/lua/LuaScriptInterface.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "Config.h" #include "Format.h" @@ -33,6 +34,7 @@ #include "simulation/Simulation.h" #include "simulation/ElementGraphics.h" +#include "simulation/ElementCommon.h" #include "simulation/Air.h" #include "ToolClasses.h" @@ -712,9 +714,6 @@ int simulation_deletesign(lua_State *l) //// Begin Simulation API -StructProperty * LuaScriptInterface::particleProperties; -int LuaScriptInterface::particlePropertiesCount; - void LuaScriptInterface::initSimulationAPI() { //Methods @@ -817,14 +816,13 @@ void LuaScriptInterface::initSimulationAPI() SETCONST(l, PMAPMASK); //Declare FIELD_BLAH constants - std::vector particlePropertiesV = Particle::GetProperties(); - particlePropertiesCount = 0; - particleProperties = new StructProperty[particlePropertiesV.size()]; - for(std::vector::iterator iter = particlePropertiesV.begin(), end = particlePropertiesV.end(); iter != end; ++iter) { - lua_pushinteger(l, particlePropertiesCount); - lua_setfield(l, -2, ("FIELD_" + (*iter).Name.ToUpper()).c_str()); - particleProperties[particlePropertiesCount++] = *iter; + int particlePropertiesCount = 0; + for (auto &prop : Particle::GetProperties()) + { + lua_pushinteger(l, particlePropertiesCount++); + lua_setfield(l, -2, ("FIELD_" + prop.Name.ToUpper()).c_str()); + } } lua_newtable(l); @@ -1020,29 +1018,29 @@ int LuaScriptInterface::simulation_partProperty(lua_State * l) } } + auto &properties = Particle::GetProperties(); + auto prop = properties.end(); + //Get field if (lua_type(l, 2) == LUA_TNUMBER) { int fieldID = lua_tointeger(l, 2); - if (fieldID < 0 || fieldID >= particlePropertiesCount) + if (fieldID < 0 || fieldID >= (int)properties.size()) + { return luaL_error(l, "Invalid field ID (%d)", fieldID); - property = particleProperties[fieldID]; + } + prop = properties.begin() + fieldID; } - else if(lua_type(l, 2) == LUA_TSTRING) + else if (lua_type(l, 2) == LUA_TSTRING) { ByteString fieldName = lua_tostring(l, 2); - bool foundProperty = false; - for(int i = particlePropertiesCount-1; i >= 0; i--) + prop = std::find_if(properties.begin(), properties.end(), [&fieldName](StructProperty const &p) { + return p.Name == fieldName; + }); + if (prop == properties.end()) { - if (particleProperties[i].Name == fieldName) - { - property = particleProperties[i]; - foundProperty = true; - break; - } - } - if (!foundProperty) return luaL_error(l, "Unknown field (%s)", fieldName.c_str()); + } } else { @@ -1050,16 +1048,16 @@ int LuaScriptInterface::simulation_partProperty(lua_State * l) } //Calculate memory address of property - intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->parts[particleID])+property.Offset); + intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->parts[particleID]) + prop->Offset); if(argCount == 3) { - LuaSetProperty(l, property, propertyAddress, 3); + LuaSetProperty(l, *prop, propertyAddress, 3); return 0; } else { - LuaGetProperty(l, property, propertyAddress); + LuaGetProperty(l, *prop, propertyAddress); return 1; } } @@ -2473,6 +2471,7 @@ void LuaScriptInterface::LuaGetProperty(lua_State* l, StructProperty property, i { switch (property.Type) { + case StructProperty::TransitionType: case StructProperty::ParticleType: case StructProperty::Integer: lua_pushinteger(l, *((int*)propertyAddress)); @@ -2517,6 +2516,7 @@ void LuaScriptInterface::LuaSetProperty(lua_State* l, StructProperty property, i { switch (property.Type) { + case StructProperty::TransitionType: case StructProperty::ParticleType: case StructProperty::Integer: *((int*)propertyAddress) = luaL_checkinteger(l, stackPos); @@ -2674,79 +2674,68 @@ int LuaScriptInterface::elements_allocate(lua_State * l) int LuaScriptInterface::elements_element(lua_State * l) { - int args = lua_gettop(l); - int id; - luaL_checktype(l, 1, LUA_TNUMBER); - id = lua_tointeger(l, 1); - - if(id < 0 || id >= PT_NUM || !luacon_sim->elements[id].Enabled) + int id = luaL_checkinteger(l, 1); + if (!luacon_sim->IsValidElement(id)) + { return luaL_error(l, "Invalid element"); + } - if(args > 1) + if (lua_gettop(l) > 1) { luaL_checktype(l, 2, LUA_TTABLE); - std::vector properties = Element::GetProperties(); //Write values from native data to a table - for(std::vector::iterator iter = properties.begin(), end = properties.end(); iter != end; ++iter) + for (auto &prop : Element::GetProperties()) { - lua_getfield(l, -1, (*iter).Name.c_str()); - if(lua_type(l, -1) != LUA_TNIL) + lua_getfield(l, -1, prop.Name.c_str()); + if (lua_type(l, -1) != LUA_TNIL) { - intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[id]) + (*iter).Offset); - LuaSetProperty(l, (*iter), propertyAddress, -1); + intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[id]) + prop.Offset); + LuaSetProperty(l, prop, propertyAddress, -1); } lua_pop(l, 1); } lua_getfield(l, -1, "Update"); - if(lua_type(l, -1) == LUA_TFUNCTION) + if (lua_type(l, -1) == LUA_TFUNCTION) { lua_el_func[id].Assign(-1); - lua_pop(l, 1); lua_el_mode[id] = 1; } - else if(lua_type(l, -1) == LUA_TBOOLEAN && !lua_toboolean(l, -1)) + else if (lua_type(l, -1) == LUA_TBOOLEAN && !lua_toboolean(l, -1)) { lua_el_func[id].Clear(); - lua_pop(l, 1); lua_el_mode[id] = 0; luacon_sim->elements[id].Update = NULL; } - else - lua_pop(l, 1); + lua_pop(l, 1); lua_getfield(l, -1, "Graphics"); - if(lua_type(l, -1) == LUA_TFUNCTION) + if (lua_type(l, -1) == LUA_TFUNCTION) { lua_gr_func[id].Assign(-1); - lua_pop(l, 1); } - else if(lua_type(l, -1) == LUA_TBOOLEAN && !lua_toboolean(l, -1)) + else if (lua_type(l, -1) == LUA_TBOOLEAN && !lua_toboolean(l, -1)) { lua_gr_func[id].Clear(); - lua_pop(l, 1); luacon_sim->elements[id].Graphics = NULL; } - else - lua_pop(l, 1); + lua_pop(l, 1); luacon_model->BuildMenus(); luacon_sim->init_can_move(); luacon_ren->graphicscache[id].isready = 0; - lua_pop(l, 1); return 0; } else { - std::vector properties = Element::GetProperties(); //Write values from native data to a table lua_newtable(l); - for(std::vector::iterator iter = properties.begin(), end = properties.end(); iter != end; ++iter) + for (auto &prop : Element::GetProperties()) { - intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[id]) + (*iter).Offset); - LuaGetProperty(l, (*iter), propertyAddress); - lua_setfield(l, -2, (*iter).Name.c_str()); + intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[id]) + prop.Offset); + LuaGetProperty(l, prop, propertyAddress); + lua_setfield(l, -2, prop.Name.c_str()); } lua_pushstring(l, luacon_sim->elements[id].Identifier.c_str()); lua_setfield(l, -2, "Identifier"); @@ -2756,134 +2745,122 @@ int LuaScriptInterface::elements_element(lua_State * l) int LuaScriptInterface::elements_property(lua_State * l) { - int args = lua_gettop(l); - int id; - ByteString propertyName; - luaL_checktype(l, 1, LUA_TNUMBER); - id = lua_tointeger(l, 1); - luaL_checktype(l, 2, LUA_TSTRING); - propertyName = ByteString(lua_tostring(l, 2)); - - if(id < 0 || id >= PT_NUM || !luacon_sim->elements[id].Enabled) - return luaL_error(l, "Invalid element"); - - if(args > 2) + int id = luaL_checkinteger(l, 1); + if (!luacon_sim->IsValidElement(id)) { - StructProperty property; - bool propertyFound = false; - std::vector properties = Element::GetProperties(); + return luaL_error(l, "Invalid element"); + } + ByteString propertyName(luaL_checklstring(l, 2, NULL)); - for(std::vector::iterator iter = properties.begin(), end = properties.end(); iter != end; ++iter) - { - if((*iter).Name == propertyName) - { - property = *iter; - propertyFound = true; - break; - } - } + auto &properties = Element::GetProperties(); + auto prop = std::find_if(properties.begin(), properties.end(), [&propertyName](StructProperty const &p) { + return p.Name == propertyName; + }); - if(propertyFound) + if (lua_gettop(l) > 2) + { + if (prop != properties.end()) { - if(lua_type(l, 3) != LUA_TNIL) + if (lua_type(l, 3) != LUA_TNIL) { - intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[id]) + property.Offset); - LuaSetProperty(l, property, propertyAddress, 3); + if (prop->Type == StructProperty::TransitionType) + { + int type = luaL_checkinteger(l, 3); + if (!luacon_sim->IsValidElement(type) && type != NT && type != ST) + { + luaL_error(l, "Invalid element"); + } + } + + intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[id]) + prop->Offset); + LuaSetProperty(l, *prop, propertyAddress, 3); } luacon_model->BuildMenus(); luacon_sim->init_can_move(); luacon_ren->graphicscache[id].isready = 0; - return 0; } - else if(propertyName == "Update") + else if (propertyName == "Update") { - if(lua_type(l, 3) == LUA_TFUNCTION) + if (lua_type(l, 3) == LUA_TFUNCTION) { - if (args > 3) + switch (luaL_optint(l, 4, 0)) { - luaL_checktype(l, 4, LUA_TNUMBER); - int replace = lua_tointeger(l, 4); - if (replace == 2) - lua_el_mode[id] = 3; //update before - else if (replace == 1) - lua_el_mode[id] = 2; //replace - else - lua_el_mode[id] = 1; //update after + case 2: + lua_el_mode[id] = 3; //update before + break; + + case 1: + lua_el_mode[id] = 2; //replace + break; + + default: + lua_el_mode[id] = 1; //update after + break; } - else - lua_el_mode[id] = 1; lua_el_func[id].Assign(3); } - else if(lua_type(l, 3) == LUA_TBOOLEAN && !lua_toboolean(l, 3)) + else if (lua_type(l, 3) == LUA_TBOOLEAN && !lua_toboolean(l, 3)) { lua_el_func[id].Clear(); lua_el_mode[id] = 0; luacon_sim->elements[id].Update = NULL; } + return 0; } - else if(propertyName == "Graphics") + else if (propertyName == "Graphics") { - if(lua_type(l, 3) == LUA_TFUNCTION) + if (lua_type(l, 3) == LUA_TFUNCTION) { lua_gr_func[id].Assign(3); } - else if(lua_type(l, 3) == LUA_TBOOLEAN && !lua_toboolean(l, -1)) + else if (lua_type(l, 3) == LUA_TBOOLEAN && !lua_toboolean(l, -1)) { lua_gr_func[id].Clear(); luacon_sim->elements[id].Graphics = NULL; } luacon_ren->graphicscache[id].isready = 0; + return 0; } else + { return luaL_error(l, "Invalid element property"); - return 0; + } } else { - StructProperty property; - bool propertyFound = false; - std::vector properties = Element::GetProperties(); - - for(std::vector::iterator iter = properties.begin(), end = properties.end(); iter != end; ++iter) + if (prop != properties.end()) { - if((*iter).Name == propertyName) - { - property = *iter; - propertyFound = true; - break; - } - } - - if(propertyFound) - { - intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[id]) + property.Offset); - LuaGetProperty(l, property, propertyAddress); + intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[id]) + prop->Offset); + LuaGetProperty(l, *prop, propertyAddress); return 1; } - else if(propertyName == "Identifier") + else if (propertyName == "Identifier") { lua_pushstring(l, luacon_sim->elements[id].Identifier.c_str()); return 1; } else + { return luaL_error(l, "Invalid element property"); + } } } int LuaScriptInterface::elements_free(lua_State * l) { - int id; - luaL_checktype(l, 1, LUA_TNUMBER); - id = lua_tointeger(l, 1); - - if(id < 0 || id >= PT_NUM || !luacon_sim->elements[id].Enabled) + int id = luaL_checkinteger(l, 1); + if (!luacon_sim->IsValidElement(id)) + { return luaL_error(l, "Invalid element"); + } ByteString identifier = luacon_sim->elements[id].Identifier; - if(identifier.BeginsWith("DEFAULT_PT_")) + if (identifier.BeginsWith("DEFAULT_PT_")) + { return luaL_error(l, "Cannot free default elements"); + } luacon_sim->elements[id].Enabled = false; diff --git a/src/lua/LuaScriptInterface.h b/src/lua/LuaScriptInterface.h index 74a15890a..36a5904e3 100644 --- a/src/lua/LuaScriptInterface.h +++ b/src/lua/LuaScriptInterface.h @@ -55,8 +55,6 @@ class LuaScriptInterface: public CommandInterface static int simulation_newsign(lua_State *l); //Simulation - static StructProperty * particleProperties; - static int particlePropertiesCount; void initSimulationAPI(); static void set_map(int x, int y, int width, int height, float value, int mapType); diff --git a/src/simulation/Particle.cpp b/src/simulation/Particle.cpp index 3d851ccb8..06b6896ed 100644 --- a/src/simulation/Particle.cpp +++ b/src/simulation/Particle.cpp @@ -1,22 +1,23 @@ #include #include "Particle.h" -std::vector Particle::GetProperties() +std::vector const &Particle::GetProperties() { - std::vector properties; - properties.push_back(StructProperty("type", StructProperty::ParticleType, offsetof(Particle, type))); - properties.push_back(StructProperty("life", StructProperty::ParticleType, offsetof(Particle, life))); - properties.push_back(StructProperty("ctype", StructProperty::ParticleType, offsetof(Particle, ctype))); - properties.push_back(StructProperty("x", StructProperty::Float, offsetof(Particle, x))); - properties.push_back(StructProperty("y", StructProperty::Float, offsetof(Particle, y))); - properties.push_back(StructProperty("vx", StructProperty::Float, offsetof(Particle, vx))); - properties.push_back(StructProperty("vy", StructProperty::Float, offsetof(Particle, vy))); - properties.push_back(StructProperty("temp", StructProperty::Float, offsetof(Particle, temp))); - properties.push_back(StructProperty("flags", StructProperty::UInteger, offsetof(Particle, flags))); - properties.push_back(StructProperty("tmp", StructProperty::Integer, offsetof(Particle, tmp))); - properties.push_back(StructProperty("tmp2", StructProperty::Integer, offsetof(Particle, tmp2))); - properties.push_back(StructProperty("dcolour", StructProperty::UInteger, offsetof(Particle, dcolour))); - properties.push_back(StructProperty("pavg0", StructProperty::Float, offsetof(Particle, pavg[0]))); - properties.push_back(StructProperty("pavg1", StructProperty::Float, offsetof(Particle, pavg[1]))); + static std::vector properties = { + { "type" , StructProperty::ParticleType, offsetof(Particle, type ) }, + { "life" , StructProperty::ParticleType, offsetof(Particle, life ) }, + { "ctype" , StructProperty::ParticleType, offsetof(Particle, ctype ) }, + { "x" , StructProperty::Float , offsetof(Particle, x ) }, + { "y" , StructProperty::Float , offsetof(Particle, y ) }, + { "vx" , StructProperty::Float , offsetof(Particle, vx ) }, + { "vy" , StructProperty::Float , offsetof(Particle, vy ) }, + { "temp" , StructProperty::Float , offsetof(Particle, temp ) }, + { "flags" , StructProperty::UInteger , offsetof(Particle, flags ) }, + { "tmp" , StructProperty::Integer , offsetof(Particle, tmp ) }, + { "tmp2" , StructProperty::Integer , offsetof(Particle, tmp2 ) }, + { "dcolour", StructProperty::UInteger , offsetof(Particle, dcolour) }, + { "pavg0" , StructProperty::Float , offsetof(Particle, pavg[0]) }, + { "pavg1" , StructProperty::Float , offsetof(Particle, pavg[1]) }, + }; return properties; } diff --git a/src/simulation/Particle.h b/src/simulation/Particle.h index fbb598847..23a47475a 100644 --- a/src/simulation/Particle.h +++ b/src/simulation/Particle.h @@ -17,7 +17,7 @@ struct Particle unsigned int dcolour; /** Returns a list of properties, their type and offset within the structure that can be changed by higher-level processes referring to them by name such as Lua or the property tool **/ - static std::vector GetProperties(); + static std::vector const &GetProperties(); }; #endif diff --git a/src/simulation/StructProperty.h b/src/simulation/StructProperty.h index c7588dbb7..76ba9519c 100644 --- a/src/simulation/StructProperty.h +++ b/src/simulation/StructProperty.h @@ -6,7 +6,20 @@ struct StructProperty { - enum PropertyType { ParticleType, Colour, Integer, UInteger, Float, BString, String, Char, UChar, Removed }; + enum PropertyType + { + TransitionType, + ParticleType, + Colour, + Integer, + UInteger, + Float, + BString, + String, + Char, + UChar, + Removed + }; ByteString Name; PropertyType Type; intptr_t Offset; diff --git a/src/simulation/elements/Element.cpp b/src/simulation/elements/Element.cpp index 4c4fbd723..a8175690c 100644 --- a/src/simulation/elements/Element.cpp +++ b/src/simulation/elements/Element.cpp @@ -48,43 +48,44 @@ Element::Element(): { } -std::vector Element::GetProperties() +std::vector const &Element::GetProperties() { - std::vector properties; - properties.push_back(StructProperty("Name", StructProperty::String, offsetof(Element, Name))); - properties.push_back(StructProperty("Colour", StructProperty::Colour, offsetof(Element, Colour))); - properties.push_back(StructProperty("Color", StructProperty::Colour, offsetof(Element, Colour))); - properties.push_back(StructProperty("MenuVisible", StructProperty::Integer, offsetof(Element, MenuVisible))); - properties.push_back(StructProperty("MenuSection", StructProperty::Integer, offsetof(Element, MenuSection))); - properties.push_back(StructProperty("Enabled", StructProperty::Integer, offsetof(Element, Enabled))); - properties.push_back(StructProperty("Advection", StructProperty::Float, offsetof(Element, Advection))); - properties.push_back(StructProperty("AirDrag", StructProperty::Float, offsetof(Element, AirDrag))); - properties.push_back(StructProperty("AirLoss", StructProperty::Float, offsetof(Element, AirLoss))); - properties.push_back(StructProperty("Loss", StructProperty::Float, offsetof(Element, Loss))); - properties.push_back(StructProperty("Collision", StructProperty::Float, offsetof(Element, Collision))); - properties.push_back(StructProperty("Gravity", StructProperty::Float, offsetof(Element, Gravity))); - properties.push_back(StructProperty("Diffusion", StructProperty::Float, offsetof(Element, Diffusion))); - properties.push_back(StructProperty("HotAir", StructProperty::Float, offsetof(Element, HotAir))); - properties.push_back(StructProperty("Falldown", StructProperty::Integer, offsetof(Element, Falldown))); - properties.push_back(StructProperty("Flammable", StructProperty::Integer, offsetof(Element, Flammable))); - properties.push_back(StructProperty("Explosive", StructProperty::Integer, offsetof(Element, Explosive))); - properties.push_back(StructProperty("Meltable", StructProperty::Integer, offsetof(Element, Meltable))); - properties.push_back(StructProperty("Hardness", StructProperty::Integer, offsetof(Element, Hardness))); - properties.push_back(StructProperty("PhotonReflectWavelengths", StructProperty::UInteger, offsetof(Element, PhotonReflectWavelengths))); - properties.push_back(StructProperty("Weight", StructProperty::Integer, offsetof(Element, Weight))); - properties.push_back(StructProperty("Temperature", StructProperty::Float, offsetof(Element, Temperature))); - properties.push_back(StructProperty("HeatConduct", StructProperty::UChar, offsetof(Element, HeatConduct))); - properties.push_back(StructProperty("Description", StructProperty::String, offsetof(Element, Description))); - properties.push_back(StructProperty("State", StructProperty::Removed, 0)); - properties.push_back(StructProperty("Properties", StructProperty::Integer, offsetof(Element, Properties))); - properties.push_back(StructProperty("LowPressure", StructProperty::Float, offsetof(Element, LowPressure))); - properties.push_back(StructProperty("LowPressureTransition", StructProperty::Integer, offsetof(Element, LowPressureTransition))); - properties.push_back(StructProperty("HighPressure", StructProperty::Float, offsetof(Element, HighPressure))); - properties.push_back(StructProperty("HighPressureTransition", StructProperty::Integer, offsetof(Element, HighPressureTransition))); - properties.push_back(StructProperty("LowTemperature", StructProperty::Float, offsetof(Element, LowTemperature))); - properties.push_back(StructProperty("LowTemperatureTransition", StructProperty::Integer, offsetof(Element, LowTemperatureTransition))); - properties.push_back(StructProperty("HighTemperature", StructProperty::Float, offsetof(Element, HighTemperature))); - properties.push_back(StructProperty("HighTemperatureTransition", StructProperty::Integer, offsetof(Element, HighTemperatureTransition))); + static std::vector properties = { + { "Name", StructProperty::String, offsetof(Element, Name ) }, + { "Colour", StructProperty::Colour, offsetof(Element, Colour ) }, + { "Color", StructProperty::Colour, offsetof(Element, Colour ) }, + { "MenuVisible", StructProperty::Integer, offsetof(Element, MenuVisible ) }, + { "MenuSection", StructProperty::Integer, offsetof(Element, MenuSection ) }, + { "Enabled", StructProperty::Integer, offsetof(Element, Enabled ) }, + { "Advection", StructProperty::Float, offsetof(Element, Advection ) }, + { "AirDrag", StructProperty::Float, offsetof(Element, AirDrag ) }, + { "AirLoss", StructProperty::Float, offsetof(Element, AirLoss ) }, + { "Loss", StructProperty::Float, offsetof(Element, Loss ) }, + { "Collision", StructProperty::Float, offsetof(Element, Collision ) }, + { "Gravity", StructProperty::Float, offsetof(Element, Gravity ) }, + { "Diffusion", StructProperty::Float, offsetof(Element, Diffusion ) }, + { "HotAir", StructProperty::Float, offsetof(Element, HotAir ) }, + { "Falldown", StructProperty::Integer, offsetof(Element, Falldown ) }, + { "Flammable", StructProperty::Integer, offsetof(Element, Flammable ) }, + { "Explosive", StructProperty::Integer, offsetof(Element, Explosive ) }, + { "Meltable", StructProperty::Integer, offsetof(Element, Meltable ) }, + { "Hardness", StructProperty::Integer, offsetof(Element, Hardness ) }, + { "PhotonReflectWavelengths", StructProperty::UInteger, offsetof(Element, PhotonReflectWavelengths ) }, + { "Weight", StructProperty::Integer, offsetof(Element, Weight ) }, + { "Temperature", StructProperty::Float, offsetof(Element, Temperature ) }, + { "HeatConduct", StructProperty::UChar, offsetof(Element, HeatConduct ) }, + { "Description", StructProperty::String, offsetof(Element, Description ) }, + { "State", StructProperty::Removed, 0 }, + { "Properties", StructProperty::Integer, offsetof(Element, Properties ) }, + { "LowPressure", StructProperty::Float, offsetof(Element, LowPressure ) }, + { "LowPressureTransition", StructProperty::TransitionType, offsetof(Element, LowPressureTransition ) }, + { "HighPressure", StructProperty::Float, offsetof(Element, HighPressure ) }, + { "HighPressureTransition", StructProperty::TransitionType, offsetof(Element, HighPressureTransition ) }, + { "LowTemperature", StructProperty::Float, offsetof(Element, LowTemperature ) }, + { "LowTemperatureTransition", StructProperty::TransitionType, offsetof(Element, LowTemperatureTransition ) }, + { "HighTemperature", StructProperty::Float, offsetof(Element, HighTemperature ) }, + { "HighTemperatureTransition", StructProperty::TransitionType, offsetof(Element, HighTemperatureTransition) } + }; return properties; } diff --git a/src/simulation/elements/Element.h b/src/simulation/elements/Element.h index 85c3374ee..5533b6d86 100644 --- a/src/simulation/elements/Element.h +++ b/src/simulation/elements/Element.h @@ -60,7 +60,7 @@ public: /** Returns a list of properties, their type and offset within the structure that can be changed by higher-level processes referring to them by name such as Lua or the property tool **/ - static std::vector GetProperties(); + static std::vector const &GetProperties(); }; #endif