Daniele Bartolini há 10 anos atrás
pai
commit
6460aadcfa

+ 11 - 4
src/core/containers/container_types.h

@@ -162,8 +162,9 @@ struct Map
 	ALLOCATOR_AWARE;
 };
 
-/// Sorted map from key to POD items.
-/// Items are not automatically sorted, you have to call sort_map::sort().
+/// Vector of sorted items.
+/// Items are not automatically sorted, you have to call sort_map::sort()
+/// whenever you are done inserting items.
 /// @ingroup Containers.
 template <typename TKey, typename TValue, class Compare = less<TKey> >
 struct SortMap
@@ -172,8 +173,14 @@ struct SortMap
 
 	struct Entry
 	{
-		TKey key;
-		TValue value;
+		Entry(Allocator& a)
+			: pair(a)
+		{
+		}
+
+		PAIR(TKey, TValue) pair;
+
+		ALLOCATOR_AWARE;
 	};
 
 	Vector<Entry> _data;

+ 8 - 8
src/core/containers/sort_map.h

@@ -59,13 +59,13 @@ namespace sort_map_internal
 		bool operator()(const typename SortMap<TKey, TValue, Compare>::Entry& a,
 			const typename SortMap<TKey, TValue, Compare>::Entry& b) const
 		{
-			return comp(a.key, b.key);
+			return comp(a.pair.first, b.pair.first);
 		}
 
 		bool operator()(const typename SortMap<TKey, TValue, Compare>::Entry& a,
 			const TKey& key) const
 		{
-			return comp(a.key, key);
+			return comp(a.pair.first, key);
 		}
 
 		Compare comp;
@@ -83,7 +83,7 @@ namespace sort_map_internal
 			std::lower_bound(vector::begin(m._data), vector::end(m._data), key,
 			sort_map_internal::CompareEntry<TKey, TValue, Compare>());
 
-		if (first != vector::end(m._data) && !(key < first->key))
+		if (first != vector::end(m._data) && !(key < first->pair.first))
 		 	result.item_i = first - vector::begin(m._data);
 
 		return result;
@@ -106,7 +106,7 @@ namespace sort_map
 		if (result.item_i == sort_map_internal::END_OF_LIST)
 			return deffault;
 
-		return m._data[result.item_i].value;
+		return m._data[result.item_i].pair.second;
 	}
 
 	template <typename TKey, typename TValue, typename Compare>
@@ -132,14 +132,14 @@ namespace sort_map
 
 		if (result.item_i == sort_map_internal::END_OF_LIST)
 		{
-			typename SortMap<TKey, TValue, Compare>::Entry e;
-			e.key = key;
-			e.value = val;
+			typename SortMap<TKey, TValue, Compare>::Entry e(*m._data._allocator);
+			e.pair.first = key;
+			e.pair.second = val;
 			vector::push_back(m._data, e);
 		}
 		else
 		{
-			m._data[result.item_i].value = val;
+			m._data[result.item_i].pair.second = val;
 		}
 #if CROWN_DEBUG
 		m._is_sorted = false;

+ 0 - 16
src/lua/lua_assert.h

@@ -1,16 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#pragma once
-
-#include "config.h"
-#include "lua.hpp"
-
-#if CROWN_DEBUG
-	#define LUA_ASSERT(condition, stack, msg, ...) do { if (!(condition)) {\
-		stack.push_fstring("\nLua assertion failed: %s\n\t" msg "\n", #condition, ##__VA_ARGS__); lua_error(stack.state()); }} while (0);
-#else
-	#define LUA_ASSERT(...) ((void)0)
-#endif // CROWN_DEBUG

+ 0 - 36
src/lua/lua_color4.cpp

@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "quaternion.h"
-#include "lua_stack.h"
-#include "lua_environment.h"
-
-namespace crown
-{
-
-static int color4_new(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(quaternion(stack.get_float(1),
-		stack.get_float(2),
-		stack.get_float(3),
-		stack.get_float(4)));
-	return 1;
-}
-
-static int color4_ctor(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.remove(1); // Remove table
-	return color4_new(L);
-}
-
-void load_color4(LuaEnvironment& env)
-{
-	env.load_module_function("Color4", "new", color4_new);
-	env.load_module_constructor("Color4",     color4_ctor);
-}
-
-} // namespace crown

+ 12 - 21
src/lua/lua_environment.cpp

@@ -10,7 +10,6 @@
 #include "lua_stack.h"
 #include "lua_resource.h"
 #include "device.h"
-#include "lua_assert.h"
 #include "resource_manager.h"
 #include "log.h"
 #include <stdarg.h>
@@ -21,24 +20,20 @@ namespace crown
 // Lua modules
 extern void load_debug_line(LuaEnvironment& env);
 extern void load_device(LuaEnvironment& env);
-extern void load_float_setting(LuaEnvironment& env);
 extern void load_gui(LuaEnvironment& env);
-extern void load_int_setting(LuaEnvironment& env);
-extern void load_keyboard(LuaEnvironment& env);
 extern void load_math(LuaEnvironment& env);
-extern void load_matrix4x4(LuaEnvironment& env);
-extern void load_mouse(LuaEnvironment& env);
 extern void load_physics_world(LuaEnvironment& env);
-extern void load_quaternion(LuaEnvironment& env);
 extern void load_resource_package(LuaEnvironment& env);
 extern void load_sound_world(LuaEnvironment& env);
-extern void load_string_setting(LuaEnvironment& env);
-extern void load_touch(LuaEnvironment& env);
-extern void load_vector3(LuaEnvironment& env);
+extern void load_raycast(LuaEnvironment& env);
+extern void load_resource_package(LuaEnvironment& env);
+extern void load_sound_world(LuaEnvironment& env);
+extern void load_sprite(LuaEnvironment& env);
+extern void load_settings(LuaEnvironment& env);
 extern void load_window(LuaEnvironment& env);
 extern void load_world(LuaEnvironment& env);
-extern void load_color4(LuaEnvironment& env);
 extern void load_material(LuaEnvironment& env);
+extern void load_input(LuaEnvironment& env);
 
 // When an error occurs, logs the error message and pauses the engine.
 static int error_handler(lua_State* L)
@@ -182,24 +177,20 @@ void LuaEnvironment::load_libs()
 	// Register crown libraries
 	load_debug_line(*this);
 	load_device(*this);
-	load_float_setting(*this);
 	load_gui(*this);
-	load_int_setting(*this);
-	load_keyboard(*this);
 	load_math(*this);
-	load_matrix4x4(*this);
-	load_mouse(*this);
 	load_physics_world(*this);
-	load_quaternion(*this);
 	load_resource_package(*this);
 	load_sound_world(*this);
-	load_string_setting(*this);
-	load_touch(*this);
-	load_vector3(*this);
+	load_raycast(*this);
+	load_resource_package(*this);
+	load_sound_world(*this);
+	load_sprite(*this);
+	load_settings(*this);
 	load_window(*this);
 	load_world(*this);
-	load_color4(*this);
 	load_material(*this);
+	load_input(*this);
 
 	// Register custom loader
 	lua_getfield(L, LUA_GLOBALSINDEX, "package");

+ 0 - 119
src/lua/lua_float_setting.cpp

@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "float_setting.h"
-#include "lua_stack.h"
-#include "lua_environment.h"
-
-namespace crown
-{
-
-static int float_setting_value(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-
-	FloatSetting* setting = FloatSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		stack.push_float(setting->value());
-	}
-	else
-	{
-		stack.push_float(0.0f);
-	}
-
-	return 1;
-}
-
-static int float_setting_synopsis(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-
-	FloatSetting* setting = FloatSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		stack.push_string(setting->synopsis());
-	}
-	else
-	{
-		stack.push_string("");
-	}
-
-	return 1;
-}
-
-static int float_setting_min(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-
-	FloatSetting* setting = FloatSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		stack.push_float(setting->min());
-	}
-	else
-	{
-		stack.push_float(0);
-	}
-
-	return 1;
-}
-
-static int float_setting_max(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-
-	FloatSetting* setting = FloatSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		stack.push_float(setting->max());
-	}
-	else
-	{
-		stack.push_float(0);
-	}
-
-	return 1;
-}
-
-static int float_setting_update(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-	const float setting_value = stack.get_float(2);
-
-	FloatSetting* setting = FloatSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		(*setting) = setting_value;
-	}
-
-	return 0;
-}
-
-void load_float_setting(LuaEnvironment& env)
-{
-	env.load_module_function("FloatSetting", "value",    float_setting_value);
-	env.load_module_function("FloatSetting", "synopsis", float_setting_synopsis);
-	env.load_module_function("FloatSetting", "min",      float_setting_min);
-	env.load_module_function("FloatSetting", "max",      float_setting_max);
-	env.load_module_function("FloatSetting", "update",   float_setting_update);
-}
-
-} // namespace crown

+ 0 - 119
src/lua/lua_int_setting.cpp

@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "int_setting.h"
-#include "lua_stack.h"
-#include "lua_environment.h"
-
-namespace crown
-{
-
-static int int_setting_query_value(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-
-	IntSetting* setting = IntSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		stack.push_int32(setting->value());
-	}
-	else
-	{
-		stack.push_int32(0);
-	}
-
-	return 1;
-}
-
-static int int_setting_query_synopsis(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-
-	IntSetting* setting = IntSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		stack.push_string(setting->synopsis());
-	}
-	else
-	{
-		stack.push_string("");
-	}
-
-	return 1;
-}
-
-static int int_setting_query_min(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-
-	IntSetting* setting = IntSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		stack.push_int32(setting->min());
-	}
-	else
-	{
-		stack.push_int32(0);
-	}
-
-	return 1;
-}
-
-static int int_setting_query_max(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-
-	IntSetting* setting = IntSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		stack.push_int32(setting->max());
-	}
-	else
-	{
-		stack.push_int32(0);
-	}
-
-	return 1;
-}
-
-static int int_setting_update(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-	const int32_t setting_value = stack.get_int(2);
-
-	IntSetting* setting = IntSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		(*setting) = setting_value;
-	}
-
-	return 0;
-}
-
-void load_int_setting(LuaEnvironment& env)
-{
-	env.load_module_function("IntSetting", "value",    int_setting_query_value);
-	env.load_module_function("IntSetting", "synopsis", int_setting_query_synopsis);
-	env.load_module_function("IntSetting", "min",      int_setting_query_min);
-	env.load_module_function("IntSetting", "max",      int_setting_query_max);
-	env.load_module_function("IntSetting", "update",   int_setting_update);
-}
-
-} // namespace crown

+ 0 - 155
src/lua/lua_keyboard.cpp

@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "lua_stack.h"
-#include "lua_environment.h"
-#include "device.h"
-#include "input_manager.h"
-#include "input_device.h"
-
-namespace crown
-{
-
-static int keyboard_name(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_string(device()->input_manager()->keyboard()->name());
-	return 1;
-}
-
-static int keyboard_num_buttons(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_uint32(device()->input_manager()->keyboard()->num_buttons());
-	return 1;
-}
-
-static int keyboard_num_axes(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_uint32(device()->input_manager()->keyboard()->num_axes());
-	return 1;
-}
-
-static int keyboard_pressed(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->keyboard()->pressed((KeyboardButton::Enum) stack.get_int(1)));
-	return 1;
-}
-
-static int keyboard_released(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->keyboard()->released((KeyboardButton::Enum) stack.get_int(1)));
-	return 1;
-}
-
-static int keyboard_any_pressed(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->keyboard()->any_pressed());
-	return 1;
-}
-
-static int keyboard_any_released(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->keyboard()->any_released());
-	return 1;
-}
-
-void load_keyboard(LuaEnvironment& env)
-{
-	env.load_module_function("Keyboard", "name",         keyboard_name);
-	env.load_module_function("Keyboard", "num_buttons",  keyboard_num_buttons);
-	env.load_module_function("Keyboard", "num_axes",     keyboard_num_axes);
-	env.load_module_function("Keyboard", "pressed",      keyboard_pressed);
-	env.load_module_function("Keyboard", "released",     keyboard_released);
-	env.load_module_function("Keyboard", "any_pressed",  keyboard_any_pressed);
-	env.load_module_function("Keyboard", "any_released", keyboard_any_released);
-
-	env.load_module_enum("Keyboard", "TAB",       KeyboardButton::TAB);
-	env.load_module_enum("Keyboard", "ENTER",     KeyboardButton::ENTER);
-	env.load_module_enum("Keyboard", "ESCAPE",    KeyboardButton::ESCAPE);
-	env.load_module_enum("Keyboard", "SPACE",     KeyboardButton::SPACE);
-	env.load_module_enum("Keyboard", "BACKSPACE", KeyboardButton::BACKSPACE);
-	env.load_module_enum("Keyboard", "KP_0",      KeyboardButton::KP_0);
-	env.load_module_enum("Keyboard", "KP_1",      KeyboardButton::KP_1);
-	env.load_module_enum("Keyboard", "KP_2",      KeyboardButton::KP_2);
-	env.load_module_enum("Keyboard", "KP_3",      KeyboardButton::KP_3);
-	env.load_module_enum("Keyboard", "KP_4",      KeyboardButton::KP_4);
-	env.load_module_enum("Keyboard", "KP_5",      KeyboardButton::KP_5);
-	env.load_module_enum("Keyboard", "KP_6",      KeyboardButton::KP_6);
-	env.load_module_enum("Keyboard", "KP_7",      KeyboardButton::KP_7);
-	env.load_module_enum("Keyboard", "KP_8",      KeyboardButton::KP_8);
-	env.load_module_enum("Keyboard", "KP_9",      KeyboardButton::KP_9);
-	env.load_module_enum("Keyboard", "F1",        KeyboardButton::F1);
-	env.load_module_enum("Keyboard", "F2",        KeyboardButton::F2);
-	env.load_module_enum("Keyboard", "F3",        KeyboardButton::F3);
-	env.load_module_enum("Keyboard", "F4",        KeyboardButton::F4);
-	env.load_module_enum("Keyboard", "F5",        KeyboardButton::F5);
-	env.load_module_enum("Keyboard", "F6",        KeyboardButton::F6);
-	env.load_module_enum("Keyboard", "F7",        KeyboardButton::F7);
-	env.load_module_enum("Keyboard", "F8",        KeyboardButton::F8);
-	env.load_module_enum("Keyboard", "F9",        KeyboardButton::F9);
-	env.load_module_enum("Keyboard", "F10",       KeyboardButton::F10);
-	env.load_module_enum("Keyboard", "F11",       KeyboardButton::F11);
-	env.load_module_enum("Keyboard", "F12",       KeyboardButton::F12);
-	env.load_module_enum("Keyboard", "HOME",      KeyboardButton::HOME);
-	env.load_module_enum("Keyboard", "LEFT",      KeyboardButton::LEFT);
-	env.load_module_enum("Keyboard", "UP",        KeyboardButton::UP);
-	env.load_module_enum("Keyboard", "RIGHT",     KeyboardButton::RIGHT);
-	env.load_module_enum("Keyboard", "DOWN",      KeyboardButton::DOWN);
-	env.load_module_enum("Keyboard", "PAGE_UP",   KeyboardButton::PAGE_UP);
-	env.load_module_enum("Keyboard", "PAGE_DOWN", KeyboardButton::PAGE_DOWN);
-	env.load_module_enum("Keyboard", "LCONTROL",  KeyboardButton::LCONTROL);
-	env.load_module_enum("Keyboard", "RCONTROL",  KeyboardButton::RCONTROL);
-	env.load_module_enum("Keyboard", "LSHIFT",    KeyboardButton::LSHIFT);
-	env.load_module_enum("Keyboard", "RSHIFT",    KeyboardButton::RSHIFT);
-	env.load_module_enum("Keyboard", "CAPS_LOCK", KeyboardButton::CAPS_LOCK);
-	env.load_module_enum("Keyboard", "LALT",      KeyboardButton::LALT);
-	env.load_module_enum("Keyboard", "RALT",      KeyboardButton::RALT);
-	env.load_module_enum("Keyboard", "LSUPER",    KeyboardButton::LSUPER);
-	env.load_module_enum("Keyboard", "RSUPER",    KeyboardButton::RSUPER);
-	env.load_module_enum("Keyboard", "NUM_0",     KeyboardButton::NUM_0);
-	env.load_module_enum("Keyboard", "NUM_1",     KeyboardButton::NUM_1);
-	env.load_module_enum("Keyboard", "NUM_2",     KeyboardButton::NUM_2);
-	env.load_module_enum("Keyboard", "NUM_3",     KeyboardButton::NUM_3);
-	env.load_module_enum("Keyboard", "NUM_4",     KeyboardButton::NUM_4);
-	env.load_module_enum("Keyboard", "NUM_5",     KeyboardButton::NUM_5);
-	env.load_module_enum("Keyboard", "NUM_6",     KeyboardButton::NUM_6);
-	env.load_module_enum("Keyboard", "NUM_7",     KeyboardButton::NUM_7);
-	env.load_module_enum("Keyboard", "NUM_8",     KeyboardButton::NUM_8);
-	env.load_module_enum("Keyboard", "NUM_9",     KeyboardButton::NUM_9);
-	env.load_module_enum("Keyboard", "A",         KeyboardButton::A);
-	env.load_module_enum("Keyboard", "B",         KeyboardButton::B);
-	env.load_module_enum("Keyboard", "C",         KeyboardButton::C);
-	env.load_module_enum("Keyboard", "D",         KeyboardButton::D);
-	env.load_module_enum("Keyboard", "E",         KeyboardButton::E);
-	env.load_module_enum("Keyboard", "F",         KeyboardButton::F);
-	env.load_module_enum("Keyboard", "G",         KeyboardButton::G);
-	env.load_module_enum("Keyboard", "H",         KeyboardButton::H);
-	env.load_module_enum("Keyboard", "I",         KeyboardButton::I);
-	env.load_module_enum("Keyboard", "J",         KeyboardButton::J);
-	env.load_module_enum("Keyboard", "K",         KeyboardButton::K);
-	env.load_module_enum("Keyboard", "L",         KeyboardButton::L);
-	env.load_module_enum("Keyboard", "M",         KeyboardButton::M);
-	env.load_module_enum("Keyboard", "N",         KeyboardButton::N);
-	env.load_module_enum("Keyboard", "O",         KeyboardButton::O);
-	env.load_module_enum("Keyboard", "P",         KeyboardButton::P);
-	env.load_module_enum("Keyboard", "Q",         KeyboardButton::Q);
-	env.load_module_enum("Keyboard", "R",         KeyboardButton::R);
-	env.load_module_enum("Keyboard", "S",         KeyboardButton::S);
-	env.load_module_enum("Keyboard", "T",         KeyboardButton::T);
-	env.load_module_enum("Keyboard", "U",         KeyboardButton::U);
-	env.load_module_enum("Keyboard", "V",         KeyboardButton::V);
-	env.load_module_enum("Keyboard", "W",         KeyboardButton::W);
-	env.load_module_enum("Keyboard", "X",         KeyboardButton::X);
-	env.load_module_enum("Keyboard", "Y",         KeyboardButton::Y);
-	env.load_module_enum("Keyboard", "Z",         KeyboardButton::Z);
-}
-
-} // namespace crown

+ 795 - 3
src/lua/lua_math.cpp

@@ -5,7 +5,10 @@
 
 #include "math_utils.h"
 #include "math_types.h"
-#include "aabb.h"
+#include "vector3.h"
+#include "matrix4x4.h"
+#include "quaternion.h"
+#include "color4.h"
 #include "intersection.h"
 #include "lua_stack.h"
 #include "lua_environment.h"
@@ -128,10 +131,700 @@ static int math_fmod(lua_State* L)
 static int math_ray_obb_intersection(lua_State* L)
 {
 	LuaStack stack(L);
-	stack.push_float(ray_obb_intersection(stack.get_vector3(1), stack.get_vector3(2), stack.get_matrix4x4(3), stack.get_vector3(4)));
+	stack.push_float(ray_obb_intersection(stack.get_vector3(1)
+		, stack.get_vector3(2)
+		, stack.get_matrix4x4(3)
+		, stack.get_vector3(4)));
 	return 1;
 }
 
+static int vector3_new(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(vector3(stack.get_float(1), stack.get_float(2), stack.get_float(3)));
+	return 1;
+}
+
+static int vector3_ctor(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.remove(1); // Remove table
+	return vector3_new(L);
+}
+
+static int vector3_x(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(stack.get_vector3(1).x);
+	return 1;
+}
+
+static int vector3_y(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(stack.get_vector3(1).y);
+	return 1;
+}
+
+static int vector3_z(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(stack.get_vector3(1).z);
+	return 1;
+}
+
+static int vector3_set_x(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.get_vector3(1).x = stack.get_float(2);
+	return 0;
+}
+
+static int vector3_set_y(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.get_vector3(1).y = stack.get_float(2);
+	return 0;
+}
+
+static int vector3_set_z(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.get_vector3(1).z = stack.get_float(2);
+	return 0;
+}
+
+static int vector3_values(lua_State* L)
+{
+	LuaStack stack(L);
+	Vector3& a = stack.get_vector3(1);
+	stack.push_float(a.x);
+	stack.push_float(a.y);
+	stack.push_float(a.z);
+	return 3;
+}
+
+static int vector3_add(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(stack.get_vector3(1) + stack.get_vector3(2));
+	return 1;
+}
+
+static int vector3_subtract(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(stack.get_vector3(1) - stack.get_vector3(2));
+	return 1;
+}
+
+static int vector3_multiply(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(stack.get_vector3(1) * stack.get_float(2));
+	return 1;
+}
+
+static int vector3_divide(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(stack.get_vector3(1) / stack.get_float(2));
+	return 1;
+}
+
+static int vector3_dot(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(dot(stack.get_vector3(1), stack.get_vector3(2)));
+	return 1;
+}
+
+static int vector3_cross(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(cross(stack.get_vector3(1), stack.get_vector3(2)));
+	return 1;
+}
+
+static int vector3_equal(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_bool(stack.get_vector3(1) == stack.get_vector3(2));
+	return 1;
+}
+
+static int vector3_length(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(length(stack.get_vector3(1)));
+	return 1;
+}
+
+static int vector3_squared_length(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(squared_length(stack.get_vector3(1)));
+	return 1;
+}
+
+static int vector3_set_length(lua_State* L)
+{
+	LuaStack stack(L);
+	set_length(stack.get_vector3(1), stack.get_float(2));
+	return 0;
+}
+
+static int vector3_normalize(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(normalize(stack.get_vector3(1)));
+	return 1;
+}
+
+static int vector3_distance(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(distance(stack.get_vector3(1), stack.get_vector3(2)));
+	return 1;
+}
+
+static int vector3_angle(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(angle(stack.get_vector3(1), stack.get_vector3(2)));
+	return 1;
+}
+
+static int vector3_forward(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(VECTOR3_FORWARD);
+	return 1;
+}
+
+static int vector3_backward(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(VECTOR3_BACKWARD);
+	return 1;
+}
+
+static int vector3_left(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(VECTOR3_LEFT);
+	return 1;
+}
+
+static int vector3_right(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(VECTOR3_RIGHT);
+	return 1;
+}
+
+static int vector3_up(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(VECTOR3_UP);
+	return 1;
+}
+
+static int vector3_down(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(VECTOR3_DOWN);
+	return 1;
+}
+
+static int vector2_new(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector2(vector2(stack.get_float(1), stack.get_float(2)));
+	return 1;
+}
+
+static int vector2_ctor(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.remove(1); // Remove table
+	return vector2_new(L);
+}
+
+static int vector3box_new(lua_State* L)
+{
+	LuaStack stack(L);
+
+	if (stack.num_args() == 0)
+		stack.push_vector3box(Vector3());
+	else if (stack.num_args() == 1)
+		stack.push_vector3box(stack.get_vector3(1));
+	else
+		stack.push_vector3box(vector3(stack.get_float(1)
+			, stack.get_float(2)
+			, stack.get_float(3)));
+
+	return 1;
+}
+
+static int vector3box_ctor(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.remove(1); // Remove table
+	return vector3box_new(L);
+}
+
+static int vector3box_store(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Vector3& v = stack.get_vector3box(1);
+
+	if (stack.num_args() == 2)
+		v = stack.get_vector3(2);
+	else
+		v = vector3(stack.get_float(2)
+			, stack.get_float(3)
+			, stack.get_float(4));
+
+	return 0;
+}
+
+static int vector3box_unbox(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(stack.get_vector3box(1));
+	return 1;
+}
+
+static int vector3box_get_value(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Vector3& v = stack.get_vector3box(1);
+	const char* s = stack.get_string(2);
+
+	switch (s[0])
+	{
+		case 'x': stack.push_float(v.x); return 1;
+		case 'y': stack.push_float(v.y); return 1;
+		case 'z': stack.push_float(v.z); return 1;
+		default: LUA_ASSERT(false, stack, "Bad index: '%c'", s[0]); break;
+	}
+
+	return 0;
+}
+
+static int vector3box_set_value(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Vector3& v = stack.get_vector3box(1);
+	const char* s = stack.get_string(2);
+	const float value = stack.get_float(3);
+
+	switch (s[0])
+	{
+		case 'x': v.x = value; break;
+		case 'y': v.y = value; break;
+		case 'z': v.z = value; break;
+		default: LUA_ASSERT(false, stack, "Bad index: '%c'", s[0]); break;
+	}
+
+	return 0;
+}
+
+static int vector3box_tostring(lua_State* L)
+{
+	LuaStack stack(L);
+	Vector3& v = stack.get_vector3box(1);
+	stack.push_fstring("Vector3Box (%p)", &v);
+	return 1;
+}
+
+static int matrix4x4_new(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(matrix4x4(stack.get_float(1)
+		, stack.get_float(2)
+		, stack.get_float(3)
+		, stack.get_float(4)
+		, stack.get_float(5)
+		, stack.get_float(6)
+		, stack.get_float(7)
+		, stack.get_float(8)
+		, stack.get_float(9)
+		, stack.get_float(10)
+		, stack.get_float(11)
+		, stack.get_float(12)
+		, stack.get_float(13)
+		, stack.get_float(14)
+		, stack.get_float(15)
+		, stack.get_float(16)));
+	return 1;
+}
+
+static int matrix4x4_ctor(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.remove(1); // Remove table
+	return matrix4x4_new(L);
+}
+
+static int matrix4x4_from_quaternion(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(matrix4x4(stack.get_quaternion(1), vector3(0, 0, 0)));
+	return 1;
+}
+
+static int matrix4x4_from_translation(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(matrix4x4(QUATERNION_IDENTITY, stack.get_vector3(1)));
+	return 1;
+}
+
+static int matrix4x4_from_quaternion_translation(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(matrix4x4(stack.get_quaternion(1), stack.get_vector3(2)));
+	return 1;
+}
+
+static int matrix4x4_from_axes(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(matrix4x4(stack.get_vector3(1), stack.get_vector3(2), stack.get_vector3(3), stack.get_vector3(4)));
+	return 1;
+}
+
+static int matrix4x4_add(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(stack.get_matrix4x4(1) + stack.get_matrix4x4(2));
+	return 1;
+}
+
+static int matrix4x4_subtract(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(stack.get_matrix4x4(1) - stack.get_matrix4x4(2));
+	return 1;
+}
+
+static int matrix4x4_multiply(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(stack.get_matrix4x4(1) * stack.get_matrix4x4(2));
+	return 1;
+}
+
+static int matrix4x4_transpose(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(transpose(stack.get_matrix4x4(1)));
+	return 1;
+}
+
+static int matrix4x4_determinant(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(determinant(stack.get_matrix4x4(1)));
+	return 1;
+}
+
+static int matrix4x4_invert(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(invert(stack.get_matrix4x4(1)));
+	return 1;
+}
+
+static int matrix4x4_x(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(x(stack.get_matrix4x4(1)));
+	return 1;
+}
+
+static int matrix4x4_y(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(y(stack.get_matrix4x4(1)));
+	return 1;
+}
+
+static int matrix4x4_z(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(z(stack.get_matrix4x4(1)));
+	return 1;
+}
+
+static int matrix4x4_set_x(lua_State* L)
+{
+	LuaStack stack(L);
+	set_x(stack.get_matrix4x4(1), stack.get_vector3(2));
+	return 0;
+}
+
+static int matrix4x4_set_y(lua_State* L)
+{
+	LuaStack stack(L);
+	set_y(stack.get_matrix4x4(1), stack.get_vector3(2));
+	return 0;
+}
+
+static int matrix4x4_set_z(lua_State* L)
+{
+	LuaStack stack(L);
+	set_z(stack.get_matrix4x4(1), stack.get_vector3(2));
+	return 0;
+}
+
+static int matrix4x4_translation(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(translation(stack.get_matrix4x4(1)));
+	return 1;
+}
+
+static int matrix4x4_set_translation(lua_State* L)
+{
+	LuaStack stack(L);
+	set_translation(stack.get_matrix4x4(1), stack.get_vector3(2));
+	return 0;
+}
+
+static int matrix4x4_rotation(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(rotation(stack.get_matrix4x4(1)));
+	return 1;
+}
+
+static int matrix4x4_set_rotation(lua_State* L)
+{
+	LuaStack stack(L);
+	set_rotation(stack.get_matrix4x4(1), stack.get_quaternion(2));
+	return 0;
+}
+
+static int matrix4x4_identity(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(MATRIX4X4_IDENTITY);
+	return 1;
+}
+
+static int matrix4x4_to_string(lua_State* L)
+{
+	LuaStack stack(L);
+	Matrix4x4& a = stack.get_matrix4x4(1);
+	stack.push_fstring("%.1f, %.1f, %.1f, %.1f\n%.1f, %.1f, %.1f, %.1f\n%.1f, %.1f, %.1f, %.1f\n%.1f, %.1f, %.1f, %.1f\n",
+						a.x.x, a.x.y, a.x.z, a.y.w, a.y.x, a.y.y, a.y.z, a.y.w, a.z.x, a.z.y, a.z.z, a.z.w, a.t.x, a.t.y, a.t.z, a.t.w);
+	return 1;
+}
+
+static int matrix4x4box_new(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4box(stack.get_matrix4x4(1));
+	return 1;
+}
+
+static int matrix4x4box_ctor(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.remove(1); // Remove table
+	return matrix4x4box_new(L);
+}
+
+static int matrix4x4box_store(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.get_matrix4x4box(1) = stack.get_matrix4x4(2);
+	return 0;
+}
+
+static int matrix4x4box_unbox(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_matrix4x4(stack.get_matrix4x4box(1));
+	return 1;
+}
+
+static int matrix4x4box_tostring(lua_State* L)
+{
+	LuaStack stack(L);
+	Matrix4x4& m = stack.get_matrix4x4box(1);
+	stack.push_fstring("Matrix4x4Box (%p)", &m);
+	return 1;
+}
+
+static int quaternion_new(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(quaternion(stack.get_vector3(1), stack.get_float(2)));
+	return 1;
+}
+
+static int quaternion_ctor(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.remove(1); // Remove table
+	return quaternion_new(L);
+}
+
+static int quaternion_negate(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(-stack.get_quaternion(1));
+	return 1;
+}
+
+static int quaternion_identity(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(QUATERNION_IDENTITY);
+	return 1;
+}
+
+static int quaternion_length(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(length(stack.get_quaternion(1)));
+	return 1;
+}
+
+static int quaternion_normalize(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(normalize(stack.get_quaternion(1)));
+	return 1;
+}
+
+static int quaternion_conjugate(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(conjugate(stack.get_quaternion(1)));
+	return 1;
+}
+
+static int quaternion_inverse(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(inverse(stack.get_quaternion(1)));
+	return 1;
+}
+
+static int quaternion_multiply(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(stack.get_quaternion(1) * stack.get_quaternion(2));
+	return 1;
+}
+
+static int quaternion_multiply_by_scalar(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(stack.get_quaternion(1) * stack.get_float(2));
+	return 1;
+}
+
+static int quaternion_power(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(power(stack.get_quaternion(1), stack.get_float(2)));
+	return 1;
+}
+
+static int quaternion_elements(lua_State* L)
+{
+	LuaStack stack(L);
+	const Quaternion& q = stack.get_quaternion(1);
+	stack.push_float(q.x);
+	stack.push_float(q.y);
+	stack.push_float(q.z);
+	stack.push_float(q.w);
+	return 4;
+}
+
+static int quaternionbox_new(lua_State* L)
+{
+	LuaStack stack(L);
+
+	if (stack.num_args() == 1)
+		stack.push_quaternionbox(stack.get_quaternion(1));
+	else
+		stack.push_quaternionbox(quaternion(stack.get_float(1)
+			, stack.get_float(2)
+			, stack.get_float(3)
+			, stack.get_float(4)));
+
+	return 1;
+}
+
+static int quaternionbox_ctor(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.remove(1); // Remove table
+	return quaternionbox_new(L);
+}
+
+static int quaternionbox_store(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Quaternion& q = stack.get_quaternionbox(1);
+
+	if (stack.num_args() == 2)
+		q = stack.get_quaternion(2);
+	else
+		q = quaternion(stack.get_float(2)
+			, stack.get_float(3)
+			, stack.get_float(4)
+			, stack.get_float(5));
+
+	return 0;
+}
+
+static int quaternionbox_unbox(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Quaternion& q = stack.get_quaternionbox(1);
+
+	stack.push_quaternion(q);
+	return 1;
+}
+
+static int quaternionbox_tostring(lua_State* L)
+{
+	LuaStack stack(L);
+	Quaternion& q = stack.get_quaternionbox(1);
+	stack.push_fstring("QuaternionBox (%p)", &q);
+	return 1;
+}
+
+static int color4_new(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_quaternion(quaternion(stack.get_float(1)
+		, stack.get_float(2)
+		, stack.get_float(3)
+		, stack.get_float(4)));
+	return 1;
+}
+
+static int color4_ctor(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.remove(1); // Remove table
+	return color4_new(L);
+}
+
 void load_math(LuaEnvironment& env)
 {
 	env.load_module_function("Math", "to_rad",               math_to_rad);
@@ -150,7 +843,106 @@ void load_math(LuaEnvironment& env)
 	env.load_module_function("Math", "atan2",                math_atan2);
 	env.load_module_function("Math", "abs",                  math_abs);
 	env.load_module_function("Math", "fmod",                 math_fmod);
-	env.load_module_function("Math", "ray_obb_intersection", math_ray_obb_intersection);
+	env.load_module_function("Math", "ray_obb_intersection", math_ray_oobb_intersection);
+
+	env.load_module_function("Vector3", "new",            vector3_new);
+	env.load_module_function("Vector3", "x",              vector3_x);
+	env.load_module_function("Vector3", "y",              vector3_y);
+	env.load_module_function("Vector3", "z",              vector3_z);
+	env.load_module_function("Vector3", "set_x",          vector3_set_x);
+	env.load_module_function("Vector3", "set_y",          vector3_set_y);
+	env.load_module_function("Vector3", "set_z",          vector3_set_z);
+	env.load_module_function("Vector3", "values",         vector3_values);
+	env.load_module_function("Vector3", "add",            vector3_add);
+	env.load_module_function("Vector3", "subtract",       vector3_subtract);
+	env.load_module_function("Vector3", "multiply",       vector3_multiply);
+	env.load_module_function("Vector3", "divide",         vector3_divide);
+	env.load_module_function("Vector3", "dot",            vector3_dot);
+	env.load_module_function("Vector3", "cross",          vector3_cross);
+	env.load_module_function("Vector3", "equal",          vector3_equal);
+	env.load_module_function("Vector3", "length",         vector3_length);
+	env.load_module_function("Vector3", "squared_length", vector3_squared_length);
+	env.load_module_function("Vector3", "set_length",     vector3_set_length);
+	env.load_module_function("Vector3", "normalize",      vector3_normalize);
+	env.load_module_function("Vector3", "distance",       vector3_distance);
+	env.load_module_function("Vector3", "angle",          vector3_angle);
+	env.load_module_function("Vector3", "forward",        vector3_forward);
+	env.load_module_function("Vector3", "backward",       vector3_backward);
+	env.load_module_function("Vector3", "left",           vector3_left);
+	env.load_module_function("Vector3", "right",          vector3_right);
+	env.load_module_function("Vector3", "up",             vector3_up);
+	env.load_module_function("Vector3", "down",           vector3_down);
+
+	env.load_module_constructor("Vector3", vector3_ctor);
+
+	env.load_module_function("Vector2", "new",            vector2_new);
+	env.load_module_constructor("Vector2", vector2_ctor);
+
+	env.load_module_function("Vector3Box", "new",        vector3box_new);
+	env.load_module_function("Vector3Box", "store",      vector3box_store);
+	env.load_module_function("Vector3Box", "unbox",      vector3box_unbox);
+	env.load_module_function("Vector3Box", "__index",    vector3box_get_value);
+	env.load_module_function("Vector3Box", "__newindex", vector3box_set_value);
+	env.load_module_function("Vector3Box", "__tostring", vector3box_tostring);
+
+	env.load_module_constructor("Vector3Box", vector3box_ctor);
+
+	env.load_module_function("Matrix4x4", "new",                         matrix4x4_new);
+	env.load_module_function("Matrix4x4", "from_quaternion",             matrix4x4_from_quaternion);
+	env.load_module_function("Matrix4x4", "from_translation",            matrix4x4_from_translation);
+	env.load_module_function("Matrix4x4", "from_quaternion_translation", matrix4x4_from_quaternion_translation);
+	env.load_module_function("Matrix4x4", "from_axes",                   matrix4x4_from_axes);
+	env.load_module_function("Matrix4x4", "add",                         matrix4x4_add);
+	env.load_module_function("Matrix4x4", "subtract",                    matrix4x4_subtract);
+	env.load_module_function("Matrix4x4", "multiply",                    matrix4x4_multiply);
+	env.load_module_function("Matrix4x4", "transpose",                   matrix4x4_transpose);
+	env.load_module_function("Matrix4x4", "determinant",                 matrix4x4_determinant);
+	env.load_module_function("Matrix4x4", "invert",                      matrix4x4_invert);
+	env.load_module_function("Matrix4x4", "x",                           matrix4x4_x);
+	env.load_module_function("Matrix4x4", "y",                           matrix4x4_y);
+	env.load_module_function("Matrix4x4", "z",                           matrix4x4_z);
+	env.load_module_function("Matrix4x4", "set_x",                       matrix4x4_set_x);
+	env.load_module_function("Matrix4x4", "set_y",                       matrix4x4_set_y);
+	env.load_module_function("Matrix4x4", "set_z",                       matrix4x4_set_z);
+	env.load_module_function("Matrix4x4", "translation",                 matrix4x4_translation);
+	env.load_module_function("Matrix4x4", "set_translation",             matrix4x4_set_translation);
+	env.load_module_function("Matrix4x4", "rotation",                    matrix4x4_rotation);
+	env.load_module_function("Matrix4x4", "set_rotation",                matrix4x4_set_rotation);
+	env.load_module_function("Matrix4x4", "identity",                    matrix4x4_identity);
+	env.load_module_function("Matrix4x4", "to_string",                   matrix4x4_to_string);
+
+	env.load_module_constructor("Matrix4x4", matrix4x4_ctor);
+
+	env.load_module_function("Matrix4x4Box", "new",        matrix4x4box_new);
+	env.load_module_function("Matrix4x4Box", "store",      matrix4x4box_store);
+	env.load_module_function("Matrix4x4Box", "unbox",      matrix4x4box_unbox);
+	env.load_module_function("Matrix4x4Box", "__tostring", matrix4x4box_tostring);
+
+	env.load_module_constructor("Matrix4x4Box", matrix4x4box_ctor);
+
+	env.load_module_function("Quaternion", "new",                quaternion_new);
+	env.load_module_function("Quaternion", "negate",             quaternion_negate);
+	env.load_module_function("Quaternion", "identity",           quaternion_identity);
+	env.load_module_function("Quaternion", "multiply",           quaternion_multiply);
+	env.load_module_function("Quaternion", "multiply_by_scalar", quaternion_multiply_by_scalar);
+	env.load_module_function("Quaternion", "length",             quaternion_length);
+	env.load_module_function("Quaternion", "normalize",          quaternion_normalize);
+	env.load_module_function("Quaternion", "conjugate",          quaternion_conjugate);
+	env.load_module_function("Quaternion", "inverse",            quaternion_inverse);
+	env.load_module_function("Quaternion", "power",              quaternion_power);
+	env.load_module_function("Quaternion", "elements",           quaternion_elements);
+
+	env.load_module_constructor("Quaternion", quaternion_ctor);
+
+	env.load_module_function("QuaternionBox", "new",        quaternionbox_new);
+	env.load_module_function("QuaternionBox", "store",      quaternionbox_store);
+	env.load_module_function("QuaternionBox", "unbox",      quaternionbox_unbox);
+	env.load_module_function("QuaternionBox", "__tostring", quaternionbox_tostring);
+
+	env.load_module_constructor("QuaternionBox", quaternionbox_ctor);
+
+	env.load_module_function("Color4", "new", color4_new);
+	env.load_module_constructor("Color4",     color4_ctor);
 }
 
 } // namespace crown

+ 0 - 272
src/lua/lua_matrix4x4.cpp

@@ -1,272 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "matrix4x4.h"
-#include "vector3.h"
-#include "lua_stack.h"
-#include "lua_environment.h"
-
-namespace crown
-{
-
-static int matrix4x4_new(lua_State* L)
-{
-	LuaStack stack(L);
-	float m0 = stack.get_float(1);
-	float m1 = stack.get_float(2);
-	float m2 = stack.get_float(3);
-	float m3 = stack.get_float(4);
-	float m4 = stack.get_float(5);
-	float m5 = stack.get_float(6);
-	float m6 = stack.get_float(7);
-	float m7 = stack.get_float(8);
-	float m8 = stack.get_float(9);
-	float m9 = stack.get_float(10);
-	float m10 = stack.get_float(11);
-	float m11 = stack.get_float(12);
-	float m12 = stack.get_float(13);
-	float m13 = stack.get_float(14);
-	float m14 = stack.get_float(15);
-	float m15 = stack.get_float(16);
-	stack.push_matrix4x4(matrix4x4(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15));
-	return 1;
-}
-
-static int matrix4x4_ctor(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.remove(1); // Remove table
-	return matrix4x4_new(L);
-}
-
-static int matrix4x4_from_quaternion(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(matrix4x4(stack.get_quaternion(1), vector3(0, 0, 0)));
-	return 1;
-}
-
-static int matrix4x4_from_translation(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(matrix4x4(QUATERNION_IDENTITY, stack.get_vector3(1)));
-	return 1;
-}
-
-static int matrix4x4_from_quaternion_translation(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(matrix4x4(stack.get_quaternion(1), stack.get_vector3(2)));
-	return 1;
-}
-
-static int matrix4x4_from_axes(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(matrix4x4(stack.get_vector3(1), stack.get_vector3(2), stack.get_vector3(3), stack.get_vector3(4)));
-	return 1;
-}
-
-static int matrix4x4_add(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(stack.get_matrix4x4(1) + stack.get_matrix4x4(2));
-	return 1;
-}
-
-static int matrix4x4_subtract(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(stack.get_matrix4x4(1) - stack.get_matrix4x4(2));
-	return 1;
-}
-
-static int matrix4x4_multiply(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(stack.get_matrix4x4(1) * stack.get_matrix4x4(2));
-	return 1;
-}
-
-static int matrix4x4_transpose(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(transpose(stack.get_matrix4x4(1)));
-	return 1;
-}
-
-static int matrix4x4_determinant(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_float(determinant(stack.get_matrix4x4(1)));
-	return 1;
-}
-
-static int matrix4x4_invert(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(invert(stack.get_matrix4x4(1)));
-	return 1;
-}
-
-static int matrix4x4_x(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(x(stack.get_matrix4x4(1)));
-	return 1;
-}
-
-static int matrix4x4_y(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(y(stack.get_matrix4x4(1)));
-	return 1;
-}
-
-static int matrix4x4_z(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(z(stack.get_matrix4x4(1)));
-	return 1;
-}
-
-static int matrix4x4_set_x(lua_State* L)
-{
-	LuaStack stack(L);
-	set_x(stack.get_matrix4x4(1), stack.get_vector3(2));
-	return 0;
-}
-
-static int matrix4x4_set_y(lua_State* L)
-{
-	LuaStack stack(L);
-	set_y(stack.get_matrix4x4(1), stack.get_vector3(2));
-	return 0;
-}
-
-static int matrix4x4_set_z(lua_State* L)
-{
-	LuaStack stack(L);
-	set_z(stack.get_matrix4x4(1), stack.get_vector3(2));
-	return 0;
-}
-
-static int matrix4x4_translation(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(translation(stack.get_matrix4x4(1)));
-	return 1;
-}
-
-static int matrix4x4_set_translation(lua_State* L)
-{
-	LuaStack stack(L);
-	set_translation(stack.get_matrix4x4(1), stack.get_vector3(2));
-	return 0;
-}
-
-static int matrix4x4_rotation(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(rotation(stack.get_matrix4x4(1)));
-	return 1;
-}
-
-static int matrix4x4_set_rotation(lua_State* L)
-{
-	LuaStack stack(L);
-	set_rotation(stack.get_matrix4x4(1), stack.get_quaternion(2));
-	return 0;
-}
-
-static int matrix4x4_identity(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(MATRIX4X4_IDENTITY);
-	return 1;
-}
-
-static int matrix4x4_to_string(lua_State* L)
-{
-	LuaStack stack(L);
-	Matrix4x4& a = stack.get_matrix4x4(1);
-	stack.push_fstring("%.1f, %.1f, %.1f, %.1f\n%.1f, %.1f, %.1f, %.1f\n%.1f, %.1f, %.1f, %.1f\n%.1f, %.1f, %.1f, %.1f\n",
-						a.x.x, a.x.y, a.x.z, a.y.w, a.y.x, a.y.y, a.y.z, a.y.w, a.z.x, a.z.y, a.z.z, a.z.w, a.t.x, a.t.y, a.t.z, a.t.w);
-	return 1;
-}
-
-static int matrix4x4box_new(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4box(stack.get_matrix4x4(1));
-	return 1;
-}
-
-static int matrix4x4box_ctor(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.remove(1); // Remove table
-	return matrix4x4box_new(L);
-}
-
-static int matrix4x4box_store(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.get_matrix4x4box(1) = stack.get_matrix4x4(2);
-	return 0;
-}
-
-static int matrix4x4box_unbox(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_matrix4x4(stack.get_matrix4x4box(1));
-	return 1;
-}
-
-static int matrix4x4box_tostring(lua_State* L)
-{
-	LuaStack stack(L);
-	Matrix4x4& m = stack.get_matrix4x4box(1);
-	stack.push_fstring("Matrix4x4Box (%p)", &m);
-	return 1;
-}
-
-void load_matrix4x4(LuaEnvironment& env)
-{
-	env.load_module_function("Matrix4x4", "new",                         matrix4x4_new);
-	env.load_module_function("Matrix4x4", "from_quaternion",             matrix4x4_from_quaternion);
-	env.load_module_function("Matrix4x4", "from_translation",            matrix4x4_from_translation);
-	env.load_module_function("Matrix4x4", "from_quaternion_translation", matrix4x4_from_quaternion_translation);
-	env.load_module_function("Matrix4x4", "from_axes",                   matrix4x4_from_axes);
-	env.load_module_function("Matrix4x4", "add",                         matrix4x4_add);
-	env.load_module_function("Matrix4x4", "subtract",                    matrix4x4_subtract);
-	env.load_module_function("Matrix4x4", "multiply",                    matrix4x4_multiply);
-	env.load_module_function("Matrix4x4", "transpose",                   matrix4x4_transpose);
-	env.load_module_function("Matrix4x4", "determinant",                 matrix4x4_determinant);
-	env.load_module_function("Matrix4x4", "invert",                      matrix4x4_invert);
-	env.load_module_function("Matrix4x4", "x",                           matrix4x4_x);
-	env.load_module_function("Matrix4x4", "y",                           matrix4x4_y);
-	env.load_module_function("Matrix4x4", "z",                           matrix4x4_z);
-	env.load_module_function("Matrix4x4", "set_x",                       matrix4x4_set_x);
-	env.load_module_function("Matrix4x4", "set_y",                       matrix4x4_set_y);
-	env.load_module_function("Matrix4x4", "set_z",                       matrix4x4_set_z);
-	env.load_module_function("Matrix4x4", "translation",                 matrix4x4_translation);
-	env.load_module_function("Matrix4x4", "set_translation",             matrix4x4_set_translation);
-	env.load_module_function("Matrix4x4", "rotation",                    matrix4x4_rotation);
-	env.load_module_function("Matrix4x4", "set_rotation",                matrix4x4_set_rotation);
-	env.load_module_function("Matrix4x4", "identity",                    matrix4x4_identity);
-	env.load_module_function("Matrix4x4", "to_string",                   matrix4x4_to_string);
-
-	env.load_module_constructor("Matrix4x4", matrix4x4_ctor);
-
-	env.load_module_function("Matrix4x4Box", "new",        matrix4x4box_new);
-	env.load_module_function("Matrix4x4Box", "store",      matrix4x4box_store);
-	env.load_module_function("Matrix4x4Box", "unbox",      matrix4x4box_unbox);
-	env.load_module_function("Matrix4x4Box", "__tostring", matrix4x4box_tostring);
-
-	env.load_module_constructor("Matrix4x4Box", matrix4x4box_ctor);
-}
-
-} //namespace crown

+ 0 - 87
src/lua/lua_mouse.cpp

@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "lua_stack.h"
-#include "lua_environment.h"
-#include "device.h"
-#include "input_manager.h"
-#include "input_device.h"
-
-namespace crown
-{
-
-static int mouse_name(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_string(device()->input_manager()->mouse()->name());
-	return 1;
-}
-
-static int mouse_num_buttons(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_uint32(device()->input_manager()->mouse()->num_buttons());
-	return 1;
-}
-
-static int mouse_num_axes(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_uint32(device()->input_manager()->mouse()->num_axes());
-	return 1;
-}
-
-static int mouse_pressed(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->mouse()->pressed((MouseButton::Enum) stack.get_int(1)));
-	return 1;
-}
-
-static int mouse_released(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->mouse()->released((MouseButton::Enum) stack.get_int(1)));
-	return 1;
-}
-
-static int mouse_any_pressed(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->mouse()->any_pressed());
-	return 1;
-}
-
-static int mouse_any_released(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->mouse()->any_released());
-	return 1;
-}
-
-static int mouse_axis(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(device()->input_manager()->mouse()->axis(stack.get_int(1)));
-	return 1;
-}
-
-void load_mouse(LuaEnvironment& env)
-{
-	env.load_module_function("Mouse", "name",         mouse_name);
-	env.load_module_function("Mouse", "num_buttons",  mouse_num_buttons);
-	env.load_module_function("Mouse", "num_axes",     mouse_num_axes);
-	env.load_module_function("Mouse", "pressed",      mouse_pressed);
-	env.load_module_function("Mouse", "released",     mouse_released);
-	env.load_module_function("Mouse", "any_pressed",  mouse_any_pressed);
-	env.load_module_function("Mouse", "any_released", mouse_any_released);
-	env.load_module_function("Mouse", "axis",         mouse_axis);
-
-	env.load_module_enum("Mouse", "LEFT",   MouseButton::LEFT);
-	env.load_module_enum("Mouse", "MIDDLE", MouseButton::MIDDLE);
-	env.load_module_enum("Mouse", "RIGHT",  MouseButton::RIGHT);
-}
-
-} // namespace crown

+ 0 - 184
src/lua/lua_quaternion.cpp

@@ -1,184 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "quaternion.h"
-#include "vector3.h"
-#include "lua_stack.h"
-#include "lua_environment.h"
-
-
-namespace crown
-{
-
-static int quaternion_new(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(quaternion(stack.get_vector3(1), stack.get_float(2)));
-	return 1;
-}
-
-static int quaternion_ctor(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.remove(1); // Remove table
-	return quaternion_new(L);
-}
-
-static int quaternion_negate(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(-stack.get_quaternion(1));
-	return 1;
-}
-
-static int quaternion_identity(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(QUATERNION_IDENTITY);
-	return 1;
-}
-
-static int quaternion_length(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_float(length(stack.get_quaternion(1)));
-	return 1;
-}
-
-static int quaternion_normalize(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(normalize(stack.get_quaternion(1)));
-	return 1;
-}
-
-static int quaternion_conjugate(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(conjugate(stack.get_quaternion(1)));
-	return 1;
-}
-
-static int quaternion_inverse(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(inverse(stack.get_quaternion(1)));
-	return 1;
-}
-
-static int quaternion_multiply(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(stack.get_quaternion(1) * stack.get_quaternion(2));
-	return 1;
-}
-
-static int quaternion_multiply_by_scalar(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(stack.get_quaternion(1) * stack.get_float(2));
-	return 1;
-}
-
-static int quaternion_power(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_quaternion(power(stack.get_quaternion(1), stack.get_float(2)));
-	return 1;
-}
-
-static int quaternion_elements(lua_State* L)
-{
-	LuaStack stack(L);
-	const Quaternion& q = stack.get_quaternion(1);
-	stack.push_float(q.x);
-	stack.push_float(q.y);
-	stack.push_float(q.z);
-	stack.push_float(q.w);
-	return 4;
-}
-
-static int quaternionbox_new(lua_State* L)
-{
-	LuaStack stack(L);
-
-	if (stack.num_args() == 1)
-		stack.push_quaternionbox(stack.get_quaternion(1));
-	else
-		stack.push_quaternionbox(quaternion(stack.get_float(1)
-			, stack.get_float(2)
-			, stack.get_float(3)
-			, stack.get_float(4)));
-
-	return 1;
-}
-
-static int quaternionbox_ctor(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.remove(1); // Remove table
-	return quaternionbox_new(L);
-}
-
-static int quaternionbox_store(lua_State* L)
-{
-	LuaStack stack(L);
-
-	Quaternion& q = stack.get_quaternionbox(1);
-
-	if (stack.num_args() == 2)
-		q = stack.get_quaternion(2);
-	else
-		q = quaternion(stack.get_float(2)
-			, stack.get_float(3)
-			, stack.get_float(4)
-			, stack.get_float(5));
-
-	return 0;
-}
-
-static int quaternionbox_unbox(lua_State* L)
-{
-	LuaStack stack(L);
-
-	Quaternion& q = stack.get_quaternionbox(1);
-
-	stack.push_quaternion(q);
-	return 1;
-}
-
-static int quaternionbox_tostring(lua_State* L)
-{
-	LuaStack stack(L);
-	Quaternion& q = stack.get_quaternionbox(1);
-	stack.push_fstring("QuaternionBox (%p)", &q);
-	return 1;
-}
-
-void load_quaternion(LuaEnvironment& env)
-{
-	env.load_module_function("Quaternion", "new",                quaternion_new);
-	env.load_module_function("Quaternion", "negate",             quaternion_negate);
-	env.load_module_function("Quaternion", "identity",           quaternion_identity);
-	env.load_module_function("Quaternion", "multiply",           quaternion_multiply);
-	env.load_module_function("Quaternion", "multiply_by_scalar", quaternion_multiply_by_scalar);
-	env.load_module_function("Quaternion", "length",             quaternion_length);
-	env.load_module_function("Quaternion", "normalize",          quaternion_normalize);
-	env.load_module_function("Quaternion", "conjugate",          quaternion_conjugate);
-	env.load_module_function("Quaternion", "inverse",            quaternion_inverse);
-	env.load_module_function("Quaternion", "power",              quaternion_power);
-	env.load_module_function("Quaternion", "elements",           quaternion_elements);
-
-	env.load_module_constructor("Quaternion", quaternion_ctor);
-
-	env.load_module_function("QuaternionBox", "new",        quaternionbox_new);
-	env.load_module_function("QuaternionBox", "store",      quaternionbox_store);
-	env.load_module_function("QuaternionBox", "unbox",      quaternionbox_unbox);
-	env.load_module_function("QuaternionBox", "__tostring", quaternionbox_tostring);
-
-	env.load_module_constructor("QuaternionBox", quaternionbox_ctor);
-}
-
-} //namespace crown

+ 5 - 0
src/lua/lua_stack.h

@@ -40,6 +40,9 @@
 	#define CHECKINTEGER(stack, i) luaL_checkinteger(stack, i)
 	#define CHECKNUMBER(stack, i) luaL_checknumber(stack, i)
 	#define CHECKSTRING(stack, i) luaL_checkstring(stack, i)
+
+	#define LUA_ASSERT(condition, stack, msg, ...) do { if (!(condition)) {\
+		stack.push_fstring("\nLua assertion failed: %s\n\t" msg "\n", #condition, ##__VA_ARGS__); lua_error(stack.state()); }} while (0);
 #else
 	#define CHECKUDATA(stack, i, expected) lua_touserdata(stack, i)
 	#define CHECKLIGHTDATA(stack, i, cf, expected) lua_touserdata(stack, i)
@@ -47,6 +50,8 @@
 	#define CHECKINTEGER(stack, i) lua_tointeger(stack, i)
 	#define CHECKNUMBER(stack, i) lua_tonumber(stack, i)
 	#define CHECKSTRING(stack, i) lua_tostring(stack, i)
+
+	#define LUA_ASSERT(...) ((void)0)
 #endif // CROWN_DEBUG
 
 namespace crown

+ 0 - 77
src/lua/lua_string_setting.cpp

@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "string_setting.h"
-#include "lua_stack.h"
-#include "lua_environment.h"
-
-namespace crown
-{
-
-static int string_setting_value(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-
-	StringSetting* setting = StringSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		stack.push_string(setting->value());
-	}
-	else
-	{
-		stack.push_string("");
-	}
-
-	return 1;
-}
-
-static int string_setting_synopsis(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-
-	StringSetting* setting = StringSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		stack.push_string(setting->synopsis());
-	}
-	else
-	{
-		stack.push_string("");
-	}
-
-	return 1;
-}
-
-static int string_setting_update(lua_State* L)
-{
-	LuaStack stack(L);
-
-	const char* setting_name = stack.get_string(1);
-	const char* setting_value = stack.get_string(2);
-
-	StringSetting* setting = StringSetting::find_setting(setting_name);
-
-	if (setting != NULL)
-	{
-		(*setting) = setting_value;
-	}
-
-	return 0;
-}
-
-void load_string_setting(LuaEnvironment& env)
-{
-	env.load_module_function("StringSetting", "value",    string_setting_value);
-	env.load_module_function("StringSetting", "synopsis", string_setting_synopsis);
-	env.load_module_function("StringSetting", "update",   string_setting_update);
-}
-
-} // namespace crown

+ 0 - 83
src/lua/lua_touch.cpp

@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "lua_stack.h"
-#include "lua_environment.h"
-#include "device.h"
-#include "input_manager.h"
-#include "input_device.h"
-
-namespace crown
-{
-
-static int touch_name(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_string(device()->input_manager()->touch()->name());
-	return 1;
-}
-
-static int touch_num_buttons(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_uint32(device()->input_manager()->touch()->num_buttons());
-	return 1;
-}
-
-static int touch_num_axes(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_uint32(device()->input_manager()->touch()->num_axes());
-	return 1;
-}
-
-static int touch_pressed(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->touch()->pressed(stack.get_int(1)));
-	return 1;
-}
-
-static int touch_released(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->touch()->released(stack.get_int(1)));
-	return 1;
-}
-
-static int touch_any_pressed(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->touch()->any_pressed());
-	return 1;
-}
-
-static int touch_any_released(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(device()->input_manager()->touch()->any_released());
-	return 1;
-}
-
-static int touch_axis(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(device()->input_manager()->touch()->axis(stack.get_int(1)));
-	return 1;
-}
-
-void load_touch(LuaEnvironment& env)
-{
-	env.load_module_function("Touch", "name",         touch_name);
-	env.load_module_function("Touch", "num_buttons",  touch_num_buttons);
-	env.load_module_function("Touch", "num_axes",     touch_num_axes);
-	env.load_module_function("Touch", "pressed",      touch_pressed);
-	env.load_module_function("Touch", "released",     touch_released);
-	env.load_module_function("Touch", "any_pressed",  touch_any_pressed);
-	env.load_module_function("Touch", "any_released", touch_any_released);
-	env.load_module_function("Touch", "axis",         touch_axis);
-}
-
-} // namespace crown

+ 0 - 363
src/lua/lua_vector3.cpp

@@ -1,363 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "vector3.h"
-#include "lua_stack.h"
-#include "lua_environment.h"
-#include "lua_assert.h"
-
-namespace crown
-{
-
-static int vector3_new(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(vector3(stack.get_float(1), stack.get_float(2), stack.get_float(3)));
-	return 1;
-}
-
-static int vector3_ctor(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.remove(1); // Remove table
-	return vector3_new(L);
-}
-
-static int vector3_x(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_float(stack.get_vector3(1).x);
-	return 1;
-}
-
-static int vector3_y(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_float(stack.get_vector3(1).y);
-	return 1;
-}
-
-static int vector3_z(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_float(stack.get_vector3(1).z);
-	return 1;
-}
-
-static int vector3_set_x(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.get_vector3(1).x = stack.get_float(2);
-	return 0;
-}
-
-static int vector3_set_y(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.get_vector3(1).y = stack.get_float(2);
-	return 0;
-}
-
-static int vector3_set_z(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.get_vector3(1).z = stack.get_float(2);
-	return 0;
-}
-
-static int vector3_values(lua_State* L)
-{
-	LuaStack stack(L);
-	Vector3& a = stack.get_vector3(1);
-	stack.push_float(a.x);
-	stack.push_float(a.y);
-	stack.push_float(a.z);
-	return 3;
-}
-
-static int vector3_add(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(stack.get_vector3(1) + stack.get_vector3(2));
-	return 1;
-}
-
-static int vector3_subtract(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(stack.get_vector3(1) - stack.get_vector3(2));
-	return 1;
-}
-
-static int vector3_multiply(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(stack.get_vector3(1) * stack.get_float(2));
-	return 1;
-}
-
-static int vector3_divide(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(stack.get_vector3(1) / stack.get_float(2));
-	return 1;
-}
-
-static int vector3_dot(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_float(dot(stack.get_vector3(1), stack.get_vector3(2)));
-	return 1;
-}
-
-static int vector3_cross(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(cross(stack.get_vector3(1), stack.get_vector3(2)));
-	return 1;
-}
-
-static int vector3_equal(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_bool(stack.get_vector3(1) == stack.get_vector3(2));
-	return 1;
-}
-
-static int vector3_length(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_float(length(stack.get_vector3(1)));
-	return 1;
-}
-
-static int vector3_squared_length(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_float(squared_length(stack.get_vector3(1)));
-	return 1;
-}
-
-static int vector3_set_length(lua_State* L)
-{
-	LuaStack stack(L);
-	set_length(stack.get_vector3(1), stack.get_float(2));
-	return 0;
-}
-
-static int vector3_normalize(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(normalize(stack.get_vector3(1)));
-	return 1;
-}
-
-static int vector3_distance(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_float(distance(stack.get_vector3(1), stack.get_vector3(2)));
-	return 1;
-}
-
-static int vector3_angle(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_float(angle(stack.get_vector3(1), stack.get_vector3(2)));
-	return 1;
-}
-
-static int vector3_forward(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(VECTOR3_FORWARD);
-	return 1;
-}
-
-static int vector3_backward(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(VECTOR3_BACKWARD);
-	return 1;
-}
-
-static int vector3_left(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(VECTOR3_LEFT);
-	return 1;
-}
-
-static int vector3_right(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(VECTOR3_RIGHT);
-	return 1;
-}
-
-static int vector3_up(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(VECTOR3_UP);
-	return 1;
-}
-
-static int vector3_down(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(VECTOR3_DOWN);
-	return 1;
-}
-
-static int vector2_new(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector2(vector2(stack.get_float(1), stack.get_float(2)));
-	return 1;
-}
-
-static int vector2_ctor(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.remove(1); // Remove table
-	return vector2_new(L);
-}
-
-static int vector3box_new(lua_State* L)
-{
-	LuaStack stack(L);
-
-	if (stack.num_args() == 0)
-		stack.push_vector3box(Vector3());
-	else if (stack.num_args() == 1)
-		stack.push_vector3box(stack.get_vector3(1));
-	else
-		stack.push_vector3box(vector3(stack.get_float(1)
-			, stack.get_float(2)
-			, stack.get_float(3)));
-
-	return 1;
-}
-
-static int vector3box_ctor(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.remove(1); // Remove table
-	return vector3box_new(L);
-}
-
-static int vector3box_store(lua_State* L)
-{
-	LuaStack stack(L);
-
-	Vector3& v = stack.get_vector3box(1);
-
-	if (stack.num_args() == 2)
-		v = stack.get_vector3(2);
-	else
-		v = vector3(stack.get_float(2)
-			, stack.get_float(3)
-			, stack.get_float(4));
-
-	return 0;
-}
-
-static int vector3box_unbox(lua_State* L)
-{
-	LuaStack stack(L);
-	stack.push_vector3(stack.get_vector3box(1));
-	return 1;
-}
-
-static int vector3box_get_value(lua_State* L)
-{
-	LuaStack stack(L);
-
-	Vector3& v = stack.get_vector3box(1);
-	const char* s = stack.get_string(2);
-
-	switch (s[0])
-	{
-		case 'x': stack.push_float(v.x); return 1;
-		case 'y': stack.push_float(v.y); return 1;
-		case 'z': stack.push_float(v.z); return 1;
-		default: LUA_ASSERT(false, stack, "Bad index: '%c'", s[0]); break;
-	}
-
-	return 0;
-}
-
-static int vector3box_set_value(lua_State* L)
-{
-	LuaStack stack(L);
-
-	Vector3& v = stack.get_vector3box(1);
-	const char* s = stack.get_string(2);
-	const float value = stack.get_float(3);
-
-	switch (s[0])
-	{
-		case 'x': v.x = value; break;
-		case 'y': v.y = value; break;
-		case 'z': v.z = value; break;
-		default: LUA_ASSERT(false, stack, "Bad index: '%c'", s[0]); break;
-	}
-
-	return 0;
-}
-
-static int vector3box_tostring(lua_State* L)
-{
-	LuaStack stack(L);
-	Vector3& v = stack.get_vector3box(1);
-	stack.push_fstring("Vector3Box (%p)", &v);
-	return 1;
-}
-
-void load_vector3(LuaEnvironment& env)
-{
-	env.load_module_function("Vector3", "new",            vector3_new);
-	env.load_module_function("Vector3", "x",              vector3_x);
-	env.load_module_function("Vector3", "y",              vector3_y);
-	env.load_module_function("Vector3", "z",              vector3_z);
-	env.load_module_function("Vector3", "set_x",          vector3_set_x);
-	env.load_module_function("Vector3", "set_y",          vector3_set_y);
-	env.load_module_function("Vector3", "set_z",          vector3_set_z);
-	env.load_module_function("Vector3", "values",         vector3_values);
-	env.load_module_function("Vector3", "add",            vector3_add);
-	env.load_module_function("Vector3", "subtract",       vector3_subtract);
-	env.load_module_function("Vector3", "multiply",       vector3_multiply);
-	env.load_module_function("Vector3", "divide",         vector3_divide);
-	env.load_module_function("Vector3", "dot",            vector3_dot);
-	env.load_module_function("Vector3", "cross",          vector3_cross);
-	env.load_module_function("Vector3", "equal",          vector3_equal);
-	env.load_module_function("Vector3", "length",         vector3_length);
-	env.load_module_function("Vector3", "squared_length", vector3_squared_length);
-	env.load_module_function("Vector3", "set_length",     vector3_set_length);
-	env.load_module_function("Vector3", "normalize",      vector3_normalize);
-	env.load_module_function("Vector3", "distance",       vector3_distance);
-	env.load_module_function("Vector3", "angle",          vector3_angle);
-	env.load_module_function("Vector3", "forward",        vector3_forward);
-	env.load_module_function("Vector3", "backward",       vector3_backward);
-	env.load_module_function("Vector3", "left",           vector3_left);
-	env.load_module_function("Vector3", "right",          vector3_right);
-	env.load_module_function("Vector3", "up",             vector3_up);
-	env.load_module_function("Vector3", "down",           vector3_down);
-
-	env.load_module_constructor("Vector3", vector3_ctor);
-
-	env.load_module_function("Vector2", "new",            vector2_new);
-	env.load_module_constructor("Vector2", vector2_ctor);
-
-	env.load_module_function("Vector3Box", "new",        vector3box_new);
-	env.load_module_function("Vector3Box", "store",      vector3box_store);
-	env.load_module_function("Vector3Box", "unbox",      vector3box_unbox);
-	env.load_module_function("Vector3Box", "__index",    vector3box_get_value);
-	env.load_module_function("Vector3Box", "__newindex", vector3box_set_value);
-	env.load_module_function("Vector3Box", "__tostring", vector3box_tostring);
-
-	env.load_module_constructor("Vector3Box", vector3box_ctor);
-}
-
-} // namespace crown

+ 0 - 1
src/lua/lua_world.cpp

@@ -7,7 +7,6 @@
 #include "lua_environment.h"
 #include "array.h"
 #include "gui.h"
-#include "lua_assert.h"
 #include "temp_allocator.h"
 #include "world.h"
 #include "device.h"

+ 0 - 1
src/renderers/material_manager.h

@@ -10,7 +10,6 @@
 #include "material.h"
 #include "resource_manager.h"
 #include "resource_types.h"
-#include "id_table.h"
 #include <bgfx.h>
 
 namespace crown

+ 2 - 2
src/resource/resource_manager.cpp

@@ -29,8 +29,8 @@ ResourceManager::~ResourceManager()
 
 	for (; begin != end; begin++)
 	{
-		resource_on_offline(begin->key.type, begin->key.name, *this);
-		resource_on_unload(begin->key.type, _resource_heap, begin->value.data);
+		resource_on_offline(begin->pair.first.type, begin->pair.first.name, *this);
+		resource_on_unload(begin->pair.first.type, _resource_heap, begin->pair.second.data);
 	}
 }