unsigned int CQuadField::GetQuads(float3 pos, float radius, int*& begQuad, int*& endQuad) const { pos.ClampInBounds(); pos.AssertNaNs(); assert(begQuad == &tempQuads[0]); assert(endQuad == &tempQuads[0]); const int maxx = std::min((int(pos.x + radius)) / quadSizeX + 1, numQuadsX - 1); const int maxz = std::min((int(pos.z + radius)) / quadSizeZ + 1, numQuadsZ - 1); const int minx = std::max((int(pos.x - radius)) / quadSizeX, 0); const int minz = std::max((int(pos.z - radius)) / quadSizeZ, 0); if (maxz < minz || maxx < minx) { return 0; } // qsx and qsz are always equal const float maxSqLength = (radius + quadSizeX * 0.72f) * (radius + quadSizeZ * 0.72f); for (int z = minz; z <= maxz; ++z) { for (int x = minx; x <= maxx; ++x) { const float3 quadCenterPos = float3(x * quadSizeX + quadSizeX * 0.5f, 0, z * quadSizeZ + quadSizeZ * 0.5f); if ((pos - quadCenterPos).SqLength2D() < maxSqLength) { *endQuad = z * numQuadsX + x; ++endQuad; } } } return (endQuad - begQuad); }
std::vector<int> CQuadField::GetQuads(float3 pos, float radius) const { pos.ClampInBounds(); pos.AssertNaNs(); std::vector<int> ret; // qsx and qsz are always equal const float maxSqLength = (radius + quadSizeX * 0.72f) * (radius + quadSizeZ * 0.72f); const int maxx = std::min((int(pos.x + radius)) / quadSizeX + 1, numQuadsX - 1); const int maxz = std::min((int(pos.z + radius)) / quadSizeZ + 1, numQuadsZ - 1); const int minx = std::max((int(pos.x - radius)) / quadSizeX, 0); const int minz = std::max((int(pos.z - radius)) / quadSizeZ, 0); if (maxz < minz || maxx < minx) { return ret; } ret.reserve((maxz - minz) * (maxx - minx)); for (int z = minz; z <= maxz; ++z) { for (int x = minx; x <= maxx; ++x) { if ((pos - float3(x * quadSizeX + quadSizeX * 0.5f, 0, z * quadSizeZ + quadSizeZ * 0.5f)).SqLength2D() < maxSqLength) { ret.push_back(z * numQuadsX + x); } } } return ret; }
static void MAPPOS_SANITY_CHECK(const float3 v) { v.AssertNaNs(); assert(v.x >= -(float3::maxxpos * 16.0f)); assert(v.x <= (float3::maxxpos * 16.0f)); assert(v.z >= -(float3::maxzpos * 16.0f)); assert(v.z <= (float3::maxzpos * 16.0f)); assert(v.y >= -MAX_PROJECTILE_HEIGHT); assert(v.y <= MAX_PROJECTILE_HEIGHT); }