Changeset 520

Show
Ignore:
Timestamp:
02/25/08 01:01:21 (11 months ago)
Author:
phill
Message:

o Now exports morph shapes.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/morph-targets/libx42make/modelbuilder-write.cpp

    r519 r520  
    125125        std::vector< vec2 >                                     vertTc; 
    126126        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; 
    127132 
    128133        std::vector< index >                            indices; 
     
    136141        void pack_tags( const model_builder &data ); 
    137142        void pack_groups( const model_builder &data ); 
     143        void pack_morph_shapes( const model_builder &data ); 
    138144        void pack_anims( const model_builder &data ); 
    139145        void fixup_names(); 
     
    150156        pack_tags( data ); 
    151157        pack_groups( data ); 
     158        pack_morph_shapes( data ); 
    152159        pack_anims( data ); 
    153160 
     
    192199        copy_vector_data( (vec2*)dst->vertTc, vertTc ); 
    193200        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 ); 
    194206 
    195207        copy_vector_data( dst->indices, indices ); 
     
    440452 
    441453        lods.resize( data.lods.size() ); 
    442         for( uint l = 0; l < lods.size(); l++ ) 
     454        for( size_t l = 0; l < lods.size(); l++ ) 
    443455        { 
    444456                const_lod_ptr inLod = data.lods[l]; 
     
    448460                outLod.firstGroup = (u16)groups.size(); 
    449461 
    450                 for( uint i = 0; i < inLod->groups.size(); i++ ) 
     462                for( size_t i = 0; i < inLod->groups.size(); i++ ) 
    451463                { 
    452464                        const_group_ptr in = inLod->groups[i]; 
    453465                        x42group_t out; 
    454466                         
     467                        if( !in->geometry.is_valid() ) 
     468                                throw validation_error(); 
     469 
    455470                        memset( &out, 0, sizeof( out ) ); 
    456471 
     
    544559} 
    545560 
     561inline 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 
     568void 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 
    546632void model_data_builder::pack_anims( const model_builder &data ) 
    547633{ 
     
    581667        fixup_name_refs( bones, map ); 
    582668        fixup_name_refs( tags, map ); 
     669         
     670        for( uint i = 0; i < morphs.size(); i++ ) 
     671                morphs[i].targetName = map[morphs[i].targetName]; 
    583672 
    584673        for( uint i = 0; i < groups.size(); i++ ) 
     
    646735        h.numGroups = (u16)groups.size(); 
    647736 
     737        h.numMorphTargets = (u16)morphs.size(); 
     738        h.numMorphDeltas = (u32)morph_indices.size(); 
     739 
    648740        h.numVerts = (u32)vertPos.size(); 
    649741        h.numIndices = (u32)indices.size();