void ShadowVolumeRenderPass::Draw(Camera * camera)
{
    // Draw all layers with their materials
    uint32 size = (uint32)renderLayers.size();
    DVASSERT(size == 1);
    
    RenderLayer * shadowVolumesLayer = renderLayers[0];
    //Vector<LightNode*> & lights = renderSystem->GetLights();
    uint32 renderBatchCount = shadowVolumesLayer->GetRenderBatchCount();
    
    if(RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::SHADOWVOLUME_DRAW)
       && renderBatchCount > 0)
	{
		if(!shadowRect)
		{
			shadowRect = ShadowRect::Create();
		}
        
		//2nd pass
		RenderManager::Instance()->RemoveState(RenderStateBlock::STATE_CULL);
		RenderManager::Instance()->RemoveState(RenderStateBlock::STATE_DEPTH_WRITE);
		RenderManager::Instance()->AppendState(RenderStateBlock::STATE_BLEND);
		RenderManager::Instance()->SetBlendMode(BLEND_ZERO, BLEND_ONE);
        
		RenderManager::Instance()->ClearStencilBuffer(0);
		RenderManager::Instance()->AppendState(RenderStateBlock::STATE_STENCIL_TEST);
		
		RenderManager::State()->SetStencilFunc(FACE_FRONT_AND_BACK, CMP_ALWAYS);
		RenderManager::State()->SetStencilRef(1);
		RenderManager::State()->SetStencilMask(0xFFFFFFFF);
        
		RenderManager::State()->SetStencilPass(FACE_FRONT, STENCILOP_KEEP);
		RenderManager::State()->SetStencilFail(FACE_FRONT, STENCILOP_KEEP);
		RenderManager::State()->SetStencilZFail(FACE_FRONT, STENCILOP_DECR_WRAP);
        
		RenderManager::State()->SetStencilPass(FACE_BACK, STENCILOP_KEEP);
		RenderManager::State()->SetStencilFail(FACE_BACK, STENCILOP_KEEP);
		RenderManager::State()->SetStencilZFail(FACE_BACK, STENCILOP_INCR_WRAP);
		
		RenderManager::Instance()->FlushState();
    
        shadowVolumesLayer->Draw(camera);
        
		//3rd pass
		RenderManager::Instance()->RemoveState(RenderStateBlock::STATE_CULL);
		RenderManager::Instance()->RemoveState(RenderStateBlock::STATE_DEPTH_TEST);
		
		RenderManager::State()->SetStencilRef(0);
		RenderManager::State()->SetStencilFunc(FACE_FRONT_AND_BACK, CMP_NOTEQUAL);
		RenderManager::State()->SetStencilPass(FACE_FRONT_AND_BACK, STENCILOP_KEEP);
		RenderManager::State()->SetStencilFail(FACE_FRONT_AND_BACK, STENCILOP_KEEP);
		RenderManager::State()->SetStencilZFail(FACE_FRONT_AND_BACK, STENCILOP_KEEP);
        
		RenderManager::Instance()->SetBlendMode(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);
		shadowRect->Draw();
	}
}
void ShadowVolumeRenderPass::Draw(Camera * camera)
{
    // Draw all layers with their materials
    uint32 size = (uint32)renderLayers.size();
    DVASSERT(size == 1);
    
    RenderLayer * shadowVolumesLayer = renderLayers[0];
    //Vector<LightNode*> & lights = renderSystem->GetLights();
    uint32 renderBatchCount = shadowVolumesLayer->GetRenderBatchCount();
    
    if(RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::SHADOWVOLUME_DRAW)
       && renderBatchCount > 0)
	{
		eBlendMode sFactor = RenderManager::Instance()->GetSrcBlend();
		eBlendMode dFactor = RenderManager::Instance()->GetDestBlend();

		//2nd pass
		RenderManager::Instance()->RemoveState(RenderState::STATE_CULL);
		RenderManager::Instance()->RemoveState(RenderState::STATE_DEPTH_WRITE);
		RenderManager::Instance()->AppendState(RenderState::STATE_BLEND);
		RenderManager::Instance()->SetBlendMode(BLEND_ZERO, BLEND_ONE);
        
		//RenderManager::Instance()->ClearStencilBuffer(0); //moved to per-frame clear
		RenderManager::Instance()->AppendState(RenderState::STATE_STENCIL_TEST);
		
		RenderManager::State()->SetStencilFunc(FACE_FRONT_AND_BACK, CMP_ALWAYS);
		RenderManager::State()->SetStencilRef(1);
		RenderManager::State()->SetStencilMask(0x0000000F);
        
		RenderManager::State()->SetStencilPass(FACE_FRONT, STENCILOP_KEEP);
		RenderManager::State()->SetStencilFail(FACE_FRONT, STENCILOP_KEEP);
		RenderManager::State()->SetStencilZFail(FACE_FRONT, STENCILOP_DECR_WRAP);
        
		RenderManager::State()->SetStencilPass(FACE_BACK, STENCILOP_KEEP);
		RenderManager::State()->SetStencilFail(FACE_BACK, STENCILOP_KEEP);
		RenderManager::State()->SetStencilZFail(FACE_BACK, STENCILOP_INCR_WRAP);
		
		RenderManager::Instance()->FlushState();
    
        shadowVolumesLayer->Draw(camera);
        
		//3rd pass
		RenderManager::Instance()->RemoveState(RenderState::STATE_CULL);
		RenderManager::Instance()->RemoveState(RenderState::STATE_DEPTH_TEST);
		
		RenderManager::State()->SetStencilRef(0);
		RenderManager::State()->SetStencilFunc(FACE_FRONT_AND_BACK, CMP_NOTEQUAL);
		RenderManager::State()->SetStencilPass(FACE_FRONT_AND_BACK, STENCILOP_KEEP);
		RenderManager::State()->SetStencilFail(FACE_FRONT_AND_BACK, STENCILOP_KEEP);
		RenderManager::State()->SetStencilZFail(FACE_FRONT_AND_BACK, STENCILOP_KEEP);

		switch(blendMode)
		{
		case MODE_BLEND_ALPHA:
			RenderManager::Instance()->SetBlendMode(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);
			break;
		case MODE_BLEND_MULTIPLY:
			RenderManager::Instance()->SetBlendMode(BLEND_DST_COLOR, BLEND_ZERO);
			break;
		default:
			break;
		}

		shadowRect->Draw();

		RenderManager::Instance()->SetBlendMode(sFactor, dFactor);
	}
}