Bläddra i källkod

Add look(), right(), up() and forward() quaternion API

Daniele Bartolini 10 år sedan
förälder
incheckning
2f16079fa9
2 ändrade filer med 64 tillägg och 0 borttagningar
  1. 31 0
      src/core/math/quaternion.h
  2. 33 0
      src/lua/lua_math.cpp

+ 31 - 0
src/core/math/quaternion.h

@@ -8,6 +8,7 @@
 #include "types.h"
 #include "math_types.h"
 #include "math_utils.h"
+#include "matrix3x3.h"
 
 namespace crown
 {
@@ -138,5 +139,35 @@ inline Quaternion power(const Quaternion& q, float exp)
 	return q;
 }
 
+inline Quaternion look(const Vector3& dir, const Vector3& up = VECTOR3_YAXIS)
+{
+	const Vector3 right = cross(dir, up);
+	const Vector3 nup = cross(right, dir);
+
+	Matrix3x3 m;
+	m.x = -right;
+	m.y = nup;
+	m.z = dir;
+	return quaternion(m);
+}
+
+inline Vector3 right(const Quaternion& q)
+{
+	const Matrix3x3 m = matrix3x3(q);
+	return m.x;
+}
+
+inline Vector3 up(const Quaternion& q)
+{
+	const Matrix3x3 m = matrix3x3(q);
+	return m.y;
+}
+
+inline Vector3 forward(const Quaternion& q)
+{
+	const Matrix3x3 m = matrix3x3(q);
+	return m.z;
+}
+
 // @}
 } // namespace crown

+ 33 - 0
src/lua/lua_math.cpp

@@ -647,6 +647,35 @@ static int quaternion_elements(lua_State* L)
 	return 4;
 }
 
+static int quaternion_look(lua_State* L)
+{
+	LuaStack stack(L);
+	const Vector3 up = stack.num_args() == 2 ? stack.get_vector3(2) : VECTOR3_YAXIS;
+	stack.push_quaternion(look(stack.get_vector3(1), up));
+	return 1;
+}
+
+static int quaternion_right(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(right(stack.get_quaternion(1)));
+	return 1;
+}
+
+static int quaternion_up(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(up(stack.get_quaternion(1)));
+	return 1;
+}
+
+static int quaternion_forward(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_vector3(forward(stack.get_quaternion(1)));
+	return 1;
+}
+
 static int quaternionbox_new(lua_State* L)
 {
 	LuaStack stack(L);
@@ -890,6 +919,10 @@ void load_math(LuaEnvironment& env)
 	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_function("Quaternion", "look",               quaternion_look);
+	env.load_module_function("Quaternion", "right",              quaternion_right);
+	env.load_module_function("Quaternion", "up",                 quaternion_up);
+	env.load_module_function("Quaternion", "forward",            quaternion_forward);
 
 	env.load_module_constructor("Quaternion", quaternion_ctor);