void FGLRenderer::RenderView (player_t* player) { OpenGLFrameBuffer* GLTarget = static_cast<OpenGLFrameBuffer*>(screen); AActor *&LastCamera = GLTarget->LastCamera; checkBenchActive(); if (player->camera != LastCamera) { // If the camera changed don't interpolate // Otherwise there will be some not so nice effects. R_ResetViewInterpolation(); LastCamera=player->camera; } gl_RenderState.SetVertexBuffer(mVBO); GLRenderer->mVBO->Reset(); // reset statistics counters ResetProfilingData(); // Get this before everything else if (cl_capfps || r_NoInterpolate) r_TicFracF = 1.; else r_TicFracF = I_GetTimeFrac (&r_FrameTime); gl_frameMS = I_MSTime(); P_FindParticleSubsectors (); if (!gl.legacyMode) GLRenderer->mLights->Clear(); // NoInterpolateView should have no bearing on camera textures, but needs to be preserved for the main view below. bool saved_niv = NoInterpolateView; NoInterpolateView = false; // prepare all camera textures that have been used in the last frame FCanvasTextureInfo::UpdateAll(); NoInterpolateView = saved_niv; // now render the main view float fovratio; float ratio = WidescreenRatio; if (WidescreenRatio >= 1.3f) { fovratio = 1.333333f; } else { fovratio = ratio; } SetFixedColormap (player); // Check if there's some lights. If not some code can be skipped. TThinkerIterator<ADynamicLight> it(STAT_DLIGHT); GLRenderer->mLightCount = ((it.Next()) != NULL); sector_t * viewsector = RenderViewpoint(player->camera, NULL, FieldOfView.Degrees, ratio, fovratio, true, true); All.Unclock(); }
static void R_SetupFrame (player_t *player) { int cm; boolean NoInterpolate = paused || (menuactive && !demoplayback); viewplayer = player; if (player->mo != oviewer || NoInterpolate) { R_ResetViewInterpolation (); oviewer = player->mo; } tic_vars.frac = I_GetTimeFrac (); if (NoInterpolate) tic_vars.frac = FRACUNIT; R_InterpolateView (player, tic_vars.frac); extralight = player->extralight; viewsin = finesine[viewangle>>ANGLETOFINESHIFT]; viewcos = finecosine[viewangle>>ANGLETOFINESHIFT]; R_DoInterpolations(tic_vars.frac); // killough 3/20/98, 4/4/98: select colormap based on player status if (player->mo->subsector->sector->heightsec != -1) { const sector_t *s = player->mo->subsector->sector->heightsec + sectors; cm = viewz < s->floorheight ? s->bottommap : viewz > s->ceilingheight ? s->topmap : s->midmap; if (cm < 0 || cm > numcolormaps) cm = 0; } else cm = 0; fullcolormap = colormaps[cm]; zlight = c_zlight[cm]; if (player->fixedcolormap) { fixedcolormap = fullcolormap // killough 3/20/98: use fullcolormap + player->fixedcolormap*256*sizeof(lighttable_t); } else fixedcolormap = 0; validcount++; }
void R_InterpolateView(player_t *player) { static mobj_t *oviewer; fixed_t frac; dboolean NoInterpolate = (paused && !walkcamera.type) || (menuactive && !demoplayback); viewplayer = player; if (player->mo != oviewer || NoInterpolate) { R_ResetViewInterpolation(); oviewer = player->mo; } tic_vars.frac = I_GetTimeFrac(); if (NoInterpolate) tic_vars.frac = FRACUNIT; frac = tic_vars.frac; if (movement_smooth) { if (NoInterpolateView) { NoInterpolateView = false; player->prev_viewz = player->viewz; player->prev_viewangle = player->mo->angle + viewangleoffset; player->prev_viewpitch = player->mo->pitch; P_ResetWalkcam(); } if (walkcamera.type != 2) { viewx = player->mo->PrevX + FixedMul (frac, player->mo->x - player->mo->PrevX); viewy = player->mo->PrevY + FixedMul (frac, player->mo->y - player->mo->PrevY); viewz = player->prev_viewz + FixedMul (frac, player->viewz - player->prev_viewz); } else { viewx = walkcamera.PrevX + FixedMul (frac, walkcamera.x - walkcamera.PrevX); viewy = walkcamera.PrevY + FixedMul (frac, walkcamera.y - walkcamera.PrevY); viewz = walkcamera.PrevZ + FixedMul (frac, walkcamera.z - walkcamera.PrevZ); } if (walkcamera.type) { viewangle = walkcamera.PrevAngle + FixedMul (frac, walkcamera.angle - walkcamera.PrevAngle); viewpitch = walkcamera.PrevPitch + FixedMul (frac, walkcamera.pitch - walkcamera.PrevPitch); } else { viewangle = player->prev_viewangle + FixedMul (frac, R_SmoothPlaying_Get(player) + viewangleoffset - player->prev_viewangle); viewpitch = player->prev_viewpitch + FixedMul (frac, player->mo->pitch - player->prev_viewpitch); } } else { if (walkcamera.type != 2) { viewx = player->mo->x; viewy = player->mo->y; viewz = player->viewz; } else { viewx = walkcamera.x; viewy = walkcamera.y; viewz = walkcamera.z; } if (walkcamera.type) { viewangle = walkcamera.angle; viewpitch = walkcamera.pitch; } else { viewangle = R_SmoothPlaying_Get(player); viewpitch = player->mo->pitch; } } if (!paused && movement_smooth) { int i; didInterp = tic_vars.frac != FRACUNIT; if (didInterp) { for (i = numinterpolations - 1; i >= 0; i--) { R_DoAnInterpolation (i, tic_vars.frac); } } } }
sector_t *FGLRenderer::RenderView(player_t* player) { gl_RenderState.SetVertexBuffer(screen->mVertexData); screen->mVertexData->Reset(); sector_t *retsec; if (!V_IsHardwareRenderer()) { if (swdrawer == nullptr) swdrawer = new SWSceneDrawer; retsec = swdrawer->RenderView(player); } else { hw_ClearFakeFlat(); iter_dlightf = iter_dlight = draw_dlight = draw_dlightf = 0; checkBenchActive(); // reset statistics counters ResetProfilingData(); // Get this before everything else if (cl_capfps || r_NoInterpolate) r_viewpoint.TicFrac = 1.; else r_viewpoint.TicFrac = I_GetTimeFrac(); screen->mLights->Clear(); screen->mViewpoints->Clear(); // NoInterpolateView should have no bearing on camera textures, but needs to be preserved for the main view below. bool saved_niv = NoInterpolateView; NoInterpolateView = false; // Shader start time does not need to be handled per level. Just use the one from the camera to render from. gl_RenderState.CheckTimer(player->camera->Level->ShaderStartTime); // prepare all camera textures that have been used in the last frame. // This must be done for all levels, not just the primary one! for (auto Level : AllLevels()) { Level->canvasTextureInfo.UpdateAll([&](AActor *camera, FCanvasTexture *camtex, double fov) { RenderTextureView(camtex, camera, fov); }); } NoInterpolateView = saved_niv; // now render the main view float fovratio; float ratio = r_viewwindow.WidescreenRatio; if (r_viewwindow.WidescreenRatio >= 1.3f) { fovratio = 1.333333f; } else { fovratio = ratio; } retsec = RenderViewpoint(r_viewpoint, player->camera, NULL, r_viewpoint.FieldOfView.Degrees, ratio, fovratio, true, true); } All.Unclock(); return retsec; }