Changeset 518

Show
Ignore:
Timestamp:
02/24/08 00:46:16 (11 months ago)
Author:
phill
Message:

o Static group vertex baking goodness.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/morph-targets/libx42make/include/x42make-modelbuilder.h

    r517 r518  
    430430 
    431431        void optimize( optimize_type opt_type = optimize_type::match_current ); 
    432          
    433         void bake_vertices( const std::vector< ::x42::math::affine > &inf_mats ); 
    434432 
    435433        size_t vertex_count() const { return base_shape.size(); } 
     
    438436        bool is_valid() const; 
    439437 
     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 
    440441private: 
    441442        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; 
    442446}; 
    443447 
     
    503507        bone_ptr create_bone( const std::string &name = std::string(), const bone_ptr &parent = bone_ptr() ); 
    504508        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(); 
    505510        tag_ptr create_tag( const std::string &name = std::string(), const bone_ptr &bone = bone_ptr(), const ::x42::math::affine &matrix = ::x42::math::affinei() ); 
    506511 
  • branches/morph-targets/libx42make/modelbuilder-geometry.cpp

    r517 r518  
    381381} 
    382382 
    383 void geometry::bake_vertices( const std::vector< ::x42::math::affine > &inf_mats
    384 { 
    385         if( !are_tracks_parallell() ) 
     383void geometry::bake_vertices( const std::vector< ::x42::math::affine > &inf_mats, const influence_ptr &rebind_inf
     384{ 
     385        if( !are_vert_arrays_parallell() ) 
    386386                throw validation_error( "Can't bake non-parallell vertex arrays." ); 
    387387 
    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 
     407std::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; 
    392441} 
    393442 
  • branches/morph-targets/libx42make/modelbuilder-influences.cpp

    r517 r518  
    7878} 
    7979 
     80influence_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 
    8093void model_builder::validate_influence_bone( influence * /* influence */, const bone_ptr &new_bone ) const 
    8194{ 
     
    235248                        continue; 
    236249 
    237                 g->geometry.bake_vertices( static_mats ); 
     250                g->geometry.bake_vertices( static_mats, get_static_identity_influence() ); 
    238251        } 
    239252}