Przeglądaj źródła

add LuaVector2Box

mikymod 11 lat temu
rodzic
commit
9f84a4d4ba

+ 1 - 0
engine/CMakeLists.txt

@@ -351,6 +351,7 @@ set (LUA_SRC
 	lua/LuaTouch.cpp
 	lua/LuaUnit.cpp
 	lua/LuaVector2.cpp
+	lua/LuaVector2Box.cpp
 	lua/LuaVector3.cpp
 	lua/LuaVector3Box.cpp
 	lua/LuaWindow.cpp

+ 16 - 0
engine/lua/LuaStack.h

@@ -509,6 +509,22 @@ public:
 		lua_setmetatable(m_L, -2);
 	}
 
+	//-----------------------------------------------------------------------------
+	void push_vector2box(const Vector2& v)
+	{
+		Vector2* vec = (Vector2*) lua_newuserdata(m_L, sizeof(Vector2));
+		luaL_getmetatable(m_L, "Vector2Box");
+		lua_setmetatable(m_L, -2);
+		*vec = v;
+	}
+
+	//-----------------------------------------------------------------------------
+	Vector2& get_vector2box(uint32_t index)
+	{
+		Vector2* v = (Vector2*) CHECKUDATA(m_L, index, "Vector2Box");
+		return *v;
+	}
+
 	//-----------------------------------------------------------------------------
 	void push_vector3box(const Vector3& v)
 	{

+ 2 - 0
engine/lua/LuaSystem.cpp

@@ -69,6 +69,7 @@ extern void load_string_setting(LuaEnvironment& env);
 extern void load_touch(LuaEnvironment& env);
 extern void load_unit(LuaEnvironment& env);
 extern void load_vector2(LuaEnvironment& env);
+extern void load_vector2box(LuaEnvironment& env);
 extern void load_vector3(LuaEnvironment& env);
 extern void load_vector3box(LuaEnvironment& env);
 extern void load_window(LuaEnvironment& env);
@@ -334,6 +335,7 @@ namespace lua_system
 		load_touch(env);
 		load_unit(env);
 		load_vector2(env);
+		load_vector2box(env);
 		load_vector3(env);
 		load_vector3box(env);
 		load_window(env);

+ 162 - 0
engine/lua/LuaVector2Box.cpp

@@ -0,0 +1,162 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "LuaEnvironment.h"
+#include "LuaStack.h"
+#include "Vector2.h"
+#include "StringUtils.h"
+
+namespace crown
+{
+
+//-----------------------------------------------------------------------------
+static int vector2box_new(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Vector2 v;
+	if (stack.num_args() == 1)
+	{
+		const Vector2 tv = stack.get_vector2(1);
+		v = tv;
+	}
+	else if (stack.num_args() == 2)
+	{
+		v.x = stack.get_float(1);
+		v.y = stack.get_float(2);
+	}
+
+	stack.push_vector2box(v);
+	return 1;
+}
+
+//-----------------------------------------------------------------------------
+static int vector2box_ctor(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.remove(1); // Remove table
+	return vector2box_new(L);
+}
+
+//-----------------------------------------------------------------------------
+static int vector2box_get_value(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Vector2& v = stack.get_vector2box(1);
+	const char* s = stack.get_string(2);
+
+	if (string::strcmp(s, "x") == 0)
+	{
+		stack.push_float(v.x);
+		return 1;
+	}
+	else if (string::strcmp(s, "y") == 0)
+	{
+		stack.push_float(v.y);
+		return 1;
+	}
+
+	// Never happens
+	return 0;
+}
+
+//-----------------------------------------------------------------------------
+static int vector2box_set_value(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Vector2& v = stack.get_vector2box(1);
+	const char* s = stack.get_string(2);
+	float value = stack.get_float(3);
+
+	if (string::strcmp(s, "x") == 0)
+	{
+		v.x = value;
+	}
+	else if (string::strcmp(s, "y") == 0)
+	{
+		v.y = value;
+	}
+
+	return 0;
+}
+
+//-----------------------------------------------------------------------------
+static int vector2box_store(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Vector2& v = stack.get_vector2box(1);
+	
+	if (stack.num_args() == 2)
+	{
+		Vector2 tv = stack.get_vector2(2);
+
+		v = tv;
+	}
+	else if (stack.num_args() == 3)
+	{
+		v.x = stack.get_float(2);
+		v.y = stack.get_float(3);
+	}
+	return 0;
+}
+
+//-----------------------------------------------------------------------------
+static int vector2box_unbox(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Vector2& v = stack.get_vector2box(1);
+
+	stack.push_vector2(v);
+	return 1;
+}
+
+//-----------------------------------------------------------------------------
+static int vector2box_tostring(lua_State* L)
+{
+	LuaStack stack(L);
+	Vector2& v = stack.get_vector2box(1);
+	stack.push_fstring("Vector2Box (%p)", &v);
+	return 1;
+}
+
+//-----------------------------------------------------------------------------
+void load_vector2box(LuaEnvironment& env)
+{
+	env.load_module_function("Vector2Box", "new",			vector2box_new);
+	env.load_module_function("Vector2Box", "store",			vector2box_store);
+	env.load_module_function("Vector2Box", "unbox",			vector2box_unbox);
+	env.load_module_function("Vector2Box", "__index",		vector2box_get_value);
+	env.load_module_function("Vector2Box", "__newindex",	vector2box_set_value);
+	env.load_module_function("Vector2Box", "__tostring",	vector2box_tostring);
+
+	env.load_module_constructor("Vector2Box",				vector2box_ctor);
+}
+
+} // namespace crown