Browse Source

Quat binds re implemented without ffi

mikymod 12 years ago
parent
commit
42901bc428
3 changed files with 112 additions and 55 deletions
  1. 1 0
      lua/CMakeLists.txt
  2. 16 16
      lua/MathBinds.cpp
  3. 95 39
      lua/QuatBinds.cpp

+ 1 - 0
lua/CMakeLists.txt

@@ -8,6 +8,7 @@ set(LUA_SRC
 	Vec2Binds.cpp
 	Vec3Binds.cpp
 	Mat4Binds.cpp
+	QuatBinds.cpp
 	MathBinds.cpp
 
 	MouseBinds.cpp

+ 16 - 16
lua/MathBinds.cpp

@@ -190,22 +190,22 @@ int32_t math_fmod(lua_State* L)
 
 void load_math(LuaEnvironment& env)
 {
-	env.load_module_function("Math", "deg_to_rad", math_deg_to_rad);
-	env.load_module_function("Math", "rad_to_deg", math_rad_to_deg);
-	env.load_module_function("Math", "next_pow_2", math_next_pow_2);
-	env.load_module_function("Math", "is_pow_2", math_is_pow_2);
-	env.load_module_function("Math", "ceil", math_ceil);
-	env.load_module_function("Math", "floor", math_floor);
-	env.load_module_function("Math", "sqrt", math_sqrt);
-	env.load_module_function("Math", "inv_sqrt", math_inv_sqrt);
-	env.load_module_function("Math", "sin", math_sin);
-	env.load_module_function("Math", "cos", math_cos);
-	env.load_module_function("Math", "asin", math_asin);
-	env.load_module_function("Math", "acos", math_acos);
-	env.load_module_function("Math", "tan", math_tan);
-	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", "deg_to_rad", 	math_deg_to_rad);
+	env.load_module_function("Math", "rad_to_deg", 	math_rad_to_deg);
+	env.load_module_function("Math", "next_pow_2", 	math_next_pow_2);
+	env.load_module_function("Math", "is_pow_2", 	math_is_pow_2);
+	env.load_module_function("Math", "ceil", 		math_ceil);
+	env.load_module_function("Math", "floor", 		math_floor);
+	env.load_module_function("Math", "sqrt", 		math_sqrt);
+	env.load_module_function("Math", "inv_sqrt", 	math_inv_sqrt);
+	env.load_module_function("Math", "sin", 		math_sin);
+	env.load_module_function("Math", "cos", 		math_cos);
+	env.load_module_function("Math", "asin",	 	math_asin);
+	env.load_module_function("Math", "acos", 		math_acos);
+	env.load_module_function("Math", "tan", 		math_tan);
+	env.load_module_function("Math", "atan2", 		math_atan2);
+	env.load_module_function("Math", "abs", 		math_abs);
+	env.load_module_function("Math", "fmod", 		math_fmod);
 }
 
 } // namespace crown

+ 95 - 39
lua/QuatBinds.cpp

@@ -1,85 +1,141 @@
-#include "Device.h"
-#include "ScriptSystem.h"
+#include "Quat.h"
+#include "Vec3.h"
+#include "LuaStack.h"
+#include "LuaEnvironment.h"
+
 
 namespace crown
 {
-
-/// Lightweight bind for Quat
-
 extern "C"
 {
-	Quat&		quat(float angle, const Vec3& v);
-
-	void		quat_negate(Quat& self);
 
-	void		quat_load_identity(Quat& self);
+const int32_t 	LUA_QUAT_BUFFER_SIZE = 4096;
+Quat 			quat_buffer[LUA_QUAT_BUFFER_SIZE];
+uint32_t 		quat_used = 0;
 
-	float		quat_length(Quat& self);	
+int32_t quat(lua_State* L)
+{
+	LuaStack stack(L);
 
-	void		quat_conjugate(Quat& self);
+	float w = stack.get_float(1);
+	Vec3* v = (Vec3*)stack.get_lightudata(2);
 
-	Quat&		quat_inverse(Quat& self);			
+	quat_buffer[quat_used].w = w;
+	quat_buffer[quat_used].v = *v;
 
-	Quat&		quat_cross(Quat& self, const Quat& b);
+	stack.push_lightudata(&quat_buffer[quat_used]);
 
-	Quat&		quat_multiply(Quat& self, const float& k);
+	quat_used++;
 
-	Quat&		quat_power(Quat& self, float exp);
+	return 1;
 }
 
-Quat& quat(float angle, const Vec3& v)
+int32_t quat_negate(lua_State* L)
 {
-	return device()->script_system()->next_quat(angle, v);
+	LuaStack stack(L);
+
+	Quat* q = (Quat*)stack.get_lightudata(1);
+
+	q->negate();
+
+	return 0;
 }
 
-void quat_negate(Quat& self)
+int32_t quat_load_identity(lua_State* L)
 {
-	self.negate();
+	LuaStack stack(L);
+
+	Quat* q = (Quat*)stack.get_lightudata(1);
+
+	q->load_identity();
+
+	return 0;
 }
 
-void quat_load_identity(Quat& self)
+int32_t quat_length(lua_State* L)
 {
-	self.load_identity();
+	LuaStack stack(L);
+
+	Quat* q = (Quat*)stack.get_lightudata(1);
+
+	stack.push_float(q->length());
+
+	return 1;
 }
 
-float quat_length(Quat& self)
+int32_t quat_conjugate(lua_State* L)
 {
-	return self.length();
+	LuaStack stack(L);
+
+	Quat* q = (Quat*)stack.get_lightudata(1);
+
+	Quat r = q->get_conjugate();
+
+	stack.push_lightudata(&r);
+
+	return 1;
 }
 
-void quat_conjugate(Quat& self)
+int32_t quat_inverse(lua_State* L)
 {
-	self.conjugate();
+	LuaStack stack(L);
+
+	Quat* q = (Quat*)stack.get_lightudata(1);
+
+	Quat r = q->get_inverse();
+
+	stack.push_lightudata(&r);
+
+	return 1;
 }
 
-Quat& quat_inverse(Quat& self)
+int32_t quat_cross(lua_State* L)
 {
-	self.conjugate(); 
-	
-	self = self * (1.0f / self.length());
+	LuaStack stack(L);
+
+	Quat* q1 = (Quat*)stack.get_lightudata(1);
+	Quat* q2 = (Quat*)stack.get_lightudata(2);
+
+	Quat r = *q1 * (*q2);
 
-	return self;
+	stack.push_lightudata(&r);
+
+	return 1;
 }
 
-Quat& quat_cross(Quat& self, const Quat& b)
+int32_t quat_multiply(lua_State* L)
 {
-	self = self * b;
+	LuaStack stack(L);
+
+	Quat* q = (Quat*)stack.get_lightudata(1);
+	float k = stack.get_float(2);
+
+	Quat r = *q * k;
+
+	stack.push_lightudata(&r);
 
-	return self;
+	return 1;
 }
 
-Quat& quat_multiply(Quat& self, const float& k)
+int32_t quat_power(lua_State* L)
 {
-	self = self * k;
+	LuaStack stack(L);
 
-	return self;
+	Quat* q = (Quat*)stack.get_lightudata(1);
+	float k = stack.get_float(2);
+
+	Quat r = q->power(k);
+
+	stack.push_lightudata(&r);
+
+	return 1;
 }
 
-Quat& quat_power(Quat& self, float exp)
+} // extern "C"
+
+void load_quat(LuaEnvironment& env)
 {
-	self.power(exp);
 
-	return self;
 }
 
 } //namespace crown