Ignore:
Timestamp:
11/12/15 19:02:08 (10 years ago)
Author:
epyon
Message:
  • skeletal animation updated
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/formats/nmd_loader.cc

    r480 r482  
    3737{
    3838        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 );
    4041//      m_mesh_names.push_back( e.name );
     42        m_infos.push_back( info );
    4143        m_meshes.push_back( mesh );
    4244        return true;
    4345}
    4446
    45 data_channel_set* nv::nmd_loader::release_mesh_data( size_t index )
     47data_channel_set* nv::nmd_loader::release_mesh_data( size_t index, data_node_info& info )
    4648{
    4749        data_channel_set* result = m_meshes[ index ];
     50        info = m_infos[ index ];
    4851        m_meshes[ index ] = nullptr;
    4952        return result;
     
    5457        for ( auto mesh : m_meshes ) if ( mesh ) delete mesh;
    5558        if ( m_node_data ) delete m_node_data;
     59        if ( m_bone_data ) delete m_bone_data;
    5660        m_meshes.clear();
    5761
    58         m_node_data  = nullptr;
     62        m_node_data = nullptr;
     63        m_bone_data = nullptr;
    5964}
    6065
     
    8590        nmd_animation_header animation_header;
    8691        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 );
    8894        for ( uint32 i = 0; i < e.children; ++i )
    8995        {
     
    9399                NV_ASSERT( element_header.type == nmd_type::NODE, "NODE expected!" );
    94100                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 );
    97105        }
    98106        m_node_data->initialize();
     
    110118}
    111119
    112 bool nv::nmd_loader::load_channel_set( stream& source, data_channel_set* channel_set, const nmd_element_header& e )
     120bool nv::nmd_loader::load_channel_set( stream& source, data_channel_set* channel_set, data_node_info& info, const nmd_element_header& e )
    113121{
    114122        data_channel_set_creator kaccess( channel_set );
     
    117125                load_channel( source, channel_set );
    118126        }
    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;
    123130        return true;
    124131}
     
    126133mesh_nodes_data* nv::nmd_loader::release_mesh_nodes_data( size_t )
    127134{
    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
     140data_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
     147bool nv::nmd_loader::is_animated( size_t /*= 0 */ )
     148{
     149        if ( !m_node_data ) return false;
     150        return m_node_data->is_animated();
    135151}
    136152
     
    150166}
    151167
    152 void nv::nmd_dump_element( stream& stream_out, const data_channel_set& data, nmd_type type )
     168void nv::nmd_dump_element( stream& stream_out, const data_channel_set& data, const data_node_info& info, nmd_type type )
    153169{
    154170        uint32 size = 0;
     
    163179        eheader.children   = static_cast<uint16>( data.size() );
    164180        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;
    168184        eheader.attributes = 0;
    169185        stream_out.write( &eheader, sizeof( eheader ), 1 );
     
    205221        aheader.frame_rate  = nodes.get_fps();
    206222        aheader.frame_count = nodes.get_frame_count();
    207         aheader.flat = nodes.is_flat();
     223        aheader.unused      = false;
    208224        stream_out.write( &aheader, sizeof( aheader ), 1 );
    209225
     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
     232void nv::nmd_dump_bones( stream& stream_out, const data_node_list& nodes )
     233{
     234        uint32 total = sizeof( nmd_animation_header );
    210235        for ( auto node : nodes )
    211236        {
    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 );
    213268        }
    214269}
     
    227282}
    228283
    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 */ )
     284void 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 */ )
    230285{
    231286        uint32 elements = ( strings ? 1 : 0 ) // +1 string array
     
    237292        {
    238293                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 );
    240295        }
    241296
     
    243298        {
    244299                nmd_dump_nodes( stream_out, *nodes );
     300        }
     301
     302        if ( strings )
     303        {
     304                nmd_dump_strings( stream_out, *strings );
     305        }
     306}
     307
     308void 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 );
    245324        }
    246325
Note: See TracChangeset for help on using the changeset viewer.