437{
438 std::vector<int> remap( properties.size() );
439 for(unsigned i= 0; i < remap.size(); i++)
440 remap[i]= i;
441
442 std::stable_sort(remap.begin(), remap.end(),
443 [&]( const int a, const int b)
444 {
445 return properties[a] < properties[b];
446 });
447
448
449 std::vector<unsigned> tmp;
450 tmp.reserve(indices.size());
451 for(unsigned i= 0; i < remap.size(); i++)
452 {
453 int id= remap[i];
454 tmp.push_back( indices[3*id] );
455 tmp.push_back( indices[3*id+1] );
456 tmp.push_back( indices[3*id+2] );
457 }
458
459 std::swap(indices, tmp);
460
461
462 std::vector<MeshIOGroup> groups;
463
464
465 int id= properties[remap[0]];
466 unsigned first= 0;
467 unsigned count= 1;
468 for(unsigned i= 1; i < remap.size(); i++)
469 {
470 if(properties[remap[i]] != id)
471 {
472 groups.push_back({ id, first, count });
473
474 id= properties[remap[i]];
475 first= i;
476 count= 0;
477 }
478
479 count++;
480 }
481
482
483 groups.push_back({ id, first, count });
484
485 {
486
487 std::vector<int> tmp;
488 tmp.reserve(remap.size());
489 for(unsigned i= 0; i < remap.size(); i++)
490 tmp.push_back( material_indices[remap[i]] );
491
492 std::swap(material_indices, tmp);
493
494
495 tmp.clear();
496 for(unsigned i= 0; i < remap.size(); i++)
497 tmp.push_back( object_indices[remap[i]] );
498
499 std::swap(object_indices, tmp);
500 }
501
502 return groups;
503}