[Bf-blender-cvs] [d7cecc2ba3f] blender2.7: Fix cycles.merge_images not merging correctly for some channel layouts.

Brecht Van Lommel noreply at git.blender.org
Wed Mar 20 18:40:06 CET 2019


Commit: d7cecc2ba3f6ee9c907af456253dcf3417157644
Author: Brecht Van Lommel
Date:   Wed Mar 20 18:38:02 2019 +0100
Branches: blender2.7
https://developer.blender.org/rBd7cecc2ba3f6ee9c907af456253dcf3417157644

Fix cycles.merge_images not merging correctly for some channel layouts.

===================================================================

M	intern/cycles/render/merge.cpp

===================================================================

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<MergeImage>& 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;
 				}



More information about the Bf-blender-cvs mailing list