Index: trunk/src/formats/assimp_loader.cc
===================================================================
--- trunk/src/formats/assimp_loader.cc	(revision 413)
+++ trunk/src/formats/assimp_loader.cc	(revision 415)
@@ -117,30 +117,31 @@
 
 	bool skinned = mesh->mNumBones > 0;
-	raw_data_channel* channel = nullptr;
+
+	data_descriptor desc;
 	if ( skinned )
-		channel = raw_data_channel::create< assimp_skinned_vtx >( mesh->mNumVertices );
+		desc.initialize< assimp_skinned_vtx >();
 	else
-		channel = raw_data_channel::create< assimp_plain_vtx >( mesh->mNumVertices );
-	uint8* cdata = const_cast< uint8*>( channel->raw_data() );
-
-	data->add_channel( channel );
+		desc.initialize< assimp_plain_vtx >();
+	raw_data_channel_creator channel( desc, mesh->mNumVertices );
+	uint8* cdata = channel.raw_data();
+
 	if ( mesh->mTangents && mesh->mBitangents )
-	for (unsigned int i=0; i<mesh->mNumVertices; i++)
-	{
-		vec3 v = assimp_vec3_cast( mesh->mVertices[ i ] );
-		vec3 n = glm::normalize( assimp_vec3_cast( mesh->mNormals[ i ] ) );
-		vec3 t = glm::normalize( assimp_vec3_cast( mesh->mTangents[ i ] ) );
-		vec3 b = glm::normalize( assimp_vec3_cast( mesh->mBitangents[ i ] ) );
-		vec2 s = assimp_st_cast( mesh->mTextureCoords[ 0 ][ i ] );
-
-		glm::vec3 t_i = glm::normalize (t - n * glm::dot (n, t));
-		float det = (glm::dot (glm::cross (n, t), b));
-		det = (det < 0.0f ? -1.0f : 1.0f );
-		nv::vec4 vt ( t_i[0], t_i[1], t_i[2], det );
-		if ( skinned )
-			reinterpret_cast< assimp_skinned_vtx* >( cdata )[i] = assimp_skinned_vtx( v, s, n, vt );
-		else
-			reinterpret_cast< assimp_plain_vtx* >( cdata )[i] = assimp_plain_vtx( v, s, n, vt );
-	}
+		for ( unsigned int i = 0; i < mesh->mNumVertices; i++ )
+		{
+			vec3 v = assimp_vec3_cast( mesh->mVertices[i] );
+			vec3 n = glm::normalize( assimp_vec3_cast( mesh->mNormals[i] ) );
+			vec3 t = glm::normalize( assimp_vec3_cast( mesh->mTangents[i] ) );
+			vec3 b = glm::normalize( assimp_vec3_cast( mesh->mBitangents[i] ) );
+			vec2 s = assimp_st_cast( mesh->mTextureCoords[0][i] );
+
+			glm::vec3 t_i = glm::normalize( t - n * glm::dot( n, t ) );
+			float det = ( glm::dot( glm::cross( n, t ), b ) );
+			det = ( det < 0.0f ? -1.0f : 1.0f );
+			nv::vec4 vt( t_i[0], t_i[1], t_i[2], det );
+			if ( skinned )
+				reinterpret_cast<assimp_skinned_vtx*>( cdata )[i] = assimp_skinned_vtx( v, s, n, vt );
+			else
+				reinterpret_cast<assimp_plain_vtx*>( cdata )[i] = assimp_plain_vtx( v, s, n, vt );
+		}
 
 	if ( skinned )
@@ -179,4 +180,5 @@
 		}
 	}
+	data->add_channel( channel.release() );
 	data->add_channel( ichannel.release() );
 }
Index: trunk/src/formats/md5_loader.cc
===================================================================
--- trunk/src/formats/md5_loader.cc	(revision 413)
+++ trunk/src/formats/md5_loader.cc	(revision 415)
@@ -137,5 +137,4 @@
 			assert( m_type == MESH );
 			mesh_data* mesh = new mesh_data("md5_mesh");
-			raw_data_channel* ch_pntiw = nullptr;
 
 			uint32 num_verts   = 0;
@@ -160,7 +159,7 @@
 					md5_vtx_t* tdata = nullptr;
 					{
-						data_channel_creator<md5_vtx_pnt> ch_pnt( num_verts );
-						data_channel_creator<md5_vtx_t>   ch_t( num_verts );
-						ch_pntiw = raw_data_channel::create<md5_vtx_pntiw>( num_verts );
+						data_channel_creator<md5_vtx_pnt>   ch_pnt( num_verts );
+						data_channel_creator<md5_vtx_t>     ch_t( num_verts );
+						data_channel_creator<md5_vtx_pntiw> ch_pntiw( num_verts );
 						tdata = ch_t.data();
 						mesh->add_channel( ch_pnt.release() );
@@ -168,5 +167,5 @@
 						// TODO: hack to prevent rendering
 						//ch_pntiw->m_count = 0;
-						mesh->add_channel( ch_pntiw );
+						mesh->add_channel( ch_pntiw.release() );
 					}
 					weight_info.resize( num_verts );
@@ -236,5 +235,5 @@
 			}
 
-			prepare_mesh( reinterpret_cast< md5_vtx_pntiw* >( const_cast< uint8* >( ch_pntiw->raw_data() ) ), nodes, weight_info.size(), mesh, weights.data(), weight_info.data() );
+			prepare_mesh( nodes, weight_info.size(), mesh, weights.data(), weight_info.data() );
 
 			m_meshes[ num_meshes ] = mesh;
@@ -258,5 +257,6 @@
 				nodes[i].target_id = -1;
 				nodes[i].data      = new key_data;
-				nodes[i].data->add_channel( raw_data_channel::create< md5_key_t >( num_frames ) );
+				data_channel_creator< md5_key_t > fc( num_frames );
+				nodes[i].data->add_channel( fc.release() );
 				next_line( sstream ); 
 			}
@@ -335,9 +335,11 @@
 }
 
-bool md5_loader::prepare_mesh( md5_vtx_pntiw* vtx_data, mesh_node_data* nodes, uint32 vtx_count, mesh_data* mdata, md5_weight* weights, md5_weight_info* weight_info )
+bool md5_loader::prepare_mesh( mesh_node_data* nodes, uint32 vtx_count, mesh_data* mdata, md5_weight* weights, md5_weight_info* weight_info )
 {
 	assert( m_type == MESH );
-	data_channel_creator< md5_vtx_pnt > pnt( const_cast< raw_data_channel* >( mdata->get_channel< md5_vtx_pnt >() ) );
-	md5_vtx_pnt* vtcs       = pnt.data(); 
+	data_channel_creator< md5_vtx_pnt >   pnt  ( const_cast< raw_data_channel* >( mdata->get_channel< md5_vtx_pnt >() ) );
+	data_channel_creator< md5_vtx_pntiw > pntiw( const_cast< raw_data_channel* >( mdata->get_channel< md5_vtx_pntiw >() ) );
+	md5_vtx_pntiw* vtx_data = pntiw.data();
+	md5_vtx_pnt* vtcs = pnt.data();
 
 	for ( uint32 i = 0; i < vtx_count; ++i )
@@ -488,5 +490,5 @@
 			const transform* ptv = reinterpret_cast< const transform* >( pjoint.data->get_channel(0)->raw_data() );
 			transform ptr;
-			if ( pjoint.data->get_channel(0)->element_count() > index ) ptr = ptv[ index ];
+			if ( pjoint.data->get_channel(0)->size() > index ) ptr = ptv[ index ];
 			vec3 rot_pos = ptr.get_orientation() * pos;
 
Index: trunk/src/formats/nmd_loader.cc
===================================================================
--- trunk/src/formats/nmd_loader.cc	(revision 413)
+++ trunk/src/formats/nmd_loader.cc	(revision 415)
@@ -189,7 +189,7 @@
 		nmd_stream_header sheader;
 		sheader.format = chan->descriptor();
-		sheader.count  = chan->element_count();
+		sheader.count  = chan->size();
 		stream_out.write( &sheader, sizeof( sheader ), 1 );
-		stream_out.write( chan->raw_data(), chan->element_size(), chan->element_count() );
+		stream_out.write( chan->raw_data(), chan->element_size(), chan->size() );
 	}
 }
@@ -257,7 +257,7 @@
 			nmd_stream_header cheader;
 			cheader.format    = channel->descriptor();
-			cheader.count     = channel->element_count();
+			cheader.count     = channel->size();
 			stream_out.write( &cheader, sizeof( cheader ), 1 );
-			stream_out.write( channel->raw_data(), channel->element_size(), channel->element_count() );
+			stream_out.write( channel->raw_data(), channel->element_size(), channel->size() );
 		}
 	}
