diff --git a/libs/vecr/include/psemek/vecr/full.hpp b/libs/vecr/include/psemek/vecr/full.hpp new file mode 100644 index 00000000..15e76698 --- /dev/null +++ b/libs/vecr/include/psemek/vecr/full.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include + +namespace psemek::vecr +{ + + struct full + {}; + + inline sdf_sample sdf(full const &, geom::point const &) + { + return { + .value = 0.f, + .gradient = {0.f, 0.f}, + }; + } + + inline geom::box bbox(full const &) + { + return geom::box::full(); + } + +} diff --git a/libs/vecr/include/psemek/vecr/renderer.hpp b/libs/vecr/include/psemek/vecr/renderer.hpp index 6fcfc49b..037bd948 100644 --- a/libs/vecr/include/psemek/vecr/renderer.hpp +++ b/libs/vecr/include/psemek/vecr/renderer.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -12,6 +13,7 @@ namespace psemek::vecr struct primitive { any mask = {}; + any filter = full{}; float blur = 1.f; float alpha = 1.f; any_colorizer colorizer = {}; diff --git a/libs/vecr/source/renderer.cpp b/libs/vecr/source/renderer.cpp index 4015e79e..7214443c 100644 --- a/libs/vecr/source/renderer.cpp +++ b/libs/vecr/source/renderer.cpp @@ -71,6 +71,10 @@ namespace psemek::vecr { geom::point const center{(x + 0.5f) / samples_, (y + 0.5f) / samples_}; + auto const filter_sample = sdf(primitive.filter, center); + + if (filter_sample.value > aa) continue; + auto const sample = sdf(primitive.mask, center); if (sample.value > aa) continue;