void CProjectileDrawer::DrawGroundFlashes() { static const GLfloat black[] = {0.0f, 0.0f, 0.0f, 0.0f}; glDepthMask(GL_FALSE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glActiveTexture(GL_TEXTURE0); groundFXAtlas->BindTexture(); glEnable(GL_TEXTURE_2D); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.01f); glPolygonOffset(-20, -1000); glEnable(GL_POLYGON_OFFSET_FILL); glFogfv(GL_FOG_COLOR, black); { GML_STDMUTEX_LOCK(rflash); // DrawGroundFlashes ph->groundFlashes.delete_delayed(); ph->groundFlashes.add_delayed(); } CGroundFlash::va = GetVertexArray(); CGroundFlash::va->Initialize(); CGroundFlash::va->EnlargeArrays(8, 0, VA_SIZE_TC); GroundFlashContainer& gfc = ph->groundFlashes; GroundFlashContainer::render_iterator gfi; bool depthTest = true; bool depthMask = false; for (gfi = gfc.render_begin(); gfi != gfc.render_end(); ++gfi) { CGroundFlash* gf = *gfi; const bool los = gu->spectatingFullView || loshandler->InAirLos(gf->pos, gu->myAllyTeam); const bool vis = camera->InView(gf->pos, gf->size); if (depthTest != gf->depthTest) { depthTest = gf->depthTest; if (depthTest) { glEnable(GL_DEPTH_TEST); } else { glDisable(GL_DEPTH_TEST); } } if (depthMask != gf->depthMask) { depthMask = gf->depthMask; if (depthMask) { glDepthMask(GL_TRUE); } else { glDepthMask(GL_FALSE); } } if ((gf->alwaysVisible || los) && vis) { gf->Draw(); } CGroundFlash::va->DrawArrayTC(GL_QUADS); CGroundFlash::va->Initialize(); } glFogfv(GL_FOG_COLOR, mapInfo->atmosphere.fogColor); glDisable(GL_POLYGON_OFFSET_FILL); glDisable(GL_ALPHA_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); }