#include #include namespace psemek::vecr { gfx::color_4f colorize(gfx::color_rgba const & color, geom::point const &, sdf_sample const &) { return gfx::to_colorf(color); } gfx::color_4f colorize(gradient const & gradient, geom::point const & p, sdf_sample const &) { return gfx::lerp( gfx::to_colorf(gradient.color0), gfx::to_colorf(gradient.color1), geom::clamp(sdf(gradient.shape, p).value + 0.5f, {0.f, 1.f}) ); } gfx::color_4f colorize(lighting const & lighting, geom::point const & p, sdf_sample const & sample) { auto const real_sample = lighting.shape ? sdf(lighting.shape, p) : sample; auto normal = geom::swizzle<0, 1, -1>(real_sample.gradient * lighting.slope); normal[2] = 1.f; normal = geom::normalized(normal); geom::vector view{0.f, 0.f, 1.f}; auto reflected = 2.f * geom::dot(normal, lighting.direction) * normal - lighting.direction; auto NdotL = geom::dot(normal, lighting.direction); auto RdotV = geom::dot(reflected, view); auto lightness = 0.5f + 0.5f * NdotL; auto specular = lighting.specular_intensity * std::pow(std::max(0.f, RdotV), lighting.specular_power); auto result = gfx::lerp(gfx::to_colorf(lighting.color0), gfx::to_colorf(lighting.color1), lightness); result = gfx::lerp(result, gfx::to_colorf(lighting.specular_color), specular); return result; } }