Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void IGame::OnDrawScene( SGRX_IRenderControl* ctrl, SGRX_RenderScene& info )
- {
- #define RT_MAIN 0xfff0
- #define RT_HBLUR 0xfff1
- #define RT_VBLUR 0xfff2
- #define RT_HBLUR2 0xfff3
- #define RT_VBLUR2 0xfff4
- #define RT_HPASS 0xfff5
- #define RT_DEPTH 0xfff6
- // preserve state
- Mat4 viewMtx = g_BatchRenderer->viewMatrix;
- // shortcuts
- SGRX_Scene* scene = info.scene;
- BatchRenderer& br = GR2D_GetBatchRenderer();
- int W = GR_GetWidth();
- int H = GR_GetHeight();
- int W4 = TMAX( W / 4, 1 ), H4 = TMAX( H / 4, 1 );
- int W16 = TMAX( W4 / 4, 1 ), H16 = TMAX( H4 / 4, 1 );
- // load shaders
- PixelShaderHandle pppsh_final = GR_GetPixelShader( "sys_pp_final" );
- PixelShaderHandle pppsh_highpass = GR_GetPixelShader( "sys_pp_highpass" );
- PixelShaderHandle pppsh_blur = GR_GetPixelShader( "sys_pp_blur" );
- GR_PreserveResource( pppsh_final );
- GR_PreserveResource( pppsh_highpass );
- GR_PreserveResource( pppsh_blur );
- // initial actions
- ctrl->RenderShadows( scene, 0 );
- ctrl->SortRenderItems( scene );
- // prepare render targets
- TextureHandle rttMAIN, rttHPASS, rttHBLUR, rttVBLUR, rttHBLUR2, rttVBLUR2, rttDEPTH;
- DepthStencilSurfHandle dssMAIN;
- if( info.enablePostProcessing )
- {
- rttMAIN = GR_GetRenderTarget( W, H, RT_FORMAT_COLOR_HDR16, RT_MAIN );
- rttDEPTH = GR_GetRenderTarget( W, H, RT_FORMAT_COLOR_HDR16, RT_DEPTH );
- rttHPASS = GR_GetRenderTarget( W, H, RT_FORMAT_COLOR_HDR16, RT_HPASS );
- rttHBLUR = GR_GetRenderTarget( W4, H, RT_FORMAT_COLOR_HDR16, RT_HBLUR );
- rttVBLUR = GR_GetRenderTarget( W4, H4, RT_FORMAT_COLOR_HDR16, RT_VBLUR );
- rttHBLUR2 = GR_GetRenderTarget( W16, H4, RT_FORMAT_COLOR_HDR16, RT_HBLUR2 );
- rttVBLUR2 = GR_GetRenderTarget( W16, H16, RT_FORMAT_COLOR_HDR16, RT_VBLUR2 );
- dssMAIN = GR_GetDepthStencilSurface( W, H, RT_FORMAT_COLOR_HDR16, RT_MAIN );
- GR_PreserveResource( rttMAIN );
- GR_PreserveResource( rttDEPTH );
- GR_PreserveResource( rttHPASS );
- GR_PreserveResource( rttHBLUR );
- GR_PreserveResource( rttVBLUR );
- GR_PreserveResource( rttHBLUR2 );
- GR_PreserveResource( rttVBLUR2 );
- GR_PreserveResource( dssMAIN );
- ctrl->SetRenderTargets( dssMAIN, SGRX_RT_ClearAll, 0, 0, 1, rttDEPTH );
- ctrl->RenderTypes( scene, 0, 1, SGRX_TY_Solid );
- }
- // draw things
- ctrl->SetRenderTargets( dssMAIN, SGRX_RT_ClearAll, 0, 0, 1, rttMAIN );
- if( info.viewport )
- GR2D_SetViewport( info.viewport->x0, info.viewport->y0, info.viewport->x1, info.viewport->y1 );
- ctrl->RenderTypes( scene, 1, 1, SGRX_TY_Solid );
- ctrl->RenderTypes( scene, 3, 4, SGRX_TY_Solid );
- ctrl->RenderTypes( scene, 1, 1, SGRX_TY_Decal );
- ctrl->RenderTypes( scene, 3, 4, SGRX_TY_Decal );
- ctrl->RenderTypes( scene, 1, 1, SGRX_TY_Transparent );
- ctrl->RenderTypes( scene, 3, 4, SGRX_TY_Transparent );
- if( info.postdraw )
- {
- GR2D_SetViewMatrix( scene->camera.mView * scene->camera.mProj );
- info.postdraw->PostDraw();
- }
- // post-process
- GR2D_SetViewMatrix( Mat4::CreateUI( 0, 0, 1, 1 ) );
- if( info.enablePostProcessing )
- {
- br.Reset();
- br.ShaderData.push_back( V4(0) );
- float spread = 3.5f;
- ctrl->SetRenderTargets( NULL, SGRX_RT_ClearAll, 0, 0, 1, rttHPASS );
- br.SetTexture( rttMAIN ).SetShader( pppsh_highpass ).Quad( 0, 0, 1, 1 ).Flush();
- br.ShaderData[0] = V4( 0, 0, safe_fdiv( spread, W ), 0 );
- ctrl->SetRenderTargets( NULL, SGRX_RT_ClearAll, 0, 0, 1, rttHBLUR );
- br.SetTexture( rttHPASS ).SetShader( pppsh_blur ).Quad( 0, 0, 1, 1 ).Flush();
- br.ShaderData[0] = V4( 0, 0, 0, safe_fdiv( spread, H ) );
- ctrl->SetRenderTargets( NULL, SGRX_RT_ClearAll, 0, 0, 1, rttVBLUR );
- br.SetTexture( rttHBLUR ).SetShader( pppsh_blur ).Quad( 0, 0, 1, 1 ).Flush();
- br.ShaderData[0] = V4( 0, 0, safe_fdiv( spread, W4 ), 0 );
- ctrl->SetRenderTargets( NULL, SGRX_RT_ClearAll, 0, 0, 1, rttHBLUR2 );
- br.SetTexture( rttVBLUR ).SetShader( pppsh_blur ).Quad( 0, 0, 1, 1 ).Flush();
- br.ShaderData[0] = V4( 0, 0, 0, safe_fdiv( spread, H4 ) );
- ctrl->SetRenderTargets( NULL, SGRX_RT_ClearAll, 0, 0, 1, rttVBLUR2 );
- br.SetTexture( rttHBLUR2 ).SetShader( pppsh_blur ).Quad( 0, 0, 1, 1 ).Flush();
- ctrl->SetRenderTargets( NULL, 0, 0, 0, 1 );
- br.SetTexture( 0, rttMAIN )
- .SetTexture( 2, rttVBLUR )
- .SetTexture( 3, rttVBLUR2 )
- .SetTexture( 4, rttDEPTH ).SetShader( pppsh_final ).VPQuad( info.viewport ).Flush();
- }
- else
- {
- ctrl->SetRenderTargets( NULL, 0, 0, 0, 1 );
- br.Reset().SetTexture( rttMAIN ).VPQuad( info.viewport ).Flush();
- }
- // debug rendering from camera viewpoint and optional depth clipping
- if( info.debugdraw )
- {
- ctrl->SetRenderTargets( dssMAIN, 0, 0, 0, 1 );
- if( info.viewport )
- GR2D_SetViewport( info.viewport->x0, info.viewport->y0, info.viewport->x1, info.viewport->y1 );
- GR2D_SetViewMatrix( scene->camera.mView * scene->camera.mProj );
- info.debugdraw->DebugDraw();
- if( info.viewport )
- GR2D_UnsetViewport();
- ctrl->SetRenderTargets( NULL, 0, 0, 0, 1 );
- }
- GR2D_SetViewMatrix( viewMtx );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement