template <class geometry_t, class idx_t>
tg::optional<idx_t> bsp<geometry_t, idx_t>::impl_subdeterminant_query_leaf_idx(idx_t idx, subdeterminants<geometry_t> const& sub) const
{
    auto n_idx = idx;
    while (!nodes[n_idx].is_leaf())
    {
        auto& plane = planes[nodes[n_idx].plane_idx];


        const auto d = classify_vertex(sub, plane);


        if (is_zero(d))
        {
            TG_ASSERT(!nodes[n_idx].is_leaf());
            TG_ASSERT(nodes[n_idx].child_pos != n_idx);
            TG_ASSERT(nodes[n_idx].child_neg != n_idx);

            auto const q_neg = impl_subdeterminant_query_leaf_idx(nodes[n_idx].child_neg, sub);
            if (!q_neg.has_value())
                return {}; /// means: point is on surface

            auto const q_pos = impl_subdeterminant_query_leaf_idx(nodes[n_idx].child_pos, sub);
            if (!q_pos.has_value())
                return {}; /// means: point is on surface

            auto const& n_neg = nodes[q_neg.value()];
            auto const& n_pos = nodes[q_pos.value()];
            TG_ASSERT(n_neg.is_leaf() && n_pos.is_leaf());
            if (n_neg.plane_idx == n_pos.plane_idx)
                return q_neg;

            return {}; /// means: point is on surface
        }

        if (less_than_zero(d))
            n_idx = nodes[n_idx].child_neg;
        else // d > 0
            n_idx = nodes[n_idx].child_pos;
    }
    return n_idx; /// bsp.nodes[n_idx].is_in() ?
}