[Bf-blender-cvs] [5317dc7] master: Fix T45839 : Regression - Multi-layer image issues when using non-standard names

Dalai Felinto noreply at git.blender.org
Wed Sep 9 16:44:55 CEST 2015


Commit: 5317dc716e3e0123570674e4637342cbd5d9559b
Author: Dalai Felinto
Date:   Wed Sep 9 19:41:46 2015 +0500
Branches: master
https://developer.blender.org/rB5317dc716e3e0123570674e4637342cbd5d9559b

Fix T45839 : Regression - Multi-layer image issues when using non-standard names

This was introduced in the fix for T44336 .
The code is now what it should have been in the first place at the time
of multiview commit.

ImageUser->passtype is being removed in favour of bringing
ImageUser->pass back.

Reviewers: sergey

Differential Revision: https://developer.blender.org/D1504

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

M	source/blender/blenkernel/intern/image.c
M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/compositor/nodes/COM_ImageNode.cpp
M	source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
M	source/blender/compositor/operations/COM_MultilayerImageOperation.h
M	source/blender/editors/render/render_internal.c
M	source/blender/editors/space_image/image_buttons.c
M	source/blender/editors/space_image/space_image.c
M	source/blender/makesdna/DNA_image_types.h
M	source/blender/makesrna/intern/rna_image.c

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

diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index ef760f2..36aeb97 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -2578,21 +2578,10 @@ static void image_init_imageuser(Image *ima, ImageUser *iuser)
 	RenderResult *rr = ima->rr;
 
 	iuser->multi_index = 0;
-	iuser->layer = iuser->view = 0;
-	iuser->passtype = SCE_PASS_COMBINED;
-
-	if (rr) {
-		RenderLayer *rl = rr->layers.first;
-
-		if (rl) {
-			RenderPass *rp = rl->passes.first;
-
-			if (rp)
-				iuser->passtype = rp->passtype;
-		}
+	iuser->layer = iuser->pass = iuser->view = 0;
 
+	if (rr)
 		BKE_image_multilayer_index(rr, iuser);
-	}
 }
 
 void BKE_image_init_imageuser(Image *ima, ImageUser *iuser)
@@ -2740,6 +2729,52 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
 	}
 }
 
+#define PASSTYPE_UNSET -1
+/* return renderpass for a given pass index and active view */
+/* fallback to available if there are missing passes for active view */
+static RenderPass *image_render_pass_get(RenderLayer *rl, const int pass, const int view, int *r_passindex)
+{
+	RenderPass *rpass_ret = NULL;
+	RenderPass *rpass;
+
+	int rp_index = 0;
+	int rp_passtype = PASSTYPE_UNSET;
+
+	for (rpass = rl->passes.first; rpass; rpass = rpass->next, rp_index++) {
+		if (rp_index == pass) {
+			rpass_ret = rpass;
+			if (view == 0) {
+				/* no multiview or left eye */
+				break;
+			}
+			else {
+				rp_passtype = rpass->passtype;
+			}
+		}
+		/* multiview */
+		else if ((rp_passtype != PASSTYPE_UNSET) &&
+		         (rpass->passtype == rp_passtype) &&
+		         (rpass->view_id == view))
+		{
+			rpass_ret = rpass;
+			break;
+		}
+	}
+
+	/* fallback to the first pass in the layer */
+	if (rpass_ret == NULL) {
+		rp_index = 0;
+		rpass_ret = rl->passes.first;
+	}
+
+	if (r_passindex) {
+		*r_passindex = (rpass == rpass_ret ? rp_index : pass);
+	}
+
+	return rpass_ret;
+}
+#undef PASSTYPE_UNSET
+
 /* if layer or pass changes, we need an index for the imbufs list */
 /* note it is called for rendered results, but it doesnt use the index! */
 /* and because rendered results use fake layer/passes, don't correct for wrong indices here */
@@ -2759,27 +2794,16 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
 		if (RE_HasFakeLayer(rr)) rl_index += 1;
 
 		for (rl = rr->layers.first; rl; rl = rl->next, rl_index++) {
-			for (rpass = rl->passes.first; rpass; rpass = rpass->next, index++) {
-				if (iuser->layer == rl_index &&
-				    iuser->passtype == rpass->passtype &&
-				    rv_index == rpass->view_id)
-				{
-					break;
-				}
-			}
-			if (rpass)
+			if (iuser->layer == rl_index) {
+				int rp_index;
+				rpass = image_render_pass_get(rl, iuser->pass, rv_index, &rp_index);
+				iuser->multi_index = index + rp_index;
 				break;
+			}
+			else {
+				index += BLI_listbase_count(&rl->passes);
+			}
 		}
-		iuser->multi_index = (rpass ? index : 0);
-	}
-
-	if (rpass == NULL) {
-		rl = rr->layers.first;
-		if (rl)
-			rpass = rl->passes.first;
-
-		if (rpass && iuser)
-			iuser->passtype = rpass->passtype;
 	}
 
 	return rpass;
@@ -3613,7 +3637,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc
 	float *rectf, *rectz;
 	unsigned int *rect;
 	float dither;
-	int channels, layer, passtype;
+	int channels, layer, pass;
 	ImBuf *ibuf;
 	int from_render = (ima->render_slot == ima->last_render_slot);
 	int actview;
@@ -3630,7 +3654,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc
 
 	channels = 4;
 	layer = iuser->layer;
-	passtype = iuser->passtype;
+	pass = iuser->pass;
 	actview = iuser->view;
 
 	if ((ima->flag & IMA_IS_STEREO) && (iuser->flag & IMA_SHOW_STEREO))
@@ -3693,19 +3717,10 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc
 	else if (rres.layers.first) {
 		RenderLayer *rl = BLI_findlink(&rres.layers, layer - (rres.have_combined ? 1 : 0));
 		if (rl) {
-			RenderPass *rpass;
-
-			for (rpass = rl->passes.first; rpass; rpass = rpass->next) {
-				if (passtype == rpass->passtype &&
-				    actview == rpass->view_id)
-				{
-					break;
-				}
-			}
-
+			RenderPass *rpass = image_render_pass_get(rl, pass, actview, NULL);
 			if (rpass) {
 				rectf = rpass->rect;
-				if (passtype == SCE_PASS_COMBINED) {
+				if (pass == 0) {
 					if (rectf == NULL) {
 						/* Happens when Save Buffers is enabled.
 						 * Use display buffer stored in the render layer.
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index 6af6a7a..5518b15 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -767,7 +767,6 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
 						{
 							SpaceImage *sima = (SpaceImage *) sl;
 							sima->iuser.flag |= IMA_SHOW_STEREO;
-							sima->iuser.passtype = SCE_PASS_COMBINED;
 							break;
 						}
 					}
diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp
index 572e63a..facd422 100644
--- a/source/blender/compositor/nodes/COM_ImageNode.cpp
+++ b/source/blender/compositor/nodes/COM_ImageNode.cpp
@@ -40,19 +40,19 @@ ImageNode::ImageNode(bNode *editorNode) : Node(editorNode)
 
 }
 NodeOperation *ImageNode::doMultilayerCheck(NodeConverter &converter, RenderLayer *rl, Image *image, ImageUser *user,
-                                            int framenumber, int outputsocketIndex, int passtype, int view, DataType datatype) const
+                                            int framenumber, int outputsocketIndex, int passindex, int view, DataType datatype) const
 {
 	NodeOutput *outputSocket = this->getOutputSocket(outputsocketIndex);
 	MultilayerBaseOperation *operation = NULL;
 	switch (datatype) {
 		case COM_DT_VALUE:
-			operation = new MultilayerValueOperation(passtype, view);
+			operation = new MultilayerValueOperation(passindex, view);
 			break;
 		case COM_DT_VECTOR:
-			operation = new MultilayerVectorOperation(passtype, view);
+			operation = new MultilayerVectorOperation(passindex, view);
 			break;
 		case COM_DT_COLOR:
-			operation = new MultilayerColorOperation(passtype, view);
+			operation = new MultilayerColorOperation(passindex, view);
 			break;
 		default:
 			break;
@@ -124,20 +124,21 @@ void ImageNode::convertToOperations(NodeConverter &converter, const CompositorCo
 					}
 
 					if (rpass) {
+						int passindex = BLI_findindex(&rl->passes, rpass);
 						switch (rpass->channels) {
 							case 1:
 								operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index,
-								                              rpass->passtype, view, COM_DT_VALUE);
+								                              passindex, view, COM_DT_VALUE);
 								break;
 								/* using image operations for both 3 and 4 channels (RGB and RGBA respectively) */
 								/* XXX any way to detect actual vector images? */
 							case 3:
 								operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index,
-								                              rpass->passtype, view, COM_DT_VECTOR);
+								                              passindex, view, COM_DT_VECTOR);
 								break;
 							case 4:
 								operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index,
-								                              rpass->passtype, view, COM_DT_COLOR);
+								                              passindex, view, COM_DT_COLOR);
 								break;
 							default:
 								/* dummy operation is added below */
diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
index 00be3b1..b57dd4e 100644
--- a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
+++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
@@ -27,9 +27,9 @@ extern "C" {
 #  include "IMB_imbuf_types.h"
 }
 
-MultilayerBaseOperation::MultilayerBaseOperation(int passtype, int view) : BaseImageOperation()
+MultilayerBaseOperation::MultilayerBaseOperation(int passindex, int view) : BaseImageOperation()
 {
-	this->m_passtype = passtype;
+	this->m_passId = passindex;
 	this->m_view = view;
 }
 
@@ -39,7 +39,7 @@ ImBuf *MultilayerBaseOperation::getImBuf()
 	int view = this->m_imageUser->view;
 
 	this->m_imageUser->view = this->m_view;
-	this->m_imageUser->passtype = this->m_passtype;
+	this->m_imageUser->pass = this->m_passId;
 
 	if (BKE_image_multilayer_index(this->m_image->rr, this->m_imageUser)) {
 		ImBuf *ibuf = BaseImageOperation::getImBuf();
diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.h b/source/blender/compositor/operations/COM_MultilayerImageOperation.h
index 2e14057..46a9319 100644
--- a/source/blender/compositor/operations/COM_MultilayerImageOperation.h
+++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.h
@@ -29,7 +29,7 @@
 
 class MultilayerBaseOperation : public BaseImageOperation {
 private:
-	int m_passtype;
+	int m_passId;
 	int m_view;
 	RenderLayer *m_renderlayer;
 protected:
@@ -38,13 +38,13 @@ public:
 	/**
 	 * Constructor
 	 */
-	MultilayerBaseOperation(int passtype, int view);
+	MultilayerBaseOperation(int passindex, int view);
 	void setRenderLayer(RenderLayer *renderlayer) { this->m_renderlayer = renderlayer; }
 };
 
 class MultilayerColorOperation : public MultilayerBaseOperation {
 public:
-	MultilayerColorOperation(int passtype, int view) : MultilayerBaseOperation(passtype, view) {
+	MultilayerColorOperation(int passindex, int view) : MultilayerBaseOperation(passindex, view) {
 		this->addOutputSocket(COM_DT_COLOR);
 	}
 	void executePixelSampled(float output[4], float x, float y, PixelSampler sampler);
@@ -52,7 +52,7 @@ public:
 
 class MultilayerValueOperation : public MultilayerBaseOperation {
 public:
-	MultilayerValueOperation(int passtype, int view) : MultilayerBaseOperation(passtype, view) {
+	MultilayerValueOperation(int passindex, int view) : MultilayerBaseOperation(passindex, view) {
 		this->addOutputSocket(COM_DT_VALUE);
 	}


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list