- Timestamp:
- 11/09/15 19:55:25 (10 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/core/resource.hh
r480 r481 146 146 class resource_lock 147 147 { 148 static const uint64 hash_value = rtti_type_hash<T>::value;149 148 public: 150 149 resource_lock() = delete; … … 171 170 if ( this != &other ) 172 171 { 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 ) ); 174 173 m_id = other.m_id; 175 174 m_handler = other.m_handler; … … 185 184 ~resource_lock() 186 185 { 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 ) ); 188 187 } 189 188 private: -
trunk/nv/gfx/skeleton_instance.hh
r480 r481 16 16 { 17 17 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 18 64 class skeleton_binding 19 65 { 20 66 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 ) 24 87 { 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() ); 31 94 } 32 95 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; 38 98 }; 39 99 … … 41 101 { 42 102 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 ); 54 112 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; 61 114 }; 62 115 -
trunk/src/gfx/skeleton_instance.cc
r480 r481 11 11 void nv::skeleton_binding::prepare( const mesh_nodes_data* node_data, const mesh_nodes_data* bone_data ) 12 12 { 13 if ( !m_offsets || !m_indices)13 if ( m_indices.empty() ) 14 14 { 15 15 // TODO: either fixed size struct or static allocator 16 16 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 20 19 for ( nv::uint16 bi = 0; bi < bone_data->size(); ++bi ) 21 20 { 22 21 const data_channel_set* bone = ( *bone_data )[bi]; 23 22 bone_names[bone->get_name()] = bi; 24 m_offsets[bi] = bone->get_transform();25 23 } 26 24 … … 38 36 39 37 } 38 m_bone_count = bone_data->size(); 40 39 } 41 40 … … 50 49 } 51 50 51 52 52 } 53 53 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 116 void nv::skeleton_instance::assign( const skeleton_transforms& skeleton, const bone_transforms& bones ) 55 117 { 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]; 69 123 } 70 124 71 void nv::skeleton_instance::a nimate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent)125 void nv::skeleton_instance::assign( const bone_transforms& bones ) 72 126 { 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 131 void nv::skeleton_transforms::animate_rec( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, uint32 id, const transform& parent ) 132 { 75 133 const data_channel_set* node = ( *node_data )[id]; 76 134 transform node_mat( node->get_transform() ); … … 81 139 node_mat = interpolator.get< transform >( frame ); 82 140 } 83 141 sint16 bone_id = binding.m_indices[id]; 84 142 transform global_mat = parent * node_mat; 85 86 sint16 bone_id = binding.m_indices[id];87 143 if ( bone_id >= 0 ) 88 144 { 89 m_transform [bone_id] = global_mat.extract() * binding.m_offsets[bone_id];145 m_transforms[bone_id] = global_mat; 90 146 } 91 92 147 for ( auto child : node_data->children( id ) ) 93 148 { … … 96 151 } 97 152 98 void nv:: skeleton_instance::animate_flat( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame )153 void nv::bone_transforms::prepare( const mesh_nodes_data* bone_data ) 99 154 { 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 ) 102 160 { 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(); 114 163 } 164 } 115 165 }
Note: See TracChangeset
for help on using the changeset viewer.