[Bf-blender-cvs] [1111b21] multiview: Support image views format change in the image panel - so user can drag&drop images and change their type afterwards

Dalai Felinto noreply at git.blender.org
Thu Sep 11 15:45:15 CEST 2014


Commit: 1111b2101e9d845cc5a369de94171e536e1d1fd6
Author: Dalai Felinto
Date:   Thu Sep 11 15:45:16 2014 +0200
Branches: multiview
https://developer.blender.org/rB1111b2101e9d845cc5a369de94171e536e1d1fd6

Support image views format change in the image panel - so user can drag&drop images and change their type afterwards

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

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_ops.c
M	source/blender/makesrna/intern/rna_image.c

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

diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 47dca2f..3dd6ee4 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -675,7 +675,8 @@ class IMAGE_PT_stereo_3d_properties(Panel):
     def poll(cls, context):
         sima = context.space_data
         image = sima.image if sima else None
-        return (sima and image and image.type == 'IMAGE' and image.is_multiview and image.views_format == 'STEREO_3D')
+        return (sima and image and image.type == 'IMAGE' and \
+                context.scene.render.use_multiple_views)
 
     def draw(self, context):
         layout = self.layout
@@ -683,7 +684,12 @@ class IMAGE_PT_stereo_3d_properties(Panel):
         sima = context.space_data
         ima = sima.image
 
-        box = layout.box()
+        col = layout
+        col.label(text="Views Format:")
+        col.row().prop(ima, "views_format", expand=True)
+
+        box = col.box()
+        box.active = ima.views_format == 'STEREO_3D'
         box.template_image_stereo_3d(ima.stereo_3d_format)
 
 
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 068ad6a..53b129e 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -203,6 +203,9 @@ struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct Im
 /* sets index offset for multiview files */
 void BKE_image_multiview_index(struct Image *ima, struct ImageUser *iuser);
 
+/* called on image settings change (in ui) */
+void BKE_image_update_views_format(struct Scene *scene, struct Image *ima);
+
 /* for multilayer images as well as for render-viewer */
 bool BKE_image_is_multilayer(struct Image *ima);
 struct RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, struct Image *ima);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index cb131f9..7bfb843 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -4215,3 +4215,108 @@ ImBuf *BKE_image_get_first_ibuf(Image *image)
 
 	return ibuf;
 }
+
+void BKE_image_update_views_format(Scene *scene, Image *ima)
+{
+	SceneRenderView *srv;
+	ImageView *iv;
+	const bool is_multiview = (scene->r.scemode & R_MULTIVIEW) != 0;
+
+	/* reset the image views */
+	BKE_image_free_views(ima);
+
+	if (!is_multiview) {
+		goto monoview;
+	}
+	else if (ima->views_format == R_IMF_VIEWS_STEREO_3D) {
+		size_t i;
+		const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
+
+		ima->flag |= IMA_IS_MULTIVIEW;
+		ima->flag |= IMA_IS_STEREO;
+
+		for (i = 0; i < 2; i++) {
+			iv = MEM_mallocN(sizeof(ImageView), "Image View Stereo (open)");
+			BLI_strncpy(iv->name, names[i], sizeof(iv->name));
+			BLI_strncpy(iv->filepath, ima->name, sizeof(iv->filepath));
+			BLI_addtail(&ima->views, iv);
+		}
+
+		ima->views_format = R_IMF_VIEWS_STEREO_3D;
+		return;
+	}
+	else {
+		/* R_IMF_VIEWS_INDIVIDUAL */
+		char prefix[FILE_MAX] = {'\0'};
+		char *name = ima->name;
+		char *ext;
+
+		size_t index_act;
+		char *suf_act;
+		const char delims[] = {'.', '\0'};
+
+		/* begin of extension */
+		index_act = BLI_str_rpartition(name, delims, &ext, &suf_act);
+		BLI_assert(index_act > 0);
+
+		for (srv = scene->r.views.first; srv; srv = srv->next) {
+			if (BKE_scene_render_view_active(&scene->r, srv)) {
+				size_t len = strlen(srv->suffix);
+				if (STREQLEN(ext - len, srv->suffix, len)) {
+					BLI_strncpy(prefix, name, strlen(name) - strlen(ext) - len + 1);
+					break;
+				}
+			}
+		}
+
+		if (prefix[0] == '\0') {
+			goto monoview;
+		}
+
+		/* create all the image views */
+		for (srv = scene->r.views.first; srv; srv = srv->next) {
+			if (BKE_scene_render_view_active(&scene->r, srv)) {
+				iv = MEM_mallocN(sizeof(ImageView), "Image View (open)");
+				BLI_strncpy(iv->name, srv->name, sizeof(iv->name));
+
+				sprintf(iv->filepath, "%s%s%s", prefix, srv->suffix, ext);
+				BLI_addtail(&ima->views, iv);
+			}
+		}
+
+		/* check if the files are all available */
+		for (iv = ima->views.first; iv; iv = iv->next) {
+			int file;
+			char str[FILE_MAX];
+
+			BLI_strncpy(str, iv->filepath, sizeof(str));
+			BLI_path_abs(str, G.main->name);
+
+			/* exists? */
+			file = BLI_open(str, O_BINARY | O_RDONLY, 0);
+			if (file == -1) {
+				ImageView *iv_del = iv;
+				iv = iv_del->prev;
+				BLI_remlink(&ima->views, iv_del);
+				MEM_freeN(iv_del);
+			}
+			close(file);
+		}
+
+		/* all good */
+		if (BLI_countlist(&ima->views) > 1) {
+			ima->flag |= IMA_IS_MULTIVIEW;
+			if (BKE_scene_is_stereo3d(&scene->r))
+				ima->flag |= IMA_IS_STEREO;
+		}
+		else {
+monoview:
+			ima->flag &= IMA_IS_STEREO;
+			ima->flag &= IMA_IS_MULTIVIEW;
+			BKE_image_free_views(ima);
+		}
+
+		/* monoview and multiview rely on individual images */
+		ima->views_format = R_IMF_VIEWS_INDIVIDUAL;
+	}
+}
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index c4954aa..31731fc 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1044,112 +1044,6 @@ static int image_sequence_get_len(ListBase *frames, int *ofs)
 	return 0;
 }
 
-/* handle the individual views case */
-static void image_open_multiview(wmOperator *op, Scene *scene, Image *ima)
-{
-	SceneRenderView *srv;
-	ImageView *iv;
-	ImageOpenData *iod = op->customdata;
-	ImageFormatData *imf = &iod->im_format;
-	const bool is_multiview = RNA_boolean_get(op->ptr, "use_multiple_views");
-
-	if (!is_multiview) {
-		goto monoview;
-	}
-	else if (imf->views_format == R_IMF_VIEWS_STEREO_3D) {
-		size_t i;
-		const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
-
-		ima->flag |= IMA_IS_MULTIVIEW;
-		ima->flag |= IMA_IS_STEREO;
-
-		for (i = 0; i < 2; i++) {
-			iv = MEM_mallocN(sizeof(ImageView), "Image View Stereo (open)");
-			BLI_strncpy(iv->name, names[i], sizeof(iv->name));
-			BLI_strncpy(iv->filepath, ima->name, sizeof(iv->filepath));
-			BLI_addtail(&ima->views, iv);
-		}
-
-		*ima->stereo3d_format = imf->stereo3d_format;
-		ima->views_format = R_IMF_VIEWS_STEREO_3D;
-		return;
-	}
-	else {
-		/* R_IMF_VIEWS_INDIVIDUAL */
-		char prefix[FILE_MAX] = {'\0'};
-		char *name = ima->name;
-		char *ext;
-
-		size_t index_act;
-		char *suf_act;
-		const char delims[] = {'.', '\0'};
-
-		/* begin of extension */
-		index_act = BLI_str_rpartition(name, delims, &ext, &suf_act);
-		BLI_assert(index_act > 0);
-
-		for (srv = scene->r.views.first; srv; srv = srv->next) {
-			if (BKE_scene_render_view_active(&scene->r, srv)) {
-				size_t len = strlen(srv->suffix);
-				if (STREQLEN(ext - len, srv->suffix, len)) {
-					BLI_strncpy(prefix, name, strlen(name) - strlen(ext) - len + 1);
-					break;
-				}
-			}
-		}
-
-		if (prefix[0] == '\0') {
-			goto monoview;
-		}
-
-		/* create all the image views */
-		for (srv = scene->r.views.first; srv; srv = srv->next) {
-			if (BKE_scene_render_view_active(&scene->r, srv)) {
-				iv = MEM_mallocN(sizeof(ImageView), "Image View (open)");
-				BLI_strncpy(iv->name, srv->name, sizeof(iv->name));
-
-				sprintf(iv->filepath, "%s%s%s", prefix, srv->suffix, ext);
-				BLI_addtail(&ima->views, iv);
-			}
-		}
-
-		/* check if the files are all available */
-		for (iv = ima->views.first; iv; iv = iv->next) {
-			int file;
-			char str[FILE_MAX];
-
-			BLI_strncpy(str, iv->filepath, sizeof(str));
-			BLI_path_abs(str, G.main->name);
-
-			/* exists? */
-			file = BLI_open(str, O_BINARY | O_RDONLY, 0);
-			if (file == -1) {
-				ImageView *iv_del = iv;
-				iv = iv_del->prev;
-				BLI_remlink(&ima->views, iv_del);
-				MEM_freeN(iv_del);
-			}
-			close(file);
-		}
-
-		/* all good */
-		if (BLI_countlist(&ima->views) > 1) {
-			ima->flag |= IMA_IS_MULTIVIEW;
-			if (BKE_scene_is_stereo3d(&scene->r))
-				ima->flag |= IMA_IS_STEREO;
-		}
-		else {
-	monoview:
-			ima->flag &= IMA_IS_STEREO;
-			ima->flag &= IMA_IS_MULTIVIEW;
-			BKE_image_free_views(ima);
-		}
-
-		/* monoview and multiview rely on individual images */
-		ima->views_format = R_IMF_VIEWS_INDIVIDUAL;
-	}
-}
-
 static int image_open_exec(bContext *C, wmOperator *op)
 {
 	Main *bmain = CTX_data_main(C);
@@ -1157,7 +1051,7 @@ static int image_open_exec(bContext *C, wmOperator *op)
 	Scene *scene = CTX_data_scene(C);
 	Object *obedit = CTX_data_edit_object(C);
 	ImageUser *iuser = NULL;
-	ImageOpenData *iod;
+	ImageOpenData *iod = op->customdata;
 	PointerRNA idptr;
 	Image *ima = NULL;
 	char path[FILE_MAX];
@@ -1194,7 +1088,22 @@ static int image_open_exec(bContext *C, wmOperator *op)
 		image_open_init(C, op);
 
 	/* handle multiview images */
-	image_open_multiview(op, scene, ima);
+	if (RNA_boolean_get(op->ptr, "use_multiple_views")) {
+		ImageFormatData *imf = &iod->im_format;
+
+		ima->views_format = imf->views_format;
+		*ima->stereo3d_format = imf->stereo3d_format;
+
+		BKE_image_update_views_format(scene, ima);
+	}
+	else {
+		ima->flag &= IMA_IS_STEREO;
+		ima->flag &= IMA_IS_MULTIVIEW;
+		BKE_image_free_views(ima);
+
+		/* monoview and multiview rely on individual images */
+		ima->views_format = R_IMF_VIEWS_INDIVIDUAL;
+	}
 
 	/* only image path after save, never ibuf */
 	if (is_relative_path) {
diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c
index 7d0c70a..0f02e0f 100644
--- a/source/blender/makesrna/intern/rna_image.c
+++ b/source/blender/makesrna/intern/rna_image.c
@@ -138,6 +138,22 @@ static void rna_Image_colormanage_update(Main *UNUSED(bmain), Scene *UNUSED(scen
 	WM_main_add_notifier(NC_IMAGE | NA_EDITED, &ima->id);
 }
 
+static void rna_Image_views_format_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
+{
+	Image *ima = ptr->id.data;
+	ImBuf *ibuf;
+	void *lock;
+
+	ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock);
+
+	if (ibuf) {
+		BKE_image_update_views_format(scene, ima);
+		BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
+	}
+
+	BKE_image_release_ibuf(ima, ibuf, lock);
+}
+
 static void rna_ImageUser_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
 {
 	ImageUser *iuser = ptr->data;
@@ -788,7 +804,7 @@ static void rna_def_

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list