Changeset 524
- Timestamp:
- 02/25/08 17:48:11 (11 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/morph-targets/libx42make/modelbuilder-batch.cpp
r523 r524 36 36 { 37 37 public: 38 group_ptrsource_group;38 const_group_ptr source_group; 39 39 group_ptr target_group; 40 40 std::vector< index > vertex_map; //maps source vertices to the target group 41 41 std::vector< influence_ptr > influences; 42 42 size_t prim_count; 43 size_t max_infs_per_vert; 43 44 44 45 void compute_append_vert_cost( index src_idx, size_t &inf_cost ) const; … … 62 63 { 63 64 public: 64 group_ptrsource;65 const_group_ptr source; 65 66 66 67 size_t prim_count; … … 71 72 std::vector< group_split_target_ptr > target_groups; 72 73 73 group_split_context( group_ptr source );74 group_split_context( const_group_ptr source ); 74 75 group_split_target_ptr create_target(); 75 76 … … 78 79 return list_indices[prim_index * elems_per_prim + elem_index]; 79 80 } 81 82 void split_by_weight_count(); 80 83 }; 81 84 … … 88 91 source_group( owner->source ), target_group( new group() ), 89 92 vertex_map( owner->source->geometry.vertex_count(), invalid_index ), 90 prim_count( 0 ) 93 prim_count( 0 ), max_infs_per_vert( 0 ) 91 94 { 92 95 target_group->material_name = source_group->material_name; … … 136 139 dst.morph_targets[i]->vertices.push_back( 137 140 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 } 138 157 } 139 158 … … 176 195 } 177 196 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 ); 189 198 } 190 199 } … … 194 203 */ 195 204 196 group_split_context::group_split_context( group_ptr source )205 group_split_context::group_split_context( const_group_ptr source ) 197 206 : source( source ), prim_count( source->geometry.primitive_count() ), 198 207 elems_per_prim( source->geometry.prim_type.elems_per_prim() ), … … 209 218 } 210 219 211 }; 212 213 }; 214 }; 220 void 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 };
