Index: /trunk/nv/lua/lua_area.hh
===================================================================
--- /trunk/nv/lua/lua_area.hh	(revision 182)
+++ /trunk/nv/lua/lua_area.hh	(revision 183)
@@ -11,4 +11,5 @@
 #include <nv/lua/lua_glm.hh>
 #include <nv/lib/lua.hh>
+#include <nv/lua/lua_values.hh>
 
 void nlua_register_area( lua_State* L );
@@ -24,3 +25,18 @@
 inline void nlua_push_coord( lua_State* L, const nv::ivec2& v ) { return nlua_push_vec<nv::ivec2>( L, v ); }
 
+namespace nv
+{
+	namespace lua
+	{
+
+		template<>
+		struct pass_traits< nv::rectangle >
+		{
+			static void push( lua_State *L, const nv::rectangle& p ) { nlua_push_area( L, p ); }
+			static void pop( lua_State *L, nv::rectangle& p ) { p = nlua_to_area( L, -1 ); lua_pop( L, 1 ); }
+		};
+	}
+
+}
+
 #endif // NV_LUA_AREA_HH
Index: /trunk/nv/lua/lua_glm.hh
===================================================================
--- /trunk/nv/lua/lua_glm.hh	(revision 182)
+++ /trunk/nv/lua/lua_glm.hh	(revision 183)
@@ -11,4 +11,5 @@
 #include <nv/math.hh>
 #include <nv/lib/lua.hh>
+#include <nv/lua/lua_values.hh>
 
 void nlua_register_glm( lua_State* L );
@@ -48,3 +49,36 @@
 template<> inline const char* nlua_metatable_name< nv::vec4  >() { return "vec4"; }
 
+namespace nv
+{
+	namespace lua
+	{
+
+		template< typename T >
+		struct pass_traits< glm::detail::tvec2<T> >
+		{
+			typedef glm::detail::tvec2<T> value_type;
+			static void push( lua_State *L, const value_type& p ) { nlua_push_vec< value_type >( L, p ); }
+			static void pop( lua_State *L, value_type& p ) { p = nlua_to_vec< value_type >( L, -1 ); lua_pop( L, 1 ); }
+		};
+
+		template< typename T >
+		struct pass_traits< glm::detail::tvec3<T> >
+		{
+			typedef glm::detail::tvec3<T> value_type;
+			static void push( lua_State *L, const value_type& p ) { nlua_push_vec< value_type >( L, p ); }
+			static void pop( lua_State *L, value_type& p ) { p = nlua_to_vec< value_type >( L, -1 ); lua_pop( L, 1 ); }
+		};
+
+		template< typename T >
+		struct pass_traits< glm::detail::tvec4<T> >
+		{
+			typedef glm::detail::tvec4<T> value_type;
+			static void push( lua_State *L, const value_type& p ) { nlua_push_vec< value_type >( L, p ); }
+			static void pop( lua_State *L, value_type& p ) { p = nlua_to_vec< value_type >( L, -1 ); lua_pop( L, 1 ); }
+		};
+	}
+
+}
+
+
 #endif // NV_LUA_GLM_HH
Index: /trunk/nv/lua/lua_values.hh
===================================================================
--- /trunk/nv/lua/lua_values.hh	(revision 182)
+++ /trunk/nv/lua/lua_values.hh	(revision 183)
@@ -17,10 +17,4 @@
 	namespace lua
 	{
-		template < typename T >
-		struct pass_traits
-		{
-		};
-
-
 		struct passer
 		{
@@ -28,12 +22,23 @@
 		};
 
-		template < typename T >
-		struct returner
+		struct returner_base
 		{
 			virtual void pop( lua_State *L ) = 0;
+		};
+
+		template < typename T >
+		struct returner : public returner_base
+		{
 			operator T() { return value; }
 			operator const T() const { return value; }
 		protected:
 			T value;
+		};
+
+		template < typename T >
+		struct pass_traits
+		{
+			static void push( lua_State *L, const T& p ) { p.push( L ); }
+			static void pop( lua_State *L, T& p ) { p.pop( L ); }
 		};
 
@@ -47,5 +52,9 @@
 			void push_value( lua_State *L, object* o );
 			void push_value( lua_State *L, void* p );
-			void push_value( lua_State *L, const passer& p );
+ 			template < typename T >
+ 			void push_value( lua_State *L, const T& p )
+ 			{
+ 				pass_traits<T>::push( L, p );
+ 			}
 
 			template < typename T1 >
@@ -67,6 +76,8 @@
 			void pop_value( lua_State *L, void*& p );
 			template < typename T >
-			void pop_value( lua_State *L, T& p ) { p.pop(L); }
-
+			void pop_value( lua_State *L, T& p )
+			{
+				pass_traits<T>::pop( L, p );
+			}
 		}
 
Index: /trunk/src/gfx/keyframed_mesh.cc
===================================================================
--- /trunk/src/gfx/keyframed_mesh.cc	(revision 182)
+++ /trunk/src/gfx/keyframed_mesh.cc	(revision 183)
@@ -105,5 +105,5 @@
 			if ( m_looping )
 			{
-				uint32 left = m_time - f_max;
+				uint32 left = m_time - static_cast< uint32 >( f_max );
 				m_time = 0;
 				update( left );
Index: /trunk/src/lua/lua_values.cc
===================================================================
--- /trunk/src/lua/lua_values.cc	(revision 182)
+++ /trunk/src/lua/lua_values.cc	(revision 183)
@@ -52,9 +52,4 @@
 }
 
-void nv::lua::detail::push_value( lua_State *L, const passer& p )
-{
-	p.push(L);
-}
-
 void nv::lua::detail::pop_value( lua_State *L, long& n )
 {
