Changeset 518
- Timestamp:
- 02/24/08 00:46:16 (11 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/morph-targets/libx42make/include/x42make-modelbuilder.h
r517 r518 430 430 431 431 void optimize( optimize_type opt_type = optimize_type::match_current ); 432 433 void bake_vertices( const std::vector< ::x42::math::affine > &inf_mats );434 432 435 433 size_t vertex_count() const { return base_shape.size(); } … … 438 436 bool is_valid() const; 439 437 438 static std::vector< vertex_geometry > animate_vertices( const std::vector< vertex_geometry > &verts, 439 const std::vector< vertex_weights > &weights, const std::vector< ::x42::math::affine > &inf_mats ); 440 440 441 private: 441 442 bool are_vert_arrays_parallell() const; 443 void bake_vertices( const std::vector< ::x42::math::affine > &inf_mats, const influence_ptr &rebind_inf ); 444 445 friend class model_builder; 442 446 }; 443 447 … … 503 507 bone_ptr create_bone( const std::string &name = std::string(), const bone_ptr &parent = bone_ptr() ); 504 508 influence_ptr create_influence( const bone_ptr &bone = bone_ptr(), const ::x42::math::affine &matrix = ::x42::math::affinei() ); 509 influence_ptr get_static_identity_influence(); 505 510 tag_ptr create_tag( const std::string &name = std::string(), const bone_ptr &bone = bone_ptr(), const ::x42::math::affine &matrix = ::x42::math::affinei() ); 506 511 branches/morph-targets/libx42make/modelbuilder-geometry.cpp
r517 r518 381 381 } 382 382 383 void geometry::bake_vertices( const std::vector< ::x42::math::affine > &inf_mats )384 { 385 if( !are_ tracks_parallell() )383 void geometry::bake_vertices( const std::vector< ::x42::math::affine > &inf_mats, const influence_ptr &rebind_inf ) 384 { 385 if( !are_vert_arrays_parallell() ) 386 386 throw validation_error( "Can't bake non-parallell vertex arrays." ); 387 387 388 std::vector< vertex_geometry > new_shape( base_shape.size() ); 389 std::vector< morph_target_ptr > new_morph_targets( morph_targets.size() ); 390 391 DO NOT LET THIS COMPILE UNTIL I FIX THIS SHIT 388 std::vector< vertex_geometry > new_shape = animate_vertices( base_shape, weights, inf_mats ); 389 std::vector< std::vector< vertex_geometry > > new_morph_targets( morph_targets.size() ); 390 for( size_t i = 0; i < morph_targets.size(); i++ ) 391 { 392 new_morph_targets[i] = animate_vertices( morph_targets[i]->vertices, weights, inf_mats ); 393 } 394 395 vertex_weights new_wts; 396 new_wts.add( vertex_weight( rebind_inf, 1.0F ) ); 397 std::vector< vertex_weights > new_weights( weights.size(), new_wts ); 398 399 std::swap( base_shape, new_shape ); 400 for( size_t i = 0; i < morph_targets.size(); i++ ) 401 { 402 std::swap( morph_targets[i]->vertices, new_morph_targets[i] ); 403 } 404 std::swap( weights, new_weights ); 405 } 406 407 std::vector< vertex_geometry > geometry::animate_vertices( const std::vector< vertex_geometry > &verts, 408 const std::vector< vertex_weights > &weights, const std::vector< ::x42::math::affine > &inf_mats ) 409 { 410 if( verts.size() != weights.size() ) 411 throw error(); 412 413 std::vector< vertex_geometry > ret( verts.size() ); 414 415 for( size_t i = 0; i < verts.size(); i++ ) 416 { 417 const vertex_geometry &v = verts[i]; 418 const vertex_weights &w = weights[i]; 419 420 affine m = affinez(); 421 for( uint j = 0; j < vertex_weights::max_weights; j++ ) 422 { 423 const vertex_weight wt = w[j]; 424 425 if( wt.is_empty() ) 426 //sort puts empty ones at the end, done 427 break; 428 429 m += inf_mats[wt.influence()->index()] * wt.weight(); 430 } 431 432 vertex_geometry &o = ret[i]; 433 434 o.position = m.mul_point( v.position ); 435 o.tangent = normalize( m.mul_vec( v.tangent ) ); 436 o.bitangent = normalize( m.mul_vec( v.bitangent ) ); 437 o.normal = normalize( inverse( transpose( m ) ).mul_vec( v.normal ) ); 438 } 439 440 return ret; 392 441 } 393 442 branches/morph-targets/libx42make/modelbuilder-influences.cpp
r517 r518 78 78 } 79 79 80 influence_ptr model_builder::get_static_identity_influence() 81 { 82 for( size_t i = 0; i < influences.size(); i++ ) 83 { 84 influence_ptr inf = influences[i]; 85 86 if( !inf->_bone && inf->matrix == affinei() ) 87 return inf; 88 } 89 90 return create_influence( bone_ptr(), affinei() ); 91 } 92 80 93 void model_builder::validate_influence_bone( influence * /* influence */, const bone_ptr &new_bone ) const 81 94 { … … 235 248 continue; 236 249 237 g->geometry.bake_vertices( static_mats );250 g->geometry.bake_vertices( static_mats, get_static_identity_influence() ); 238 251 } 239 252 }
