Changeset 423 for trunk/src/formats/nmd_loader.cc
- Timestamp:
- 07/16/15 19:24:30 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/formats/nmd_loader.cc
r421 r423 28 28 case nmd_type::MESH : load_mesh( source, element_header ); break; 29 29 case nmd_type::ANIMATION : load_animation( source, element_header ); break; 30 // case nmd_type::STRING_TABLE: load_strings( source ); break;30 case nmd_type::STRINGS : load_strings( source ); break; 31 31 default: NV_ASSERT( false, "UNKNOWN NMD ELEMENT!" ); break; 32 32 } … … 68 68 { 69 69 for ( auto mesh : m_meshes ) if ( mesh ) delete mesh; 70 //if ( m_strings ) delete m_strings;70 if ( m_strings ) delete m_strings; 71 71 if ( m_node_data ) delete m_node_data; 72 72 m_meshes.clear(); … … 76 76 m_node_data = nullptr; 77 77 m_node_array = nullptr; 78 //m_strings = nullptr;78 m_strings = nullptr; 79 79 } 80 80 … … 90 90 } 91 91 92 bool nv::nmd_loader::load_strings( stream& /*source*/ ) 93 { 94 // NV_ASSERT( m_strings == nullptr, "MULTIPLE STRING ENTRIES!" ); 95 // m_strings = new string_table( &source ); 92 bool nv::nmd_loader::load_strings( stream& source ) 93 { 94 NV_ASSERT( m_strings == nullptr, "MULTIPLE STRING ENTRIES!" ); 95 // TODO: load strings optionally 96 m_strings = new string_table( source ); 96 97 return true; 97 98 } … … 112 113 load_node( source, &m_node_array[i], element_header ); 113 114 } 114 m_node_data = new mesh_nodes_data( "animation", e.children, m_node_array, animation_header.frame_rate, animation_header.duration, animation_header.flat );115 m_node_data = new mesh_nodes_data( e.name, e.children, m_node_array, animation_header.frame_rate, animation_header.duration, animation_header.flat ); 115 116 return true; 116 117 } … … 118 119 bool nv::nmd_loader::load_node( stream& source, mesh_node_data* data, const nmd_element_header& e ) 119 120 { 120 data->name _hash = e.name_hash;121 data->name = e.name; 121 122 data->parent_id = e.parent_id; 122 123 data->transform = e.transform; … … 190 191 } 191 192 192 static void nmd_dump_mesh( const data_channel_set* mesh, stream& stream_out )193 {194 uint32 size = 0;195 for ( auto& chan : *mesh )196 {197 size += sizeof( nmd_channel_header );198 size += chan.raw_size();199 }200 201 nmd_element_header eheader;202 eheader.type = nmd_type::MESH;203 // eheader.name = 0;204 eheader.children = static_cast< uint16 >( mesh->size() );205 eheader.size = size;206 eheader.name_hash = 0;207 eheader.transform = mat4();208 eheader.parent_id = -1;209 eheader.attributes = 0;210 stream_out.write( &eheader, sizeof( eheader ), 1 );211 nmd_dump_channel_set( mesh, stream_out );212 }213 214 193 static void nmd_dump_node( const mesh_node_data* node, stream& stream_out ) 215 194 { … … 227 206 eheader.children = static_cast<uint16>( chan_count ); 228 207 eheader.size = chan_size; 229 eheader.name _hash = node->name_hash;208 eheader.name = node->name; 230 209 eheader.parent_id = node->parent_id; 231 210 eheader.transform = node->transform; … … 235 214 } 236 215 237 static void nmd_dump_nodes_data( const mesh_nodes_data* nodes, stream& stream_out, string_table_creator* /*strings*/ ) 216 void nv::nmd_dump_header( stream& stream_out, uint32 elements, uint64 name ) 217 { 218 nmd_header header; 219 header.id = four_cc<'n', 'm', 'f', '1'>::value; 220 header.elements = elements; // +1 string array 221 header.name = name; 222 header.version = 1; 223 header.attributes = 0; 224 stream_out.write( &header, sizeof( header ), 1 ); 225 } 226 227 void nv::nmd_dump_mesh( stream& stream_out, const data_channel_set& mesh ) 228 { 229 uint32 size = 0; 230 for ( auto& chan : mesh ) 231 { 232 size += sizeof( nmd_channel_header ); 233 size += chan.raw_size(); 234 } 235 236 nmd_element_header eheader; 237 eheader.type = nmd_type::MESH; 238 eheader.children = static_cast<uint16>( mesh.size() ); 239 eheader.size = size; 240 int uncomment; 241 // eheader.name = mesh.get_name(); 242 // eheader.transform = mesh.get_transform(); 243 // eheader.parent_id = mesh.get_parent_id(); 244 eheader.name = 0; 245 eheader.transform = mat4(); 246 eheader.parent_id = -1; 247 eheader.attributes = 0; 248 stream_out.write( &eheader, sizeof( eheader ), 1 ); 249 nmd_dump_channel_set( &mesh, stream_out ); 250 } 251 252 void nv::nmd_dump_nodes( stream& stream_out, const mesh_nodes_data& nodes ) 238 253 { 239 254 uint32 total = sizeof( nmd_animation_header ); 240 for ( uint32 i = 0; i < nodes ->get_count(); ++i )241 { 242 const mesh_node_data* node = nodes ->get_node(i);255 for ( uint32 i = 0; i < nodes.get_count(); ++i ) 256 { 257 const mesh_node_data* node = nodes.get_node( i ); 243 258 total += sizeof( nmd_element_header ); 244 259 if ( node->data ) … … 246 261 { 247 262 total += sizeof( nmd_channel_header ); 248 total += node->data->get_channel( c)->raw_size();263 total += node->data->get_channel( c )->raw_size(); 249 264 } 250 265 } 251 266 252 267 nmd_element_header header; 253 // header.name = 0; 254 header.type = nmd_type::ANIMATION; 255 header.children = static_cast< uint16 >( nodes->get_count() ); 256 header.size = total; 257 header.name_hash = 0; 258 header.transform = mat4(); 259 header.parent_id = -1; 268 header.type = nmd_type::ANIMATION; 269 header.children = static_cast<uint16>( nodes.get_count() ); 270 header.size = total; 271 header.name = nodes.get_name(); 272 header.transform = mat4(); 273 header.parent_id = -1; 260 274 header.attributes = 0; 261 275 … … 263 277 264 278 nmd_animation_header aheader; 265 aheader.frame_rate = nodes->get_frame_rate();266 aheader.duration = nodes->get_duration();267 aheader.flat = nodes->is_flat();279 aheader.frame_rate = nodes.get_frame_rate(); 280 aheader.duration = nodes.get_duration(); 281 aheader.flat = nodes.is_flat(); 268 282 stream_out.write( &aheader, sizeof( aheader ), 1 ); 269 283 270 for ( uint32 i = 0; i < nodes->get_count(); ++i ) 271 { 272 nmd_dump_node( nodes->get_node( i ), stream_out ); 273 } 274 } 275 276 void nv::nmd_dump( const mesh_data_pack* model, stream& stream_out ) 277 { 278 string_table_creator strings; 279 { 280 nmd_header header; 281 header.id = four_cc<'n','m','f','1'>::value; 282 header.elements = 0; // +1 string array 283 header.elements += model->get_count(); 284 if ( model->get_nodes() && model->get_nodes()->get_count() > 0 ) 285 header.elements += 1;// +1 bone array 286 header.version = 1; 287 header.attributes = 0; 288 stream_out.write( &header, sizeof( header ), 1 ); 289 } 284 for ( uint32 i = 0; i < nodes.get_count(); ++i ) 285 { 286 nmd_dump_node( nodes.get_node( i ), stream_out ); 287 } 288 } 289 290 void nv::nmd_dump_strings( stream& stream_out, const string_table& strings ) 291 { 292 nmd_element_header sheader; 293 sheader.type = nv::nmd_type::STRINGS; 294 sheader.children = 0; 295 sheader.size = strings.dump_size(); 296 sheader.name = 0; 297 sheader.parent_id = -1; 298 sheader.attributes = 0; 299 stream_out.write( &sheader, sizeof( sheader ), 1 ); 300 strings.dump( stream_out ); 301 } 302 303 void nv::nmd_dump( stream& stream_out, const mesh_data_pack* model, const string_table* strings, uint64 name ) 304 { 305 uint32 elements = ( strings ? 1 : 0 ) // +1 string array 306 + model->get_count() // meshes 307 + ( model->get_node_count() > 0 ? 1 : 0 ); // nodes 308 nmd_dump_header( stream_out, elements, name ); 290 309 291 310 for ( uint32 i = 0; i < model->get_count(); ++i ) 292 311 { 293 const data_channel_set* mesh = model->get_mesh(i); 294 nmd_dump_mesh( mesh, stream_out ); 295 } 296 297 if ( model->get_nodes() && model->get_nodes()->get_count() > 0 ) 298 { 299 nmd_dump_nodes_data( model->get_nodes(), stream_out, &strings ); 300 } 301 302 // nmd_element_header sheader; 303 // sheader.type = nv::nmd_type::STRING_TABLE; 304 // sheader.name = 0; 305 // sheader.size = strings.dump_size(); 306 // sheader.children = 0; 307 // sheader.attributes = 0; 308 // stream_out.write( &sheader, sizeof( sheader ), 1 ); 309 // strings.dump( &stream_out ); 310 } 312 nmd_dump_mesh( stream_out, *model->get_mesh( i ) ); 313 } 314 315 if ( model->get_node_count() > 0 ) 316 { 317 nmd_dump_nodes( stream_out, *model->get_nodes() ); 318 } 319 320 if ( strings ) 321 { 322 nmd_dump_strings( stream_out, *strings ); 323 } 324 }
Note: See TracChangeset
for help on using the changeset viewer.