Esempio n. 1
0
/*
==================
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 ();
}
Esempio n. 2
0
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;
}