@@ -75,6 +75,8 @@ SamplingIntegrator<Float, Spectrum>::render(Scene *scene,
7575
7676 ref<Film> film = sensor->film ();
7777 ScalarVector2i film_size = film->crop_size ();
78+ if (film->has_high_quality_edges ())
79+ film_size += 2 * film->reconstruction_filter ()->border_size ();
7880
7981 size_t total_spp = sensor->sampler ()->sample_count ();
8082 size_t samples_per_pass = (m_samples_per_pass == (size_t ) -1 )
@@ -115,7 +117,7 @@ SamplingIntegrator<Float, Spectrum>::render(Scene *scene,
115117 m_block_size = block_size;
116118 }
117119
118- Spiral spiral (film, m_block_size, n_passes);
120+ Spiral spiral (film_size, film-> crop_offset () , m_block_size, n_passes);
119121
120122 ThreadEnvironment env;
121123 ref<ProgressReporter> progress = new ProgressReporter (" Rendering" );
@@ -135,13 +137,20 @@ SamplingIntegrator<Float, Spectrum>::render(Scene *scene,
135137 ref<ImageBlock> block = new ImageBlock (
136138 m_block_size, channels.size (),
137139 film->reconstruction_filter (),
138- /* warn_negative */ !has_aovs && !is_spectral_v<Spectrum>);
140+ !has_aovs && !is_spectral_v<Spectrum> /* warn_negative */ ,
141+ std::is_scalar_v<Float> /* warn_invalid */ ,
142+ true /* border */ ,
143+ false /* normalize */ );
139144 std::unique_ptr<Float[]> aovs (new Float[channels.size ()]);
140145
141146 // For each block
142147 for (auto i = range.begin (); i != range.end () && !should_stop (); ++i) {
143148 auto [offset, size, block_id] = spiral.next_block ();
144149 Assert (ek::hprod (size) != 0 );
150+
151+ if (film->has_high_quality_edges ())
152+ offset -= film->reconstruction_filter ()->border_size ();
153+
145154 block->set_size (size);
146155 block->set_offset (offset);
147156
@@ -175,7 +184,8 @@ SamplingIntegrator<Float, Spectrum>::render(Scene *scene,
175184 if (samples_per_pass != 1 )
176185 idx /= (uint32_t ) samples_per_pass;
177186
178- ref<ImageBlock> block = new ImageBlock (film_size, channels.size (),
187+ ref<ImageBlock> block = new ImageBlock (film->crop_size (),
188+ channels.size (),
179189 film->reconstruction_filter (),
180190 false /* warn_negative */ ,
181191 false /* warn_invalid */ ,
@@ -187,6 +197,9 @@ SamplingIntegrator<Float, Spectrum>::render(Scene *scene,
187197 Float (idx / uint32_t (film_size[0 ])));
188198 std::vector<Float> aovs (channels.size ());
189199
200+ if (film->has_high_quality_edges ())
201+ pos -= film->reconstruction_filter ()->border_size ();
202+
190203 Timer timer;
191204 for (size_t i = 0 ; i < n_passes; i++) {
192205 render_sample (scene, sensor, sampler, block, aovs.data (),
@@ -321,16 +334,9 @@ SamplingIntegrator<Float, Spectrum>::render_sample(const Scene *scene,
321334 Float wavelength_sample = sampler->next_1d (active);
322335
323336 const Film *film = sensor->film ();
324- ScalarVector2i size = film->crop_size ();
325- ScalarVector2i offset = film->crop_offset ();
326-
327- if (film->has_high_quality_edges ()) {
328- uint32_t border_size = film->reconstruction_filter ()->border_size ();
329- position_sample -= border_size;
330- position_sample *= Vector2f (size + 2 * border_size) / size;
331- }
332337
333- Vector2f adjusted_position = (position_sample - offset) / size;
338+ Vector2f adjusted_position =
339+ (position_sample - film->crop_offset ()) / film->crop_size ();
334340
335341 auto [ray, ray_weight] = sensor->sample_ray_differential (
336342 time, wavelength_sample, adjusted_position, aperture_sample);
0 commit comments