Changeset 482 for trunk/src/gfx


Ignore:
Timestamp:
11/12/15 19:02:08 (10 years ago)
Author:
epyon
Message:
  • skeletal animation updated
Location:
trunk/src/gfx
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gfx/mesh_creator.cc

    r480 r482  
    1313struct nv_key_transform { nv::transform tform; };
    1414
    15 void nv::mesh_nodes_creator::pre_transform_keys()
    16 {
    17         if ( m_data->m_flat ) return;
    18         merge_keys();
    19         uint16 max_frames = 0;
    20 
    21         nv::vector< sint16 > ids;
    22         {
    23                 // TODO: simplify this shit!
    24                 // The complexity here is that we cannot pre-transform in any order
    25                 // as the bones depend on previous bones, but ARE NOT IN ORDER
    26                 //
    27                 // Either rewrite this a lot nicer, or sort the bones on creation
    28                 // by tree-order.
    29 
    30                 ids.reserve( m_data->m_data.size() );
    31                 {
    32                         nv::vector< sint16 > ids_next;
    33                         ids_next.reserve( m_data->m_data.size() );
    34                         ids_next.push_back( -1 );
    35                         while ( !ids_next.empty() )
    36                         {
    37                                 sint16 pid = ids_next.back();
    38                                 ids_next.pop_back();
    39                                 for ( sint16 i = 0; i < sint16(m_data->m_data.size()); ++i )
    40                                         if ( m_data->m_data[i]->get_parent_id() == pid )
    41                                         {
    42                                                 sint16* it = nv::find( ids.begin(), ids.end(), i );
    43                                                 if ( it == ids.end() )
    44                                                 {
    45                                                         ids.push_back( i );
    46                                                         ids_next.push_back( i );
    47                                                 }
    48                                         }
    49                         }
    50                 }
    51 
    52                 if ( ids.size() != m_data->m_data.size() )
    53                 {
    54                         NV_LOG_WARNING( "Bad skeleton!" );
    55                 }
    56         }
    57 
    58         NV_LOG_DEBUG( "ID/PID" );
    59         for ( auto id : ids )
    60         {
    61                 data_channel_set* keys = m_data->m_data[id];
    62                 sint16 parent_id = keys->get_parent_id();
    63                 NV_LOG_DEBUG( "Id : ", id, " PID", parent_id );
    64                 data_channel_set* pkeys = ( parent_id != -1 ? m_data->m_data[parent_id] : nullptr );
    65                 size_t count     = ( keys ? keys->get_channel_size(0) : 0 );
    66                 size_t pcount    = ( pkeys ? pkeys->get_channel_size(0) : 0 );
    67                 max_frames = nv::max<uint16>( uint16( count ), max_frames );
    68                 if ( pkeys && pkeys->size() > 0 && keys && keys->size() > 0 )
    69                 {
    70                         data_channel_access< nv_key_transform > channel_creator( keys, 0 );
    71 
    72                         nv_key_transform* channel = channel_creator.data();
    73                         const nv_key_transform* pchannel = pkeys->get_channel(0)->data_cast< nv_key_transform >();
    74                         for ( unsigned n = 0; n < count; ++n )
    75                         {
    76                                 channel[n].tform = pchannel[ nv::min( n, pcount-1 ) ].tform * channel[n].tform;
    77                         }
    78                 }
    79         }
    80 
    81         // DAE pre_transform hack
    82         if ( m_data->m_frame_rate == 1 )
    83         {
    84                 m_data->m_frame_rate  = 32;
    85                 m_data->m_frame_count = max_frames;
    86         }
    87 
    88         m_data->m_flat = true;
    89 }
    90 
    91 
    9215void nv::mesh_nodes_creator::merge_keys()
    9316{
     
    11033                        data_channel_set* new_keys = data_channel_set_creator::create_set( 1 );
    11134                        data_channel_set_creator nk_access( new_keys );
    112                         nk_access.set_name( old_keys->get_name() );
    113                         nk_access.set_parent_id( old_keys->get_parent_id() );
    114                         nk_access.set_transform( old_keys->get_transform() );
    11535                        data_channel_access< nv_key_transform > kt_channel( nk_access.add_channel<nv_key_transform>( max_keys ) );
    11636
     
    14565        for ( auto node : m_data->m_data )
    14666        {
    147                 node->m_transform = pre_transform * node->m_transform * post_transform;
    148 
    14967                for ( size_t c = 0; c < node->size(); ++c )
    15068                {
     
    15876        }
    15977}
     78
     79void nv::data_node_list_creator::transform( float scale, const mat3& r33 )
     80{
     81        mat3 ri33 = math::inverse( r33 );
     82        mat4 pre_transform( scale * r33 );
     83        mat4 post_transform( 1.f / scale * ri33 );
     84
     85        for ( auto& node : m_data->m_data )
     86                node.transform = pre_transform * node.transform * post_transform;
     87}
     88
    16089
    16190void nv::mesh_data_creator::transform( float scale, const mat3& r33 )
     
    209138        nv::vec4 tangent;
    210139};
     140
    211141
    212142void nv::mesh_data_creator::flip_normals()
     
    434364}
    435365
     366
    436367template < typename T >
    437368static inline void swap_culling_impl( nv::raw_data_channel* index_channel )
     
    650581        initialize();
    651582}
    652 
  • 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.