void DrawQuad(int x, int y) { std::vector<IWorldObjectModelRenderer*>& opaqueModelRenderers = featureDrawer->opaqueModelRenderers; std::vector<IWorldObjectModelRenderer*>& cloakedModelRenderers = featureDrawer->cloakedModelRenderers; const CFeatureDrawer::DrawQuad* dq = &(*drawQuads)[y * drawQuadsX + x]; for (std::set<CFeature*>::const_iterator fi = dq->features.begin(); fi != dq->features.end(); ++fi) { CFeature* f = (*fi); if (f->IsInVoid()) continue; assert(f->def->drawType == DRAWTYPE_MODEL); if (gu->spectatingFullView || f->IsInLosForAllyTeam(gu->myAllyTeam)) { if (drawReflection) { float3 zeroPos; if (f->midPos.y < 0.0f) { zeroPos = f->midPos; } else { const float dif = f->midPos.y - camera->GetPos().y; zeroPos = camera->GetPos() * (f->midPos.y / dif) + f->midPos * (-camera->GetPos().y / dif); } if (ground->GetApproximateHeight(zeroPos.x, zeroPos.z, false) > f->drawRadius) { continue; } } if (drawRefraction) { if (f->pos.y > 0.0f) continue; } const float sqDist = (f->pos - camera->GetPos()).SqLength(); const float farLength = f->sqRadius * unitDrawer->unitDrawDistSqr; #ifdef USE_GML if (statFeatures && (f->reclaimLeft < 1.0f || f->resurrectProgress > 0.0f)) statFeatures->push_back(f); #endif if (sqDist < farLength) { float sqFadeDistE; float sqFadeDistB; if (farLength < sqFadeDistEnd) { sqFadeDistE = farLength; sqFadeDistB = farLength * sqFadeDistBegin / sqFadeDistEnd; } else { sqFadeDistE = sqFadeDistEnd; sqFadeDistB = sqFadeDistBegin; } if (sqDist < sqFadeDistB) { cloakedModelRenderers[MDL_TYPE(f)]->DelFeature(f); if (camera->InView(f->drawMidPos, f->drawRadius)) opaqueModelRenderers[MDL_TYPE(f)]->AddFeature(f); } else if (sqDist < sqFadeDistE) { const float falpha = 1.0f - (sqDist - sqFadeDistB) / (sqFadeDistE - sqFadeDistB); opaqueModelRenderers[MDL_TYPE(f)]->DelFeature(f); if (camera->InView(f->drawMidPos, f->drawRadius)) cloakedModelRenderers[MDL_TYPE(f)]->AddFeature(f, falpha); } } else { if (farFeatures) { farTextureHandler->Queue(f); } } } } }