void Gource::updateUsers(float t, float dt) { std::vector<RUser*> inactiveUsers; int idle_users = 0; //recalc the user bounds user_bounds.reset(); // move users for(std::map<std::string,RUser*>::iterator it = users.begin(); it!=users.end(); it++) { RUser* u = it->second; u->logic(t, dt); //deselect user if fading out from inactivity if(u->isFading() && selectedUser == u) { selectUser(0); } if(u->isInactive()) { inactiveUsers.push_back(u); } if(u->isIdle()) { idle_users++; } else { user_bounds.update(u->getPos()); //if nothing is selected, and this user is active and this user is the specified user to follow, select them if(selectedUser == 0 && selectedFile == 0) { for(std::vector<std::string>::iterator ui = follow_users.begin(); ui != follow_users.end(); ui++) { std::string follow = *ui; if(follow.size() && u->getName() == follow) { selectUser(u); } } } } } //nothing is moving so increment idle if(idle_users==users.size()) { idle_time += dt; //if stop_on_idle is set and either no stop condition is set or the condition has been reached, exit if(stop_on_idle && (stop_position == 0.0f && !stop_at_end || stop_position_reached)) appFinished = true; } else { idle_time = 0; } // delete inactive users for(std::vector<RUser*>::iterator it = inactiveUsers.begin(); it != inactiveUsers.end(); it++) { deleteUser(*it); } }
void Gource::updateUsers(float t, float dt) { std::vector<RUser*> inactiveUsers; int idle_users = 0; //recalc the user bounds user_bounds.reset(); // move users for(std::map<std::string,RUser*>::iterator it = users.begin(); it!=users.end(); it++) { RUser* u = it->second; u->logic(t, dt); //deselect user if fading out from inactivity if(u->isFading() && selectedUser == u) { selectUser(0); } if(u->isInactive()) { inactiveUsers.push_back(u); } if(u->isIdle()) { idle_users++; } else { user_bounds.update(u->getPos()); //if nothing is selected, and this user is active and this user is the specified user to follow, select them if(selectedUser == 0 && selectedFile == 0) { for(std::vector<std::string>::iterator ui = follow_users.begin(); ui != follow_users.end(); ui++) { std::string follow = *ui; if(follow.size() && u->getName() == follow) { selectUser(u); } } } } } //nothing is moving so increment idle if(idle_users==static_cast<int>(users.size())) { idle_time += dt; } else { idle_time = 0.0f; } // delete inactive users for(std::vector<RUser*>::iterator it = inactiveUsers.begin(); it != inactiveUsers.end(); it++) { deleteUser(*it); } }
void Gource::updateBounds() { user_bounds.reset(); for(std::map<std::string,RUser*>::iterator it = users.begin(); it!=users.end(); it++) { RUser* u = it->second; if(!u->isIdle()) { user_bounds.update(u->getPos()); } } dir_bounds.reset(); for(std::map<std::string,RDirNode*>::iterator it = gGourceDirMap.begin(); it!=gGourceDirMap.end(); it++) { RDirNode* node = it->second; if(node->isVisible()) { dir_bounds.update(node->getPos()); } } }
void Gource::logic(float t, float dt) { if(draw_loading) return; if(message_timer>0.0f) message_timer -= dt; if(splash>0.0f) splash -= dt; //init log file if(commitlog == 0) { try { commitlog = determineFormat(logfile); } catch(SeekLogException& exception) { throw SDLAppException("unable to read log file"); } if(commitlog == 0) { //if not in a git dir and no log file, show help if(logfile.size() == 0 || logfile == ".") { SDL_Quit(); SDLAppException exception(""); exception.setShowHelp(true); throw exception; } else if(SDLAppDirExists(logfile)) { throw SDLAppException("directory not supported"); } else { throw SDLAppException("unsupported log format (you may need to regenerate your log file)"); } } if(gGourceSettings.start_position>0.0) { seekTo(gGourceSettings.start_position); } } slider.logic(dt); //apply rotation if(rotate_angle != 0.0f) { float s = sinf(rotate_angle); float c = cosf(rotate_angle); root->rotate(s, c); for(std::map<std::string,RUser*>::iterator it = users.begin(); it!=users.end(); it++) { RUser* user = it->second; vec2f userpos = user->getPos(); user->setPos(userpos.rotate(s, c)); } rotate_angle = 0.0f; } //still want to update camera while paused if(paused) { updateBounds(); updateQuadTree(); updateCamera(dt); return; } // get more entries if(commitqueue.size() == 0) { readLog(); } //loop in attempt to find commits if(commitqueue.size()==0 && commitlog->isSeekable() && gGourceSettings.loop) { first_read=true; seekTo(0.0); readLog(); } if(currtime==0 && commitqueue.size()) { currtime = lasttime = commitqueue[0].timestamp; subseconds = 0.0; } //set current time float time_inc = (dt * 86400.0 * gGourceSettings.days_per_second); int seconds = (int) time_inc; subseconds += time_inc - ((float) seconds); if(subseconds >= 1.0) { currtime += (int) subseconds; subseconds -= (int) subseconds; } currtime += seconds; // delete files for(std::vector<RFile*>::iterator it = gGourceRemovedFiles.begin(); it != gGourceRemovedFiles.end(); it++) { deleteFile(*it); } gGourceRemovedFiles.clear(); //add commits up until the current time while(commitqueue.size() > 0) { RCommit commit = commitqueue[0]; //auto skip ahead, unless stop_position_reached if(gGourceSettings.auto_skip_seconds>=0.0 && idle_time >= gGourceSettings.auto_skip_seconds && !stop_position_reached) { currtime = lasttime = commit.timestamp; idle_time = 0.0; } if(commit.timestamp > currtime) break; processCommit(commit, t); currtime = lasttime = commit.timestamp; subseconds = 0.0; commitqueue.pop_front(); } //reset loop counters gGourceUserInnerLoops = 0; gGourceDirNodeInnerLoops = 0; gGourceFileInnerLoops = 0; interactUsers(); updateUsers(t, dt); updateQuadTree(); updateBounds(); updateDirs(dt); updateCamera(dt); updateTime(commitqueue.size() > 0 ? currtime : lasttime); }