Changeset 482 for trunk/src/formats/nmd_loader.cc
- Timestamp:
- 11/12/15 19:02:08 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/formats/nmd_loader.cc
r480 r482 37 37 { 38 38 data_channel_set* mesh = data_channel_set_creator::create_set( e.children ); 39 load_channel_set( source, mesh, e ); 39 data_node_info info; 40 load_channel_set( source, mesh, info, e ); 40 41 // m_mesh_names.push_back( e.name ); 42 m_infos.push_back( info ); 41 43 m_meshes.push_back( mesh ); 42 44 return true; 43 45 } 44 46 45 data_channel_set* nv::nmd_loader::release_mesh_data( size_t index )47 data_channel_set* nv::nmd_loader::release_mesh_data( size_t index, data_node_info& info ) 46 48 { 47 49 data_channel_set* result = m_meshes[ index ]; 50 info = m_infos[ index ]; 48 51 m_meshes[ index ] = nullptr; 49 52 return result; … … 54 57 for ( auto mesh : m_meshes ) if ( mesh ) delete mesh; 55 58 if ( m_node_data ) delete m_node_data; 59 if ( m_bone_data ) delete m_bone_data; 56 60 m_meshes.clear(); 57 61 58 m_node_data = nullptr; 62 m_node_data = nullptr; 63 m_bone_data = nullptr; 59 64 } 60 65 … … 85 90 nmd_animation_header animation_header; 86 91 source.read( &animation_header, sizeof( animation_header ), 1 ); 87 m_node_data = new mesh_nodes_data( e.name, animation_header.frame_rate, animation_header.frame_count, animation_header.flat ); 92 m_node_data = new mesh_nodes_data( e.name, animation_header.frame_rate, animation_header.frame_count ); 93 m_bone_data = new data_node_list( e.name ); 88 94 for ( uint32 i = 0; i < e.children; ++i ) 89 95 { … … 93 99 NV_ASSERT( element_header.type == nmd_type::NODE, "NODE expected!" ); 94 100 data_channel_set* set = data_channel_set_creator::create_set( element_header.children ); 95 load_channel_set( source, set, element_header ); 96 m_node_data->append( set ); 101 data_node_info info; 102 load_channel_set( source, set, info, element_header ); 103 m_bone_data->append( info ); 104 m_node_data->append( set, info ); 97 105 } 98 106 m_node_data->initialize(); … … 110 118 } 111 119 112 bool nv::nmd_loader::load_channel_set( stream& source, data_channel_set* channel_set, const nmd_element_header& e )120 bool nv::nmd_loader::load_channel_set( stream& source, data_channel_set* channel_set, data_node_info& info, const nmd_element_header& e ) 113 121 { 114 122 data_channel_set_creator kaccess( channel_set ); … … 117 125 load_channel( source, channel_set ); 118 126 } 119 data_channel_set_creator access( channel_set ); 120 access.set_name( e.name ); 121 access.set_parent_id( e.parent_id ); 122 access.set_transform( e.transform ); 127 info.name = e.name; 128 info.parent_id = e.parent_id; 129 info.transform = e.transform; 123 130 return true; 124 131 } … … 126 133 mesh_nodes_data* nv::nmd_loader::release_mesh_nodes_data( size_t ) 127 134 { 128 if ( m_node_data ) 129 { 130 mesh_nodes_data* result = m_node_data; 131 m_node_data = nullptr; 132 return result; 133 } 134 return nullptr; 135 mesh_nodes_data* result = m_node_data; 136 m_node_data = nullptr; 137 return result; 138 } 139 140 data_node_list* nv::nmd_loader::release_data_node_list( size_t ) 141 { 142 data_node_list* result = m_bone_data; 143 m_bone_data = nullptr; 144 return result; 145 } 146 147 bool nv::nmd_loader::is_animated( size_t /*= 0 */ ) 148 { 149 if ( !m_node_data ) return false; 150 return m_node_data->is_animated(); 135 151 } 136 152 … … 150 166 } 151 167 152 void nv::nmd_dump_element( stream& stream_out, const data_channel_set& data, nmd_type type )168 void nv::nmd_dump_element( stream& stream_out, const data_channel_set& data, const data_node_info& info, nmd_type type ) 153 169 { 154 170 uint32 size = 0; … … 163 179 eheader.children = static_cast<uint16>( data.size() ); 164 180 eheader.size = size; 165 eheader.name = data.get_name();166 eheader.transform = data.get_transform();167 eheader.parent_id = data.get_parent_id();181 eheader.name = info.name; 182 eheader.transform = info.transform; 183 eheader.parent_id = info.parent_id; 168 184 eheader.attributes = 0; 169 185 stream_out.write( &eheader, sizeof( eheader ), 1 ); … … 205 221 aheader.frame_rate = nodes.get_fps(); 206 222 aheader.frame_count = nodes.get_frame_count(); 207 aheader. flat = nodes.is_flat();223 aheader.unused = false; 208 224 stream_out.write( &aheader, sizeof( aheader ), 1 ); 209 225 226 for ( uint32 i = 0; i < nodes.size(); ++i ) 227 { 228 nmd_dump_element( stream_out, *nodes[i], nodes.get_info(i), nv::nmd_type::NODE ); 229 } 230 } 231 232 void nv::nmd_dump_bones( stream& stream_out, const data_node_list& nodes ) 233 { 234 uint32 total = sizeof( nmd_animation_header ); 210 235 for ( auto node : nodes ) 211 236 { 212 nmd_dump_element( stream_out, *node, nv::nmd_type::NODE ); 237 total += sizeof( nmd_element_header ); 238 } 239 240 nmd_element_header header; 241 header.type = nmd_type::ANIMATION; 242 header.children = static_cast<uint16>( nodes.size() ); 243 header.size = total; 244 header.name = nodes.get_name(); 245 header.transform = mat4(); 246 header.parent_id = -1; 247 header.attributes = 0; 248 249 stream_out.write( &header, sizeof( header ), 1 ); 250 251 nmd_animation_header aheader; 252 aheader.frame_rate = 0; 253 aheader.frame_count = 0; 254 aheader.unused = false; 255 stream_out.write( &aheader, sizeof( aheader ), 1 ); 256 257 for ( auto node : nodes ) 258 { 259 nmd_element_header eheader; 260 eheader.type = nv::nmd_type::NODE; 261 eheader.children = 0; 262 eheader.size = 0; 263 eheader.name = node.name; 264 eheader.transform = node.transform; 265 eheader.parent_id = node.parent_id; 266 eheader.attributes = 0; 267 stream_out.write( &eheader, sizeof( eheader ), 1 ); 213 268 } 214 269 } … … 227 282 } 228 283 229 void nv::nmd_dump( stream& stream_out, array_view< data_channel_set* > meshes, const mesh_nodes_data* nodes, const string_table* strings /*= nullptr*/, uint64 name /*= 0 */ )284 void nv::nmd_dump( stream& stream_out, array_view< data_channel_set* > meshes, array_view< data_node_info > infos, const mesh_nodes_data* nodes, const string_table* strings /*= nullptr*/, uint64 name /*= 0 */ ) 230 285 { 231 286 uint32 elements = ( strings ? 1 : 0 ) // +1 string array … … 237 292 { 238 293 NV_ASSERT( meshes[i], "mesh is null!" ); 239 nmd_dump_element( stream_out, *meshes[i], nv::nmd_type::MESH );294 nmd_dump_element( stream_out, *meshes[i], infos[i], nv::nmd_type::MESH ); 240 295 } 241 296 … … 243 298 { 244 299 nmd_dump_nodes( stream_out, *nodes ); 300 } 301 302 if ( strings ) 303 { 304 nmd_dump_strings( stream_out, *strings ); 305 } 306 } 307 308 void nv::nmd_dump( stream& stream_out, array_view< data_channel_set* > meshes, array_view< data_node_info > infos, const nv::data_node_list* nodes, const string_table* strings /*= nullptr*/, uint64 name /*= 0 */ ) 309 { 310 uint32 elements = ( strings ? 1 : 0 ) // +1 string array 311 + meshes.size() // meshes 312 + ( nodes && nodes->size() > 0 ? 1 : 0 ); // nodes 313 nmd_dump_header( stream_out, elements, name ); 314 315 for ( uint32 i = 0; i < meshes.size(); ++i ) 316 { 317 NV_ASSERT( meshes[i], "mesh is null!" ); 318 nmd_dump_element( stream_out, *meshes[i], infos[i], nv::nmd_type::MESH ); 319 } 320 321 if ( nodes && nodes->size() > 0 ) 322 { 323 nmd_dump_bones( stream_out, *nodes ); 245 324 } 246 325
Note: See TracChangeset
for help on using the changeset viewer.