void SortLastWindow::splitDrawables(DrawableListT &src, UInt32 groups, bool cut) { BoxVolume vol; // Real32 srcLoad=0; Real32 dst1Load = 0; Real32 dst2Load = 0; DrawableListT::iterator dI; UInt32 dIFront = 0; UInt32 dIBack = 0; UInt32 axis = 0; Vec3f size; DrawableListT dst1; DrawableListT dst2; UInt32 groups1 = 0; UInt32 groups2 = 0; // no group if(groups == 0) return; // only one group if(groups == 1) { editMFGroupLengths()->push_back(UInt32(src.size())); for(dI = src.begin() ; dI != src.end() ; ++dI) { pushToGroupNodes(dI->node); // srcLoad+=dI->load; } // printf("load:%f\n",srcLoad); return; } groups1 = groups / 2; groups2 = groups - groups1; // collect all load and get summed volume for(dI = src.begin() ; dI != src.end() ; ++dI) { vol.extendBy(dI->bMin); vol.extendBy(dI->bMax); } // get longes axis vol.getSize(size); if(size[0] > size[1]) { if(size[0] > size[2]) axis=0; else axis=2; } else { if(size[1] > size[2]) axis=1; else axis=2; } // sort by volume if(axis == 0) { std::sort(src.begin(),src.end(), DrawableInfo::MaxXOrder()); } else { if(axis == 1) std::sort(src.begin(),src.end(), DrawableInfo::MaxYOrder()); else std::sort(src.begin(),src.end(), DrawableInfo::MaxZOrder()); } // split group if(src.size()) { dIFront = 0; dIBack = UInt32(src.size()) - 1; do { // printf("f %d b %d\n",dIFront,dIBack); if(dst2Load < dst1Load) { dst2.push_back(src[dIBack]); dst2Load += src[dIBack].load*groups/Real32(groups2); dIBack--; } else { dst1.push_back(src[dIFront]); dst1Load += src[dIFront].load*groups/Real32(groups1); dIFront++; } } while(dIFront <= dIBack); } // recourse splitDrawables(dst1, groups1, cut); splitDrawables(dst2, groups2, cut); }