#include #include #include namespace psemek::vecr { sdf_sample sdf(intersect const & s, geom::point const & p) { sdf_sample result; if (s.smooth == 0.f) { result.value = -std::numeric_limits::infinity(); for (auto const & ss : s.shapes) { auto r = sdf(ss, p); if (geom::make_max(result.value, r.value)) result.gradient = r.gradient; } } else { float v = 0.f; for (auto const & ss : s.shapes) { auto r = sdf(ss, p); float vs = std::exp(r.value / s.smooth); v += vs; result.gradient += r.gradient * vs; } result.value = std::log(v) * s.smooth; result.gradient /= v; } return result; } geom::box bbox(intersect const & s) { auto result = geom::box::full(); for (auto const & ss : s.shapes) result &= bbox(ss); return result; } }