Example #1
0
void Octree::GenerateChildren(std::unique_ptr<Partition>& parent)
{
    if(parent->GetLevel() != MAX_LEVEL)
    {
        // Center/size of child partition is half of parent
        const float size = parent->GetSize() * 0.5f;
        const D3DXVECTOR3 offset((parent->GetMinBounds()
            + parent->GetMaxBounds()) * 0.5f);

        parent->AddChild(size, D3DXVECTOR3(-size, size, -size) + offset);
        parent->AddChild(size, D3DXVECTOR3(0.0, size, -size)   + offset);
        parent->AddChild(size, D3DXVECTOR3(-size, 0.0, -size)  + offset);
        parent->AddChild(size, D3DXVECTOR3(0.0, 0.0, -size)    + offset);
        parent->AddChild(size, D3DXVECTOR3(-size, size, 0.0)   + offset);
        parent->AddChild(size, D3DXVECTOR3(0.0, size, 0.0)     + offset);
        parent->AddChild(size, D3DXVECTOR3(-size, 0.0, 0.0)    + offset);
        parent->AddChild(size, D3DXVECTOR3(0.0, 0.0, 0.0)      + offset);

        parent->ModifyChildren(std::bind(
            &Octree::GenerateChildren, this, std::placeholders::_1));
    }
}