Index: /trunk/nv/engine/default_resource_manager.hh
===================================================================
--- /trunk/nv/engine/default_resource_manager.hh	(revision 511)
+++ /trunk/nv/engine/default_resource_manager.hh	(revision 512)
@@ -34,5 +34,4 @@
 		explicit default_resource_manager( context* context, bool clear_material_paths = true );
 
-		void initialize( lua::state* lua );
 		void add_path( const string_view& path );
 
@@ -58,5 +57,6 @@
 		const type_database* get_type_db() { return m_lua->get_type_data()->get_type_database(); }
 
-		void reload_data();
+		virtual void initialize( lua::state* lua );
+		virtual void reload_data();
 	protected:
 		lua::state*            m_lua;
Index: /trunk/nv/engine/model_manager.hh
===================================================================
--- /trunk/nv/engine/model_manager.hh	(revision 511)
+++ /trunk/nv/engine/model_manager.hh	(revision 512)
@@ -33,4 +33,6 @@
 		PATTERN_CHECKER
 	};
+
+	struct model;
 
 	struct model_node
@@ -75,4 +77,5 @@
 		transform                      root;
 		shash64                        attach;
+		flags< 32 >                    flags;
  	};
 
@@ -84,5 +87,5 @@
 		sint16                       parent_id;
 		transform					 local;
-		uint32                       flags;
+		uint32                       gflags;
 	};
 
@@ -93,4 +96,5 @@
 		shash64                        attach;
 		transform					   local;
+		flags< 32 >                    flags;
 	};
 
@@ -137,4 +141,5 @@
 			result.attach = m->attach;
 			result.local = m->root;
+			result.flags = m->flags;
 			result.count = 0;
 			flatten( result, m, rng, control, transform(), -1, map, gen_flags, 0, select );
@@ -180,5 +185,5 @@
 				re.parent_id = parent_id;
 				re.attach_id = m->attach_id;
-				re.flags = parent_flags;
+				re.gflags = parent_flags;
 				if ( map ) map->push_back( m );
 				parent_id = sint16(id);
@@ -186,5 +191,5 @@
 				if ( m == selected ) 
 				{
-					re.flags |= FMF_SELECTED;
+					re.gflags |= FMF_SELECTED;
 					if ( gen_flags & FF_GENERATE_GHOST && 
 							( m->position.max != m->position.min || 
@@ -198,5 +203,5 @@
 						min_re.parent_id = parent_id;
 						min_re.attach_id = m->attach_id;
-						min_re.flags = parent_flags | FMF_RANGE_GHOST;
+						min_re.gflags = parent_flags | FMF_RANGE_GHOST;
 
 						uint32 max_id = result.count++;
@@ -207,5 +212,5 @@
 						max_re.parent_id = parent_id;
 						max_re.attach_id = m->attach_id;
-						max_re.flags = parent_flags | FMF_RANGE_GHOST;
+						max_re.gflags = parent_flags | FMF_RANGE_GHOST;
 					}
 				}
Index: /trunk/nv/lua/lua_math.hh
===================================================================
--- /trunk/nv/lua/lua_math.hh	(revision 511)
+++ /trunk/nv/lua/lua_math.hh	(revision 512)
@@ -23,6 +23,6 @@
 		template<> struct pass_traits< vec4 >  : metatable_pass_traits< vec4 >  { static const char* metatable() { return "vec4"; } };
 		template<> struct pass_traits< ivec2 > : metatable_pass_traits< ivec2 > { static const char* metatable() { return "ivec2"; } };
-		template<> struct pass_traits< ivec3 > : metatable_pass_traits< ivec3 > { static const char* metatable() { return "ivec2"; } };
-		template<> struct pass_traits< ivec4 > : metatable_pass_traits< ivec4 > { static const char* metatable() { return "ivec2"; } };
+		template<> struct pass_traits< ivec3 > : metatable_pass_traits< ivec3 > { static const char* metatable() { return "ivec3"; } };
+		template<> struct pass_traits< ivec4 > : metatable_pass_traits< ivec4 > { static const char* metatable() { return "ivec4"; } };
 
 		namespace detail
Index: /trunk/src/engine/default_resource_manager.cc
===================================================================
--- /trunk/src/engine/default_resource_manager.cc	(revision 511)
+++ /trunk/src/engine/default_resource_manager.cc	(revision 512)
@@ -27,4 +27,5 @@
 	m_lua = lua;
 
+	int below_already_registered;
 	m_lua->register_enum( "RND_LINEAR",     static_cast<int>( random_dist::LINEAR ) );
 	m_lua->register_enum( "RND_GAUSSIAN",   static_cast<int>( random_dist::GAUSSIAN ) );
Index: /trunk/src/engine/model_manager.cc
===================================================================
--- /trunk/src/engine/model_manager.cc	(revision 511)
+++ /trunk/src/engine/model_manager.cc	(revision 512)
@@ -8,4 +8,5 @@
 
 #include "nv/lua/lua_math.hh"
+#include "nv/lua/lua_flags.hh"
 
 using namespace nv;
@@ -16,4 +17,5 @@
 
 	model* gm = new model;
+	gm->flags  = table.get< flags<32> >( "flags" );
 	gm->attach = table.get_string_hash_64( "attach" );
 	gm->root.set_position( table.get<vec3>( "root_position", vec3() ) );
Index: /trunk/src/lua/lua_math.cc
===================================================================
--- /trunk/src/lua/lua_math.cc	(revision 511)
+++ /trunk/src/lua/lua_math.cc	(revision 512)
@@ -154,11 +154,13 @@
 int nlua_vec_add( lua_State* L )
 {
+	T v;
 	if ( lua_type( L, 1 ) == LUA_TNUMBER )
-		push_vec<T>( L, static_cast<typename T::value_type>(lua_tonumber( L, 1 )) + to_vec<T>( L, 2 ) );
+		v = static_cast<typename T::value_type>(lua_tonumber( L, 1 )) + to_vec<T>( L, 2 );
 	else
 		if ( lua_type( L, 2 ) == LUA_TNUMBER )
-			push_vec<T>( L, to_vec<T>( L, 1 ) + static_cast<typename T::value_type>(lua_tonumber( L, 2 )) );
-		else
-			push_vec<T>( L, to_vec<T>( L, 1 ) + to_vec<T>( L, 2 ) );
+			v = to_vec<T>( L, 1 ) + static_cast<typename T::value_type>( lua_tonumber( L, 2 ) );
+		else
+			v = to_vec<T>( L, 1 ) + to_vec<T>( L, 2 );
+	push_vec<T>( L, v );
 	return 1;
 }
@@ -167,11 +169,13 @@
 int nlua_vec_sub( lua_State* L )
 {
+	T v;
 	if ( lua_type( L, 1 ) == LUA_TNUMBER )
-		push_vec<T>( L, static_cast<typename T::value_type>(lua_tonumber( L, 1 )) - to_vec<T>( L, 2 ) );
+		v = static_cast<typename T::value_type>(lua_tonumber( L, 1 )) - to_vec<T>( L, 2 );
 	else
 		if ( lua_type( L, 2 ) == LUA_TNUMBER )
-			push_vec<T>( L, to_vec<T>( L, 1 ) - static_cast<typename T::value_type>(lua_tonumber( L, 2 )) );
-		else
-			push_vec<T>( L, to_vec<T>( L, 1 ) - to_vec<T>( L, 2 ) );
+			v = to_vec<T>( L, 1 ) - static_cast<typename T::value_type>(lua_tonumber( L, 2 ) );
+		else
+			v = to_vec<T>( L, 1 ) - to_vec<T>( L, 2 );
+	push_vec<T>( L, v );
 	return 1;
 }
@@ -180,11 +184,13 @@
 int nlua_vec_mul( lua_State* L )
 {
+	T v;
 	if ( lua_type( L, 1 ) == LUA_TNUMBER )
-		push_vec<T>( L, static_cast<typename T::value_type>(lua_tonumber( L, 1 )) * to_vec<T>( L, 2 ) );
+		v = static_cast<typename T::value_type>(lua_tonumber( L, 1 )) * to_vec<T>( L, 2 );
 	else
 		if ( lua_type( L, 2 ) == LUA_TNUMBER )
-			push_vec<T>( L, to_vec<T>( L, 1 ) * static_cast<typename T::value_type>(lua_tonumber( L, 2 )) );
-		else
-			push_vec<T>( L, to_vec<T>( L, 1 ) * to_vec<T>( L, 2 ) );
+			v = to_vec<T>( L, 1 ) * static_cast<typename T::value_type>(lua_tonumber( L, 2 ));
+		else
+			v = to_vec<T>( L, 1 ) * to_vec<T>( L, 2 );
+	push_vec<T>( L, v );
 	return 1;
 }
@@ -193,11 +199,13 @@
 int nlua_vec_div( lua_State* L )
 {
+	T v;
 	if ( lua_type( L, 1 ) == LUA_TNUMBER )
-		push_vec<T>( L, static_cast<typename T::value_type>(lua_tonumber( L, 1 )) / to_vec<T>( L, 2 ) );
+		v = static_cast<typename T::value_type>(lua_tonumber( L, 1 )) / to_vec<T>( L, 2 );
 	else
 		if ( lua_type( L, 2 ) == LUA_TNUMBER )
-			push_vec<T>( L, to_vec<T>( L, 1 ) / static_cast<typename T::value_type>(lua_tonumber( L, 2 )) );
-		else
-			push_vec<T>( L, to_vec<T>( L, 1 ) / to_vec<T>( L, 2 ) );
+			v = to_vec<T>( L, 1 ) / static_cast<typename T::value_type>(lua_tonumber( L, 2 ));
+		else
+			v = to_vec<T>( L, 1 ) / to_vec<T>( L, 2 );
+	push_vec<T>( L, v );
 	return 1;
 }
