From d7cecc2ba3f6ee9c907af456253dcf3417157644 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 20 Mar 2019 18:38:02 +0100 Subject: Fix cycles.merge_images not merging correctly for some channel layouts. --- intern/cycles/render/merge.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'intern') diff --git a/intern/cycles/render/merge.cpp b/intern/cycles/render/merge.cpp index 3a85ae18f06..289bb023d72 100644 --- a/intern/cycles/render/merge.cpp +++ b/intern/cycles/render/merge.cpp @@ -392,34 +392,35 @@ static bool merge_pixels(const vector& images, for(size_t li = 0; li < image.layers.size(); li++) { const MergeImageLayer& layer = image.layers[li]; - const size_t stride = out_spec.nchannels; + const size_t stride = image.in->spec().nchannels; + const size_t out_stride = out_spec.nchannels; const size_t num_pixels = pixels.size(); for(const MergeImagePass& pass: layer.passes) { size_t offset = pass.offset; - size_t merge_offset = pass.merge_offset; + size_t out_offset = pass.merge_offset; switch(pass.op) { case MERGE_CHANNEL_NOP: break; case MERGE_CHANNEL_COPY: - for(size_t i = 0; i < num_pixels; i += stride) { - out_pixels[i + merge_offset] = pixels[i + offset]; + for(; offset < num_pixels; offset += stride, out_offset += out_stride) { + out_pixels[out_offset] = pixels[offset]; } break; case MERGE_CHANNEL_SUM: - for(size_t i = 0; i < num_pixels; i += stride) { - out_pixels[i + merge_offset] += pixels[i + offset]; + for(; offset < num_pixels; offset += stride, out_offset += out_stride) { + out_pixels[out_offset] += pixels[offset]; } break; case MERGE_CHANNEL_AVERAGE: /* Weights based on sample metadata. Per channel since not * all files are guaranteed to have the same channels. */ - const int total_samples = channel_total_samples[offset]; + const int total_samples = channel_total_samples[out_offset]; const float t = (float)layer.samples / (float)total_samples; - for(size_t i = 0; i < num_pixels; i += stride) { - out_pixels[i + merge_offset] += t * pixels[i + offset]; + for(; offset < num_pixels; offset += stride, out_offset += out_stride) { + out_pixels[out_offset] += t * pixels[offset]; } break; } -- cgit v1.2.3