Changeset 481 for trunk


Ignore:
Timestamp:
11/09/15 19:55:25 (10 years ago)
Author:
epyon
Message:
  • skeleton/resource updates


Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/core/resource.hh

    r480 r481  
    146146        class resource_lock
    147147        {
    148                 static const uint64 hash_value = rtti_type_hash<T>::value;
    149148        public:
    150149                resource_lock() = delete;
     
    171170                        if ( this != &other )
    172171                        {
    173                                 if ( m_handler ) m_handler->unlock( m_id, shash64( hash_value ) );
     172                                if ( m_handler ) m_handler->unlock( m_id, shash64( rtti_type_hash<T>::value ) );
    174173                                m_id       = other.m_id;
    175174                                m_handler  = other.m_handler;
     
    185184                ~resource_lock()
    186185                {
    187                         if ( m_handler ) m_handler->unlock( m_id, shash64( hash_value ) );
     186                        if ( m_handler ) m_handler->unlock( m_id, shash64( rtti_type_hash<T>::value ) );
    188187                }
    189188        private:
  • trunk/nv/gfx/skeleton_instance.hh

    r480 r481  
    1616{
    1717
     18        struct frame_range
     19        {
     20                uint32 start;
     21                uint32 end;
     22                bool   is_looping;
     23
     24                constexpr frame_range() : start( 0 ), end( 0 ), is_looping( false ) {}
     25                constexpr frame_range( uint32 fstart, uint32 fend, bool fis_looping )
     26                        : start( fstart )
     27                        , end( fend )
     28                        , is_looping( fis_looping )
     29                {
     30                }
     31                constexpr uint32 duration() const { return end - start; }
     32
     33                inline float clamp_frame( float f ) const
     34                {
     35                        if ( end <= start ) return float( start );
     36                        float max = float( end - start );
     37                        if ( f < max ) return f;
     38                        return is_looping ? nv::fmodf( f, max ) : float( end );
     39                }
     40
     41                inline float frame_from_time_fps( float time, uint32 fps ) const
     42                {
     43                        return clamp_frame( time * float( fps ) );
     44                }
     45
     46                inline float frame_from_ms_fps( uint32 ms, uint32 fps ) const
     47                {
     48                        return clamp_frame( ( ms * 0.001f ) * float( fps ) );
     49                }
     50        };
     51
     52        class bone_transforms
     53        {
     54        public:
     55                bone_transforms() {}
     56                void prepare( const mesh_nodes_data* bone_data );
     57                uint32 size() const { return m_offsets.size(); };
     58        protected:
     59                dynamic_array< mat4 >   m_offsets;
     60
     61                friend class skeleton_instance;
     62        };
     63
    1864        class skeleton_binding
    1965        {
    2066        public:
    21                 explicit skeleton_binding()
    22                         : m_indices( nullptr )
    23                         , m_offsets( nullptr )
     67                skeleton_binding() {}
     68                void prepare( const mesh_nodes_data* node_data, const mesh_nodes_data* bone_data );
     69                uint32 size() const { return m_indices.size(); };
     70                uint32 skeleton_size() const { return m_bone_count; };
     71        protected:
     72                dynamic_array< sint16 > m_indices;
     73                data_descriptor         m_key;
     74                uint32                  m_bone_count;
     75
     76                friend class skeleton_instance;
     77                friend class skeleton_transforms;
     78        };
     79
     80        class skeleton_transforms
     81        {
     82        public:
     83                skeleton_transforms() {}
     84                const transform* transforms() const { return m_transforms.data(); }
     85                size_t size() const { return m_transforms.size(); }
     86                void animate( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame )
    2487                {
    25                 }
    26                 void prepare( const mesh_nodes_data* node_data, const mesh_nodes_data* bone_data );
    27                 ~skeleton_binding()
    28                 {
    29                         delete[] m_indices;
    30                         delete[] m_offsets;
     88                        if ( m_transforms.size() != binding.skeleton_size() )
     89                                m_transforms.resize( binding.skeleton_size() );
     90                        NV_ASSERT( !node_data->is_flat(), "animation data is flat!" );
     91                        for ( uint32 n = 0; n < node_data->size(); ++n )
     92                                if ( ( *node_data )[n]->get_parent_id() == -1 )
     93                                        animate_rec( node_data, binding, frame, n, transform() );
    3194                }
    3295        protected:
    33                 sint16*                m_indices;
    34                 mat4*                  m_offsets;
    35                 data_descriptor        m_key;
    36 
    37                 friend class skeleton_instance;
     96                void animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent );
     97                dynamic_array< transform > m_transforms;
    3898        };
    3999
     
    41101        {
    42102        public:
    43                 explicit skeleton_instance( uint32 bone_count )
    44                 {
    45                         initialize( bone_count );
    46                 }
    47                 void initialize( uint32 bone_count )
    48                 {
    49                         if ( bone_count > m_transform.size() )
    50                                 m_transform.resize( bone_count );
    51                 }
    52                 const mat4* transforms() const { return m_transform.data(); }
    53                 size_t size() const { return m_transform.size(); }
     103                skeleton_instance() {}
     104                const mat4* transforms() const { return m_matrix.data(); }
     105                size_t size() const { return m_matrix.size(); }
     106                void assign( const skeleton_transforms& skeleton, const bone_transforms& binding );
     107                void assign( const bone_transforms& binding );
     108                //              void animate_( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame );
     109        protected:
     110//              void animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent );
     111//              void animate_flat( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame );
    54112
    55                 void animate( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame );
    56         protected:
    57                 void animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent );
    58                 void animate_flat( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame );
    59 
    60                 dynamic_array< mat4 > m_transform;
     113                dynamic_array< mat4 >      m_matrix;
    61114        };
    62115
  • trunk/src/gfx/skeleton_instance.cc

    r480 r481  
    1111void nv::skeleton_binding::prepare( const mesh_nodes_data* node_data, const mesh_nodes_data* bone_data )
    1212{
    13         if ( !m_offsets || !m_indices )
     13        if ( m_indices.empty() )
    1414        {
    1515                // TODO: either fixed size struct or static allocator
    1616                hash_store< shash64, uint16 > bone_names;
    17                 m_offsets = new mat4[bone_data->size()];
    18                 m_indices = new sint16[node_data->size()];
    19 
     17                m_indices.resize( node_data->size() );
     18               
    2019                for ( nv::uint16 bi = 0; bi < bone_data->size(); ++bi )
    2120                {
    2221                        const data_channel_set* bone = ( *bone_data )[bi];
    2322                        bone_names[bone->get_name()] = bi;
    24                         m_offsets[bi] = bone->get_transform();
    2523                }
    2624
     
    3836
    3937                }
     38                m_bone_count = bone_data->size();
    4039        }
    4140
     
    5049        }
    5150
     51
    5252}
    5353
    54 void nv::skeleton_instance::animate( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame )
     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// }
     115
     116void nv::skeleton_instance::assign( const skeleton_transforms& skeleton, const bone_transforms& bones )
    55117{
    56         if ( m_transform.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         }
     118        if ( bones.size() != m_matrix.size() )
     119                m_matrix.resize( bones.size() );
     120        const transform* transforms = skeleton.transforms();
     121        for ( uint32 n = 0; n < skeleton.size(); ++n )
     122                m_matrix[n] = transforms[n].extract() * bones.m_offsets[n];
    69123}
    70124
    71 void nv::skeleton_instance::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent )
     125void nv::skeleton_instance::assign( const bone_transforms& bones )
    72126{
    73         // TODO: fix transforms, which are now embedded,
    74         //       see note in assimp_loader.cc:load_node
     127        if ( bones.size() != m_matrix.size() )
     128                m_matrix.resize( bones.size() );
     129}
     130
     131void nv::skeleton_transforms::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent )
     132{
    75133        const data_channel_set* node = ( *node_data )[id];
    76134        transform node_mat( node->get_transform() );
     
    81139                node_mat = interpolator.get< transform >( frame );
    82140        }
    83 
     141        sint16 bone_id = binding.m_indices[id];
    84142        transform global_mat = parent * node_mat;
    85 
    86         sint16 bone_id = binding.m_indices[id];
    87143        if ( bone_id >= 0 )
    88144        {
    89                 m_transform[bone_id] = global_mat.extract() * binding.m_offsets[bone_id];
     145                m_transforms[bone_id] = global_mat;
    90146        }
    91 
    92147        for ( auto child : node_data->children( id ) )
    93148        {
     
    96151}
    97152
    98 void nv::skeleton_instance::animate_flat( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame )
     153void nv::bone_transforms::prepare( const mesh_nodes_data* bone_data )
    99154{
    100         for ( uint32 n = 0; n < node_data->size(); ++n )
    101                 if ( binding.m_indices[n] >= 0 )
     155        if ( m_offsets.empty() )
     156        {
     157                m_offsets.resize( bone_data->size() );
     158
     159                for ( nv::uint16 bi = 0; bi < bone_data->size(); ++bi )
    102160                {
    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 
    112                         sint16 bone_id = binding.m_indices[n];
    113                         m_transform[bone_id] = node_mat * binding.m_offsets[bone_id];
     161                        const data_channel_set* bone = ( *bone_data )[bi];
     162                        m_offsets[bi] = bone->get_transform();
    114163                }
     164        }
    115165}
Note: See TracChangeset for help on using the changeset viewer.