void CSMFGroundDrawer::Draw(const DrawPass::e& drawPass) { // must be here because water renderers also call us if (!globalRendering->drawGround) return; // if entire map is under voidwater, no need to draw *ground* if (readMap->HasOnlyVoidWater()) return; glDisable(GL_BLEND); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); if (drawDeferred) { // do the deferred pass first, will allow us to re-use // its output at some future point and eventually draw // the entire map deferred DrawDeferredPass(drawPass, mapRendering->voidGround || (mapRendering->voidWater && drawPass != DrawPass::WaterReflection)); } if (drawForward) { DrawForwardPass(drawPass, mapRendering->voidGround || (mapRendering->voidWater && drawPass != DrawPass::WaterReflection)); } glDisable(GL_CULL_FACE); if (drawPass != DrawPass::Normal) return; if (drawWaterPlane) DrawWaterPlane(false); if (drawMapEdges) DrawBorder(drawPass); }
void CSMFGroundDrawer::Draw(const DrawPass::e& drawPass) { if (mapInfo->map.voidWater && readmap->currMaxHeight < 0.0f) { return; } smfRenderState = smfRenderStateSSP->CanEnable(this)? smfRenderStateSSP: smfRenderStateFFP; glDisable(GL_BLEND); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); UpdateCamRestraints(cam2); smfRenderState->Enable(this, drawPass); { if (wireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } if (mapInfo->map.voidGround || (mapInfo->map.voidWater && drawPass != DrawPass::WaterReflection)) { glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, mapInfo->map.voidAlphaMin); } meshDrawer->DrawMesh(drawPass); if (mapInfo->map.voidGround || (mapInfo->map.voidWater && drawPass != DrawPass::WaterReflection)) { glDisable(GL_ALPHA_TEST); } if (wireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } } smfRenderState->Disable(this, drawPass); glDisable(GL_CULL_FACE); if (drawPass == DrawPass::Normal) { if (mapInfo->water.hasWaterPlane) { DrawWaterPlane(false); } groundDecals->Draw(); projectileDrawer->DrawGroundFlashes(); } }