Index: trunk/src/formats/assimp_loader.cc
===================================================================
--- trunk/src/formats/assimp_loader.cc	(revision 411)
+++ trunk/src/formats/assimp_loader.cc	(revision 412)
@@ -169,5 +169,5 @@
 	}
 
-	raw_data_channel* ichannel = raw_data_channel::create_index( USHORT, mesh->mNumFaces * 3 );
+	raw_data_channel* ichannel = raw_data_channel::create< index_u16 >( mesh->mNumFaces * 3 );
 	data->add_channel( ichannel );
 	uint16* indices = reinterpret_cast<uint16*>( ichannel->data );
@@ -317,5 +317,5 @@
 				raw_data_channel* channel = meshes[m].get_raw_channels()[0];
 				assimp_skinned_vtx* va = reinterpret_cast< assimp_skinned_vtx* >( channel->data );
-				for ( unsigned v = 0; v < channel->count; ++v )
+				for ( unsigned v = 0; v < channel->element_count(); ++v )
 				{
 					assimp_skinned_vtx& vertex = va[v];
Index: trunk/src/formats/md2_loader.cc
===================================================================
--- trunk/src/formats/md2_loader.cc	(revision 411)
+++ trunk/src/formats/md2_loader.cc	(revision 412)
@@ -357,5 +357,5 @@
 	}
 
-	raw_data_channel* ic = raw_data_channel::create_index< uint16 >( m_new_indexes.size() );
+	raw_data_channel* ic = raw_data_channel::create< index_u16 >( m_new_indexes.size() );
 	if ( m_new_indexes.size() > 0 )
 	{
Index: trunk/src/formats/md3_loader.cc
===================================================================
--- trunk/src/formats/md3_loader.cc	(revision 411)
+++ trunk/src/formats/md3_loader.cc	(revision 412)
@@ -354,5 +354,5 @@
 	raw_data_channel* mc_pn = raw_data_channel::create< vtx_md3_pn >( uint32( num_verts * frame_count ) );
 	raw_data_channel* mc_t  = raw_data_channel::create< vtx_md3_t >( uint32( num_verts ) );
-	raw_data_channel* ic = raw_data_channel::create_index< uint16 >( uint32( index_count ) );
+	raw_data_channel* ic = raw_data_channel::create< index_u16 >( uint32( index_count ) );
 	vtx_md3_pn* vtx_pn = reinterpret_cast< vtx_md3_pn* >( mc_pn->data );
 	vtx_md3_t*  vtx_t  = reinterpret_cast< vtx_md3_t* >( mc_t->data );
Index: trunk/src/formats/md5_loader.cc
===================================================================
--- trunk/src/formats/md5_loader.cc	(revision 411)
+++ trunk/src/formats/md5_loader.cc	(revision 412)
@@ -137,4 +137,5 @@
 			assert( m_type == MESH );
 			mesh_data* mesh = new mesh_data("md5_mesh");
+			raw_data_channel* ch_pntiw = nullptr;
 
 			uint32 num_verts   = 0;
@@ -161,10 +162,10 @@
 						raw_data_channel* ch_pnt = raw_data_channel::create<md5_vtx_pnt>( num_verts );
 						raw_data_channel* ch_t   = raw_data_channel::create<md5_vtx_t>( num_verts );
-						raw_data_channel* ch_pntiw = raw_data_channel::create<md5_vtx_pntiw>( num_verts );
+						ch_pntiw = raw_data_channel::create<md5_vtx_pntiw>( num_verts );
 						tdata = reinterpret_cast< md5_vtx_t* >( ch_t->data );
 						mesh->add_channel( ch_pnt );
 						mesh->add_channel( ch_t );
 						// TODO: hack to prevent rendering
-						ch_pntiw->count = 0;
+						//ch_pntiw->m_count = 0;
 						mesh->add_channel( ch_pntiw );
 					}
@@ -190,5 +191,5 @@
 					sstream >> num_tris;
 
-					raw_data_channel* ch_i = raw_data_channel::create_index<uint32>( num_tris * 3 );
+					raw_data_channel* ch_i = raw_data_channel::create<index_u32>( num_tris * 3 );
 					uint32* vtx_i                = reinterpret_cast< uint32* >( ch_i->data );
 					uint32 idx = 0;
@@ -234,5 +235,5 @@
 			}
 
-			prepare_mesh( nodes, weight_info.size(), mesh, weights.data(), weight_info.data() );
+			prepare_mesh( reinterpret_cast< md5_vtx_pntiw* >( ch_pntiw->data ), nodes, weight_info.size(), mesh, weights.data(), weight_info.data() );
 
 			m_meshes[ num_meshes ] = mesh;
@@ -333,9 +334,8 @@
 }
 
-bool md5_loader::prepare_mesh( mesh_node_data* nodes, uint32 vtx_count, mesh_data* mdata, md5_weight* weights, md5_weight_info* weight_info )
+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 )
 {
 	assert( m_type == MESH );
 	md5_vtx_pnt* vtcs       = reinterpret_cast< md5_vtx_pnt* >( mdata->get_channel< md5_vtx_pnt >()->data ); 
-	md5_vtx_pntiw* vtx_data = reinterpret_cast< md5_vtx_pntiw* >( mdata->get_channel< md5_vtx_pntiw >()->data );
 
 	for ( uint32 i = 0; i < vtx_count; ++i )
@@ -486,5 +486,5 @@
 			const transform* ptv = reinterpret_cast< const transform* >( pjoint.data->get_channel(0)->data );
 			transform ptr;
-			if ( pjoint.data->get_channel(0)->count > index ) ptr = ptv[ index ];
+			if ( pjoint.data->get_channel(0)->element_count() > 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 411)
+++ trunk/src/formats/nmd_loader.cc	(revision 412)
@@ -129,5 +129,5 @@
 				source.read( &cheader, sizeof( cheader ), 1 );
 				raw_data_channel* channel = raw_data_channel::create( cheader.format, cheader.count );
-				source.read( channel->data, channel->desc.element_size(), channel->count );
+				source.read( channel->data, channel->element_size(), channel->element_count() );
 				kdata->add_channel( channel );
 			}
@@ -168,5 +168,5 @@
 	{
 		size += sizeof( nmd_element_header ) + sizeof( nmd_stream_header );
-		size += chan->size();
+		size += chan->raw_size();
 	}
 
@@ -184,12 +184,12 @@
 		cheader.type     = nmd_type::STREAM;
 		cheader.children = 0;
-		cheader.size     = chan->size() + sizeof( nmd_stream_header );
+		cheader.size     = chan->raw_size() + sizeof( nmd_stream_header );
 		stream_out.write( &cheader, sizeof( cheader ), 1 );
 
 		nmd_stream_header sheader;
-		sheader.format = chan->desc;
-		sheader.count  = chan->count;
+		sheader.format = chan->descriptor();
+		sheader.count  = chan->element_count();
 		stream_out.write( &sheader, sizeof( sheader ), 1 );
-		stream_out.write( chan->data, chan->desc.element_size(), chan->count );
+		stream_out.write( chan->raw_data(), chan->element_size(), chan->element_count() );
 	}
 }
@@ -206,5 +206,5 @@
 			{
 				total += sizeof( nmd_element_header ) + sizeof( nmd_stream_header );
-				total += node->data->get_channel(c)->size();
+				total += node->data->get_channel(c)->raw_size();
 			}
 	}
@@ -231,5 +231,5 @@
 		{
 			chan_size += sizeof( nmd_element_header ) + sizeof( nv::nmd_stream_header );
-			chan_size += node->data->get_channel(c)->size();
+			chan_size += node->data->get_channel(c)->raw_size();
 		}
 
@@ -252,12 +252,12 @@
 			eheader.type     = nmd_type::KEY_CHANNEL;
 			eheader.children = 0;
-			eheader.size     = sizeof( nmd_stream_header ) + channel->size();
+			eheader.size     = sizeof( nmd_stream_header ) + channel->raw_size();
 			stream_out.write( &eheader, sizeof( eheader ), 1 );
 
 			nmd_stream_header cheader;
-			cheader.format    = channel->desc;
-			cheader.count     = channel->count;
+			cheader.format    = channel->descriptor();
+			cheader.count     = channel->element_count();
 			stream_out.write( &cheader, sizeof( cheader ), 1 );
-			stream_out.write( channel->data, channel->desc.element_size(), channel->count );
+			stream_out.write( channel->raw_data(), channel->element_size(), channel->element_count() );
 		}
 	}
Index: trunk/src/formats/obj_loader.cc
===================================================================
--- trunk/src/formats/obj_loader.cc	(revision 411)
+++ trunk/src/formats/obj_loader.cc	(revision 412)
@@ -324,15 +324,9 @@
 		}
 	
-		raw_data_channel* channel = new raw_data_channel();
-		nv::uint8* data = nullptr;
-
-		if ( reader->raw_size() > 0 ) 
-		{
-			data = new uint8[ reader->raw_size() ];
-			raw_copy_n( reader->raw_pointer(), reader->raw_size(), data );
-		}
-		channel->data  = data;
-		channel->desc  = m_descriptor;
-		channel->count = reader->size * 3;
+		raw_data_channel* channel = raw_data_channel::create( m_descriptor, reader->size * 3 );
+		if ( reader->raw_size() > 0 )
+		{
+			raw_copy_n( reader->raw_pointer(), reader->raw_size(), channel->data );
+		}
 
 		mesh_data* mesh = new mesh_data(reader->name);
