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; }