std::vector<CUnit*> CQuadField::GetUnitsExact(const float3& mins, const float3& maxs) { GML_RECMUTEX_LOCK(qnum); // GetUnitsExact std::vector<CUnit*> units; std::vector<int> quads = GetQuadsRectangle(mins, maxs); int tempNum = gs->tempNum++; std::vector<int>::iterator qi; for (qi = quads.begin(); qi != quads.end(); ++qi) { std::list<CUnit*>& quadUnits = baseQuads[*qi].units; std::list<CUnit*>::iterator ui; for (ui = quadUnits.begin(); ui != quadUnits.end(); ++ui) { CUnit* unit = *ui; const float3& pos = unit->midPos; if ((unit->tempNum != tempNum) && (pos.x > mins.x) && (pos.x < maxs.x) && (pos.z > mins.z) && (pos.z < maxs.z)) { unit->tempNum = tempNum; units.push_back(unit); } } } return units; }
std::vector<CFeature*> CQuadField::GetFeaturesExact(const float3& mins, const float3& maxs) { GML_RECMUTEX_LOCK(qnum); // GetFeaturesExact std::vector<CFeature*> features; std::vector<int> quads = GetQuadsRectangle(mins, maxs); int tempNum = gs->tempNum++; std::vector<int>::iterator qi; for(qi = quads.begin(); qi != quads.end(); ++qi) { std::list<CFeature*>& quadFeatures = baseQuads[*qi].features; std::list<CFeature*>::iterator fi; for (fi = quadFeatures.begin(); fi != quadFeatures.end(); ++fi) { CFeature* feature = *fi; const float3& pos = feature->midPos; if ((feature->tempNum != tempNum) && (pos.x > mins.x) && (pos.x < maxs.x) && (pos.z > mins.z) && (pos.z < maxs.z)) { feature->tempNum = tempNum; features.push_back(feature); } } } return features; }
std::vector<CProjectile*> CQuadField::GetProjectilesExact(const float3& mins, const float3& maxs) { GML_RECMUTEX_LOCK(qnum); // GetProjectilesExact const std::vector<int>& quads = GetQuadsRectangle(mins, maxs); std::vector<CProjectile*> projectiles; std::vector<int>::const_iterator qi; std::list<CProjectile*>::iterator pi; for (qi = quads.begin(); qi != quads.end(); ++qi) { std::list<CProjectile*>& quadProjectiles = baseQuads[*qi].projectiles; for (pi = quadProjectiles.begin(); pi != quadProjectiles.end(); ++pi) { CProjectile* projectile = *pi; const float3& pos = projectile->pos; if (pos.x < mins.x || pos.x > maxs.x) { continue; } if (pos.z < mins.z || pos.z > maxs.z) { continue; } projectiles.push_back(projectile); } } return projectiles; }