void ShaderManager::manage(Shader* shader) { if(shader->resource_name.empty()) { throw SDLAppException("Cannot manage shader with no resource name"); } if(resources[shader->resource_name] != 0) { throw SDLAppException("A shader resource already exists under the name '%s'", shader->resource_name.c_str()); } resources[shader->resource_name] = shader; shader->addref(); }
void ShaderPass::checkError() { if(!shader_object) return; GLint compile_success; glGetShaderiv(shader_object, GL_COMPILE_STATUS, &compile_success); GLint info_log_length; glGetShaderiv(shader_object, GL_INFO_LOG_LENGTH, &info_log_length); const char* resource_desc = !parent->resource_name.empty() ? parent->resource_name.c_str() : "???"; if(info_log_length > 1) { char info_log[info_log_length]; glGetShaderInfoLog(shader_object, info_log_length, &info_log_length, info_log); std::string context; errorContext(info_log, context); if(!compile_success) { throw SDLAppException("%s shader '%s' failed to compile:\n%s\n%s", shader_object_desc.c_str(), resource_desc, info_log, context.c_str()); } if(shadermanager.warnings) { warnLog("%s shader '%s':\n%s\n%s", shader_object_desc.c_str(), resource_desc, info_log, context.c_str()); } return; } if(!compile_success) { throw SDLAppException("%s shader '%s' failed to compile", shader_object_desc.c_str(), resource_desc); } }
// TODO: implement check for 'nix OSs void RCommitLog::requireExecutable(const std::string& exename) { #ifdef _WIN32 TCHAR exePath[MAX_PATH]; DWORD result = SearchPath(0, exename.c_str(), ".exe", MAX_PATH, exePath, 0); if(result) return; throw SDLAppException("unable to find %s.exe", exename.c_str()); #endif }
void Gource::readLog() { if(stop_position_reached) return; //debugLog("readLog()\n"); while(!commitlog->isFinished() && commitqueue.size() < 1) { RCommit commit; if(!commitlog->nextCommit(commit)) { if(!commitlog->isSeekable()) { break; } continue; } //ignore blank commits if(commit.files.size() > 0) { commitqueue.push_back(commit); } } if(first_read && commitqueue.size()==0) { throw SDLAppException("no commits found"); } first_read = false; if(!commitlog->isFinished() && commitlog->isSeekable()) { last_percent = commitlog->getPercent(); slider.setPercent(last_percent); } bool is_finished = commitlog->isFinished(); if( gGourceSettings.stop_at_end && is_finished || gGourceSettings.stop_position > 0.0 && commitlog->isSeekable() && (is_finished || last_percent >= gGourceSettings.stop_position)) { stop_position_reached = true; } // useful to figure out where we have crashes //debugLog("current date: %s\n", displaydate.c_str()); }
void ShaderPart::loadSourceFile() { processed_source.clear(); raw_source.clear(); // get length std::ifstream in(filename.c_str()); if(!in.is_open()) { throw SDLAppException("could not open '%s'", filename.c_str()); } std::string line; while( std::getline(in,line) ) { raw_source += line; raw_source += "\n"; } in.close(); }
void Gource::readLog() { //debugLog("readLog()\n"); while(!commitlog->isFinished() && commitqueue.size() < 1) { RCommit commit; //ignore blank commits if(commitlog->nextCommit(commit) && commit.files.size() > 0) { commitqueue.push_back(commit); } } if(first_read && commitqueue.size()==0) { throw SDLAppException("no commits found"); } first_read = false; if(!commitlog->isFinished() && commitlog->isSeekable()) { last_percent = commitlog->getPercent(); slider.setPercent(last_percent); } bool is_finished = commitlog->isFinished(); //see if we have reached the end and should exit //the next time all users are idle if( gGourceSettings.stop_at_end && is_finished || gGourceSettings.stop_position > 0.0 && commitlog->isSeekable() && (is_finished || last_percent >= gGourceSettings.stop_position)) { stop_position_reached = true; //if not stopping on idle exit immediately if(!gGourceSettings.stop_on_idle) appFinished = true; } // useful to figure out where we have crashes //debugLog("current date: %s\n", displaydate.c_str()); }
void Logstalgia::addGroup(const std::string& group_by, const std::string& grouptitle, const std::string& groupregex, int percent, vec3 colour) { if(percent<0) return; int remaining_percent = (int) ( ((float) remaining_space/total_space) * 100); if(remaining_percent<=0) return; if(!percent || percent > remaining_percent) { percent = remaining_percent; } Summarizer* summarizer = 0; try { summarizer = new Summarizer(fontSmall, percent, settings.update_rate, groupregex, grouptitle); } catch(RegexCompilationException& e) { throw SDLAppException("invalid regular expression for group '%s'", grouptitle.c_str()); } if(glm::dot(colour, colour) > 0.01f) { summarizer->setColour(colour); } if(!summarizer_types[group_by]) { summarizer_types[group_by] = new std::vector<Summarizer*>(); } summarizers.push_back(summarizer); summarizer_types[group_by]->push_back(summarizer); int space = (int) ( ((float)percent/100) * total_space ); remaining_space -= space; }
Logstalgia::Logstalgia(const std::string& logfile) : SDLApp() { info = false; paused = false; retarget = false; next = false; this->logfile = logfile; spawn_delay=0; highscore = 0; uimessage_timer=0.0f; ipSummarizer = 0; mintime = settings.sync ? time(0) : settings.start_time; seeklog = 0; streamlog = 0; if(logfile.empty()) { throw SDLAppException("no file supplied"); } if(logfile == "-") { streamlog = new StreamLog(); settings.disable_progress = true; } else { try { seeklog = new SeekLog(logfile); } catch(SeekLogException& exception) { throw SDLAppException("unable to read log file"); } } total_space = display.height - 40; remaining_space = total_space - 2; total_entries=0; background = vec3(0.0, 0.0, 0.0); fontLarge = fontmanager.grab("FreeSerif.ttf", 42); fontMedium = fontmanager.grab("FreeMonoBold.ttf", 16); fontBall = fontmanager.grab("FreeMonoBold.ttf", 16); fontSmall = fontmanager.grab("FreeMonoBold.ttf", settings.font_size); fontLarge.dropShadow(true); fontMedium.dropShadow(true); fontSmall.dropShadow(true); balltex = texturemanager.grab("ball.tga"); glowtex = texturemanager.grab("glow.tga"); infowindow = TextArea(fontSmall); mousehide_timeout = 0.0f; runtime = 0.0; frameExporter = 0; framecount = 0; frameskip = 0; fixed_tick_rate = 0.0; accesslog = 0; font_alpha = 1.0; take_screenshot = false; //every 60 minutes seconds blank text for 60 seconds screen_blank_interval = 3600.0; screen_blank_period = 60.0; screen_blank_elapsed = 0.0; init_tz(); }
Logstalgia::Logstalgia(std::string logfile, float simu_speed, float update_rate) : SDLApp() { info = false; paused = false; recentre = false; next = false; this->simu_speed = simu_speed; this->update_rate = update_rate; this->logfile = logfile; spawn_delay=0; highscore = 0; uimessage_timer=0.0f; ipSummarizer = 0; mintime = gSyncLog ? time(0) : 0; seeklog = 0; streamlog = 0; if(!logfile.size()) throw SDLAppException("no file supplied"); if(logfile.compare("-")==0) { logfile = "STDIN"; streamlog = new StreamLog(); gDisableProgress = true; } else { try { seeklog = new SeekLog(logfile); } catch(SeekLogException& exception) { throw SDLAppException("unable to read log file"); } } total_space = display.height - 40; remaining_space = total_space - 2; total_entries=0; background = vec3f(0.0, 0.0, 0.0); fontLarge = fontmanager.grab("FreeSerif.ttf", 42); fontMedium = fontmanager.grab("FreeMonoBold.ttf", 16); fontBall = fontmanager.grab("FreeMonoBold.ttf", 16); fontSmall = fontmanager.grab("FreeMonoBold.ttf", gFontSize); fontLarge.dropShadow(true); fontMedium.dropShadow(true); fontSmall.dropShadow(true); balltex = texturemanager.grab("ball.tga"); glowtex = texturemanager.grab("glow.tga"); infowindow = TextArea(fontSmall); mousehide_timeout = 0.0f; time_scale = 1.0; runtime = 0.0; frameExporter = 0; framecount = 0; frameskip = 0; fixed_tick_rate = 0.0; accesslog = 0; font_alpha = 1.0; //every 60 minutes seconds blank text for 60 seconds screen_blank_interval = 3600.0; screen_blank_period = 60.0; screen_blank_elapsed = 0.0; paddle_x = display.width * gPaddlePosition; paddle_colour = (gPaddleMode > PADDLE_SINGLE) ? vec4f(0.0f, 0.0f, 0.0f, 0.0f) : vec4f(0.5, 0.5, 0.5, 1.0); debugLog("Logstalgia end of constructor\n"); //check if TZ is set, store current value if(old_tz.empty()) { char* current_tz_env = getenv("TZ"); if(current_tz_env != 0) { old_tz = std::string("TZ="); old_tz += std::string(current_tz_env); } } }
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); }