Changeset 475 for trunk/src


Ignore:
Timestamp:
10/09/15 14:08:44 (10 years ago)
Author:
epyon
Message:
  • skeletal_mesh updates
Location:
trunk/src
Files:
1 added
4 edited

Legend:

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

    r471 r475  
    307307                                        NV_ASSERT( result->size() < MAX_BONES, "Too many bones to merge!" );
    308308                                        uint16 index = uint16( result->size() );
    309                                         result->push_back( bone );
     309                                        result->append( bone );
    310310                                        names[ bone->get_name() ] = index;
    311311                                        translate[b] = index;
     
    334334                }       
    335335        }
     336        result->initialize();
    336337
    337338        return result;
     
    360361        for ( auto set : temp_ref )
    361362        {
    362                 result->push_back( set );
    363         }
     363                result->append( set );
     364        }
     365        result->initialize();
    364366        delete temp;
    365367        return result;
  • trunk/src/formats/md3_loader.cc

    r471 r475  
    429429                access.set_name( make_name( name ) );
    430430                load_tags( access.add_channel<md3_key>( uint32( md3->header.num_frames ) ).channel(), name );
    431                 result->push_back( set );
    432         }
     431                result->append( set );
     432        }
     433        result->initialize();
    433434        return result;
    434435}
  • trunk/src/formats/nmd_loader.cc

    r470 r475  
    107107                data_channel_set* set = data_channel_set_creator::create_set( element_header.children );
    108108                load_channel_set( source, set, element_header );
    109                 m_node_data->push_back( set );
    110         }
     109                m_node_data->append( set );
     110        }
     111        m_node_data->initialize();
    111112        return true;
    112113}
  • trunk/src/gfx/skeletal_mesh.cc

    r471 r475  
    1111#include "nv/stl/unordered_map.hh"
    1212
    13 void nv::skeletal_animation_entry::initialize()
    14 {
    15         m_root      = uint32(-1);
    16         m_prepared  = false;
    17         m_children  = nullptr;
    18         m_offsets   = nullptr;
    19         m_bone_ids  = new sint16[m_node_data->size()];
    20 
    21         NV_ASSERT( m_node_data, "node data empty!" );
    22 
    23         if ( !m_node_data->is_flat() )
    24         {
    25                 m_children = new vector< uint32 >[m_node_data->size()];
    26                 for ( uint32 n = 0; n < m_node_data->size(); ++n )
    27                 {
    28                         const data_channel_set* node = (*m_node_data)[n];
    29                         if ( node->get_parent_id() != -1 )
    30                         {
    31                                 m_children[ node->get_parent_id()].push_back( n );
    32                         }
    33                         else
    34                         {
    35                                 if ( m_root >= 0 )
    36                                 {
    37                                         m_root = uint32( -2 );
    38                                 }
    39                                 else
    40                                         m_root = n;
    41                         }
    42                 }
    43                 NV_ASSERT( m_root != uint32( -1 ), "Animation without root!" );
    44         }
    45 }
     13#include "nv/core/logging.hh"
    4614
    4715void nv::skeletal_animation_entry::update_skeleton( mat4* data, uint32 a_ms_time ) const
     
    7038        }
    7139
    72         if ( !m_node_data->is_flat() )
    73         {
    74                 if ( m_root == uint32( -2 ) ) // multi-root
    75                 {
    76                         for ( uint32 n = 0; n < m_node_data->size(); ++n )
    77                                 if ( ( *m_node_data )[n]->get_parent_id() == -1 )
    78                                         animate_rec( data, fframe, n, mat4() );
    79                 }
    80                 else
    81                         animate_rec( data, fframe, m_root, mat4() );
    82                 return;
    83         }
    84 
    85         for ( uint32 n = 0; n < m_node_data->size(); ++n )
    86                 if ( m_bone_ids[n] >= 0 )
    87                 {
    88                         const data_channel_set* node = (*m_node_data)[n];
    89                         nv::mat4 node_mat( node->get_transform() );
    90 
    91                         if ( node->size() > 0 )
    92                         {
    93                                 raw_channel_interpolator interpolator( node, m_interpolation_key );
    94                                 node_mat = interpolator.get< mat4 >( fframe );
    95                         }
    96 
    97                         sint16 bone_id = m_bone_ids[n];
    98                         data[ bone_id ] = node_mat * m_offsets[ bone_id ];
    99                 }
     40        m_data.animate( data, fframe );
    10041}
    10142
    10243void nv::skeletal_animation_entry::prepare( const mesh_nodes_data* bones )
    10344{
    104         if ( m_prepared ) return;
    105         nv::hash_store< shash64, uint16 > bone_names;
    106         m_offsets = new mat4[ bones->size() ];
    107         for ( nv::uint16 bi = 0; bi < bones->size(); ++bi )
    108         {
    109                 const data_channel_set* bone = (*bones)[ bi ];
    110                 bone_names[ bone->get_name() ] = bi;
    111                 m_offsets[bi] = bone->get_transform();
    112         }
    113 
    114         for ( uint32 n = 0; n < m_node_data->size(); ++n )
    115         {
    116                 const data_channel_set* node = (*m_node_data)[ n ];
    117                 sint16 bone_id = -1;
    118 
    119                 auto bi = bone_names.find( node->get_name() );
    120                 if ( bi != bone_names.end() )
    121                 {
    122                         bone_id = sint16( bi->second );
    123                 }
    124                 m_bone_ids[n] = bone_id;
    125 
    126                 if ( m_interpolation_key.size() == 0 && node->size() > 0 )
    127                         m_interpolation_key = node->get_interpolation_key();
    128 
    129         }
    130         m_prepared = true;
    131 }
    132 
    133 void nv::skeletal_animation_entry::animate_rec( mat4* data, float time, uint32 node_id, const mat4& parent_mat ) const
    134 {
    135         // TODO: fix transforms, which are now embedded,
    136         //       see note in assimp_loader.cc:load_node
    137         const data_channel_set* node = ( *m_node_data )[ node_id ];
    138         mat4 node_mat( node->get_transform() );
    139 
    140         if ( node->size() > 0 )
    141         {
    142                 raw_channel_interpolator interpolator( node, m_interpolation_key );
    143                 node_mat = interpolator.get< mat4 >( time );
    144         }
    145 
    146         mat4 global_mat = parent_mat * node_mat;
    147 
    148         sint16 bone_id = m_bone_ids[ node_id ];
    149         if ( bone_id >= 0 )
    150         {
    151                 data[ bone_id ] = global_mat * m_offsets[ bone_id ];
    152         }
    153 
    154         for ( auto child : m_children[ node_id ] )
    155         {
    156                 animate_rec( data, time, child, global_mat );
    157         }
    158 }
    159 
    160 nv::skeletal_animation_entry::~skeletal_animation_entry()
    161 {
    162         delete[] m_offsets;
    163         delete[] m_children;
    164         delete[] m_bone_ids;
     45        m_data.prepare( bones );
    16546}
    16647
     
    19879nv::transform nv::skeletal_mesh::get_node_transform( uint32 node_id ) const
    19980{
    200         if ( node_id == 0 ) return transform();
    201         if ( node_id == uint32(-1) ) return transform( m_transform[0] );
    20281        return transform( m_transform[ node_id ] );
    20382}
Note: See TracChangeset for help on using the changeset viewer.