/* ================== V_RenderView ================== */ void V_RenderView( void ) { if( !cl.video_prepped || ( UI_IsVisible() && !cl.background )) return; // still loading if( cl.frame.valid && ( cl.force_refdef || !cl.refdef.paused )) { cl.force_refdef = false; R_ClearScene (); CL_AddEntities (); V_SetupRefDef (); } V_CalcRefDef (); }
bool V_RenderView() { guard(V_RenderView); if (cls.state != ca_active) return false; if (!cl.rendererReady) return false; // still loading if (!bspfile.clientLoaded) return false; // map already unloaded (by server), but client is still active (ca_active) if (timedemo->integer) { static unsigned lastTime = 0; unsigned time = appMilliseconds(); if (!cl.timedemoStart) { cl.timedemoStart = time; // cl.timedemoLongestFrame = 0; -- cleared anyway within a new server map // cl.timedemoFrames = 0; } else { unsigned timeDelta = time - lastTime; if (timeDelta > cl.timedemoLongestFrame) //?? && !fileFromPak) cl.timedemoLongestFrame = timeDelta; } lastTime = time; cl.timedemoFrames++; } #if PROFILE_VIEW unsigned beforePrep = 0, beforeDebug = 0, beforeEffects = 0, afterEffects = 0, beforeRender, afterRender; #endif // an invalid frame will just use the exact previous refdef // we can't use the old frame if the video mode has changed, though... if (cl.frame.valid && (cl.forceViewFrame || !cl_paused->integer)) { PRF(beforePrep = appCycles()); cl.forceViewFrame = false; CalcVrect(); TileClear(); V_ClearScene(); cl.refdef.rdflags = cl.frame.playerstate.rdflags; // build a renderer entity list and calc cl.sim* // this also calls CL_CalcViewValues which loads // v_forward, etc. CL_AddEntities(); PRF(beforeEffects = appCycles()); CL_AddEffects(); PRF(afterEffects = appCycles()); CL_AddTEnts(); #if !NO_DEBUG if (cl_testentities->integer) TestEntities(); if (cl_testlights->integer) TestLights(); if (cl_testblend->integer) { r_blend[0] = 1; r_blend[1] = 0.5; r_blend[2] = 0.25; r_blend[3] = 0.5; } // debug output // free debug memory from previous frame if (debugMem) { delete debugMem; debugMem = NULL; } PRF(beforeDebug = appCycles()); if (r_playerpos->integer) DrawOriginInfo(); if (r_surfinfo->integer) DrawSurfInfo(); DrawBrush(); #endif // NO_DEBUG #if 0 // never let it sit exactly on a node line, because a water plane can // dissapear when viewed with the eye exactly on it. // the server protocol only specifies to 1/8 pixel, so add 1/16 in each axis cl.refdef.vieworg[0] += 1.0f/16; //?? cl.refdef.vieworg[1] += 1.0f/16; cl.refdef.vieworg[2] += 1.0f/16; #endif cl.refdef.x = scr_vrect.x; cl.refdef.y = scr_vrect.y; cl.refdef.width = scr_vrect.width; cl.refdef.height = scr_vrect.height; cl.refdef.fov_y = CalcFov(cl.refdef.fov_x, cl.refdef.width, cl.refdef.height); cl.refdef.time = cl.ftime; cl.refdef.zonebits = cl.frame.zonebits; if (!cl_add_entities->integer) r_numentities = 0; if (!cl_add_lights->integer) r_numdlights = 0; if (!cl_add_blend->integer || cl.refdef.rdflags & RDF_THIRD_PERSON) r_blend[3] = 0; cl.refdef.num_entities = r_numentities; cl.refdef.entities = r_entities; cl.refdef.particles = cl_add_particles->integer ? active_particles : NULL; cl.refdef.beams = active_beams; cl.refdef.num_dlights = r_numdlights; cl.refdef.dlights = r_dlights; cl.refdef.lightstyles = cl_lightstyles; // underwater fov warp (taken from Q3 game source) if (cl.refdef.rdflags & RDF_UNDERWATER) { float v = sin(cl.ftime * 0.4f * M_PI * 2); cl.refdef.fov_x += v; cl.refdef.fov_y -= v; } FixWaterVis(); } PRF(beforeRender = appCycles()); // render scene RE_RenderFrame(&cl.refdef); PRF(afterRender = appCycles()); // add full-screen blend if (r_blend[3]) RE_Fill(cl.refdef.x, cl.refdef.y, cl.refdef.width, cl.refdef.height, RGBAS(r_blend[0], r_blend[1], r_blend[2], r_blend[3])); #if PROFILE_VIEW RE_DrawTextLeft(va("V: prep1: %5.2f fx: %5.2f prep2: %5.2f dbg: %5.2f render: %5.2f", appCyclesToMsecf(beforeEffects - beforePrep), appCyclesToMsecf(afterEffects - beforeEffects), appCyclesToMsecf(beforeDebug - afterEffects), appCyclesToMsecf(beforeRender - beforeDebug), appCyclesToMsecf(afterRender - beforeRender)), RGB(0.2,1,0.2)); #endif // stats if (r_drawfps->integer) DrawFpsInfo(); return true; unguard; }