void Gource::interactUsers() { // update quad tree Bounds2D quadtreebounds = user_bounds; quadtreebounds.min -= vec2f(1.0f, 1.0f); quadtreebounds.max += vec2f(1.0f, 1.0f); update_user_tree_time = SDL_GetTicks(); if(userTree != 0) delete userTree; int max_depth = 1; //dont use deep quad tree initially when all the nodes are in one place if(dir_bounds.area() > 10000.0) { max_depth = gGourceMaxQuadTreeDepth; } userTree = new QuadTree(quadtreebounds, max_depth, 1); for(std::map<std::string,RUser*>::iterator it = users.begin(); it!=users.end(); it++) { RUser* user = it->second; user->updateQuadItemBounds(); userTree->addItem(user); } //move users - interact with other users and files for(std::map<std::string,RUser*>::iterator ait = users.begin(); ait!=users.end(); ait++) { RUser* a = ait->second; UserForceFunctor uff(a); userTree->visitItemsInBounds(a->quadItemBounds, uff); gGourceUserInnerLoops += uff.getLoopCount(); a->applyForceToActions(); } update_user_tree_time = SDL_GetTicks() - update_user_tree_time; }
void Gource::interactUsers() { // update quad tree Bounds2D quadtreebounds = user_bounds; quadtreebounds.min -= vec2f(1.0f, 1.0f); quadtreebounds.max += vec2f(1.0f, 1.0f); update_user_tree_time = SDL_GetTicks(); if(userTree != 0) delete userTree; int max_depth = 1; //dont use deep quad tree initially when all the nodes are in one place if(dir_bounds.area() > 10000.0) { max_depth = 6; } userTree = new QuadTree(quadtreebounds, max_depth, 1); for(std::map<std::string,RUser*>::iterator it = users.begin(); it!=users.end(); it++) { RUser* user = it->second; user->updateQuadItemBounds(); userTree->addItem(user); } //move users - interact with other users and files for(std::map<std::string,RUser*>::iterator ait = users.begin(); ait!=users.end(); ait++) { RUser* a = ait->second; std::set<int> seen; std::set<int>::iterator seentest; std::vector<QuadItem*> inbounds; int found = userTree->getItemsInBounds(inbounds, a->quadItemBounds); for(std::vector<QuadItem*>::iterator it = inbounds.begin(); it != inbounds.end(); it++) { RUser* b = (RUser*) (*it); if(b==a) continue; if((seentest = seen.find(b->getTagID())) != seen.end()) { continue; } seen.insert(b->getTagID()); a->applyForceUser(b); gGourceUserInnerLoops++; } a->applyForceToActions(); } update_user_tree_time = SDL_GetTicks() - update_user_tree_time; }