Index: /trunk/nv/core/random.hh
===================================================================
--- /trunk/nv/core/random.hh	(revision 510)
+++ /trunk/nv/core/random.hh	(revision 511)
@@ -480,3 +480,5 @@
 }
 
+NV_RTTI_DECLARE( nv::random_dist )
+
 #endif // NV_CORE_RANDOM_HH
Index: /trunk/nv/core/types.hh
===================================================================
--- /trunk/nv/core/types.hh	(revision 510)
+++ /trunk/nv/core/types.hh	(revision 511)
@@ -85,4 +85,5 @@
 	{
 		shash64 name;
+		shash64 desc;
 		sint32  value;
 	};
@@ -124,5 +125,5 @@
 		type_creator union_field( const string_view& aname, TFIELD TOBJECT::*field, const string_view& control_name, ENUM_VALUE control_value, typename enable_if< !is_container<TFIELD>::value, void* >::type = nullptr );
 
-		type_creator value( const string_view& aname, sint32 value );
+		type_creator value( const string_view& aname, sint32 value, const string_view& desc = string_view() );
 	private:
 		type_database* m_database;
@@ -287,9 +288,11 @@
 	}
 
-	inline type_creator type_creator::value( const string_view& aname, sint32 value )
+	inline type_creator type_creator::value( const string_view& aname, sint32 value, const string_view& desc )
 	{
 		NV_ASSERT( m_entry->field_list.empty(), "Type cannot have both enums and fields!" );
 		type_enum e;
 		e.name = m_database->m_names.insert( aname );
+		if ( !desc.empty() )
+			e.desc = m_database->m_names.insert( desc );
 		e.value = value;
 		m_entry->enum_list.push_back( e );
Index: /trunk/nv/engine/default_resource_manager.hh
===================================================================
--- /trunk/nv/engine/default_resource_manager.hh	(revision 510)
+++ /trunk/nv/engine/default_resource_manager.hh	(revision 511)
@@ -55,4 +55,6 @@
 			return m_mesh_datas->resolve( h );
 		}
+		lua::state* get_lua() { return m_lua; }
+		const type_database* get_type_db() { return m_lua->get_type_data()->get_type_database(); }
 
 		void reload_data();
Index: /trunk/nv/engine/model_manager.hh
===================================================================
--- /trunk/nv/engine/model_manager.hh	(revision 510)
+++ /trunk/nv/engine/model_manager.hh	(revision 511)
@@ -95,4 +95,5 @@
 	};
 
+	NV_RTTI_DECLARE_NAME( model_node_choice, "random_dist" )
 	NV_RTTI_DECLARE_NAME( model, "model" )
 
Index: /trunk/nv/lua/lua_state.hh
===================================================================
--- /trunk/nv/lua/lua_state.hh	(revision 510)
+++ /trunk/nv/lua/lua_state.hh	(revision 511)
@@ -262,4 +262,10 @@
 			void unregister_object( ref object_index );
 
+			template <typename E>
+			void register_enum()
+			{
+				register_enum( m_lua_types->get_type_database()->get_type<E>() );
+			}
+			void register_enum( const type_entry* type );
 			void register_enum( string_view name, int value );
 			void register_singleton( string_view name, void* o );
Index: /trunk/src/lua/lua_state.cc
===================================================================
--- /trunk/src/lua/lua_state.cc	(revision 510)
+++ /trunk/src/lua/lua_state.cc	(revision 511)
@@ -750,4 +750,16 @@
 }
 
+void nv::lua::state::register_enum( const type_entry* type )
+{
+	NV_ASSERT_ALWAYS( type, "type not found!" );
+	NV_ASSERT_ALWAYS( !type->enum_list.empty(), "type not enum!" );
+	type_database* db = type->type_db;
+	for ( auto e : type->enum_list )
+	{
+		lua_pushinteger( m_state, e.value );
+		lua_setglobal( m_state, db->resolve_name( e.name ).data() );
+	}
+}
+
 void nv::lua::state::register_rtti_type( thash64 tid, lua_rtti_push_function p, lua_rtti_read_function r )
 {
