void display() { if(lastTime == 0) { lastTime = glutGet(GLUT_ELAPSED_TIME); } now = glutGet(GLUT_ELAPSED_TIME); delta_t = (now - lastTime) / 1000.0f; //lastTime = now; //1 / delta_t here means the frame rate. fpsTracker.timestamp(); //update camera information per frame updateCamera(); checkClear(); if(moved) lastTime = now; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //do raytrace raytrace(); //render result as texture displayTexture(); //draw tool bar TwDraw(); drawFps(); glutSwapBuffers(); glutPostRedisplay(); }
void NativeRenderLogic::draw(WorldModel::WorldAccess *worldAccess, render::Drawer *drawer) { if(!worldAccess || !drawer) return; if(shaderProgram.get()) shaderProgram->use(); const ViewAngle &viewAngle = worldAccess->getViewAngle(); drawer->rotateProjection(-viewAngle[2].getDegrees(), .0f, .0f, 1.0f); drawer->rotateProjection(-viewAngle[0].getDegrees(), 1.0f, .0f, .0f); drawer->rotateProjection(-viewAngle[1].getDegrees(), .0f, 1.0f, .0f); const ViewPos &viewPos = worldAccess->getViewPos(); drawer->translateProjection(-viewPos[0], -viewPos[1], -viewPos[2]); const size_t objectsCount = worldAccess->objectsCount(); for(size_t i = 0; i < objectsCount; ++i) (*worldAccess)[i]->draw(drawer); if(shaderProgram.get()) shaderProgram->reset(); fps = fpsCounter.frame(); drawFps(drawer); }
void debug::run() { mr_ConsoleRect.x = gfx::getScreenWidth() / 2 - gfx::getScreenWidth() / 2 / 2; mr_ConsoleRect.y = gfx::getScreenHeight() - gfx::getScreenHeight() / 12; mr_ConsoleRect.w = gfx::getScreenWidth() / 2; mr_ConsoleRect.h = gfx::getScreenHeight() / 10; if (input::keyHeld(SDLK_F3)) { mb_active = !mb_active; } if (input::chord(SDLK_LCTRL, SDLK_TAB) || input::chord(SDLK_RCTRL, SDLK_TAB)) { if (mb_ConsoleActive) { mb_ConsoleActive = false; } else { mb_ConsoleActive = true; } } while (moss_CoutString.str().length()) { if (moss_CoutString.str().find('\n') != string::npos && moss_CoutString.str().length() > 1) { mls_CoutList.push_front(moss_CoutString.str().substr(0, moss_CoutString.str().find('\n'))); moss_CoutString.str(moss_CoutString.str().substr(moss_CoutString.str().find('\n') + 1, moss_CoutString.str().length() - 1)); } else if (moss_CoutString.str().find('\n') != string::npos) { moss_CoutString.str(""); } else { mls_CoutList.push_front(moss_CoutString.str()); moss_CoutString.str(""); } } moss_CoutString.clear(); if (mb_active) { drawFps(); } if (mb_ConsoleActive) { drawConsole(); } }
void draw(void) { glClear(GL_COLOR_BUFFER_BIT); if(redrawflag && glutGet(GLUT_ELAPSED_TIME) - lastchange > 500) { redraw(); redrawflag = 0; } glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, gltex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screenW, screenH, 0, GL_RGB, GL_UNSIGNED_BYTE, tex); glBegin(GL_TRIANGLE_STRIP); glTexCoord2d(0,0); glVertex2d(0,0); glTexCoord2d(1,0); glVertex2d(screenW,0); glTexCoord2d(0,1); glVertex2d(0,screenH); glTexCoord2d(1,1); glVertex2d(screenW,screenH); glEnd(); glDisable(GL_TEXTURE_2D); if(mpress) { glColor3f(1.0, 1.0, 1.0); glBegin(GL_LINE_LOOP); glVertex2d(mpressx1, mpressy1); glVertex2d(mpressx1, mpressy2); glVertex2d(mpressx2, mpressy2); glVertex2d(mpressx2, mpressy1); glEnd(); } drawFps(); drawIter(); glutSwapBuffers(); }
void Debug::run() { if (Input::keyHeld(SDLK_F3)) { if (mb_active) { mb_active = false; } else { mb_active = true; } } if (mb_active) { drawFps(); } }
int main(int argc, char **argv) { srand(static_cast<unsigned int>(time(nullptr))); //seed random number generator with the current time if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { logSDLError("SDL_Init"); } if ((IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) != IMG_INIT_PNG) { logSDLError("IMG_Init"); } if (TTF_Init() == -1) { logSDLError("TTF_Init"); } SDL_Window *window = SDL_CreateWindow("Pong", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (window == nullptr) { logSDLError("CreateWindow"); } //SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); if (renderer == nullptr) { logSDLError("CreateRenderer"); } FpsTracker fpsTracker(100); WorldState currentWorldState; World *world = new World(renderer, SCREEN_WIDTH, SCREEN_HEIGHT, currentWorldState); world->startRound(currentWorldState); WorldState previousWorldState=currentWorldState; Hud *hud = new Hud(renderer, SCREEN_WIDTH, SCREEN_HEIGHT); drawUI(hud, currentWorldState); float dt = PHYSICS_TIMESTEP; Uint64 currentTime = SDL_GetPerformanceCounter(); float accumulator = 0; bool quit = false; SDL_Event event; while (!quit) { const Uint64 newTime = SDL_GetPerformanceCounter(); float deltaTime = static_cast<float>(newTime - currentTime) / SDL_GetPerformanceFrequency(); //aka time for this frame currentTime = newTime; if (deltaTime > 0.25f) { std::cout << "limiting delta time to 0.25f" << std::endl; deltaTime = 0.25f; // anti "spiral of death" / breakpoints } accumulator += deltaTime; int simCount = 0; while (accumulator >= dt) { accumulator -= dt; previousWorldState = currentWorldState; world->update(currentWorldState, dt); //aka integrate if (currentWorldState.humanScore != previousWorldState.humanScore || currentWorldState.opponentScore != previousWorldState.opponentScore) { drawUI(hud, currentWorldState); } ++simCount; } if (simCount > 1) { std::cout << "Simulated multiple steps:" << simCount << std::endl; } WorldState lerped = WorldState::lerpBetween(previousWorldState, currentWorldState, accumulator/dt); drawFps(hud, static_cast<int>(1 / fpsTracker.calculateAverageFrameTime(deltaTime))); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); SDL_RenderClear(renderer); world->render(lerped); hud->render(); SDL_RenderPresent(renderer); //TODO figure out where user input handling should go. @see http://gamedev.stackexchange.com/questions/8623/a-good-way-to-build-a-game-loop-in-opengl while (SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: quit = true; break; case SDL_KEYDOWN: switch(event.key.keysym.scancode) { case SDL_SCANCODE_ESCAPE: quit = true; break; } break; } } } std::cout << "Quitting" << std::endl; //cleanup delete hud; delete world; SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); TTF_Quit(); IMG_Quit(); SDL_Quit(); return 0; }