From 57f5d0f84f6870034d05dcde0bfa01573fc62f0d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tam=C3=A1s=20B=C3=A1lint=20Misius?= <lbphacker@gmail.com>
Date: Tue, 8 Nov 2016 00:00:34 +0100
Subject: [PATCH] Add sim.brush (#350)

---
 src/lua/LuaScriptInterface.cpp | 71 ++++++++++++++++++++++++++++++++++
 src/lua/LuaScriptInterface.h   |  1 +
 2 files changed, 72 insertions(+)

diff --git a/src/lua/LuaScriptInterface.cpp b/src/lua/LuaScriptInterface.cpp
index 4e7758ca4..db319cb7e 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 d9a92ee3e..e0c679b71 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);