Fix pmap not being updated when setting x / y from Lua
This commit is contained in:
parent
fcc259e9b9
commit
3519dfa83a
@ -77,68 +77,70 @@ void initLegacyProps()
|
|||||||
#ifndef FFI
|
#ifndef FFI
|
||||||
int luacon_partread(lua_State* l)
|
int luacon_partread(lua_State* l)
|
||||||
{
|
{
|
||||||
int tempinteger, i = cIndex;
|
int i = cIndex;
|
||||||
float tempfloat;
|
|
||||||
ByteString key = tpt_lua_optByteString(l, 2, "");
|
|
||||||
CommandInterface::FormatType format;
|
|
||||||
int offset = luacon_ci->GetPropertyOffset(key, format);
|
|
||||||
|
|
||||||
if (i < 0 || i >= NPART)
|
if (i < 0 || i >= NPART)
|
||||||
return luaL_error(l, "Out of range");
|
return luaL_error(l, "Out of range");
|
||||||
if (offset == -1)
|
if (!luacon_sim->parts[i].type)
|
||||||
{
|
return luaL_error(l, "Dead particle");
|
||||||
if (byteStringEqualsLiteral(key, "id"))
|
|
||||||
{
|
|
||||||
lua_pushnumber(l, i);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return luaL_error(l, "Invalid property");
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(format)
|
auto &properties = Particle::GetProperties();
|
||||||
|
auto prop = properties.end();
|
||||||
|
|
||||||
|
ByteString fieldName = tpt_lua_toByteString(l, 2);
|
||||||
|
if (fieldName == "id")
|
||||||
{
|
{
|
||||||
case CommandInterface::FormatInt:
|
lua_pushnumber(l, i);
|
||||||
case CommandInterface::FormatElement:
|
return 1;
|
||||||
tempinteger = *((int*)(((unsigned char*)&luacon_sim->parts[i])+offset));
|
|
||||||
lua_pushnumber(l, tempinteger);
|
|
||||||
break;
|
|
||||||
case CommandInterface::FormatFloat:
|
|
||||||
tempfloat = *((float*)(((unsigned char*)&luacon_sim->parts[i])+offset));
|
|
||||||
lua_pushnumber(l, tempfloat);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
for (auto &alias : Particle::GetPropertyAliases())
|
||||||
|
{
|
||||||
|
if (fieldName == alias.from)
|
||||||
|
{
|
||||||
|
fieldName = alias.to;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prop = std::find_if(properties.begin(), properties.end(), [&fieldName](StructProperty const &p) {
|
||||||
|
return p.Name == fieldName;
|
||||||
|
});
|
||||||
|
if (prop == properties.end())
|
||||||
|
return luaL_error(l, "Invalid property");
|
||||||
|
|
||||||
|
//Calculate memory address of property
|
||||||
|
intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->parts[i]) + prop->Offset);
|
||||||
|
|
||||||
|
LuaScriptInterface::LuaGetProperty(l, *prop, propertyAddress);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int luacon_partwrite(lua_State* l)
|
int luacon_partwrite(lua_State* l)
|
||||||
{
|
{
|
||||||
int i = cIndex;
|
int i = cIndex;
|
||||||
ByteString key = tpt_lua_optByteString(l, 2, "");
|
|
||||||
CommandInterface::FormatType format;
|
|
||||||
int offset = luacon_ci->GetPropertyOffset(key, format);
|
|
||||||
|
|
||||||
if (i < 0 || i >= NPART)
|
if (i < 0 || i >= NPART)
|
||||||
return luaL_error(l, "Out of range");
|
return luaL_error(l, "Out of range");
|
||||||
if (!luacon_sim->parts[i].type)
|
if (!luacon_sim->parts[i].type)
|
||||||
return luaL_error(l, "Dead particle");
|
return luaL_error(l, "Dead particle");
|
||||||
if (offset == -1)
|
|
||||||
return luaL_error(l, "Invalid property");
|
|
||||||
|
|
||||||
switch(format)
|
auto &properties = Particle::GetProperties();
|
||||||
|
auto prop = properties.end();
|
||||||
|
|
||||||
|
ByteString fieldName = tpt_lua_toByteString(l, 2);
|
||||||
|
for (auto &alias : Particle::GetPropertyAliases())
|
||||||
{
|
{
|
||||||
case CommandInterface::FormatInt:
|
if (fieldName == alias.from)
|
||||||
*((int*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = luaL_optinteger(l, 3, 0);
|
{
|
||||||
break;
|
fieldName = alias.to;
|
||||||
case CommandInterface::FormatFloat:
|
}
|
||||||
*((float*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = luaL_optnumber(l, 3, 0);
|
|
||||||
break;
|
|
||||||
case CommandInterface::FormatElement:
|
|
||||||
luacon_sim->part_change_type(i, int(luacon_sim->parts[i].x + 0.5f), int(luacon_sim->parts[i].y + 0.5f), luaL_optinteger(l, 3, 0));
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
prop = std::find_if(properties.begin(), properties.end(), [&fieldName](StructProperty const &p) {
|
||||||
|
return p.Name == fieldName;
|
||||||
|
});
|
||||||
|
if (prop == properties.end())
|
||||||
|
return luaL_error(l, "Invalid property");
|
||||||
|
|
||||||
|
//Calculate memory address of property
|
||||||
|
intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->parts[i]) + prop->Offset);
|
||||||
|
|
||||||
|
LuaScriptInterface::LuaSetParticleProperty(l, i, *prop, propertyAddress, 3);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,15 +256,8 @@ int luacon_elementwrite(lua_State* l)
|
|||||||
return luaL_error(l, "Invalid index");
|
return luaL_error(l, "Invalid index");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prop.Name == "type") // i.e. it's .type
|
intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[i]) + prop.Offset);
|
||||||
{
|
LuaScriptInterface::LuaSetProperty(l, prop, propertyAddress, 3);
|
||||||
luacon_sim->part_change_type(i, int(luacon_sim->parts[i].x+0.5f), int(luacon_sim->parts[i].y+0.5f), luaL_checkinteger(l, 3));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->elements[i]) + prop.Offset);
|
|
||||||
LuaScriptInterface::LuaSetProperty(l, prop, propertyAddress, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
luacon_model->BuildMenus();
|
luacon_model->BuildMenus();
|
||||||
luacon_sim->init_can_move();
|
luacon_sim->init_can_move();
|
||||||
@ -575,6 +570,8 @@ int luatpt_set_property(lua_State* l)
|
|||||||
int offset = luacon_ci->GetPropertyOffset(prop, format);
|
int offset = luacon_ci->GetPropertyOffset(prop, format);
|
||||||
if (offset == -1)
|
if (offset == -1)
|
||||||
return luaL_error(l, "Invalid property '%s'", prop.c_str());
|
return luaL_error(l, "Invalid property '%s'", prop.c_str());
|
||||||
|
bool isX = byteStringEqualsLiteral(prop, "x");
|
||||||
|
bool isY = byteStringEqualsLiteral(prop, "y");
|
||||||
|
|
||||||
if (acount > 2)
|
if (acount > 2)
|
||||||
{
|
{
|
||||||
@ -639,6 +636,14 @@ int luatpt_set_property(lua_State* l)
|
|||||||
{
|
{
|
||||||
if (format == CommandInterface::FormatElement)
|
if (format == CommandInterface::FormatElement)
|
||||||
luacon_sim->part_change_type(i, nx, ny, t);
|
luacon_sim->part_change_type(i, nx, ny, t);
|
||||||
|
else if (isX || isY)
|
||||||
|
{
|
||||||
|
float x = luacon_sim->parts[i].x;
|
||||||
|
float y = luacon_sim->parts[i].y;
|
||||||
|
float nx = isX ? f : x;
|
||||||
|
float ny = isY ? f : y;
|
||||||
|
luacon_sim->move(i, (int)(x + 0.5f), (int)(y + 0.5f), nx, ny);
|
||||||
|
}
|
||||||
else if(format == CommandInterface::FormatFloat)
|
else if(format == CommandInterface::FormatFloat)
|
||||||
*((float*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = f;
|
*((float*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = f;
|
||||||
else
|
else
|
||||||
@ -672,6 +677,14 @@ int luatpt_set_property(lua_State* l)
|
|||||||
|
|
||||||
if (format == CommandInterface::FormatElement)
|
if (format == CommandInterface::FormatElement)
|
||||||
luacon_sim->part_change_type(i, int(luacon_sim->parts[i].x + 0.5f), int(luacon_sim->parts[i].y + 0.5f), t);
|
luacon_sim->part_change_type(i, int(luacon_sim->parts[i].x + 0.5f), int(luacon_sim->parts[i].y + 0.5f), t);
|
||||||
|
else if (isX || isY)
|
||||||
|
{
|
||||||
|
float x = luacon_sim->parts[i].x;
|
||||||
|
float y = luacon_sim->parts[i].y;
|
||||||
|
float nx = isX ? f : x;
|
||||||
|
float ny = isY ? f : y;
|
||||||
|
luacon_sim->move(i, (int)(x + 0.5f), (int)(y + 0.5f), nx, ny);
|
||||||
|
}
|
||||||
else if (format == CommandInterface::FormatFloat)
|
else if (format == CommandInterface::FormatFloat)
|
||||||
*((float*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = f;
|
*((float*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = f;
|
||||||
else
|
else
|
||||||
|
@ -1161,7 +1161,7 @@ int LuaScriptInterface::simulation_partPosition(lua_State * l)
|
|||||||
{
|
{
|
||||||
int particleID = lua_tointeger(l, 1);
|
int particleID = lua_tointeger(l, 1);
|
||||||
int argCount = lua_gettop(l);
|
int argCount = lua_gettop(l);
|
||||||
if(particleID < 0 || particleID >= NPART || !luacon_sim->parts[particleID].type)
|
if (particleID < 0 || particleID >= NPART || !luacon_sim->parts[particleID].type)
|
||||||
{
|
{
|
||||||
if(argCount == 1)
|
if(argCount == 1)
|
||||||
{
|
{
|
||||||
@ -1173,10 +1173,12 @@ int LuaScriptInterface::simulation_partPosition(lua_State * l)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(argCount == 3)
|
if (argCount == 3)
|
||||||
{
|
{
|
||||||
luacon_sim->parts[particleID].x = lua_tonumber(l, 2);
|
float x = luacon_sim->parts[particleID].x;
|
||||||
luacon_sim->parts[particleID].y = lua_tonumber(l, 3);
|
float y = luacon_sim->parts[particleID].y;
|
||||||
|
luacon_sim->move(particleID, (int)(x + 0.5f), (int)(y + 0.5f), lua_tonumber(l, 2), lua_tonumber(l, 3));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1193,13 +1195,15 @@ int LuaScriptInterface::simulation_partProperty(lua_State * l)
|
|||||||
int particleID = luaL_checkinteger(l, 1);
|
int particleID = luaL_checkinteger(l, 1);
|
||||||
StructProperty property;
|
StructProperty property;
|
||||||
|
|
||||||
if(particleID < 0 || particleID >= NPART || !luacon_sim->parts[particleID].type)
|
if (particleID < 0 || particleID >= NPART || !luacon_sim->parts[particleID].type)
|
||||||
{
|
{
|
||||||
if(argCount == 3)
|
if (argCount == 3)
|
||||||
{
|
{
|
||||||
lua_pushnil(l);
|
lua_pushnil(l);
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1239,16 +1243,9 @@ int LuaScriptInterface::simulation_partProperty(lua_State * l)
|
|||||||
//Calculate memory address of property
|
//Calculate memory address of property
|
||||||
intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->parts[particleID]) + prop->Offset);
|
intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->parts[particleID]) + prop->Offset);
|
||||||
|
|
||||||
if(argCount == 3)
|
if (argCount == 3)
|
||||||
{
|
{
|
||||||
if (prop == properties.begin() + 0) // i.e. it's .type
|
LuaSetParticleProperty(l, particleID, *prop, propertyAddress, 3);
|
||||||
{
|
|
||||||
luacon_sim->part_change_type(particleID, int(luacon_sim->parts[particleID].x+0.5f), int(luacon_sim->parts[particleID].y+0.5f), luaL_checkinteger(l, 3));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LuaSetProperty(l, *prop, propertyAddress, 3);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -3002,6 +2999,28 @@ void LuaScriptInterface::LuaSetProperty(lua_State* l, StructProperty property, i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LuaScriptInterface::LuaSetParticleProperty(lua_State* l, int particleID, StructProperty property, intptr_t propertyAddress, int stackPos)
|
||||||
|
{
|
||||||
|
if (property.Name == "type")
|
||||||
|
{
|
||||||
|
luacon_sim->part_change_type(particleID, int(luacon_sim->parts[particleID].x+0.5f), int(luacon_sim->parts[particleID].y+0.5f), luaL_checkinteger(l, 3));
|
||||||
|
}
|
||||||
|
else if (property.Name == "x" || property.Name == "y")
|
||||||
|
{
|
||||||
|
float val = luaL_checknumber(l, 3);
|
||||||
|
float x = luacon_sim->parts[particleID].x;
|
||||||
|
float y = luacon_sim->parts[particleID].y;
|
||||||
|
float nx = property.Name == "x" ? val : x;
|
||||||
|
float ny = property.Name == "y" ? val : y;
|
||||||
|
luacon_sim->move(particleID, (int)(x + 0.5f), (int)(y + 0.5f), nx, ny);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LuaSetProperty(l, property, propertyAddress, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int LuaScriptInterface::elements_loadDefault(lua_State * l)
|
int LuaScriptInterface::elements_loadDefault(lua_State * l)
|
||||||
{
|
{
|
||||||
int args = lua_gettop(l);
|
int args = lua_gettop(l);
|
||||||
|
@ -215,6 +215,7 @@ public:
|
|||||||
|
|
||||||
static void LuaGetProperty(lua_State* l, StructProperty property, intptr_t propertyAddress);
|
static void LuaGetProperty(lua_State* l, StructProperty property, intptr_t propertyAddress);
|
||||||
static void LuaSetProperty(lua_State* l, StructProperty property, intptr_t propertyAddress, int stackPos);
|
static void LuaSetProperty(lua_State* l, StructProperty property, intptr_t propertyAddress, int stackPos);
|
||||||
|
static void LuaSetParticleProperty(lua_State* l, int particleID, StructProperty property, intptr_t propertyAddress, int stackPos);
|
||||||
|
|
||||||
ui::Window * Window;
|
ui::Window * Window;
|
||||||
lua_State *l;
|
lua_State *l;
|
||||||
|
@ -2904,30 +2904,39 @@ int Simulation::do_move(int i, int x, int y, float nxf, float nyf)
|
|||||||
result = try_move(i, x, y, nx, ny);
|
result = try_move(i, x, y, nx, ny);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
int t = parts[i].type;
|
if (!move(i, x, y, nxf, nyf))
|
||||||
parts[i].x = nxf;
|
return -1;
|
||||||
parts[i].y = nyf;
|
|
||||||
if (ny!=y || nx!=x)
|
|
||||||
{
|
|
||||||
if (ID(pmap[y][x]) == i)
|
|
||||||
pmap[y][x] = 0;
|
|
||||||
if (ID(photons[y][x]) == i)
|
|
||||||
photons[y][x] = 0;
|
|
||||||
// kill_part if particle is out of bounds
|
|
||||||
if (nx < CELL || nx >= XRES - CELL || ny < CELL || ny >= YRES - CELL)
|
|
||||||
{
|
|
||||||
kill_part(i);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (elements[t].Properties & TYPE_ENERGY)
|
|
||||||
photons[ny][nx] = PMAP(i, t);
|
|
||||||
else if (t)
|
|
||||||
pmap[ny][nx] = PMAP(i, t);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Simulation::move(int i, int x, int y, float nxf, float nyf)
|
||||||
|
{
|
||||||
|
int nx = (int)(nxf+0.5f), ny = (int)(nyf+0.5f);
|
||||||
|
int t = parts[i].type;
|
||||||
|
parts[i].x = nxf;
|
||||||
|
parts[i].y = nyf;
|
||||||
|
if (ny != y || nx != x)
|
||||||
|
{
|
||||||
|
if (ID(pmap[y][x]) == i)
|
||||||
|
pmap[y][x] = 0;
|
||||||
|
if (ID(photons[y][x]) == i)
|
||||||
|
photons[y][x] = 0;
|
||||||
|
// kill_part if particle is out of bounds
|
||||||
|
if (nx < CELL || nx >= XRES - CELL || ny < CELL || ny >= YRES - CELL)
|
||||||
|
{
|
||||||
|
kill_part(i);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (elements[t].Properties & TYPE_ENERGY)
|
||||||
|
photons[ny][nx] = PMAP(i, t);
|
||||||
|
else if (t)
|
||||||
|
pmap[ny][nx] = PMAP(i, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Simulation::photoelectric_effect(int nx, int ny)//create sparks from PHOT when hitting PSCN and NSCN
|
void Simulation::photoelectric_effect(int nx, int ny)//create sparks from PHOT when hitting PSCN and NSCN
|
||||||
{
|
{
|
||||||
unsigned r = pmap[ny][nx];
|
unsigned r = pmap[ny][nx];
|
||||||
|
@ -134,6 +134,7 @@ public:
|
|||||||
void photoelectric_effect(int nx, int ny);
|
void photoelectric_effect(int nx, int ny);
|
||||||
unsigned direction_to_map(float dx, float dy, int t);
|
unsigned direction_to_map(float dx, float dy, int t);
|
||||||
int do_move(int i, int x, int y, float nxf, float nyf);
|
int do_move(int i, int x, int y, float nxf, float nyf);
|
||||||
|
bool move(int i, int x, int y, float nxf, float nyf);
|
||||||
int try_move(int i, int x, int y, int nx, int ny);
|
int try_move(int i, int x, int y, int nx, int ny);
|
||||||
int eval_move(int pt, int nx, int ny, unsigned *rr);
|
int eval_move(int pt, int nx, int ny, unsigned *rr);
|
||||||
void init_can_move();
|
void init_can_move();
|
||||||
|
Reference in New Issue
Block a user