Skip to content

Commit

Permalink
Add sim.brush (#350)
Browse files Browse the repository at this point in the history
  • Loading branch information
LBPHacker authored and jacob1 committed Nov 7, 2016
1 parent 3a3254f commit 57f5d0f
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
71 changes: 71 additions & 0 deletions src/lua/LuaScriptInterface.cpp
Expand Up @@ -741,6 +741,7 @@ void LuaScriptInterface::initSimulationAPI()
{"ambientAirTemp", simulation_ambientAirTemp},
{"elementCount", simulation_elementCount},
{"can_move", simulation_canMove},
{"brush", simulation_brush},
{"parts", simulation_parts},
{"pmap", simulation_pmap},
{"photons", simulation_photons},
Expand Down Expand Up @@ -1903,6 +1904,76 @@ int LuaScriptInterface::simulation_parts(lua_State * l)
return 1;
}

int BrushClosure(lua_State * l)
{
// see Simulation::ToolBrush
int positionX = lua_tointeger(l, lua_upvalueindex(1));
int positionY = lua_tointeger(l, lua_upvalueindex(2));
int radiusX = lua_tointeger(l, lua_upvalueindex(3));
int radiusY = lua_tointeger(l, lua_upvalueindex(4));
int sizeX = lua_tointeger(l, lua_upvalueindex(5));
int sizeY = lua_tointeger(l, lua_upvalueindex(6));
int x = lua_tointeger(l, lua_upvalueindex(7));
int y = lua_tointeger(l, lua_upvalueindex(8));
float strength = lua_tonumber(l, lua_upvalueindex(9));
unsigned char *bitmap = (unsigned char *)lua_touserdata(l, lua_upvalueindex(10));


int yield_x, yield_y;
while (true)
{
if (!(y < sizeY)) return 0;
if (x < sizeX)
{
bool yield_coords = false;
if(bitmap[(y*sizeX)+x] && (positionX+(x-radiusX) >= 0 && positionY+(y-radiusY) >= 0 && positionX+(x-radiusX) < XRES && positionY+(y-radiusY) < YRES))
{
yield_coords = true;
yield_x = positionX+(x-radiusX);
yield_y = positionY+(y-radiusY);
}
x++;
if (yield_coords) break;
}
else
{
x = 0;
y++;
}
}

lua_pushnumber(l, x);
lua_replace(l, lua_upvalueindex(7));
lua_pushnumber(l, y);
lua_replace(l, lua_upvalueindex(8));

lua_pushnumber(l, yield_x);
lua_pushnumber(l, yield_y);
lua_pushnumber(l, strength);
return 3;
}

int LuaScriptInterface::simulation_brush(lua_State * l)
{
// see Simulation::ToolBrush
int positionX = luaL_checkint(l, 1);
int positionY = luaL_checkint(l, 2);
Brush * cBrush = luacon_model->GetBrush();
int radiusX = cBrush->GetRadius().X, radiusY = cBrush->GetRadius().Y, sizeX = cBrush->GetSize().X, sizeY = cBrush->GetSize().Y;
lua_pushnumber(l, positionX);
lua_pushnumber(l, positionY);
lua_pushnumber(l, radiusX);
lua_pushnumber(l, radiusY);
lua_pushnumber(l, sizeX);
lua_pushnumber(l, sizeY);
lua_pushnumber(l, 0);
lua_pushnumber(l, 0);
lua_pushnumber(l, luacon_model->GetToolStrength());
lua_pushlightuserdata(l, cBrush->GetBitmap());
lua_pushcclosure(l, BrushClosure, 10);
return 1;
}

int LuaScriptInterface::simulation_pmap(lua_State * l)
{
int x = luaL_checkint(l, 1);
Expand Down
1 change: 1 addition & 0 deletions src/lua/LuaScriptInterface.h
Expand Up @@ -102,6 +102,7 @@ class LuaScriptInterface: public CommandInterface
static int simulation_elementCount(lua_State * l);
static int simulation_canMove(lua_State * l);
static int simulation_parts(lua_State * l);
static int simulation_brush(lua_State * l);
static int simulation_pmap(lua_State * l);
static int simulation_photons(lua_State * l);
static int simulation_neighbours(lua_State * l);
Expand Down

0 comments on commit 57f5d0f

Please sign in to comment.