diff --git a/src/lua/LuaScriptInterface.cpp b/src/lua/LuaScriptInterface.cpp index 4e7758ca42..db319cb7ed 100644 --- a/src/lua/LuaScriptInterface.cpp +++ b/src/lua/LuaScriptInterface.cpp @@ -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}, @@ -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); diff --git a/src/lua/LuaScriptInterface.h b/src/lua/LuaScriptInterface.h index d9a92ee3e1..e0c679b712 100644 --- a/src/lua/LuaScriptInterface.h +++ b/src/lua/LuaScriptInterface.h @@ -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);