示例#1
0
OctreeNode * OctreeScene::_InsideChild(OctreeNode * node, const Aabb & bound)
{
    const Aabb & ndbound = node->GetBound();

    Vec3 _half = ndbound.GetHalfSize();
    Vec3 _min = bound.minimum - ndbound.minimum;
    Vec3 _max = bound.maximum - ndbound.minimum;

    int ix0 = 0, iy0 = 0, iz0 = 0;
    int ix1 = 0, iy1 = 0, iz1 = 0;
    Aabb clbound(ndbound.minimum, ndbound.minimum);

    if (_min.x >= _half.x)
    {
        ix0 = 1;
        clbound.minimum.x += _half.x;
    }
    if (_min.y >= _half.y)
    {
        iy0 = 1;
        clbound.minimum.y += _half.y;
    }
    if (_min.z >= _half.z)
    {
        iz0 = 1;
        clbound.minimum.z += _half.z;
    }

    if (_max.x >= _half.x)
        ix1 = 1;
    if (_max.y >= _half.y)
        iy1 = 1;
    if (_max.z >= _half.z)
        iz1 = 1;

    clbound.maximum = clbound.minimum + _half;

    if (ix0 != ix1 || iy0 != iy1 || iz0 != iz1)
        return NULL;

    d_assert (Math::AABBInside(clbound, bound));

    int index = _MAKE_POSITION(ix0, iy1, iz1);

    OctreeNode * child = node->_GetChild(index);
    if (child == NULL)
    {
        child = AllocOctNode();
        child->SetBound(clbound);
        node->_SetChild(index, child);
    }

    return child;
}