Index: trunk/src/engine/particle_engine.cc
===================================================================
--- trunk/src/engine/particle_engine.cc	(revision 438)
+++ trunk/src/engine/particle_engine.cc	(revision 439)
@@ -302,6 +302,6 @@
 void nv::particle_engine::load( lua::table_guard& table )
 {
-	std::string id = table.get_std_string( "id" );
-	if ( id == "" )
+	shash64 id = table.get_string_hash_64( "id" );
+	if ( !id.valid() )
 	{
 		NV_LOG_ERROR( "Bad table passed to particle_engine!" )
@@ -355,6 +355,6 @@
 	{
 		lua::table_guard element( table, i+1 );
-		const_string type     = element.get_string("type");
-		std::string sub_type = element.get_std_string("sub_type");
+		const_string type     = element.get_string( "type" );
+		const_string sub_type = element.get_string( "sub_type" );
 		if ( type == "emmiter" )
 		{
@@ -370,5 +370,5 @@
 				{
 					edata.emmiter_func = nv_particle_emmiter_point;
-					NV_LOG_WARNING( "Unknown emmiter type in particle system! (", sub_type.c_str(), ")" );
+					NV_LOG_WARNING( "Unknown emmiter type in particle system! (", sub_type, ")" );
 				}
 
@@ -435,5 +435,5 @@
 					{
 						data.affector_count--;
-						NV_LOG_WARNING( "Bad data passed to ", string_view( sub_type.c_str(), sub_type.size() ), " affector in particle system!" );
+						NV_LOG_WARNING( "Bad data passed to ", sub_type, " affector in particle system!" );
 					}
 				}
@@ -441,5 +441,5 @@
 				{
 					data.affector_count--;
-					NV_LOG_WARNING( "Unknown affector type in particle system! (", string_view( sub_type.c_str(), sub_type.size() ), ")" );
+					NV_LOG_WARNING( "Unknown affector type in particle system! (", sub_type, ")" );
 				}
 			}
@@ -469,5 +469,5 @@
 }
 
-nv::particle_system nv::particle_engine::create_system( const std::string& id )
+nv::particle_system nv::particle_engine::create_system( const string_view& id )
 {
 	auto it = m_names.find( id );
@@ -823,5 +823,5 @@
 }
 
-void nv::particle_engine::register_emmiter_type( const std::string& name, particle_emmiter_func func )
+void nv::particle_engine::register_emmiter_type( const string_view& name, particle_emmiter_func func )
 {
 	m_emmiters[ name ] = func;
@@ -842,5 +842,5 @@
 }
 
-void nv::particle_engine::register_affector_type( const std::string& name, particle_affector_init_func init, particle_affector_func process )
+void nv::particle_engine::register_affector_type( const string_view& name, particle_affector_init_func init, particle_affector_func process )
 {
 	m_affectors[ name ].init    = init;
Index: trunk/src/gl/gl_device.cc
===================================================================
--- trunk/src/gl/gl_device.cc	(revision 438)
+++ trunk/src/gl/gl_device.cc	(revision 439)
@@ -212,5 +212,5 @@
 		for ( auto& i : *info->m_uniform_map )
 		{
-			auto j = lmap.find( i.first.c_str() );
+			auto j = lmap.find( i.first );
 			if ( j != lmap.end() )
 			{
@@ -218,5 +218,5 @@
 			}			
 
-			auto k = map.find( i.first.c_str() );
+			auto k = map.find( i.first );
 			if ( k != map.end() )
 			{
@@ -227,5 +227,5 @@
 }
 
-uniform_base* nv::gl_device::get_uniform( program p, const std::string& name, bool fatal /*= true */ ) const
+uniform_base* nv::gl_device::get_uniform( program p, const string_view& name, bool fatal /*= true */ ) const
 {
 	const gl_program_info* info = m_programs.get( p );
@@ -238,5 +238,5 @@
 		if ( fatal )
 		{
-			NV_LOG_CRITICAL( "gl_device : uniform '", string_view( name.c_str(), name.size() ), "' not found in program!" );
+			NV_LOG_CRITICAL( "gl_device : uniform '", name, "' not found in program!" );
 			NV_ABORT( "gl_device : uniform not found!" );
 		}
@@ -245,5 +245,5 @@
 }
 
-int nv::gl_device::get_attribute_location( program p, const std::string& name, bool fatal /*= true */ ) const
+int nv::gl_device::get_attribute_location( program p, const string_view& name, bool fatal /*= true */ ) const
 {
 	const gl_program_info* info = m_programs.get( p );
@@ -257,5 +257,5 @@
 		if ( fatal )
 		{
-			NV_LOG_CRITICAL( "gl_device : attribute '", string_view( name.c_str(), name.size() ), "' not found in program!" );
+			NV_LOG_CRITICAL( "gl_device : attribute '", name, "' not found in program!" );
 			NV_ABORT( "gl_device : attribute not found!" );
 		}
@@ -357,13 +357,12 @@
 		glGetActiveAttrib( p->glid, i, 128, &attr_nlen, &attr_len, &attr_type, name_buffer );
 
-		std::string name( name_buffer, size_t( attr_nlen ) );
+		string_view name( name_buffer, size_t( attr_nlen ) );
 
 		// skip built-ins
 		if ( name.substr(0,3) == "gl_" ) continue;
 
-		int attr_loc = glGetAttribLocation( p->glid, name.c_str() );
+		int attr_loc = glGetAttribLocation( p->glid, name.data() );
 
 		attribute& attr = (*p->m_attribute_map)[ name ];
-		attr.name     = name;
 		attr.location = attr_loc;
 		attr.type     = gl_enum_to_datatype( attr_type );
@@ -386,20 +385,20 @@
 		glGetActiveUniform( p->glid, i, 128, &uni_nlen, &uni_len, &uni_type, name_buffer );
 
-		std::string name( name_buffer, size_t( uni_nlen ) );
+		string_view name( name_buffer, size_t( uni_nlen ) );
 
 		// skip built-ins
 		if ( name.substr(0,3) == "gl_" ) continue;
 
-		int uni_loc = glGetUniformLocation( p->glid, name.c_str() );
+		int uni_loc = glGetUniformLocation( p->glid, name.data() );
 		datatype utype = gl_enum_to_datatype( uni_type );
 
 		// check for array
-		std::string::size_type arrchar = name.find( '[' );
-		if ( arrchar != std::string::npos )
+		size_t arrchar = name.find( '[' );
+		if ( arrchar != string_view::npos )
 		{
 			name = name.substr( 0, arrchar );
 		}
 
-		uniform_base* u = uniform_base::create( utype, name, uni_loc, uni_len );
+		uniform_base* u = uniform_base::create( utype, uni_loc, uni_len );
 		NV_ASSERT( u, "Unknown uniform type!" );
 		(*p->m_uniform_map)[ name ] = u;
