snake5 icon

some clean-ish rendering code

snake5 | PRO | 09/20/15 02:09:11 PM UTC | 0 ⭐ | 783 👁️ | Never ⏰ | []
C++ |

4.93 KB

|

None

|

0 👍

/

0 👎

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 );
}

Comments