idTech4.Renderer.idRenderWorld.RenderScene C# (CSharp) Method

RenderScene() public method

Rendering a scene may actually render multiple subviews for mirrors and portals, and may render composite textures for gui console screens and light projections. It would also be acceptable to render a scene multiple times, for "rear view mirrors", etc.
public RenderScene ( idRenderView renderView ) : void
renderView idRenderView
return void
		public void RenderScene(idRenderView renderView)
		{
#if ID_DEDICATED

#else
			if(idE.RenderSystem.IsRunning == false)
			{
				return;
			}

			// skip front end rendering work, which will result
			// in only gui drawing
			if(idE.CvarSystem.GetBool("r_skipFrontEnd") == true)
			{
				return;
			}

			if((renderView.FovX <= 0) || (renderView.FovY <= 0))
			{
				idConsole.Error("idRenderWorld::RenderScene: bad FOVS: {0}, {1}", renderView.FovX, renderView.FovY);
			}

			idRenderView copy = renderView.Copy();

			// close any gui drawing
			idE.RenderSystem.GuiModel.EmitFullScreen();
			idE.RenderSystem.GuiModel.Clear();

			int startTime = idE.System.Milliseconds;

			// setup view parms for the initial view
			//
			View parms = new View();
			parms.RenderView = copy;

			// TODO: screenshot
			/*if ( tr.takingScreenshot ) {
				parms->renderView.forceUpdate = true;
			}*/

			// set up viewport, adjusted for resolution and OpenGL style 0 at the bottom
			parms.ViewPort = idE.RenderSystem.RenderViewToViewPort(parms.RenderView);

			// the scissor bounds may be shrunk in subviews even if
			// the viewport stays the same
			// this scissor range is local inside the viewport
			parms.Scissor.X1 = 0;
			parms.Scissor.Y1 = 0;
			parms.Scissor.X2 = (short) (parms.ViewPort.X2 - parms.ViewPort.X1);
			parms.Scissor.Y2 = (short) (parms.ViewPort.Y2 - parms.ViewPort.Y1);

			parms.IsSubview = false;
			parms.InitialViewAreaOrigin = renderView.ViewOrigin;
			parms.FloatTime = parms.RenderView.Time * 0.001f;
			parms.RenderWorld = this;

			// use this time for any subsequent 2D rendering, so damage blobs/etc 
			// can use level time
			idE.RenderSystem.FrameShaderTime = parms.FloatTime;

			// see if the view needs to reverse the culling sense in mirrors
			// or environment cube sides
			Vector3 tmp = new Vector3(parms.RenderView.ViewAxis.M21, parms.RenderView.ViewAxis.M22, parms.RenderView.ViewAxis.M23);
			Vector3 tmp2 = new Vector3(parms.RenderView.ViewAxis.M31, parms.RenderView.ViewAxis.M32, parms.RenderView.ViewAxis.M33);
			Vector3 tmp3 = new Vector3(parms.RenderView.ViewAxis.M11, parms.RenderView.ViewAxis.M12, parms.RenderView.ViewAxis.M13);
			Vector3 cross = Vector3.Cross(tmp, tmp2);

			if((cross * tmp3).Length() > 0)
			{
				parms.IsMirror = false;
			}
			else
			{
				parms.IsMirror = true;
			}

			if(idE.CvarSystem.GetBool("r_lockSurfaces") == true)
			{
				idConsole.Warning("TODO: R_LockSurfaceScene( parms );");
				return;
			}

			// save this world for use by some console commands
			idE.RenderSystem.PrimaryRenderWorld = this;
			idE.RenderSystem.PrimaryRenderView = copy;
			idE.RenderSystem.PrimaryView = parms;
			
			// rendering this view may cause other views to be rendered
			// for mirrors / portals / shadows / environment maps
			// this will also cause any necessary entities and lights to be
			// updated to the demo file
			idE.RenderSystem.RenderView(parms);

			// now write delete commands for any modified-but-not-visible entities, and
			// add the renderView command to the demo
			
			// TODO: demo
			/*if ( session->writeDemo ) {
				WriteRenderView( renderView );
			}*/

			int endTime = idE.System.Milliseconds;

			// TODO: tr.pc.frontEndMsec += endTime - startTime;

			// prepare for any 2D drawing after this
			idE.RenderSystem.GuiModel.Clear();
#endif
		}
		#endregion