[Bf-blender-cvs] [9c2dd85] multiview: Image Editor fixup, now ImageUser is always initialized properly, stereo image loads right away and render images also display correctly

Dalai Felinto noreply at git.blender.org
Fri May 23 15:14:44 CEST 2014


Commit: 9c2dd855eac5c7b21ef1cf1ff2a547259b0e29be
Author: Dalai Felinto
Date:   Mon May 12 11:28:28 2014 +0200
https://developer.blender.org/rB9c2dd855eac5c7b21ef1cf1ff2a547259b0e29be

Image Editor fixup, now ImageUser is always initialized properly, stereo
image loads right away and render images also display correctly

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

M	release/scripts/startup/bl_ui/space_image.py
M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/intern/image.c
M	source/blender/editors/space_image/image_draw.c
M	source/blender/editors/space_image/image_ops.c
M	source/blender/makesdna/DNA_image_types.h
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/render/extern/include/RE_pipeline.h
M	source/blender/render/intern/source/pipeline.c

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

diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 0277b7e..1215aaa 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -430,9 +430,9 @@ class IMAGE_HT_header(Header):
 
         if ima:
             # layers
-            if sima.is_stereo:
+            if ima.is_stereo_3d:
                 row = layout.row()
-                row.prop(sima, "show_stereo", text="")
+                row.prop(sima, "show_stereo_3d", text="")
 
             layout.template_image_layers(ima, iuser)
 
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index b2ac64b..e84ace9 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -170,6 +170,7 @@ struct Image *BKE_image_add_generated(
 struct Image *BKE_image_add_from_imbuf(struct ImBuf *ibuf);
 
 /* for reload, refresh, pack */
+void BKE_image_init_imageuser(struct Image *ima, struct ImageUser *iuser);
 void BKE_image_signal(struct Image *ima, struct ImageUser *iuser, int signal);
 
 void BKE_image_walk_all_users(const struct Main *mainp, void *customdata,
@@ -195,6 +196,7 @@ struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct Im
 struct RenderPass *BKE_image_multiview_index(struct RenderResult *rr, struct ImageUser *iuser);
 
 /* for multilayer images as well as for render-viewer */
+bool BKE_image_is_stereo(struct Scene *scene, struct Image *ima);
 struct RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, struct Image *ima);
 void BKE_image_release_renderresult(struct Scene *scene, struct Image *ima);
 
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 926570e..1741745 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -2248,6 +2248,36 @@ static void image_tag_frame_recalc(Image *ima, ImageUser *iuser, void *customdat
 	}
 }
 
+static void image_init_imageuser(Image *ima, ImageUser *iuser)
+{
+	RenderResult *rr = ima->rr;
+
+	iuser->multi_index = 0;
+	iuser->layer = iuser->pass = 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;
+		}
+
+		BKE_image_multilayer_index(rr, iuser);
+	}
+	else {
+		iuser->flag &= ~IMA_SHOW_STEREO;
+	}
+}
+
+void BKE_image_init_imageuser(Image *ima, ImageUser *iuser)
+{
+	return image_init_imageuser(ima, iuser);
+}
+
 void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
 {
 	if (ima == NULL)
@@ -2335,8 +2365,7 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
 				iuser->ok = 1;
 				if (ima->source == IMA_SRC_FILE || ima->source == IMA_SRC_SEQUENCE) {
 					if (ima->type == IMA_TYPE_MULTILAYER) {
-						iuser->multi_index = 0;
-						iuser->layer = iuser->pass = 0;
+						image_init_imageuser(ima, iuser);
 					}
 				}
 			}
@@ -2380,7 +2409,7 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
 	if (iuser) {
 		short index = 0, rl_index = 0, rp_index;
 		short view;
-		bool is_stereo = RE_HasStereo3D(rr) && (iuser->flag & IMA_SHOW_STEREO);
+		bool is_stereo = RE_RenderResult_is_stereo(rr) && (iuser->flag & IMA_SHOW_STEREO);
 
 		view = is_stereo ? iuser->eye : iuser->view;
 
@@ -2416,19 +2445,47 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
 	return rpass;
 }
 
-RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima)
+bool BKE_image_is_stereo(Scene *scene, Image *ima)
 {
 	if (ima->rr) {
-		return ima->rr;
+		return (ima->flag & IMA_IS_STEREO) != 0;
 	}
 	else if (ima->type == IMA_TYPE_R_RESULT) {
+		RenderResult *rr;
 		if (ima->render_slot == ima->last_render_slot)
-			return RE_AcquireResultRead(RE_GetRender(scene->id.name));
+			rr =  RE_AcquireResultRead(RE_GetRender(scene->id.name));
 		else
-			return ima->renders[ima->render_slot];
+			rr = ima->renders[ima->render_slot];
+
+		return RE_RenderResult_is_stereo(rr);
 	}
 	else
-		return NULL;
+		return false;
+}
+
+static void image_set_stereo_flag(Image *ima, RenderResult *rr)
+{
+	if (rr && RE_RenderResult_is_stereo(rr))
+		ima->flag |= IMA_IS_STEREO;
+	else
+		ima->flag &= ~IMA_IS_STEREO;
+}
+
+RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima)
+{
+	RenderResult *rr = NULL;
+	if (ima->rr) {
+		rr = ima->rr;
+	}
+	else if (ima->type == IMA_TYPE_R_RESULT) {
+		if (ima->render_slot == ima->last_render_slot)
+			rr = RE_AcquireResultRead(RE_GetRender(scene->id.name));
+		else
+			rr = ima->renders[ima->render_slot];
+	}
+
+	image_set_stereo_flag(ima, rr);
+	return rr;
 }
 
 void BKE_image_release_renderresult(Scene *scene, Image *ima)
@@ -2478,6 +2535,8 @@ static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
 	ibuf->userdata = NULL;
 	if (ima->rr)
 		ima->rr->framenr = framenr;
+
+	image_set_stereo_flag(ima, ima->rr);
 }
 
 static void image_check_stereo(Image *ima)
@@ -2487,7 +2546,7 @@ static void image_check_stereo(Image *ima)
 		return;
 	}
 
-	if (RE_HasStereo3D(ima->rr))
+	if (RE_RenderResult_is_stereo(ima->rr))
 		ima->flag |= IMA_IS_STEREO;
 	else
 		ima->flag &= ~IMA_IS_STEREO;
@@ -2790,7 +2849,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
 	float *rectf, *rectz;
 	unsigned int *rect;
 	float dither;
-	int channels, layer, pass;
+	int channels, layer, passtype;
 	ImBuf *ibuf;
 	int from_render = (ima->render_slot == ima->last_render_slot);
 	int actview;
@@ -2807,16 +2866,11 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
 
 	channels = 4;
 	layer = iuser->layer;
-	pass = iuser->pass;
+	passtype = iuser->passtype;
 	actview = iuser->view;
 
-	if ((iuser->flag & IMA_SHOW_STEREO) && (ima->flag & IMA_IS_STEREO)) {
-		/* view == 0 shows stereo */
-		if (actview == 0)
-			actview = iuser->eye;
-		else
-			actview = actview - 1;
-	}
+	if ((ima->flag & IMA_IS_STEREO) && (iuser->flag & IMA_SHOW_STEREO))
+		actview = iuser->eye;
 
 	if (from_render) {
 		RE_AcquireResultImage(re, &rres, actview);
@@ -2863,9 +2917,12 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
 		if (rl) {
 			RenderPass *rpass;
 
-			/* "there's no combined pass, is in renderlayer itself" */
-			/* -Now it does, no need to do pass - 1 (dfelinto) */
-			rpass = BLI_findlink(&rl->passes, pass);
+			for (rpass = rl->passes.first; rpass; rpass = rpass->next) {
+				if (passtype == rpass->passtype &&
+					actview == rpass->view_id)
+					break;
+			}
+
 			if (rpass) {
 				channels = rpass->channels;
 				rectf = rpass->rect;
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index 74fc3f5..f513b63 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -831,7 +831,7 @@ void draw_image_main(const bContext *C, ARegion *ar)
 	show_viewer = (ima && ima->source == IMA_SRC_VIEWER) != 0;
 	show_render = (show_viewer && ima->type == IMA_TYPE_R_RESULT) != 0;
 	show_paint = (ima && (sima->mode == SI_MODE_PAINT) && (show_viewer == false) && (show_render == false));
-	show_stereo3d = (ima && ima->rr && (ima->flag & IMA_IS_STEREO) && (sima->iuser.flag & IMA_SHOW_STEREO));
+	show_stereo3d = (ima && (ima->flag & IMA_IS_STEREO) && (sima->iuser.flag & IMA_SHOW_STEREO));
 
 	if (show_viewer) {
 		/* use locked draw for drawing viewer image buffer since the compositor
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 01ba259..526e908 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1108,6 +1108,7 @@ static int image_open_exec(bContext *C, wmOperator *op)
 		iuser->framenr = 1;
 		iuser->offset = frame_ofs - 1;
 		iuser->fie_ima = 2;
+		BKE_image_init_imageuser(ima, iuser);
 	}
 
 	/* XXX unpackImage frees image buffers */
@@ -1631,6 +1632,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
 			RenderView *rv;
 			int i, orig_multi_index = sima->iuser.multi_index;
 			short orig_pass = sima->iuser.pass;
+			short orig_flag = sima->iuser.flag;
 			short orig_view = sima->iuser.view;
 			unsigned char planes = ibuf->planes;
 
@@ -1639,6 +1641,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
 			for (i=0, rv = (RenderView *)rr->views.first; rv; rv = rv->next, i++) {
 				sima->iuser.pass = get_multiview_pass_id(rr, &sima->iuser, i);
 				sima->iuser.view = i;
+				sima->iuser.flag &= ~IMA_SHOW_STEREO;
 				BKE_image_multilayer_index(rr, &sima->iuser);
 
 				srv = BLI_findstring(&scene->r.views, rv->name, offsetof(SceneRenderView, name));
@@ -1662,6 +1665,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
 			}
 
 			sima->iuser.pass = orig_pass;
+			sima->iuser.flag = orig_flag;
 			sima->iuser.view = orig_view;
 			sima->iuser.multi_index = orig_multi_index;
 		}
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index 200b249..52ce1fd 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -64,12 +64,14 @@ typedef struct ImageUser {
 
 } ImageUser;
 
-/* iuser->flag */
-#define	IMA_ANIM_ALWAYS		1
-#define IMA_ANIM_REFRESHED	2
-/* #define IMA_DO_PREMUL	4 */
-#define IMA_NEED_FRAME_RECALC	8
-#define IMA_SHOW_STEREO		16
+/* ImageUser.flag */
+enum {
+	IMA_ANIM_ALWAYS         = (1 << 0),
+	IMA_ANIM_REFRESHED      = (1 << 1),
+/*	IMA_DO_PREMUL           = (1 << 2), */
+	IMA_NEED_FRAME_RECALC   = (1 << 3),
+	IMA_SHOW_STEREO         = (1 << 4),
+};
 
 typedef struct Image {
 	ID id;
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 52fec76..4340541 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -688,12 +688,6 @@ static void rna_SpaceImageEditor_show_stereo_update(Main *U

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list