sim.partProperty API method, sim.partPosition API method
This commit is contained in:
parent
e3453aedd1
commit
52d0bb918d
@ -423,6 +423,9 @@ int LuaScriptInterface::interface_closeWindow(lua_State * l)
|
|||||||
|
|
||||||
//// Begin Simulation API
|
//// Begin Simulation API
|
||||||
|
|
||||||
|
StructProperty * LuaScriptInterface::particleProperties;
|
||||||
|
int LuaScriptInterface::particlePropertiesCount;
|
||||||
|
|
||||||
void LuaScriptInterface::initSimulationAPI()
|
void LuaScriptInterface::initSimulationAPI()
|
||||||
{
|
{
|
||||||
//Methods
|
//Methods
|
||||||
@ -430,6 +433,8 @@ void LuaScriptInterface::initSimulationAPI()
|
|||||||
{"partNeighbours", simulation_partNeighbours},
|
{"partNeighbours", simulation_partNeighbours},
|
||||||
{"partChangeType", simulation_partChangeType},
|
{"partChangeType", simulation_partChangeType},
|
||||||
{"partCreate", simulation_partCreate},
|
{"partCreate", simulation_partCreate},
|
||||||
|
{"partProperty", simulation_partProperty},
|
||||||
|
{"partPosition", simulation_partPosition},
|
||||||
{"partKill", simulation_partKill},
|
{"partKill", simulation_partKill},
|
||||||
{"pressure", simulation_pressure},
|
{"pressure", simulation_pressure},
|
||||||
{"ambientHeat", simulation_ambientHeat},
|
{"ambientHeat", simulation_ambientHeat},
|
||||||
@ -454,6 +459,18 @@ void LuaScriptInterface::initSimulationAPI()
|
|||||||
lua_pushinteger(l, MAX_TEMP); lua_setfield(l, simulationAPI, "MAX_TEMP");
|
lua_pushinteger(l, MAX_TEMP); lua_setfield(l, simulationAPI, "MAX_TEMP");
|
||||||
lua_pushinteger(l, MIN_TEMP); lua_setfield(l, simulationAPI, "MIN_TEMP");
|
lua_pushinteger(l, MIN_TEMP); lua_setfield(l, simulationAPI, "MIN_TEMP");
|
||||||
|
|
||||||
|
//Declare FIELD_BLAH constants
|
||||||
|
std::vector<StructProperty> particlePropertiesV = Particle::GetProperties();
|
||||||
|
particlePropertiesCount = 0;
|
||||||
|
particleProperties = new StructProperty[particlePropertiesV.size()];
|
||||||
|
for(std::vector<StructProperty>::iterator iter = particlePropertiesV.begin(), end = particlePropertiesV.end(); iter != end; ++iter)
|
||||||
|
{
|
||||||
|
std::string propertyName = (*iter).Name;
|
||||||
|
std::transform(propertyName.begin(), propertyName.end(), propertyName.begin(), ::toupper);
|
||||||
|
lua_pushinteger(l, particlePropertiesCount);
|
||||||
|
lua_setfield(l, simulationAPI, ("FIELD_"+propertyName).c_str());
|
||||||
|
particleProperties[particlePropertiesCount++] = *iter;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LuaScriptInterface::set_map(int x, int y, int width, int height, float value, int map) // A function so this won't need to be repeated many times later
|
void LuaScriptInterface::set_map(int x, int y, int width, int height, float value, int map) // A function so this won't need to be repeated many times later
|
||||||
@ -541,6 +558,148 @@ int LuaScriptInterface::simulation_partCreate(lua_State * l)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::simulation_partPosition(lua_State * l)
|
||||||
|
{
|
||||||
|
int particleID = lua_tointeger(l, 1);
|
||||||
|
int argCount = lua_gettop(l);
|
||||||
|
if(particleID < 0 || particleID >= NPART || !luacon_sim->parts[particleID].type)
|
||||||
|
{
|
||||||
|
if(argCount == 1)
|
||||||
|
{
|
||||||
|
lua_pushnil(l);
|
||||||
|
lua_pushnil(l);
|
||||||
|
return 2;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(argCount == 3)
|
||||||
|
{
|
||||||
|
luacon_sim->parts[particleID].x = lua_tonumber(l, 2);
|
||||||
|
luacon_sim->parts[particleID].y = lua_tonumber(l, 3);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lua_pushnumber(l, luacon_sim->parts[particleID].x);
|
||||||
|
lua_pushnumber(l, luacon_sim->parts[particleID].y);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int LuaScriptInterface::simulation_partProperty(lua_State * l)
|
||||||
|
{
|
||||||
|
int argCount = lua_gettop(l);
|
||||||
|
int particleID = lua_tointeger(l, 1);
|
||||||
|
StructProperty * property = NULL;
|
||||||
|
|
||||||
|
if(particleID < 0 || particleID >= NPART || !luacon_sim->parts[particleID].type)
|
||||||
|
{
|
||||||
|
if(argCount == 3)
|
||||||
|
{
|
||||||
|
lua_pushnil(l);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get field
|
||||||
|
if(lua_type(l, 2) == LUA_TNUMBER)
|
||||||
|
{
|
||||||
|
int fieldID = lua_tointeger(l, 2);
|
||||||
|
if(fieldID < 0 || fieldID >= particlePropertiesCount)
|
||||||
|
return luaL_error(l, "Invalid field ID (%d)", fieldID);
|
||||||
|
property = &particleProperties[fieldID];
|
||||||
|
} else if(lua_type(l, 2) == LUA_TSTRING) {
|
||||||
|
std::string fieldName = lua_tostring(l, 2);
|
||||||
|
for(int i = particlePropertiesCount-1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if(particleProperties[i].Name == fieldName)
|
||||||
|
property = &particleProperties[i];
|
||||||
|
}
|
||||||
|
if(!property)
|
||||||
|
return luaL_error(l, "Unknown field (%s)", fieldName.c_str());
|
||||||
|
} else {
|
||||||
|
return luaL_error(l, "Field ID must be an name (string) or identifier (integer)");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Calculate memory address of property
|
||||||
|
intptr_t propertyAddress = (intptr_t)(((unsigned char*)&luacon_sim->parts[particleID])+property->Offset);
|
||||||
|
|
||||||
|
if(argCount == 3)
|
||||||
|
{
|
||||||
|
//Set
|
||||||
|
switch(property->Type)
|
||||||
|
{
|
||||||
|
case StructProperty::ParticleType:
|
||||||
|
case StructProperty::Integer:
|
||||||
|
*((int*)propertyAddress) = lua_tointeger(l, 3);
|
||||||
|
break;
|
||||||
|
case StructProperty::UInteger:
|
||||||
|
*((unsigned int*)propertyAddress) = lua_tointeger(l, 3);
|
||||||
|
break;
|
||||||
|
case StructProperty::Float:
|
||||||
|
*((float*)propertyAddress) = lua_tonumber(l, 3);
|
||||||
|
break;
|
||||||
|
case StructProperty::Char:
|
||||||
|
*((char*)propertyAddress) = lua_tointeger(l, 3);
|
||||||
|
break;
|
||||||
|
case StructProperty::UChar:
|
||||||
|
*((unsigned char*)propertyAddress) = lua_tointeger(l, 3);
|
||||||
|
break;
|
||||||
|
case StructProperty::String:
|
||||||
|
*((char**)propertyAddress) = strdup(lua_tostring(l, 3));
|
||||||
|
break;
|
||||||
|
case StructProperty::Colour:
|
||||||
|
#if PIXELSIZE == 4
|
||||||
|
*((unsigned int*)propertyAddress) = lua_tointeger(l, 3);
|
||||||
|
#else
|
||||||
|
*((unsigned short*)propertyAddress) = lua_tointeger(l, 3);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Get
|
||||||
|
switch(property->Type)
|
||||||
|
{
|
||||||
|
case StructProperty::ParticleType:
|
||||||
|
case StructProperty::Integer:
|
||||||
|
lua_pushinteger(l, *((int*)propertyAddress));
|
||||||
|
break;
|
||||||
|
case StructProperty::UInteger:
|
||||||
|
lua_pushinteger(l, *((unsigned int*)propertyAddress));
|
||||||
|
break;
|
||||||
|
case StructProperty::Float:
|
||||||
|
lua_pushnumber(l, *((float*)propertyAddress));
|
||||||
|
break;
|
||||||
|
case StructProperty::Char:
|
||||||
|
lua_pushinteger(l, *((char*)propertyAddress));
|
||||||
|
break;
|
||||||
|
case StructProperty::UChar:
|
||||||
|
lua_pushinteger(l, *((unsigned char*)propertyAddress));
|
||||||
|
break;
|
||||||
|
case StructProperty::String:
|
||||||
|
lua_pushstring(l, *((char**)propertyAddress));
|
||||||
|
break;
|
||||||
|
case StructProperty::Colour:
|
||||||
|
#if PIXELSIZE == 4
|
||||||
|
lua_pushinteger(l, *((unsigned int*)propertyAddress));
|
||||||
|
#else
|
||||||
|
lua_pushinteger(l, *((unsigned short*)propertyAddress));
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
lua_pushnil(l);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int LuaScriptInterface::simulation_partKill(lua_State * l)
|
int LuaScriptInterface::simulation_partKill(lua_State * l)
|
||||||
{
|
{
|
||||||
if(lua_gettop(l)==2)
|
if(lua_gettop(l)==2)
|
||||||
|
@ -54,11 +54,16 @@ class LuaScriptInterface: public CommandInterface
|
|||||||
TPTScriptInterface * legacy;
|
TPTScriptInterface * legacy;
|
||||||
|
|
||||||
//Simulation
|
//Simulation
|
||||||
|
static StructProperty * particleProperties;
|
||||||
|
static int particlePropertiesCount;
|
||||||
|
//
|
||||||
void initSimulationAPI();
|
void initSimulationAPI();
|
||||||
static void set_map(int x, int y, int width, int height, float value, int mapType);
|
static void set_map(int x, int y, int width, int height, float value, int mapType);
|
||||||
static int simulation_partNeighbours(lua_State * l);
|
static int simulation_partNeighbours(lua_State * l);
|
||||||
static int simulation_partChangeType(lua_State * l);
|
static int simulation_partChangeType(lua_State * l);
|
||||||
static int simulation_partCreate(lua_State * l);
|
static int simulation_partCreate(lua_State * l);
|
||||||
|
static int simulation_partProperty(lua_State * l);
|
||||||
|
static int simulation_partPosition(lua_State * l);
|
||||||
static int simulation_partKill(lua_State * l);
|
static int simulation_partKill(lua_State * l);
|
||||||
static int simulation_pressure(lua_State * l);
|
static int simulation_pressure(lua_State * l);
|
||||||
static int simulation_velocityX(lua_State * l);
|
static int simulation_velocityX(lua_State * l);
|
||||||
|
Loading…
Reference in New Issue
Block a user