Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}