Changeset 524

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

o Batcherizationish.

Files:

Legend:

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

    r523 r524  
    3636{ 
    3737public: 
    38         group_ptr                                             source_group; 
     38        const_group_ptr                                       source_group; 
    3939        group_ptr                                               target_group; 
    4040        std::vector< index >                    vertex_map;             //maps source vertices to the target group 
    4141        std::vector< influence_ptr >    influences; 
    4242        size_t                                                  prim_count; 
     43        size_t                                                  max_infs_per_vert; 
    4344 
    4445        void compute_append_vert_cost( index src_idx, size_t &inf_cost ) const; 
     
    6263{ 
    6364public: 
    64         group_ptr                                             source; 
     65        const_group_ptr                                       source; 
    6566 
    6667        size_t                                                  prim_count; 
     
    7172        std::vector< group_split_target_ptr > target_groups; 
    7273 
    73         group_split_context( group_ptr source ); 
     74        group_split_context( const_group_ptr source ); 
    7475        group_split_target_ptr create_target(); 
    7576 
     
    7879                return list_indices[prim_index * elems_per_prim + elem_index]; 
    7980        } 
     81 
     82        void split_by_weight_count(); 
    8083}; 
    8184 
     
    8891        source_group( owner->source ), target_group( new group() ), 
    8992        vertex_map( owner->source->geometry.vertex_count(), invalid_index ), 
    90         prim_count( 0 ) 
     93        prim_count( 0 ), max_infs_per_vert( 0 ) 
    9194{ 
    9295        target_group->material_name = source_group->material_name; 
     
    136139                dst.morph_targets[i]->vertices.push_back( 
    137140                        src.morph_targets[i]->vertices[src_idx] ); 
     141        } 
     142 
     143        const vertex_weights &wts = src.weights[src_idx]; 
     144        size_t wt_count = wts.count(); 
     145 
     146        max_infs_per_vert = max( wt_count, max_infs_per_vert ); 
     147 
     148        for( size_t j = 0; j < wt_count; j++ ) 
     149        { 
     150                const vertex_weight &w = wts[j]; 
     151 
     152                if( std::find( influences.begin(), influences.end(), 
     153                        w.influence() ) == influences.end() ) 
     154                { 
     155                        influences.push_back( w.influence() ); 
     156                } 
    138157        } 
    139158 
     
    176195                } 
    177196 
    178                 const vertex_weights &wts = source_group->geometry.weights[src_idx]; 
    179                 for( size_t j = 0; j < vertex_weights::max_weights; j++ ) 
    180                 { 
    181                         const vertex_weight &w = wts[j]; 
    182  
    183                         if( std::find( influences.begin(), influences.end(), 
    184                                 w.influence() ) == influences.end() ) 
    185                         { 
    186                                 influences.push_back( w.influence() ); 
    187                         } 
    188                 } 
     197                target_group->geometry.indices.push_back( dst_idx ); 
    189198        } 
    190199} 
     
    194203*/ 
    195204 
    196 group_split_context::group_split_context( group_ptr source ) 
     205group_split_context::group_split_context( const_group_ptr source ) 
    197206        : source( source ), prim_count( source->geometry.primitive_count() ), 
    198207        elems_per_prim( source->geometry.prim_type.elems_per_prim() ), 
     
    209218} 
    210219 
    211 }; 
    212  
    213 }; 
    214 }; 
     220void group_split_context::split_by_weight_count() 
     221
     222        if( target_groups.size() ) 
     223                throw error(); 
     224 
     225        for( size_t i = 0; i < vertex_weights::max_weights; i++ ) 
     226        { 
     227                create_target(); 
     228        } 
     229 
     230        const geometry &src = source->geometry; 
     231 
     232        for( size_t i_prim = 0; i_prim < prim_count; i_prim++ ) 
     233        { 
     234 
     235                size_t max_weights = 0; 
     236                for( size_t i_vert = 0; i_vert < elems_per_prim; i_vert++ ) 
     237                { 
     238                        size_t wt_count = src.weights[prim_elem_index( i_prim, i_vert )].count(); 
     239 
     240                        if( wt_count > max_weights ) 
     241                                max_weights = wt_count; 
     242                } 
     243 
     244                if( !max_weights ) 
     245                        throw error( "Found unweighted vertex." ); 
     246 
     247                target_groups[max_weights - 1]->append_prim( i_prim ); 
     248        } 
     249
     250 
     251}; 
     252 
     253}; 
     254};