Changeset 285
- Timestamp:
- 07/21/14 02:19:34 (11 years ago)
- Location:
- trunk
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/formats/assimp_loader.hh
r284 r285 42 42 sint32 parent_id; 43 43 mat4 transform; 44 uint16 channel_count; 45 key_raw_channel* channels[4]; 44 key_data* data; 46 45 47 46 assimp_animated_node_data() 48 : name(), parent_id( -1 ) 47 : name(), parent_id( -1 ), data( nullptr ) 49 48 { 50 channels[0] = nullptr; channels[1] = nullptr; channels[2] = nullptr; channels[3] = nullptr;51 49 } 52 50 ~assimp_animated_node_data() 53 51 { 54 if ( channels[0] ) delete channels[0]; 55 if ( channels[1] ) delete channels[1]; 56 if ( channels[2] ) delete channels[2]; 57 if ( channels[3] ) delete channels[3]; 52 if ( data ) delete data; 58 53 } 59 54 }; -
trunk/nv/formats/md2_loader.hh
r240 r285 29 29 virtual bool load( stream& source ); 30 30 virtual mesh_data* release_mesh_data( size_t index = 0 ); 31 virtual size_t get_mesh_count() const { return 1; } 32 private: 31 33 virtual mesh_data* release_mesh_frame( sint32 frame ); 32 virtual size_t get_mesh_count() const { return 1; }33 34 size_t get_max_frames() const; 34 private:35 35 void reindex(); 36 36 private: -
trunk/nv/formats/md3_loader.hh
r282 r285 40 40 size_t get_max_frames() const; 41 41 virtual tag_map* create_tag_map(); 42 virtual mesh_node_data* release_mesh_node_data( size_t index ); 43 virtual size_t get_node_count() const; 42 44 private: 43 45 key_raw_channel* load_tags( const std::string& tag ); -
trunk/nv/formats/nmd_loader.hh
r284 r285 78 78 sint16 parent_id; 79 79 mat4 transform; 80 uint16 channel_count; 81 key_raw_channel** channels; 80 key_data* data; 82 81 }; 83 82 … … 91 90 92 91 nmd_animation() : node_count(0), nodes( nullptr ) {} 93 void clear_node( nmd_node* node )94 {95 if ( node->channel_count > 0 )96 {97 for ( uint16 c = 0; c < node->channel_count; ++c )98 delete node->channels[c];99 delete[] node->channels;100 }101 node->channels = nullptr;102 node->channel_count = 0;103 }104 92 ~nmd_animation() 105 93 { 106 94 for ( uint16 n = 0; n < node_count; ++n ) 107 clear_node( &nodes[n] ); 95 { 96 if ( nodes[n].data ) delete nodes[n].data; 97 } 108 98 delete[] nodes; 109 99 } … … 149 139 150 140 // TODO: Temporary, find a better way and remove! 151 struct nmd_temp_node_data152 {153 key_animation_data* keys;154 mat4 transform;155 sint32 bone_id;156 std::vector< nmd_temp_node_data* > children;157 };158 141 159 142 class nmd_temp_model; … … 171 154 void animate_rec( mat4* data, float time, uint32 node_id, const mat4& parent_mat ); 172 155 173 std::vector< key_ animation_data* > m_data;156 std::vector< key_data* > m_data; 174 157 std::vector< sint16 > m_bone_ids; 175 158 std::vector< std::vector< uint32 > > m_children; -
trunk/nv/gfx/animation.hh
r284 r285 52 52 } 53 53 54 uint32 get_raw( uint32 index, float* result ) const 55 { 56 if ( count == 0 ) return 0; 57 uint32 keyfsize = desc.size / 4; 58 const float* fdata = ((const float*)data) + keyfsize * index; 59 uint32 mod = 0; 60 if ( desc.slots[0].vslot == animation_slot::TIME ) mod = 1; 61 std::copy_n( fdata + mod, keyfsize - mod, result ); 62 return keyfsize - mod; 63 } 64 54 65 uint32 interpolate_raw( float time, float* result ) const 55 66 { 67 if ( count == 0 ) return 0; 56 68 uint32 keyfsize = desc.size / 4; 57 69 uint32 keyfresult = keyfsize; 58 70 const float* fdata = (const float*)data; 59 if ( count == 0 ) return 0;60 71 61 72 uint32 slot = 0; … … 129 140 } 130 141 131 mat4 get_ matrix( float time ) const142 mat4 get_raw_matrix( uint32 index ) const 132 143 { 133 144 float key[ 16 ]; … … 135 146 for ( uint16 i = 0; i < m_channels.size(); ++i ) 136 147 { 137 pkey += m_channels[i]-> interpolate_raw( time, pkey );148 pkey += m_channels[i]->get_raw( index, pkey ); 138 149 } 139 150 return extract_matrix_raw( final_key, key ); 140 151 }; 141 152 142 transform get_ transform( float time ) const153 transform get_raw_transform( uint32 index ) const 143 154 { 144 155 float key[ 16 ]; … … 146 157 for ( uint16 i = 0; i < m_channels.size(); ++i ) 147 158 { 159 pkey += m_channels[i]->get_raw( index, pkey ); 160 } 161 return extract_transform_raw( final_key, key ); 162 }; 163 164 mat4 get_matrix( float time ) const 165 { 166 float key[ 16 ]; 167 float* pkey = key; 168 for ( uint16 i = 0; i < m_channels.size(); ++i ) 169 { 148 170 pkey += m_channels[i]->interpolate_raw( time, pkey ); 149 171 } 172 return extract_matrix_raw( final_key, key ); 173 }; 174 175 transform get_transform( float time ) const 176 { 177 float key[ 16 ]; 178 float* pkey = key; 179 for ( uint16 i = 0; i < m_channels.size(); ++i ) 180 { 181 pkey += m_channels[i]->interpolate_raw( time, pkey ); 182 } 150 183 return extract_transform_raw( final_key, key ); 151 184 }; 185 186 size_t get_channel_count() const { return m_channels.size(); } 187 const key_raw_channel* get_channel( size_t index ) const { return m_channels[ index ]; } 152 188 153 189 virtual ~key_data() … … 169 205 public: 170 206 key_channel_interpolator() : m_data( nullptr ) {} 171 key_channel_interpolator( key_raw_channel* data ) : m_data( nullptr ) { set_data( data ); }172 key_channel_interpolator( key_raw_channel* data, bool ) : m_data( data ) {}173 void set_data( key_raw_channel* data )207 key_channel_interpolator( const key_raw_channel* data ) : m_data( nullptr ) { set_data( data ); } 208 key_channel_interpolator( const key_raw_channel* data, bool ) : m_data( data ) {} 209 void set_data( const key_raw_channel* data ) 174 210 { 175 211 m_data = data; … … 194 230 195 231 private: 196 key_raw_channel* m_data;232 const key_raw_channel* m_data; 197 233 }; 198 234 … … 202 238 public: 203 239 key_channel_interpolator() : m_data( nullptr ) {} 204 key_channel_interpolator( key_raw_channel* data ) : m_data( nullptr ) { set_data( data ); }205 void set_data( key_raw_channel* data )240 key_channel_interpolator( const key_raw_channel* data ) : m_data( nullptr ) { set_data( data ); } 241 void set_data( const key_raw_channel* data ) 206 242 { 207 243 m_data = data; … … 233 269 234 270 private: 235 key_raw_channel* m_data;271 const key_raw_channel* m_data; 236 272 }; 237 273 … … 260 296 struct key_s { float time; vec3 scale; }; 261 297 public: 262 explicit key_vectors_prs( key_raw_channel* p, key_raw_channel* r,key_raw_channel* s )298 explicit key_vectors_prs( const key_raw_channel* p, const key_raw_channel* r, const key_raw_channel* s ) 263 299 { 264 300 m_pchannel = p; … … 304 340 } 305 341 protected: 306 key_raw_channel* m_pchannel;307 key_raw_channel* m_rchannel;308 key_raw_channel* m_schannel;342 const key_raw_channel* m_pchannel; 343 const key_raw_channel* m_rchannel; 344 const key_raw_channel* m_schannel; 309 345 key_channel_interpolator< key_p, true > m_pinter; 310 346 key_channel_interpolator< key_r, true > m_rinter; … … 319 355 }; 320 356 public: 321 explicit transform_vector( key_raw_channel* channel )357 explicit transform_vector( const key_raw_channel* channel ) 322 358 { 323 359 key_descriptor kd; … … 354 390 protected: 355 391 key_channel_interpolator< key, false > m_interpolator; 356 key_raw_channel* m_channel;392 const key_raw_channel* m_channel; 357 393 }; 358 394 -
trunk/nv/gfx/keyframed_mesh.hh
r283 r285 41 41 virtual void run_animation( animation_entry* a_anim ); 42 42 size_t get_max_frames() const; 43 transform get_tag( const std::string& tag) const;43 transform get_tag( uint32 tag_id ) const; 44 44 virtual void setup_animation( uint32 start, uint32 count, uint32 fps, bool loop ); 45 45 virtual void set_frame( uint32 frame ); -
trunk/nv/interface/animated_mesh.hh
r283 r285 41 41 virtual void update_animation( animation_entry*, uint32 ) {} 42 42 virtual void run_animation( animation_entry* ) {} 43 virtual transform get_tag( const std::string& ) const { return transform(); } 43 virtual transform get_tag( uint32 ) const { return transform(); } 44 44 45 }; 45 46 -
trunk/nv/interface/mesh_loader.hh
r282 r285 30 30 { 31 31 public: 32 typedef std::unordered_map< std::string, key_raw_channel*> map;32 typedef std::unordered_map< std::string, uint32 > map; 33 33 34 tag_map 34 tag_map() {} 35 35 36 const transform* get_tag( const std::string& key) const36 const key_data* get_tag( uint32 id ) const 37 37 { 38 key_raw_channel* channel = m_map.at( key ); 39 return ((transform*)(channel->data)); 38 return m_data[id]; 40 39 } 41 void insert( const std::string& key, key_raw_channel* chan )40 uint32 get_tag_id( const std::string& key ) const 42 41 { 43 m_map[ key ] = chan; 42 return m_map.at( key ); 43 } 44 void insert( const std::string& key, key_data* chan ) 45 { 46 m_map[ key ] = m_data.size(); 47 m_data.push_back( chan ); 44 48 } 45 49 ~tag_map() 46 50 { 47 for ( auto t : m_ map)48 delete t .second;51 for ( auto t : m_data ) 52 delete t; 49 53 } 50 54 private: 55 std::vector< key_data* > m_data; 51 56 map m_map; 52 57 }; 53 58 59 struct mesh_node_data 60 { 61 string name; 62 sint16 target_id; 63 sint16 parent_id; 64 mat4 transform; 65 key_data* data; 66 }; 54 67 55 68 class mesh_loader … … 62 75 virtual mesh_data* release_mesh_data( size_t index = 0 ) = 0; 63 76 virtual size_t get_mesh_count() const = 0; 77 virtual mesh_node_data* release_mesh_node_data( size_t ) { return nullptr; } 78 virtual size_t get_node_count() const { return 0; } 64 79 }; 65 80 -
trunk/nv/interface/vertex.hh
r284 r285 479 479 } 480 480 481 bool operator==( const key_descriptor& rhs ) 481 bool operator==( const key_descriptor& rhs ) const 482 482 { 483 483 if ( size != rhs.size ) return false; -
trunk/src/formats/assimp_loader.cc
r284 r285 367 367 if (this_id == 0) 368 368 a_data.transform = mat4(); 369 a_data. channel_count = 0;369 a_data.data = nullptr; 370 370 371 371 if (anode) … … 394 394 size_t max_keys = glm::max( node->mNumPositionKeys, node->mNumRotationKeys ); 395 395 396 data->channel_count = 1; 397 data->channels[0] = key_raw_channel::create<assimp_key_tr>( max_keys ); 398 assimp_key_tr* channel = ((assimp_key_tr*)(data->channels[0]->data)); 396 key_raw_channel* raw_channel = key_raw_channel::create<assimp_key_tr>( max_keys ); 397 data->data = new key_data; 398 data->data->add_channel( raw_channel ); 399 assimp_key_tr* channel = ((assimp_key_tr*)(raw_channel->data)); 399 400 400 401 for ( unsigned n = 0; n < max_keys; ++n ) … … 406 407 // TODO: only do the calculation when a rotate transform is present! 407 408 nv::transform ptr; 408 if ( parent )409 { 410 key_raw_channel* pchannel = parent->channels[0];411 if ( p arent->channels[0] && parent->channels[0]->count > 0 )412 { 413 ptr = ((assimp_key_tr*)pchannel->data)[ glm::min( n, p arent->channels[0]->count-1 ) ].tform;409 if ( parent && parent->data ) 410 { 411 const key_raw_channel* pchannel = parent->data->get_channel(0); 412 if ( pchannel && pchannel->count > 0 ) 413 { 414 ptr = ((assimp_key_tr*)pchannel->data)[ glm::min( n, pchannel->count-1 ) ].tform; 414 415 } 415 416 } … … 422 423 void nv::assimp_loader::create_direct_keys( assimp_animated_node_data* data, const void* vnode ) 423 424 { 424 data->channel_count = 0;425 425 const aiNodeAnim* node = (const aiNodeAnim*)vnode; 426 426 if ( node->mNumPositionKeys == 0 && node->mNumRotationKeys == 0 && node->mNumScalingKeys == 0 ) … … 429 429 } 430 430 431 data->channel_count = 3; 432 data->channels[0] = key_raw_channel::create<assimp_key_p>( node->mNumPositionKeys ); 433 data->channels[1] = key_raw_channel::create<assimp_key_r>( node->mNumRotationKeys ); 434 data->channels[2] = key_raw_channel::create<assimp_key_s>( node->mNumScalingKeys ); 435 assimp_key_p* pchannel = ((assimp_key_p*)(data->channels[0]->data)); 436 assimp_key_r* rchannel = ((assimp_key_r*)(data->channels[1]->data)); 437 assimp_key_s* schannel = ((assimp_key_s*)(data->channels[2]->data)); 431 data->data = new key_data; 432 key_raw_channel* raw_pchannel = key_raw_channel::create<assimp_key_p>( node->mNumPositionKeys ); 433 key_raw_channel* raw_rchannel = key_raw_channel::create<assimp_key_r>( node->mNumRotationKeys ); 434 key_raw_channel* raw_schannel = key_raw_channel::create<assimp_key_s>( node->mNumScalingKeys ); 435 data->data->add_channel( raw_pchannel ); 436 data->data->add_channel( raw_rchannel ); 437 data->data->add_channel( raw_schannel ); 438 assimp_key_p* pchannel = ((assimp_key_p*)(raw_pchannel->data)); 439 assimp_key_r* rchannel = ((assimp_key_r*)(raw_rchannel->data)); 440 assimp_key_s* schannel = ((assimp_key_s*)(raw_schannel->data)); 438 441 439 442 for ( unsigned np = 0; np < node->mNumPositionKeys; ++np ) -
trunk/src/formats/md3_loader.cc
r282 r285 407 407 for ( sint32 i = 0; i < md3->header.num_tags; ++i ) 408 408 { 409 const md3_tag_t& rtag = md3->tags[i + md3->header.num_tags];409 const md3_tag_t& rtag = md3->tags[i]; 410 410 std::string name( (char*)(rtag.name) ); 411 nv::key_raw_channel* keys = load_tags( name ); 412 result->insert( name, keys ); 411 412 key_data* data = new key_data; 413 data->add_channel( load_tags( name ) ); 414 result->insert( name, data ); 413 415 } 414 416 return result; 415 417 } 416 418 419 mesh_node_data* nv::md3_loader::release_mesh_node_data( size_t index ) 420 { 421 md3_t* md3 = (md3_t*)m_md3; 422 const md3_tag_t& rtag = md3->tags[index]; 423 std::string name( (char*)(rtag.name) ); 424 425 mesh_node_data* result = new mesh_node_data; 426 result->transform = mat4(); 427 result->name = name; 428 result->parent_id = -1; 429 result->target_id = -1; 430 result->data = new key_data; 431 432 key_raw_channel* keys = load_tags( name ); 433 result->data->add_channel( keys ); 434 return result; 435 } 436 437 size_t nv::md3_loader::get_node_count() const 438 { 439 return ((md3_t*)m_md3)->header.num_tags; 440 } 441 417 442 size_t md3_loader::get_max_frames() const 418 443 { -
trunk/src/formats/nmd_loader.cc
r284 r285 138 138 m_animation->nodes[i].parent_id = node_header.parent_id; 139 139 m_animation->nodes[i].transform = node_header.transform; 140 m_animation->nodes[i].channel_count = ch_count; 141 m_animation->nodes[i].channels = nullptr; 140 m_animation->nodes[i].data = nullptr; 142 141 if ( ch_count > 0 ) 143 142 { 144 m_animation->nodes[i].channels = new key_raw_channel* [ch_count]; 143 key_data* kdata = new key_data; 144 m_animation->nodes[i].data = kdata; 145 145 for ( uint32 c = 0; c < ch_count; ++c ) 146 146 { … … 151 151 key_raw_channel* channel = key_raw_channel::create( cheader.format, cheader.count ); 152 152 source.read( channel->data, channel->desc.size, channel->count ); 153 m_animation->nodes[i].channels[c] = channel;153 kdata->add_channel( channel ); 154 154 } 155 155 } … … 168 168 { 169 169 nmd_node& node = m_animation->nodes[n]; 170 key_animation_data* keys = nullptr; 171 if ( node.channel_count > 1 ) 172 { 173 keys = new nv::key_vectors_prs( node.channels[0], node.channels[1], node.channels[2] ); 174 } 175 else if ( node.channel_count == 1 ) 176 { 177 keys = new nv::transform_vector( node.channels[0] ); 178 node.channels[0] = nullptr; 179 node.channel_count = 0; 180 } 181 m_data.push_back( keys ); 170 m_data.push_back( node.data ); 171 node.data = nullptr; 182 172 } 183 173 … … 239 229 nv::mat4 node_mat( node->transform ); 240 230 241 if ( m_data[n] && !m_data[n]->empty())231 if ( m_data[n] ) 242 232 { 243 233 node_mat = m_data[n]->get_matrix( anim_time ); … … 257 247 mat4 node_mat( node->transform ); 258 248 259 if ( m_data[ node_id ] && !m_data[ node_id ]->empty())249 if ( m_data[ node_id ] ) 260 250 { 261 251 node_mat = m_data[ node_id ]->get_matrix( time ); -
trunk/src/gfx/keyframed_mesh.cc
r283 r285 40 40 } 41 41 42 transform keyframed_mesh::get_tag( const std::string&tag ) const42 transform keyframed_mesh::get_tag( uint32 tag ) const 43 43 { 44 44 NV_ASSERT( m_tag_map, "TAGMAP FAIL" ); 45 const transform* transforms = m_tag_map->get_tag( tag ); 46 NV_ASSERT( transforms, "TAG FAIL" ); 47 return interpolate( transforms[ m_last_frame ], transforms[ m_next_frame ], m_interpolation ); 45 const key_data* data = m_tag_map->get_tag( tag ); 46 NV_ASSERT( data, "TAG FAIL" ); 47 transform last = data->get_raw_transform( m_last_frame ); 48 transform next = data->get_raw_transform( m_next_frame ); 49 return interpolate( last, next, m_interpolation ); 48 50 } 49 51
Note: See TracChangeset
for help on using the changeset viewer.