Example #1
0
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);
}
Example #2
0
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;
}
Example #3
0
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);
}