Changeset 427 for trunk/src/formats/nmd_loader.cc
- Timestamp:
- 07/20/15 13:25:20 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/formats/nmd_loader.cc
r425 r427 71 71 72 72 m_node_data = nullptr; 73 m_node_array = nullptr;74 73 } 75 74 … … 100 99 nmd_animation_header animation_header; 101 100 source.read( &animation_header, sizeof( animation_header ), 1 ); 102 m_node_ array = new mesh_node_data[ e.children ];101 m_node_data = new mesh_nodes_data( e.name, animation_header.frame_rate, animation_header.duration, animation_header.flat ); 103 102 for ( uint32 i = 0; i < e.children; ++i ) 104 103 { … … 107 106 skip_attributes( source, element_header.attributes ); 108 107 NV_ASSERT( element_header.type == nmd_type::NODE, "NODE expected!" ); 109 m_node_array[i].data= data_channel_set_creator::create_set( element_header.children );110 load_channel_set( source, m_node_array[i].data, element_header );111 }112 m_node_data = new mesh_nodes_data( e.name, e.children, m_node_array, animation_header.frame_rate, animation_header.duration, animation_header.flat );108 data_channel_set* set = data_channel_set_creator::create_set( element_header.children ); 109 load_channel_set( source, set, element_header ); 110 m_node_data->push_back( set ); 111 } 113 112 return true; 114 113 } … … 144 143 mesh_nodes_data* result = m_node_data; 145 144 m_node_data = nullptr; 146 m_node_array = nullptr;147 145 return result; 148 146 } … … 153 151 // nmd format dump 154 152 // HACK : TEMPORARY - will go to it's own file, probably nmd_io 155 static void nmd_dump_channel( const raw_data_channel* channel , stream& stream_out )156 {157 nmd_channel_header sheader;158 sheader.format = channel->descriptor();159 sheader.count = channel->size();160 stream_out.write( &sheader, sizeof( sheader ), 1 );161 stream_out.write( channel->raw_data(), channel->element_size(), channel->size() );162 }163 164 static void nmd_dump_channel_set( const data_channel_set* channel_set, stream& stream_out )165 {166 for ( auto& channel : *channel_set )167 {168 nmd_dump_channel( &channel, stream_out );169 }170 }171 172 static void nmd_dump_node( const mesh_node_data* node, stream& stream_out )173 {174 uint32 chan_size = 0;175 uint32 chan_count = ( node->data ? node->data->size() : 0 );176 for ( uint32 c = 0; c < chan_count; ++c )177 {178 chan_size += sizeof( nmd_channel_header );179 chan_size += node->data->get_channel( c )->raw_size();180 }181 182 nmd_element_header eheader;183 eheader.type = nmd_type::NODE;184 eheader.children = static_cast<uint16>( chan_count );185 eheader.size = chan_size;186 eheader.name = node->data->get_name();187 eheader.parent_id = node->data->get_parent_id();188 eheader.transform = node->data->get_transform();189 eheader.attributes = 0;190 stream_out.write( &eheader, sizeof( eheader ), 1 );191 if ( chan_count > 0 ) nmd_dump_channel_set( node->data, stream_out );192 }193 153 194 154 void nv::nmd_dump_header( stream& stream_out, uint32 elements, uint64 name ) … … 203 163 } 204 164 205 void nv::nmd_dump_ mesh( stream& stream_out, const data_channel_set& mesh)165 void nv::nmd_dump_element( stream& stream_out, const data_channel_set& data, nmd_type type ) 206 166 { 207 167 uint32 size = 0; 208 for ( auto& chan : mesh)168 for ( auto& chan : data ) 209 169 { 210 170 size += sizeof( nmd_channel_header ); … … 213 173 214 174 nmd_element_header eheader; 215 eheader.type = nmd_type::MESH;216 eheader.children = static_cast<uint16>( mesh.size() );175 eheader.type = type; 176 eheader.children = static_cast<uint16>( data.size() ); 217 177 eheader.size = size; 218 eheader.name = mesh.get_name();219 eheader.transform = mesh.get_transform();220 eheader.parent_id = mesh.get_parent_id();178 eheader.name = data.get_name(); 179 eheader.transform = data.get_transform(); 180 eheader.parent_id = data.get_parent_id(); 221 181 eheader.attributes = 0; 222 182 stream_out.write( &eheader, sizeof( eheader ), 1 ); 223 nmd_dump_channel_set( &mesh, stream_out ); 183 for ( auto& channel : data ) 184 { 185 nmd_channel_header cheader; 186 cheader.format = channel.descriptor(); 187 cheader.count = channel.size(); 188 stream_out.write( &cheader, sizeof( cheader ), 1 ); 189 stream_out.write( channel.raw_data(), channel.element_size(), channel.size() ); 190 } 224 191 } 225 192 … … 227 194 { 228 195 uint32 total = sizeof( nmd_animation_header ); 229 for ( uint32 i = 0; i < nodes.get_count(); ++i ) 230 { 231 const mesh_node_data* node = nodes.get_node( i ); 196 for ( auto node : nodes ) 197 { 232 198 total += sizeof( nmd_element_header ); 233 if ( node->data ) 234 for ( uint32 c = 0; c < node->data->size(); ++c ) 235 { 236 total += sizeof( nmd_channel_header ); 237 total += node->data->get_channel( c )->raw_size(); 238 } 199 for ( uint32 c = 0; c < node->size(); ++c ) 200 { 201 total += sizeof( nmd_channel_header ); 202 total += node->get_channel( c )->raw_size(); 203 } 239 204 } 240 205 … … 256 221 stream_out.write( &aheader, sizeof( aheader ), 1 ); 257 222 258 for ( uint32 i = 0; i < nodes.get_count(); ++i)259 { 260 nmd_dump_ node( nodes.get_node( i ), stream_out);223 for ( auto node : nodes ) 224 { 225 nmd_dump_element( stream_out, *node, nv::nmd_type::NODE ); 261 226 } 262 227 } … … 284 249 for ( uint32 i = 0; i < model->get_count(); ++i ) 285 250 { 286 nmd_dump_ mesh( stream_out, *model->get_mesh( i ));251 nmd_dump_element( stream_out, *model->get_mesh( i ), nv::nmd_type::MESH ); 287 252 } 288 253
Note: See TracChangeset
for help on using the changeset viewer.