void BatchQueue::Draw(View* view, bool markToStencil, bool usingLightOptimization) const { Graphics* graphics = view->GetGraphics(); Renderer* renderer = view->GetRenderer(); // If View has set up its own light optimizations, do not disturb the stencil/scissor test settings if (!usingLightOptimization) { graphics->SetScissorTest(false); // During G-buffer rendering, mark opaque pixels' lightmask to stencil buffer if requested if (!markToStencil) graphics->SetStencilTest(false); } // Instanced for (PODVector<BatchGroup*>::ConstIterator i = sortedBatchGroups_.Begin(); i != sortedBatchGroups_.End(); ++i) { BatchGroup* group = *i; if (markToStencil) graphics->SetStencilTest(true, CMP_ALWAYS, OP_REF, OP_KEEP, OP_KEEP, group->lightMask_); group->Draw(view); } // Non-instanced for (PODVector<Batch*>::ConstIterator i = sortedBatches_.Begin(); i != sortedBatches_.End(); ++i) { Batch* batch = *i; if (markToStencil) graphics->SetStencilTest(true, CMP_ALWAYS, OP_REF, OP_KEEP, OP_KEEP, batch->lightMask_); if (!usingLightOptimization) { // If drawing an alpha batch, we can optimize fillrate by scissor test if (!batch->isBase_ && batch->lightQueue_) renderer->OptimizeLightByScissor(batch->lightQueue_->light_, batch->camera_); else graphics->SetScissorTest(false); } batch->Draw(view); } }