Changeset 520
- Timestamp:
- 02/25/08 01:01:21 (11 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/morph-targets/libx42make/modelbuilder-write.cpp
r519 r520 125 125 std::vector< vec2 > vertTc; 126 126 std::vector< rgba > vertCl; 127 std::vector< x42morphTarget_t > morphs; 128 std::vector< index > morph_indices; 129 std::vector< vec4 > morph_pos; 130 std::vector< x42morphNormal_t > morph_norm; 131 std::vector< x42morphTangent_t > morph_tangent; 127 132 128 133 std::vector< index > indices; … … 136 141 void pack_tags( const model_builder &data ); 137 142 void pack_groups( const model_builder &data ); 143 void pack_morph_shapes( const model_builder &data ); 138 144 void pack_anims( const model_builder &data ); 139 145 void fixup_names(); … … 150 156 pack_tags( data ); 151 157 pack_groups( data ); 158 pack_morph_shapes( data ); 152 159 pack_anims( data ); 153 160 … … 192 199 copy_vector_data( (vec2*)dst->vertTc, vertTc ); 193 200 copy_vector_data( (rgba*)dst->vertCl, vertCl ); 201 202 copy_vector_data( dst->morphIndices, morph_indices ); 203 copy_vector_data( (vec4*)dst->morphPos, morph_pos ); 204 copy_vector_data( dst->morphNorm, morph_norm ); 205 copy_vector_data( dst->morphTan, morph_tangent ); 194 206 195 207 copy_vector_data( dst->indices, indices ); … … 440 452 441 453 lods.resize( data.lods.size() ); 442 for( uint l = 0; l < lods.size(); l++ )454 for( size_t l = 0; l < lods.size(); l++ ) 443 455 { 444 456 const_lod_ptr inLod = data.lods[l]; … … 448 460 outLod.firstGroup = (u16)groups.size(); 449 461 450 for( uint i = 0; i < inLod->groups.size(); i++ )462 for( size_t i = 0; i < inLod->groups.size(); i++ ) 451 463 { 452 464 const_group_ptr in = inLod->groups[i]; 453 465 x42group_t out; 454 466 467 if( !in->geometry.is_valid() ) 468 throw validation_error(); 469 455 470 memset( &out, 0, sizeof( out ) ); 456 471 … … 544 559 } 545 560 561 inline bool is_zero( const vec3 &v, float tol = 0.001F ) 562 { 563 return fabsf( v.x ) < tol && 564 fabsf( v.y ) < tol && 565 fabsf( v.z ) < tol; 566 } 567 568 void model_data_builder::pack_morph_shapes( const model_builder &data ) 569 { 570 size_t group_num = 0; 571 for( size_t l = 0; l < lods.size(); l++ ) 572 { 573 const_lod_ptr lod = data.lods[l]; 574 575 for( size_t i = 0; i < lod->groups.size(); i++ ) 576 { 577 const geometry &geom = lod ->groups[i]->geometry; 578 579 if( !geom.is_valid() ) 580 throw validation_error(); 581 582 for( size_t m = 0; m < geom.morph_targets.size(); i++ ) 583 { 584 const_morph_target_ptr morph = geom.morph_targets[i]; 585 586 x42morphTarget_t out; 587 memset( &out, 0, sizeof( out ) ); 588 589 out.targetName = _sb.intern_string( morph->name() ); 590 out.targetGroup = (u16)group_num; 591 592 out.firstDelta = (uint)morph_indices.size(); 593 594 for( size_t i = 0; i < geom.vertex_count(); i++ ) 595 { 596 const vertex_geometry &bg = geom.base_shape[i]; 597 const vertex_geometry &mg = morph->vertices[i]; 598 599 vec3 dp = mg.position - bg.position; 600 vec3 dn = mg.normal - bg.normal; 601 vec3 dt = mg.tangent - bg.tangent; 602 vec3 db = mg.bitangent - bg.bitangent; 603 604 if( is_zero( dp ) && is_zero( dn ) && 605 is_zero( dt ) && is_zero( db ) ) 606 continue; 607 608 morph_indices.push_back( (index)i ); 609 morph_pos.push_back( vec4c( dp, 0 ) ); 610 611 x42morphNormal_t outn; 612 copy_vec3( outn.norm, dn ); 613 outn.pad = 0; 614 morph_norm.push_back( outn ); 615 616 x42morphTangent_t outt; 617 copy_vec3( outt.tan, dt ); 618 copy_vec3( outt.bit, db ); 619 outt.nfac0 = outt.nfac1 = 0; 620 morph_tangent.push_back( outt ); 621 } 622 623 out.numDeltas = (uint)morph_indices.size() - out.firstDelta; 624 morphs.push_back( out ); 625 } 626 627 group_num++; 628 } 629 } 630 } 631 546 632 void model_data_builder::pack_anims( const model_builder &data ) 547 633 { … … 581 667 fixup_name_refs( bones, map ); 582 668 fixup_name_refs( tags, map ); 669 670 for( uint i = 0; i < morphs.size(); i++ ) 671 morphs[i].targetName = map[morphs[i].targetName]; 583 672 584 673 for( uint i = 0; i < groups.size(); i++ ) … … 646 735 h.numGroups = (u16)groups.size(); 647 736 737 h.numMorphTargets = (u16)morphs.size(); 738 h.numMorphDeltas = (u32)morph_indices.size(); 739 648 740 h.numVerts = (u32)vertPos.size(); 649 741 h.numIndices = (u32)indices.size();
