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/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 
Note: See TracChangeset for help on using the changeset viewer.