/* * R_DrawPortals */ void R_DrawPortals( void ) { unsigned int i; if( rn.renderFlags & RF_SKYSHADOWVIEW ) { // render depth mask for skylights // TODO: rewrite this! float depthmin, depthmax; RB_GetDepthRange( &depthmin, &depthmax ); RB_ClearDepth( depthmin ); RB_Clear( GL_DEPTH_BUFFER_BIT, 0, 0, 0, 0 ); if( rn.portalmasklist && rn.portalmasklist->numDrawSurfs ) { RB_SetShaderStateMask( ~0, GLSTATE_DEPTHWRITE | GLSTATE_NO_COLORWRITE | GLSTATE_OFFSET_FILL | GLSTATE_DEPTHFUNC_GT ); RB_FlipFrontFace(); RB_DepthRange( depthmax, depthmax ); R_DrawPortalSurfaces( rn.portalmasklist ); RB_SetShaderStateMask( ~0, GLSTATE_DEPTHWRITE | GLSTATE_NO_COLORWRITE | GLSTATE_OFFSET_FILL ); RB_FlipFrontFace(); RB_DepthRange( depthmin, depthmax ); } RB_ClearDepth( depthmax ); return; } if( rn.renderFlags & ( RF_MIRRORVIEW | RF_LIGHTVIEW | RF_PORTALVIEW ) ) { return; } if( rn.viewcluster == -1 ) { return; } R_DrawPortalsDepthMask(); if( rn.skyportalSurface ) { // render skyportal portalSurface_t *ps = rn.skyportalSurface; R_DrawSkyportal( ps->entity, ps->skyPortal ); } else { // FIXME: move this? // render sky dome that writes to depth R_DrawDepthSkySurf(); } // render regular portals for( i = 0; i < rn.numPortalSurfaces; i++ ) { portalSurface_t ps = rn.portalSurfaces[i]; if( !ps.skyPortal ) { R_DrawPortalSurface( &ps ); rn.portalSurfaces[i] = ps; } } }
/* * RB_ExecuteRenderCommands * * This function will be called synchronously if running without * smp extensions, or asynchronously by another thread. */ void RB_ExecuteRenderCommands(const void *data) { int t1, t2; t1 = ri.Milliseconds (); if(!r_smp->integer || data == backEndData[0]->commands.cmds){ backEnd.smpFrame = 0; }else{ backEnd.smpFrame = 1; } while(1){ data = PADP(data, sizeof(void *)); switch(*(const int*)data){ case RC_SET_COLOR: data = RB_SetColor(data); break; case RC_STRETCH_PIC: data = RB_StretchPic(data); break; case RC_DRAW_SURFS: data = RB_DrawSurfs(data); break; case RC_DRAW_BUFFER: data = RB_DrawBuffer(data); break; case RC_SWAP_BUFFERS: data = RB_SwapBuffers(data); break; case RC_SCREENSHOT: data = RB_TakeScreenshotCmd(data); break; case RC_VIDEOFRAME: data = RB_TakeVideoFrameCmd(data); break; case RC_COLORMASK: data = RB_ColorMask(data); break; case RC_CLEARDEPTH: data = RB_ClearDepth(data); break; case RC_CAPSHADOWMAP: data = RB_CapShadowMap(data); break; case RC_POSTPROCESS: data = RB_PostProcess(data); break; case RC_END_OF_LIST: default: /* stop rendering on this thread */ t2 = ri.Milliseconds (); backEnd.pc.msec = t2 - t1; return; } } }
/* ==================== RB_ExecuteRenderCommands ==================== */ void RB_ExecuteRenderCommands( const void *data ) { int t1, t2; t1 = ri.Milliseconds (); while ( 1 ) { data = PADP(data, sizeof(void *)); switch ( *(const int *)data ) { case RC_SET_COLOR: data = RB_SetColor( data ); break; case RC_STRETCH_PIC: data = RB_StretchPic( data ); break; case RC_DRAW_SURFS: data = RB_DrawSurfs( data ); break; case RC_DRAW_BUFFER: data = RB_DrawBuffer( data ); break; case RC_SWAP_BUFFERS: data = RB_SwapBuffers( data ); break; case RC_SCREENSHOT: data = RB_TakeScreenshotCmd( data ); break; case RC_VIDEOFRAME: data = RB_TakeVideoFrameCmd( data ); break; case RC_COLORMASK: data = RB_ColorMask(data); break; case RC_CLEARDEPTH: data = RB_ClearDepth(data); break; case RC_CAPSHADOWMAP: data = RB_CapShadowMap(data); break; case RC_POSTPROCESS: data = RB_PostProcess(data); break; case RC_EXPORT_CUBEMAPS: data = RB_ExportCubemaps(data); break; case RC_END_OF_LIST: default: // finish any 2D drawing if needed if(tess.numIndexes) RB_EndSurface(); // stop rendering t2 = ri.Milliseconds (); backEnd.pc.msec = t2 - t1; return; } } }
/* * R_DrawPortalsDepthMask * * Renders portal or sky surfaces from the BSP tree to depth buffer. Each rendered pixel * receives the depth value of 1.0, everything else is cleared to 0.0. * * The depth buffer is then preserved for portal render stage to minimize overdraw. */ static void R_DrawPortalsDepthMask( void ) { float depthmin, depthmax; if( !rn.portalmasklist || !rn.portalmasklist->numDrawSurfs ) { return; } RB_GetDepthRange( &depthmin, &depthmax ); RB_ClearDepth( depthmin ); RB_Clear( GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT, 0, 0, 0, 0 ); RB_SetShaderStateMask( ~0, GLSTATE_DEPTHWRITE | GLSTATE_DEPTHFUNC_GT | GLSTATE_NO_COLORWRITE ); RB_DepthRange( depthmax, depthmax ); R_DrawPortalSurfaces( rn.portalmasklist ); RB_DepthRange( depthmin, depthmax ); RB_ClearDepth( depthmax ); }
/* ==================== RB_ExecuteRenderCommands ==================== */ void RB_ExecuteRenderCommands( const void *data ) { int t1, t2; t1 = ri.Milliseconds (); while ( 1 ) { data = PADP(data, sizeof(void *)); switch ( *(const int *)data ) { case RC_SET_COLOR: data = RB_SetColor( data ); break; case RC_STRETCH_PIC: data = RB_StretchPic( data ); break; case RC_ROTATED_PIC: data = RB_RotatedPic( data ); break; case RC_DRAW_SURFS: data = RB_DrawSurfs( data ); break; case RC_DRAW_BUFFER: data = RB_DrawBuffer( data ); break; case RC_SWAP_BUFFERS: data = RB_SwapBuffers( data ); break; case RC_SCREENSHOT: data = RB_TakeScreenshotCmd( data ); break; case RC_VIDEOFRAME: data = RB_TakeVideoFrameCmd( data ); break; case RC_COLORMASK: data = RB_ColorMask(data); break; case RC_CLEARDEPTH: data = RB_ClearDepth(data); break; case RC_END_OF_LIST: default: // stop rendering t2 = ri.Milliseconds (); backEnd.pc.msec = t2 - t1; return; } } }
/* ==================== RB_ExecuteRenderCommands This function will be called synchronously if running without smp extensions, or asynchronously by another thread. ==================== */ void RB_ExecuteRenderCommands( const void *data ) { int t1, t2; t1 = ri.Milliseconds (); if ( !r_smp->integer || data == backEndData[0]->commands.cmds ) { backEnd.smpFrame = 0; } else { backEnd.smpFrame = 1; } while ( 1 ) { data = PADP(data, sizeof(void *)); switch ( *(const int *)data ) { case RC_SET_COLOR: data = RB_SetColor( data ); break; case RC_STRETCH_PIC: #ifdef FRAMEBUFFER_AND_GLSL_SUPPORT R_FrameBuffer_EndFrame(); #endif data = RB_StretchPic( data ); break; case RC_DRAW_SURFS: data = RB_DrawSurfs( data ); break; case RC_DRAW_BUFFER: #ifdef FRAMEBUFFER_AND_GLSL_SUPPORT data = useFrameBuffer ? RB_DrawFrameBuffer( data ) : RB_DrawBuffer( data ); #else data = RB_DrawBuffer( data ); #endif break; case RC_SWAP_BUFFERS: data = RB_SwapBuffers( data ); break; //these two use a hack to let them copy the framebuffer effects too case RC_SCREENSHOT: #ifdef FRAMEBUFFER_AND_GLSL_SUPPORT R_FrameBufferUnBind(); #endif data = RB_TakeScreenshotCmd( data ); #ifdef FRAMEBUFFER_AND_GLSL_SUPPORT R_FrameBufferBind(); #endif break; case RC_VIDEOFRAME: #ifdef FRAMEBUFFER_AND_GLSL_SUPPORT R_FrameBufferUnBind(); #endif data = RB_TakeVideoFrameCmd( data ); #ifdef FRAMEBUFFER_AND_GLSL_SUPPORT R_FrameBufferBind(); #endif break; case RC_COLORMASK: data = RB_ColorMask(data); break; case RC_CLEARDEPTH: data = RB_ClearDepth(data); break; case RC_END_OF_LIST: default: // stop rendering on this thread t2 = ri.Milliseconds (); backEnd.pc.msec = t2 - t1; return; } } }