void World::RenderLighting()
{
// get active camera
Camera *pkCamera = Camera::GetActiveCamera();
// render one pass for each light source
for( unsigned int a = 0; a < m_vpkVisibleLightsSet.size(); a++ )
{
//get light
Light *pkLight = m_vpkVisibleLightsSet[a];
// enable stencil test
glEnable( GL_STENCIL_TEST );
Core::Get()->GetRenderer()->ClearFramebuffer( Renderer::BUFFER_STENCIL );
if( pkLight->GetCastShadows() )
{
// setup states
glStencilFunc( GL_ALWAYS, 0, ~0 );
glColorMask( false, false, false, false );
// for all models..
for( unsigned int i = 0; i < pkLight->m_vpkShadowCastingGroupsSet.size(); i++ )
{
// activate extrusion shader
Core::Get()->GetRenderer()->ActivateShader( m_pkExtrusionShader );
// get current group
Group *pkGroup = pkLight->m_vpkShadowCastingGroupsSet[i];
// get light to model gl_Vertex
Vector3D kLightVector = pkLight->GetTranslation()-pkGroup->GetParent()->GetTranslation();
// re-compute silhouette
pkGroup->ComputeSilhouette( kLightVector );
// z-fail algorithm
glCullFace( GL_FRONT );
glStencilOp( GL_KEEP, GL_INCR, GL_KEEP );
pkGroup->RenderSilhouette();
glCullFace( GL_BACK );
glStencilOp( GL_KEEP, GL_DECR, GL_KEEP );
pkGroup->RenderSilhouette();
// ------- HACK: try to prevent self-shadowing -------
glStencilOp( GL_KEEP, GL_KEEP, GL_ZERO );
// push matrix
glPushMatrix();
// apply model's view matrix
Core::Get()->GetRenderer()->UploadMatrix( pkGroup->GetParent()->GetViewMatrix(), false );
// render group (unshaded)
pkGroup->Render( 0 );
// Pop matrix
glPopMatrix();
// -----------------------------------------------------------
}
// deactivate shaders
Core::Get()->GetRenderer()->DeactivateShaders();
// reset states
glStencilFunc( GL_EQUAL, 0, ~0) ;
glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
glColorMask( true, true, true, true );
}
// enable blending
glEnable( GL_BLEND );
glBlendFunc( GL_ONE, GL_ONE );
for( unsigned int i = 0; i < pkLight->m_vpkIlluminatedGroupsSet.size(); i++ )
{
// get current group..
Group *pkGroup = pkLight->m_vpkIlluminatedGroupsSet[i];
// push matrix
glPushMatrix();
// apply model's view matrix
Core::Get()->GetRenderer()->UploadMatrix( pkGroup->GetParent()->GetViewMatrix(), false );
// check for custom shader, otherwise use to default lighting shader
Shader *pkShader = pkGroup->GetCustomShader() ? pkGroup->GetCustomShader() : m_pkLightingShader;
// activate shader
Core::Get()->GetRenderer()->ActivateShader( pkShader );
// render it
pkGroup->Render( pkShader );
// deactivate shaders
Core::Get()->GetRenderer()->DeactivateShaders();
// Pop matrix
glPopMatrix();
}
// disable blending
glDisable( GL_BLEND );
// disable stencil test
glDisable( GL_STENCIL_TEST );
}
}