Index: /trunk/nv/lua/lua_glm.hh
===================================================================
--- /trunk/nv/lua/lua_glm.hh	(revision 74)
+++ /trunk/nv/lua/lua_glm.hh	(revision 75)
@@ -7,14 +7,17 @@
 #define NV_LUA_GLM_HH
 
+#include <new>
+#include <glm/glm.hpp>
 #include <nv/common.hh>
 #include <nv/lib/lua.hh>
-#include <glm/glm.hpp>
 
 void nlua_register_glm( lua_State* L );
+
+template< typename T > inline const char* nlua_metatable_name() { static_assert(sizeof(T) == 0, "Type not implemented!"); return NULL; }
 
 template< typename T >
 bool nlua_is_vec( lua_State* L, int index )
 {
-	return luaL_testudata( L, index, nv::get_type_name<T>() ) != 0;
+	return luaL_testudata( L, index, nlua_metatable_name<T>() ) != 0;
 }
 
@@ -22,5 +25,5 @@
 T nlua_to_vec( lua_State* L, int index )
 {
-	return *(T*)luaL_checkudata( L, index, nv::get_type_name<T>() );
+	return *(T*)luaL_checkudata( L, index, nlua_metatable_name<T>() );
 }
 
@@ -28,5 +31,5 @@
 T* nlua_to_pvec( lua_State* L, int index )
 {
-	return (T*)luaL_checkudata( L, index, nv::get_type_name<T>() );
+	return (T*)luaL_checkudata( L, index, nlua_metatable_name<T>() );
 }
 
@@ -35,6 +38,13 @@
 {
 	new (lua_newuserdata(L, sizeof(T))) T(v);
-	luaL_setmetatable( L, nv::get_type_name<T>() );
+	luaL_setmetatable( L, nlua_metatable_name<T>() );
 }
 
+template<> inline const char* nlua_metatable_name< glm::ivec2 >() { return "ivec2"; }
+template<> inline const char* nlua_metatable_name< glm::ivec3 >() { return "ivec3"; }
+template<> inline const char* nlua_metatable_name< glm::ivec4 >() { return "ivec4"; }
+template<> inline const char* nlua_metatable_name< glm::vec2  >() { return "vec2"; }
+template<> inline const char* nlua_metatable_name< glm::vec3  >() { return "vec3"; }
+template<> inline const char* nlua_metatable_name< glm::vec4  >() { return "vec4"; }
+
 #endif // NV_LUA_GLM_HH
Index: /trunk/src/lua/lua_glm.cc
===================================================================
--- /trunk/src/lua/lua_glm.cc	(revision 74)
+++ /trunk/src/lua/lua_glm.cc	(revision 75)
@@ -6,7 +6,5 @@
 
 #include "nv/lua/lua_glm.hh"
-#include "nv/types.hh"
 #include "nv/string.hh"
-#include <new>
 
 static size_t nlua_swizzel_lookup[256];
@@ -224,8 +222,8 @@
 	}
 
-	lua_getglobal( L, nv::get_type_name<T>() );
-	lua_pushvalue( L, -2 );
+	lua_getmetatable( L, 1 );
+	lua_getfield( L, -1, "__base" );
+	lua_pushvalue( L, 2 );
 	lua_rawget( L, -2 );
-
 	return 1;
 }
@@ -306,9 +304,11 @@
 	};
 
-	luaL_newmetatable( L, nv::get_type_name<T>() );
+	luaL_newmetatable( L, nlua_metatable_name<T>() );
 	luaL_setfuncs( L, nlua_vec_m, 0 );
-	lua_pop(L,1);
 	luaL_newlib(L, nlua_vec_f);
-	lua_newtable( L );
+	lua_pushvalue(L, -1);
+	lua_setfield(L, -3, "__base" );
+	lua_replace(L, -2);
+    lua_newtable( L );
 	luaL_setfuncs( L, nlua_vec_fm, 0 );
 	lua_setmetatable( L, -2 );
@@ -336,4 +336,5 @@
 	nlua_swizzel_lookup['3'] = 3;
 	int stack = lua_gettop( L );
+
 	luaL_requiref(L, "ivec2", luaopen_vec<glm::ivec2>, 1);
 	luaL_requiref(L, "ivec3", luaopen_vec<glm::ivec3>, 1);
