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/gfx/skeleton_instance.cc

    r481 r482  
    99#include "nv/core/profiler.hh"
    1010
    11 void nv::skeleton_binding::prepare( const mesh_nodes_data* node_data, const mesh_nodes_data* bone_data )
     11void nv::skeleton_binding::prepare( const mesh_nodes_data* node_data, const data_node_list& bone_data )
    1212{
    1313        if ( m_indices.empty() )
     
    1616                hash_store< shash64, uint16 > bone_names;
    1717                m_indices.resize( node_data->size() );
    18                
    19                 for ( nv::uint16 bi = 0; bi < bone_data->size(); ++bi )
    20                 {
    21                         const data_channel_set* bone = ( *bone_data )[bi];
    22                         bone_names[bone->get_name()] = bi;
    23                 }
     18
     19                for ( nv::uint16 bi = 0; bi < bone_data.size(); ++bi )
     20                        bone_names[bone_data[bi].name] = bi;
    2421
    2522                for ( uint32 n = 0; n < node_data->size(); ++n )
    2623                {
    27                         const data_channel_set* node = ( *node_data )[n];
    2824                        sint16 bone_id = -1;
    29 
    30                         auto bi = bone_names.find( node->get_name() );
     25                        auto bi = bone_names.find( node_data->get_info( n ).name );
    3126                        if ( bi != bone_names.end() )
    3227                        {
     
    3631
    3732                }
    38                 m_bone_count = bone_data->size();
     33                m_bone_count = bone_data.size();
    3934        }
    4035
     
    4843                        }
    4944        }
    50 
    51 
    5245}
    53 
    54 // void nv::skeleton_instance::animate_( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame )
    55 // {
    56 //      if ( m_matrix.size() > 0 )
    57 //      {
    58 //              if ( node_data->is_flat() )
    59 //              {
    60 //                      animate_flat( node_data, binding, frame );
    61 //              }
    62 //              else
    63 //              {
    64 //                      for ( uint32 n = 0; n < node_data->size(); ++n )
    65 //                              if ( ( *node_data )[n]->get_parent_id() == -1 )
    66 //                                      animate_rec( node_data, binding, frame, n, transform() );
    67 //              }
    68 //      }
    69 // }
    70 //
    71 // void nv::skeleton_instance::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent )
    72 // {
    73 //      // TODO: fix transforms, which are now embedded,
    74 //      //       see note in assimp_loader.cc:load_node
    75 //      const data_channel_set* node = ( *node_data )[id];
    76 //      transform node_mat( node->get_transform() );
    77 //
    78 //      if ( node->size() > 0 )
    79 //      {
    80 //              raw_channel_interpolator interpolator( node, binding.m_key );
    81 //              node_mat = interpolator.get< transform >( frame );
    82 //      }
    83 //
    84 //      transform global_mat = parent * node_mat;
    85 //
    86 //      sint16 bone_id = binding.m_indices[id];
    87 //      if ( bone_id >= 0 )
    88 //      {
    89 //              m_matrix[bone_id] = global_mat.extract() * binding.m_offsets[bone_id];
    90 //      }
    91 //
    92 //      for ( auto child : node_data->children( id ) )
    93 //      {
    94 //              animate_rec( node_data, binding, frame, child, global_mat );
    95 //      }
    96 // }
    97 //
    98 // void nv::skeleton_instance::animate_flat( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame )
    99 // {
    100 //      for ( uint32 n = 0; n < node_data->size(); ++n )
    101 //              if ( binding.m_indices[n] >= 0 )
    102 //              {
    103 //                      const data_channel_set* node = ( *node_data )[n];
    104 //                      nv::mat4 node_mat( node->get_transform() );
    105 //
    106 //                      if ( node->size() > 0 )
    107 //                      {
    108 //                              raw_channel_interpolator interpolator( node, binding.m_key );
    109 //                              node_mat = interpolator.get< mat4 >( frame );
    110 //                      }
    111 //                      sint16 bone_id = binding.m_indices[n];
    112 //                      m_matrix[bone_id] = node_mat * binding.m_offsets[bone_id];
    113 //              }
    114 // }
    11546
    11647void nv::skeleton_instance::assign( const skeleton_transforms& skeleton, const bone_transforms& bones )
     
    12051        const transform* transforms = skeleton.transforms();
    12152        for ( uint32 n = 0; n < skeleton.size(); ++n )
     53        {
    12254                m_matrix[n] = transforms[n].extract() * bones.m_offsets[n];
     55        }
    12356}
    12457
     
    12962}
    13063
    131 void nv::skeleton_transforms::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent )
     64void nv::skeleton_transforms::animate_local( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame )
     65{
     66        if ( m_transforms.size() != binding.skeleton_size() )
     67                m_transforms.resize( binding.skeleton_size() );
     68        for ( uint32 n = 0; n < node_data->size(); ++n )
     69        {
     70                const data_channel_set* node = ( *node_data )[n];
     71                sint16 bone_id = binding.m_indices[n];
     72                if ( bone_id >= 0 )
     73                {
     74                        if ( node->size() > 0 )
     75                                m_transforms[bone_id] = raw_channel_interpolator( node, binding.m_key ).get< transform >( frame );
     76                        int confirm_that_not_needed;
     77//                      else
     78//                              m_transforms[bone_id] = transform( node->get_transform() );
     79                }
     80        }
     81}
     82
     83void nv::skeleton_transforms::blend_local( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, float blend )
     84{
     85        if ( m_transforms.size() != binding.skeleton_size() )
     86                m_transforms.resize( binding.skeleton_size() );
     87        for ( uint32 n = 0; n < node_data->size(); ++n )
     88        {
     89                const data_channel_set* node = ( *node_data )[n];
     90                sint16 bone_id = binding.m_indices[n];
     91                if ( bone_id >= 0 )
     92                {
     93                       
     94                        transform tr = node->size() > 0 ? raw_channel_interpolator( node, binding.m_key ).get< transform >( frame ) : transform( /*node->get_transform()*/ ); int confirm_that_not_needed;
     95                        m_transforms[bone_id] = nv::interpolate( m_transforms[bone_id], tr, blend );
     96                }
     97        }
     98}
     99
     100void nv::skeleton_transforms::delocalize_rec( const data_node_tree& node_data, const skeleton_binding& binding, uint32 id, const transform& parent )
     101{
     102        sint16 bone_id = binding.m_indices[id];
     103        transform global_mat = parent;
     104        if ( bone_id >= 0 )
     105        {
     106                global_mat *= m_transforms[bone_id];
     107                m_transforms[bone_id] = global_mat;
     108        }
     109        for ( auto child : node_data.children( id ) )
     110        {
     111                delocalize_rec( node_data, binding, child, global_mat );
     112        }
     113}
     114
     115void nv::skeleton_transforms::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent, bool local )
    132116{
    133117        const data_channel_set* node = ( *node_data )[id];
    134         transform node_mat( node->get_transform() );
     118        transform node_mat;
     119
     120        if ( node->size() > 0 )
     121                node_mat = raw_channel_interpolator( node, binding.m_key ).get< transform >( frame );
     122        int confirm_that_not_needed;
     123        //      else
     124//              node_mat = transform( node->get_transform() );
     125        sint16 bone_id = binding.m_indices[id];
     126        transform global_mat = parent * node_mat;
     127        if ( bone_id >= 0 )
     128        {
     129                m_transforms[bone_id] = local ? node_mat : global_mat;
     130        }
     131        for ( auto child : node_data->children( id ) )
     132        {
     133                animate_rec( node_data, binding, frame, child, global_mat, local );
     134        }
     135}
     136
     137void nv::skeleton_transforms::blend_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent, bool local, float blend )
     138{
     139        const data_channel_set* node = ( *node_data )[id];
     140        int confirm_that_not_needed;
     141        transform node_mat/*( node->get_transform() )*/;
    135142
    136143        if ( node->size() > 0 )
     
    143150        if ( bone_id >= 0 )
    144151        {
    145                 m_transforms[bone_id] = global_mat;
     152                m_transforms[bone_id] = nv::interpolate( m_transforms[bone_id], local ? node_mat : global_mat, blend );
    146153        }
    147154        for ( auto child : node_data->children( id ) )
    148155        {
    149                 animate_rec( node_data, binding, frame, child, global_mat );
     156                blend_rec( node_data, binding, frame, child, global_mat, local, blend );
    150157        }
    151158}
    152159
    153 void nv::bone_transforms::prepare( const mesh_nodes_data* bone_data )
     160
     161void nv::bone_transforms::prepare( const data_node_list& bone_data )
    154162{
    155163        if ( m_offsets.empty() )
    156164        {
    157                 m_offsets.resize( bone_data->size() );
     165                m_offsets.resize( bone_data.size() );
    158166
    159                 for ( nv::uint16 bi = 0; bi < bone_data->size(); ++bi )
    160                 {
    161                         const data_channel_set* bone = ( *bone_data )[bi];
    162                         m_offsets[bi] = bone->get_transform();
    163                 }
     167                for ( nv::uint16 bi = 0; bi < bone_data.size(); ++bi )
     168                        m_offsets[bi] = bone_data[bi].transform;
    164169        }
    165170}
Note: See TracChangeset for help on using the changeset viewer.