- Timestamp:
- 07/14/15 20:19:52 (10 years ago)
- Location:
- trunk
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/gfx/animation.hh
r418 r419 20 20 { 21 21 22 class key_channel_set : public data_channel_set22 class raw_channel_interpolator 23 23 { 24 24 public: 25 mat4 get_raw_matrix( uint32 index ) const 26 { 27 float key[ 16 ]; 25 explicit raw_channel_interpolator( const data_channel_set* set ) 26 : m_set( set ), m_interpolation_key( set->get_interpolation_key() ) 27 { 28 } 29 raw_channel_interpolator( const data_channel_set* set, const data_descriptor& ikey ) 30 : m_set( set ), m_interpolation_key( ikey ) 31 { } 32 33 template < typename T > 34 T get_raw( uint32 index ) const 35 { 36 float key[16]; 28 37 float* pkey = key; 29 for ( uint16 i = 0; i < size(); ++i ) 30 { 31 pkey += get_raw( m_channels[i], index, pkey ); 32 } 33 return extract_matrix_raw( m_final_key, key ); 34 } 35 36 transform get_raw_transform( uint32 index ) const 37 { 38 float key[ 16 ]; 38 for ( const auto& channel : *m_set ) 39 { 40 pkey += get_raw( channel, index, pkey ); 41 } 42 return extract_key_raw< T >( m_interpolation_key, key ); 43 } 44 45 template < typename T > 46 T get( float time ) const 47 { 48 float key[16]; 39 49 float* pkey = key; 40 for ( uint16 i = 0; i < size(); ++i ) 41 { 42 pkey += get_raw( m_channels[i], index, pkey ); 43 } 44 return extract_transform_raw( m_final_key, key ); 45 } 46 47 mat4 get_matrix( float time ) const 48 { 49 float key[ 16 ]; 50 float* pkey = key; 51 for ( uint16 i = 0; i < size(); ++i ) 52 { 53 pkey += interpolate_raw( m_channels[i], time, pkey ); 54 } 55 return extract_matrix_raw( m_final_key, key ); 56 } 57 58 transform get_transform( float time ) const 59 { 60 float key[ 16 ]; 61 float* pkey = key; 62 for ( uint16 i = 0; i < size(); ++i ) 63 { 64 pkey += interpolate_raw( m_channels[i], time, pkey ); 65 } 66 return extract_transform_raw( m_final_key, key ); 67 } 68 69 const data_descriptor& get_final_key() const { return m_final_key; } 50 for ( const auto& channel : *m_set ) 51 { 52 pkey += interpolate_raw( channel, time, pkey ); 53 } 54 return extract_key_raw< T >( m_interpolation_key, key ); 55 } 56 57 template < typename T > 58 T get( uint32 index1, uint32 index2, float interpolation ) const 59 { 60 T t1 = get_raw< T >( index1 ); 61 T t2 = get_raw< T >( index2 ); 62 return interpolate( t1, t2, interpolation ); 63 } 70 64 71 65 static uint32 get_raw( const raw_data_channel& channel, uint32 index, float* result ) … … 138 132 return ret; 139 133 } 140 141 private: 142 friend class key_channel_set_creator; 143 144 key_channel_set() {} 145 146 data_descriptor m_final_key; 134 const data_descriptor& get_interpolation_key() { return m_interpolation_key; } 135 protected: 136 const data_channel_set* m_set; 137 data_descriptor m_interpolation_key; 147 138 }; 148 139 149 template < typename KEY, bool TIMED >150 class key_channel_interpolator;151 152 153 template < typename KEY >154 class key_channel_interpolator< KEY, false >155 {156 public:157 key_channel_interpolator() : m_data( nullptr ) {}158 key_channel_interpolator( const raw_data_channel* data ) : m_data( nullptr ) { set_data( data ); }159 key_channel_interpolator( const raw_data_channel* data, bool ) : m_data( data ) {}160 void set_data( const raw_data_channel* data )161 {162 m_data = data;163 data_descriptor desc;164 desc.initialize<KEY>();165 NV_ASSERT( data->descriptor() == desc, "Bad channel passed!" );166 }167 void get_interpolated( KEY& result, float frame ) const168 {169 NV_ASSERT( m_data, "Data is null!" );170 const KEY* keys = m_data->data_cast<KEY>( );171 uint32 count = m_data->size();172 if ( count == 0 ) return;173 if ( count == 1 )174 {175 result = keys[0];176 return;177 }178 size_t index = glm::clamp<size_t>( size_t( frame ), 0, count - 2 );179 float factor = glm::clamp<float> ( frame - index, 0.0f, 1.0f );180 interpolate_key( result, keys[index], keys[index+1], factor );181 }182 183 private:184 const raw_data_channel* m_data;185 };186 187 template < typename KEY >188 class key_channel_interpolator< KEY, true >189 {190 public:191 key_channel_interpolator() : m_data( nullptr ) {}192 key_channel_interpolator( const raw_data_channel* data ) : m_data( nullptr ) { set_data( data ); }193 void set_data( const raw_data_channel* data )194 {195 m_data = data;196 data_descriptor desc;197 desc.initialize<KEY>();198 NV_ASSERT( data->descriptor() == desc, "Bad channel passed!" );199 }200 void get_interpolated( KEY& result, float time ) const201 {202 // TODO: this probably could be optimized203 NV_ASSERT( m_data, "Data is null!" );204 const KEY* keys = m_data->data_cast<KEY>( );205 uint32 count = m_data->size();206 if ( count == 0 ) return;207 if ( count == 1 )208 {209 result = keys[0];210 return;211 }212 int index = -1;213 for ( int i = 0 ; i < int( count ) - 1 ; i++ )214 {215 if ( time < keys[i + 1].time ) { index = i; break; }216 }217 NV_ASSERT( index >= 0, "animation time fail!");218 float delta = keys[index + 1].time - keys[index].time;219 float factor = glm::clamp( (time - keys[index].time) / delta, 0.0f, 1.0f );220 interpolate_key( result, keys[index], keys[index+1], factor );221 }222 223 private:224 const raw_data_channel* m_data;225 };226 140 // template < typename KEY, bool TIMED > 141 // class key_channel_interpolator; 142 // 143 // 144 // template < typename KEY > 145 // class key_channel_interpolator< KEY, false > 146 // { 147 // public: 148 // key_channel_interpolator() : m_data( nullptr ) {} 149 // key_channel_interpolator( const raw_data_channel* data ) : m_data( nullptr ) { set_data( data ); } 150 // key_channel_interpolator( const raw_data_channel* data, bool ) : m_data( data ) {} 151 // void set_data( const raw_data_channel* data ) 152 // { 153 // m_data = data; 154 // data_descriptor desc; 155 // desc.initialize<KEY>(); 156 // NV_ASSERT( data->descriptor() == desc, "Bad channel passed!" ); 157 // } 158 // void get_interpolated( KEY& result, float frame ) const 159 // { 160 // NV_ASSERT( m_data, "Data is null!" ); 161 // const KEY* keys = m_data->data_cast<KEY>( ); 162 // uint32 count = m_data->size(); 163 // if ( count == 0 ) return; 164 // if ( count == 1 ) 165 // { 166 // result = keys[0]; 167 // return; 168 // } 169 // size_t index = glm::clamp<size_t>( size_t( frame ), 0, count - 2 ); 170 // float factor = glm::clamp<float> ( frame - index, 0.0f, 1.0f ); 171 // interpolate_key( result, keys[index], keys[index+1], factor ); 172 // } 173 // 174 // private: 175 // const raw_data_channel* m_data; 176 // }; 177 // 178 // template < typename KEY > 179 // class key_channel_interpolator< KEY, true > 180 // { 181 // public: 182 // key_channel_interpolator() : m_data( nullptr ) {} 183 // key_channel_interpolator( const raw_data_channel* data ) : m_data( nullptr ) { set_data( data ); } 184 // void set_data( const raw_data_channel* data ) 185 // { 186 // m_data = data; 187 // data_descriptor desc; 188 // desc.initialize<KEY>(); 189 // NV_ASSERT( data->descriptor() == desc, "Bad channel passed!" ); 190 // } 191 // void get_interpolated( KEY& result, float time ) const 192 // { 193 // // TODO: this probably could be optimized 194 // NV_ASSERT( m_data, "Data is null!" ); 195 // const KEY* keys = m_data->data_cast<KEY>( ); 196 // uint32 count = m_data->size(); 197 // if ( count == 0 ) return; 198 // if ( count == 1 ) 199 // { 200 // result = keys[0]; 201 // return; 202 // } 203 // int index = -1; 204 // for ( int i = 0 ; i < int( count ) - 1 ; i++ ) 205 // { 206 // if ( time < keys[i + 1].time ) { index = i; break; } 207 // } 208 // NV_ASSERT( index >= 0, "animation time fail!"); 209 // float delta = keys[index + 1].time - keys[index].time; 210 // float factor = glm::clamp( (time - keys[index].time) / delta, 0.0f, 1.0f ); 211 // interpolate_key( result, keys[index], keys[index+1], factor ); 212 // } 213 // 214 // private: 215 // const raw_data_channel* m_data; 216 // }; 217 // 227 218 // template < typename KEY1, typename KEY2 = void, typename KEY3 = void > 228 219 // class key_data_interpolator … … 230 221 // 231 222 // }; 232 233 class key_animation_data 234 { 235 public: 236 virtual mat4 get_matrix( float time ) const = 0; 237 virtual transform get_transform( float time ) const = 0; 238 virtual bool empty() const = 0; 239 virtual size_t size() const = 0; 240 virtual uint32 raw_size() const = 0; 241 virtual ~key_animation_data() {} 242 }; 243 244 245 class key_vectors_prs : public key_animation_data 246 { 247 struct key_p { float time; vec3 position; }; 248 struct key_r { float time; quat rotation; }; 249 struct key_s { float time; vec3 scale; }; 250 public: 251 explicit key_vectors_prs( const raw_data_channel* p, const raw_data_channel* r, const raw_data_channel* s ) 252 { 253 m_pchannel = p; 254 m_rchannel = r; 255 m_schannel = s; 256 m_pinter.set_data( m_pchannel ); 257 m_rinter.set_data( m_rchannel ); 258 m_sinter.set_data( m_schannel ); 259 } 260 size_t size() const { return 0; } // TODO: remove? 261 bool empty() const { 262 return m_pchannel->size() == 0 263 && m_rchannel->size() == 0 264 && m_schannel->size() == 0; } 265 virtual mat4 get_matrix( float time ) const 266 { 267 key_p p; 268 key_r r; 269 key_s s; 270 271 m_pinter.get_interpolated( p, time ); 272 m_rinter.get_interpolated( r, time ); 273 m_sinter.get_interpolated( s, time ); 274 275 return extract_matrix( p ) * extract_matrix( r ) * extract_matrix( s ); 276 } 277 virtual transform get_transform( float time ) const 278 { 279 key_p p; 280 key_r r; 281 282 m_pinter.get_interpolated( p, time ); 283 m_rinter.get_interpolated( r, time ); 284 285 return transform( p.position, r.rotation ); 286 } 287 virtual uint32 raw_size() const 288 { 289 return 3 * sizeof( size_t ) 290 + m_pchannel->size() * sizeof( key_p ) 291 + m_rchannel->size() * sizeof( key_r ) 292 + m_schannel->size() * sizeof( key_s ); 293 } 294 ~key_vectors_prs() 295 { 296 } 297 protected: 298 const raw_data_channel* m_pchannel; 299 const raw_data_channel* m_rchannel; 300 const raw_data_channel* m_schannel; 301 key_channel_interpolator< key_p, true > m_pinter; 302 key_channel_interpolator< key_r, true > m_rinter; 303 key_channel_interpolator< key_s, true > m_sinter; 304 }; 305 306 class transform_vector : public key_animation_data 307 { 308 struct key 309 { 310 transform tform; 311 }; 312 public: 313 explicit transform_vector( const raw_data_channel* channel ) 314 { 315 data_descriptor kd; 316 kd.initialize<key>(); 317 NV_ASSERT( kd == channel->descriptor(), "bad channel!" ); 318 m_channel = channel; 319 m_interpolator.set_data( m_channel ); 320 } 321 322 ~transform_vector() 323 { 324 delete m_channel; 325 } 326 bool empty() const { return m_channel->size() == 0; } 327 size_t size() const { return m_channel->size(); } 328 const transform& get( size_t index ) const { return m_channel->data_cast< key >()[ index ].tform; } 329 const transform* data() const { return &(m_channel->data_cast< key >()[0].tform); } 330 331 virtual uint32 raw_size() const 332 { 333 return sizeof( size_t ) + m_channel->size() * sizeof( key ); 334 } 335 336 virtual mat4 get_matrix( float time ) const 337 { 338 return get_transform( time ).extract(); 339 } 340 virtual transform get_transform( float time ) const 341 { 342 key result; 343 m_interpolator.get_interpolated( result, time ); 344 return extract_transform< key >( result ); 345 } 346 protected: 347 key_channel_interpolator< key, false > m_interpolator; 348 const raw_data_channel* m_channel; 349 }; 223 // 224 // class key_animation_data 225 // { 226 // public: 227 // virtual mat4 get_matrix( float time ) const = 0; 228 // virtual transform get_transform( float time ) const = 0; 229 // virtual bool empty() const = 0; 230 // virtual size_t size() const = 0; 231 // virtual uint32 raw_size() const = 0; 232 // virtual ~key_animation_data() {} 233 // }; 234 235 // class transform_vector : public key_animation_data 236 // { 237 // struct key 238 // { 239 // transform tform; 240 // }; 241 // public: 242 // explicit transform_vector( const raw_data_channel* channel ) 243 // { 244 // data_descriptor kd; 245 // kd.initialize<key>(); 246 // NV_ASSERT( kd == channel->descriptor(), "bad channel!" ); 247 // m_channel = channel; 248 // m_interpolator.set_data( m_channel ); 249 // } 250 // 251 // ~transform_vector() 252 // { 253 // delete m_channel; 254 // } 255 // bool empty() const { return m_channel->size() == 0; } 256 // size_t size() const { return m_channel->size(); } 257 // const transform& get( size_t index ) const { return m_channel->data_cast< key >()[ index ].tform; } 258 // const transform* data() const { return &(m_channel->data_cast< key >()[0].tform); } 259 // 260 // virtual uint32 raw_size() const 261 // { 262 // return sizeof( size_t ) + m_channel->size() * sizeof( key ); 263 // } 264 // 265 // virtual mat4 get_matrix( float time ) const 266 // { 267 // return get_transform( time ).extract(); 268 // } 269 // virtual transform get_transform( float time ) const 270 // { 271 // key result; 272 // m_interpolator.get_interpolated( result, time ); 273 // return extract_transform< key >( result ); 274 // } 275 // protected: 276 // key_channel_interpolator< key, false > m_interpolator; 277 // const raw_data_channel* m_channel; 278 // }; 350 279 351 280 -
trunk/nv/gfx/keyframed_mesh.hh
r417 r419 53 53 const mesh_nodes_data* m_tag_map; 54 54 55 data_descriptor m_interpolation_key; 55 56 buffer m_pbuffer; 56 57 vertex_array m_va; -
trunk/nv/gfx/skeletal_mesh.hh
r412 r419 32 32 vertex_array m_va; 33 33 context* m_context; 34 data_descriptor m_interpolation_key; 34 35 }; 35 36 … … 38 39 public: 39 40 skeletal_animation_entry_cpu( const std::string& name, const mesh_nodes_data* a_animation, bool a_looping ) 40 : animation_entry( name, a_looping, a_animation->get_frame_rate(), 0.0f, a_animation->get_duration() ), m_node_data( a_animation ) {} 41 : animation_entry( name, a_looping, a_animation->get_frame_rate(), 0.0f, a_animation->get_duration() ), m_node_data( a_animation ) 42 { 43 initialize(); 44 } 41 45 skeletal_animation_entry_cpu( const std::string& name, mesh_nodes_data* a_animation, float time_start, float time_end, bool a_looping ) 42 : animation_entry( name, a_looping, a_animation->get_frame_rate(), time_start, time_end ), m_node_data( a_animation ) {} 46 : animation_entry( name, a_looping, a_animation->get_frame_rate(), time_start, time_end ), m_node_data( a_animation ) 47 { 48 initialize(); 49 } 50 void initialize(); 43 51 void update_skeleton( transform* skeleton, float time ) const; 44 52 protected: 45 53 const mesh_nodes_data* m_node_data; 54 data_descriptor m_interpolation_key; 46 55 }; 47 56 … … 93 102 mat4* m_offsets; 94 103 bool m_prepared; 104 data_descriptor m_interpolation_key; 95 105 }; 96 106 -
trunk/nv/interface/data_channel.hh
r418 r419 68 68 friend class data_channel_creator; 69 69 friend class data_channel_set; 70 friend class key_channel_set_creator;71 70 72 71 raw_data_channel() : m_data( nullptr ), m_size( 0 ) {} … … 168 167 } 169 168 169 data_descriptor get_interpolation_key() const 170 { 171 data_descriptor result; 172 for ( uint32 c = 0; c < m_size; ++c ) 173 { 174 for ( const auto& cslot : m_channels[c].descriptor() ) 175 if ( cslot.vslot != slot::TIME ) 176 result.push_slot( cslot.etype, cslot.vslot ); 177 } 178 return result; 179 } 180 170 181 const_iterator begin() const { return &m_channels[0]; } 171 182 const_iterator end() const { return &m_channels[ m_size ]; } -
trunk/nv/interface/data_channel_access.hh
r418 r419 10 10 #include <nv/common.hh> 11 11 #include <nv/interface/data_channel.hh> 12 #include <nv/gfx/animation.hh> // TODO: remove, key creator separate file?13 12 14 13 namespace nv … … 162 161 163 162 164 class key_channel_set_creator165 {166 typedef data_channel_set::const_iterator const_iterator;167 public:168 169 static key_channel_set* create( size_t )170 {171 return new key_channel_set;172 }173 174 static key_channel_set* create_array( size_t size, size_t )175 {176 return new key_channel_set[size];177 }178 179 explicit key_channel_set_creator( key_channel_set* set ) : m_set( set ) {}180 181 template < typename Struct >182 data_channel_access< Struct > add_channel( uint32 size )183 {184 raw_data_channel channel = data_channel_creator::create( data_descriptor::create< Struct >(), size );185 for ( const auto& cslot : channel.descriptor() )186 if ( cslot.vslot != slot::TIME )187 m_set->m_final_key.push_slot( cslot.etype, cslot.vslot );188 uint32 index = m_set->m_size;189 m_set->m_channels[index] = move( channel );190 m_set->m_size++;191 return data_channel_access< Struct >( &m_set->m_channels[index] );192 }193 194 raw_data_channel_access add_channel( const data_descriptor& desc, uint32 size )195 {196 raw_data_channel channel = data_channel_creator::create( desc, size );197 for ( const auto& cslot : channel.descriptor() )198 if ( cslot.vslot != slot::TIME )199 m_set->m_final_key.push_slot( cslot.etype, cslot.vslot );200 uint32 index = m_set->m_size;201 m_set->m_channels[index] = move( channel );202 m_set->m_size++;203 return raw_data_channel_access( &m_set->m_channels[index] );204 }205 206 const raw_data_channel* operator []( uint32 i ) const { return &m_set->m_channels[i]; }207 const_iterator begin() const { return m_set->begin(); }208 const_iterator end() const { return m_set->end(); }209 210 protected:211 key_channel_set* m_set;212 };213 214 163 } 215 164 -
trunk/nv/interface/data_descriptor.hh
r417 r419 263 263 } 264 264 265 266 265 267 const_iterator begin() const { return &m_slots[0]; } 266 268 const_iterator end() const { return &m_slots[m_size]; } -
trunk/nv/interface/interpolation_raw.hh
r415 r419 57 57 } 58 58 59 inline mat4 extract_matrix_raw( const data_descriptor& desc, const float* data ) 59 template < typename T > 60 inline T extract_key_raw( const data_descriptor& desc, const float* data ); 61 62 template <> 63 inline mat4 extract_key_raw( const data_descriptor& desc, const float* data ) 60 64 { 61 65 if ( desc.size() == 1 ) … … 98 102 } 99 103 100 inline transform extract_transform_raw( const data_descriptor& desc, const float* data ) 104 template <> 105 inline transform extract_key_raw( const data_descriptor& desc, const float* data ) 101 106 { 102 107 if ( desc.size() == 1 ) -
trunk/nv/interface/mesh_data.hh
r417 r419 28 28 sint16 parent_id; 29 29 mat4 transform; 30 key_channel_set* data;30 data_channel_set* data; 31 31 }; 32 32 … … 75 75 } 76 76 77 key_channel_set* release_node_data( size_t i )77 data_channel_set* release_node_data( size_t i ) 78 78 { 79 key_channel_set* result = m_nodes[i].data;79 data_channel_set* result = m_nodes[i].data; 80 80 m_nodes[i].data = nullptr; 81 81 return result; -
trunk/src/formats/assimp_loader.cc
r417 r419 418 418 } 419 419 420 data->data = key_channel_set_creator::create( 2 );421 key_channel_set_creator key_set( data->data );420 data->data = data_channel_set_creator::create( 2 ); 421 data_channel_set_creator key_set( data->data ); 422 422 423 423 assimp_key_p* pchannel = key_set.add_channel< assimp_key_p >( node->mNumPositionKeys ).data(); -
trunk/src/formats/md3_loader.cc
r417 r419 429 429 nodes[i].parent_id = -1; 430 430 nodes[i].target_id = -1; 431 nodes[i].data = key_channel_set_creator::create( 1 );432 load_tags( key_channel_set_creator( nodes[i].data ).add_channel<md3_key>( uint32( md3->header.num_frames ) ).channel(), name );431 nodes[i].data = data_channel_set_creator::create( 1 ); 432 load_tags( data_channel_set_creator( nodes[i].data ).add_channel<md3_key>( uint32( md3->header.num_frames ) ).channel(), name ); 433 433 } 434 434 return new mesh_nodes_data( "tags", node_count, nodes ); -
trunk/src/formats/md5_loader.cc
r417 r419 250 250 nodes[i].transform = mat4(); 251 251 nodes[i].target_id = -1; 252 nodes[i].data = key_channel_set_creator::create( 1 );253 key_channel_set_creator( nodes[i].data ).add_channel< md5_key_t >( num_frames );252 nodes[i].data = data_channel_set_creator::create( 1 ); 253 data_channel_set_creator( nodes[i].data ).add_channel< md5_key_t >( num_frames ); 254 254 next_line( sstream ); 255 255 } -
trunk/src/formats/nmd_loader.cc
r418 r419 121 121 if ( ch_count > 0 ) 122 122 { 123 key_channel_set* kdata = key_channel_set_creator::create( ch_count );124 key_channel_set_creator kaccess( kdata );123 data_channel_set* kdata = data_channel_set_creator::create( ch_count ); 124 data_channel_set_creator kaccess( kdata ); 125 125 m_node_array[i].data = kdata; 126 126 for ( uint32 c = 0; c < ch_count; ++c ) -
trunk/src/gfx/keyframed_mesh.cc
r417 r419 39 39 m_frame_count = pos_size / m_vertex_count; 40 40 m_pbuffer = buffer(); 41 42 if ( m_tag_map && m_tag_map->get_count() > 0 ) 43 { 44 m_interpolation_key = m_tag_map->get_node( 0 )->data->get_interpolation_key(); 45 } 41 46 } 42 47 … … 50 55 if ( !m_tag_map ) return transform(); 51 56 NV_ASSERT( node_id < m_tag_map->get_count(), "TAGMAP FAIL" ); 52 const key_channel_set* data = m_tag_map->get_node( node_id )->data;57 const data_channel_set* data = m_tag_map->get_node( node_id )->data; 53 58 NV_ASSERT( data, "TAG FAIL" ); 54 transform last = data->get_raw_transform( m_last_frame ); 55 transform next = data->get_raw_transform( m_next_frame ); 56 return interpolate( last, next, m_interpolation ); 59 raw_channel_interpolator interpolator( data, m_interpolation_key ); 60 return interpolator.get< transform >( m_last_frame, m_next_frame, m_interpolation ); 57 61 } 58 62 -
trunk/src/gfx/mesh_creator.cc
r418 r419 19 19 { 20 20 sint16 parent_id = m_data->m_nodes[i].parent_id; 21 key_channel_set* keys = m_data->m_nodes[i].data;22 key_channel_set* pkeys = ( parent_id != -1 ? m_data->m_nodes[parent_id].data : nullptr );21 data_channel_set* keys = m_data->m_nodes[i].data; 22 data_channel_set* pkeys = ( parent_id != -1 ? m_data->m_nodes[parent_id].data : nullptr ); 23 23 size_t count = ( keys ? keys->get_channel_size(0) : 0 ); 24 24 size_t pcount = ( pkeys ? pkeys->get_channel_size(0) : 0 ); … … 46 46 } 47 47 48 // TODO: DELETE49 struct assimp_key_p { float time; nv::vec3 position; };50 struct assimp_key_r { float time; nv::quat rotation; };51 52 48 53 49 void nv::mesh_nodes_creator::merge_keys() … … 55 51 for ( size_t i = 0; i < m_data->get_count(); ++i ) 56 52 { 57 key_channel_set* old_keys = m_data->m_nodes[i].data;53 data_channel_set* old_keys = m_data->m_nodes[i].data; 58 54 if ( old_keys && old_keys->size() > 0 ) 59 55 { … … 69 65 } 70 66 71 key_channel_set* new_keys = key_channel_set_creator::create( 1 );72 key_channel_set_creator nk_access( new_keys );67 data_channel_set* new_keys = data_channel_set_creator::create( 1 ); 68 data_channel_set_creator nk_access( new_keys ); 73 69 data_channel_access< nv_key_transform > kt_channel( nk_access.add_channel<nv_key_transform>( max_keys ) ); 74 70 75 data_descriptor final_key = old_keys->get_final_key(); 71 raw_channel_interpolator interpolator( old_keys ); 72 data_descriptor final_key = interpolator.get_interpolation_key(); 76 73 77 74 for ( unsigned n = 0; n < max_keys; ++n ) … … 83 80 { 84 81 size_t idx = nv::min( old_keys->get_channel_size(c) - 1, n ); 85 pkey += old_keys->get_raw( *old_keys->get_channel(c), idx, pkey );86 } 87 kt_channel.data()[n].tform = extract_ transform_raw( final_key, key );82 pkey += raw_channel_interpolator::get_raw( *old_keys->get_channel(c), idx, pkey ); 83 } 84 kt_channel.data()[n].tform = extract_key_raw< nv::transform >( final_key, key ); 88 85 } 89 86 … … 106 103 if ( node.data ) 107 104 { 108 key_channel_set* kdata = node.data;105 data_channel_set* kdata = node.data; 109 106 for ( size_t c = 0; c < kdata->size(); ++c ) 110 107 { … … 332 329 } 333 330 } 334 delete tangents2;331 delete[] tangents2; 335 332 336 333 data_channel_set_creator( m_data ).set_channel( n_channel_index, merge_channels( *n_channel, g_channel ) ); -
trunk/src/gfx/skeletal_mesh.cc
r418 r419 91 91 92 92 93 void nv::skeletal_animation_entry_cpu::initialize() 94 { 95 for ( size_t i = 0; i < m_node_data->get_count(); ++i ) 96 { 97 if ( m_node_data->get_node( i )->data ) 98 { 99 m_interpolation_key = m_node_data->get_node( i )->data->get_interpolation_key(); 100 break; 101 } 102 } 103 } 104 93 105 void nv::skeletal_animation_entry_cpu::update_skeleton( transform* skeleton, float time ) const 94 106 { … … 100 112 for ( size_t i = 0; i < m_node_data->get_count(); ++i ) 101 113 { 102 skeleton[i] = m_node_data->get_node(i)->data->get_transform( frame_num ); 114 raw_channel_interpolator interpolator( m_node_data->get_node( i )->data, m_interpolation_key ); 115 skeleton[i] = interpolator.get< transform >( frame_num ); 103 116 } 104 117 } … … 112 125 m_bone_ids = new sint16[ node_count ]; 113 126 127 NV_ASSERT( m_node_data, "node data empty!" ); 128 114 129 if ( !m_node_data->is_flat() ) 115 130 { … … 146 161 if ( node->data ) 147 162 { 148 node_mat = node->data->get_matrix( anim_time ); 163 raw_channel_interpolator interpolator( node->data, m_interpolation_key ); 164 node_mat = interpolator.get< mat4 >( anim_time ); 149 165 } 150 166 … … 177 193 } 178 194 m_bone_ids[n] = bone_id; 195 196 if ( m_interpolation_key.size() == 0 && node->data ) 197 m_interpolation_key = node->data->get_interpolation_key(); 198 179 199 } 180 200 m_prepared = true; … … 190 210 if ( node->data ) 191 211 { 192 node_mat = node->data->get_matrix( time ); 212 raw_channel_interpolator interpolator( node->data, m_interpolation_key ); 213 node_mat = interpolator.get< mat4 >( time ); 193 214 } 194 215
Note: See TracChangeset
for help on using the changeset viewer.