@@ -45,6 +45,26 @@ namespace ns::painter::integrators::bpt
4545{
4646namespace
4747{
48+ template <std::size_t N, typename T, typename Color>
49+ [[nodiscard]] std::optional<Color> connect_s_0_infinite_light (
50+ const Scene<N, T, Color>& scene,
51+ const vertex::InfiniteLight<N, T, Color>& infinite_light)
52+ {
53+ std::optional<Color> res;
54+ for (const LightSource<N, T, Color>* const light : scene.light_sources ())
55+ {
56+ if (!light->is_infinite_area ())
57+ {
58+ continue ;
59+ }
60+ if (const auto & radiance = light->leave_radiance (infinite_light.dir ()))
61+ {
62+ com::add_optional (&res, *radiance * infinite_light.beta ());
63+ }
64+ }
65+ return res;
66+ }
67+
4868template <std::size_t N, typename T, typename Color>
4969[[nodiscard]] std::optional<Color> connect_s_0 (
5070 const Scene<N, T, Color>& scene,
@@ -55,13 +75,13 @@ template <std::size_t N, typename T, typename Color>
5575 {
5676 if (!surface.is_light ())
5777 {
58- return {} ;
78+ return std:: nullopt ;
5979 }
6080 if (const auto & radiance = surface.light_radiance ())
6181 {
6282 return *radiance * surface.beta ();
6383 }
64- return {} ;
84+ return std:: nullopt ;
6585 },
6686 [](const vertex::Camera<N, T, Color>&) -> std::optional<Color>
6787 {
@@ -73,19 +93,7 @@ template <std::size_t N, typename T, typename Color>
7393 },
7494 [&scene](const vertex::InfiniteLight<N, T, Color>& infinite_light) -> std::optional<Color>
7595 {
76- std::optional<Color> res;
77- for (const LightSource<N, T, Color>* const light : scene.light_sources ())
78- {
79- if (!light->is_infinite_area ())
80- {
81- continue ;
82- }
83- if (const auto & radiance = light->leave_radiance (infinite_light.dir ()))
84- {
85- com::add_optional (&res, *radiance * infinite_light.beta ());
86- }
87- }
88- return res;
96+ return connect_s_0_infinite_light (scene, infinite_light);
8997 }};
9098
9199 return std::visit (visitors, camera_path_vertex);
0 commit comments