[Bf-blender-cvs] [483b953] multiview: Store StereoDisplay in the image dna to use when re-saving the image

Dalai Felinto noreply at git.blender.org
Sun Sep 7 01:17:50 CEST 2014


Commit: 483b9532a584131e44f7780ad94b2d189a10b7c8
Author: Dalai Felinto
Date:   Sat Sep 6 17:11:26 2014 +0200
Branches: multiview
https://developer.blender.org/rB483b9532a584131e44f7780ad94b2d189a10b7c8

Store StereoDisplay in the image dna to use when re-saving the image

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

M	source/blender/blenkernel/intern/image.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/space_image/image_ops.c
M	source/blender/makesdna/DNA_image_types.h

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

diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 11efe53..3fdc281 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -322,6 +322,7 @@ void BKE_image_free(Image *ima)
 	}
 
 	image_free_views(ima);
+	MEM_freeN(ima->stereo_format);
 }
 
 /* only image block itself */
@@ -345,7 +346,9 @@ static Image *image_alloc(Main *bmain, const char *name, short source, short typ
 			ima->flag |= IMA_VIEW_AS_RENDER;
 
 		BKE_color_managed_colorspace_settings_init(&ima->colorspace_settings);
+		ima->stereo_format = MEM_mallocN(sizeof(StereoDisplay), "Image Stereo Format");
 	}
+
 	return ima;
 }
 
@@ -376,6 +379,18 @@ static void image_assign_ibuf(Image *ima, ImBuf *ibuf, int index, int frame)
 	}
 }
 
+static void copy_image_views(ListBase *lbn, ListBase *lbo)
+{
+	ImageView *iv, *ivn;
+	lbn->first = lbn->last = NULL;
+	iv = lbo->first;
+	while(iv) {
+		ivn = MEM_dupallocN(iv);
+		BLI_addtail(lbn, ivn);
+		iv = iv->next;
+	}
+}
+
 /* empty image block, of similar type and filename */
 Image *BKE_image_copy(Main *bmain, Image *ima)
 {
@@ -400,6 +415,9 @@ Image *BKE_image_copy(Main *bmain, Image *ima)
 	if (ima->packedfile)
 		nima->packedfile = dupPackedFile(ima->packedfile);
 
+	nima->stereo_format = MEM_dupallocN(ima->stereo_format);
+	copy_image_views(&nima->views, &ima->views);
+
 	return nima;
 }
 
@@ -2662,8 +2680,7 @@ static size_t image_num_files(Image *ima)
 	if (!is_multiview) {
 		return 1;
 	}
-	else if(false){
-		/* XXX MV not supported yet R_IMF_VIEWS_STEREO_3D */
+	else if(ima->views_format == R_IMF_VIEWS_STEREO_3D){
 		return 1;
 	}
 	/* R_IMF_VIEWS_INDIVIDUAL */
@@ -2747,10 +2764,12 @@ static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame)
 			ima->ok = 0;
 	}
 
-	/** XXX MV S3D LOAD STEREO IMAGES
-	  * this will mean we will use ibuf[0] and make ibuf[0] = left, ibuf[1] = right
-	  * so from that point on we use totviews instead of totfiles for ibufs
-	  */
+	if (ima->views_format == R_IMF_VIEWS_STEREO_3D) {
+		/** XXX MV S3D LOAD STEREO IMAGES
+		  * this will mean we will use ibuf[0] and make ibuf[0] = left, ibuf[1] = right
+		  * so from that point on we use totviews instead of totfiles for ibufs
+		  */
+	}
 
 	if (assign) {
 		if (!is_multiview)
@@ -2969,10 +2988,12 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
 			ima->ok = 0;
 	}
 
-	/** XXX MV S3D LOAD STEREO IMAGES
-	  * this will mean we will use ibuf[0] and make ibuf[0] = left, ibuf[1] = right
-	  * so from that point on we use totviews instead of totfiles for ibufs
-	  */
+	if (ima->views_format == R_IMF_VIEWS_STEREO_3D) {
+		/** XXX MV S3D LOAD STEREO IMAGES
+		  * this will mean we will use ibuf[0] and make ibuf[0] = left, ibuf[1] = right
+		  * so from that point on we use totviews instead of totfiles for ibufs
+		  */
+	}
 
 	if (assign) {
 		if (!is_multiview)
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index e41948e..753e0b2 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2231,4 +2231,3 @@ size_t BKE_scene_num_videos(const RenderData *rd)
 		return BKE_scene_num_views(rd);
 	}
 }
-
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 2ef9509..5957002 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3335,6 +3335,7 @@ static void direct_link_image(FileData *fd, Image *ima)
 
 	ima->packedfile = direct_link_packedfile(fd, ima->packedfile);
 	ima->preview = direct_link_preview_image(fd, ima->preview);
+	ima->stereo_format = newdataadr(fd, ima->stereo_format);
 	ima->ok = 1;
 }
 
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index a4f73e9..8f1c520 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -66,6 +66,7 @@
 
 #include "readfile.h"
 
+#include "MEM_guardedalloc.h"
 
 static void do_version_constraints_radians_degrees_270_1(ListBase *lb)
 {
@@ -430,10 +431,10 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
 			}
 		}
 
-		if (!DNA_struct_elem_find(fd->filesdna, "Image", "ListBase", "views")) {
+		if (!DNA_struct_elem_find(fd->filesdna, "Image", "StereoDisplay", "*stereo_format")) {
 			Image *ima;
 			for (ima = main->image.first; ima; ima = ima->id.next) {
-				ima->views.first = ima->views.last = NULL;
+				ima->stereo_format = MEM_mallocN(sizeof(StereoDisplay), "Image Stereo Format");
 			}
 		}
 	}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index e97ba3f..3c0ccbd 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2102,10 +2102,12 @@ static void write_images(WriteData *wd, ListBase *idbase)
 				writedata(wd, DATA, pf->size, pf->data);
 			}
 
+			write_previews(wd, ima->preview);
+
 			for (iv = ima->views.first; iv; iv = iv->next)
 				writestruct(wd, DATA, "ImageView", 1, iv);
+			writestruct(wd, DATA, "StereoDisplay", 1, ima->stereo_format);
 
-			write_previews(wd, ima->preview);
 		}
 		ima= ima->id.next;
 	}
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 00398cb..9dafe7d 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1045,14 +1045,40 @@ static int image_sequence_get_len(ListBase *frames, int *ofs)
 }
 
 /* handle the individual views case */
-static bool image_open_multiview(Scene *scene, Image *ima, ReportList *reports)
+static void image_open_multiview(wmOperator *op, Scene *scene, Image *ima)
 {
 	SceneRenderView *srv;
 	char prefix[FILE_MAX] = {'\0'};
 	char *name = ima->name;
 	char *ext;
 	ImageView *iv;
-	bool ok = true;
+	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_output == 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->stereo_format = imf->stereo_output;
+		ima->views_format = R_IMF_VIEWS_STEREO_3D;
+		return;
+	}
+
+	/* R_IMF_VIEWS_STEREO_3D */
 
 	/* begin of extension */
 	for (ext = name + strlen(name);(ext != name) && (ext[0] != '.'); ext--);
@@ -1070,9 +1096,7 @@ static bool image_open_multiview(Scene *scene, Image *ima, ReportList *reports)
 	}
 
 	if (prefix[0] == '\0') {
-		ok = false;
-		BKE_report(reports, RPT_ERROR, "Filename matches no scene views' suffix");
-		goto finally;
+		goto monoview;
 	}
 
 	/* create all the image views */
@@ -1097,23 +1121,29 @@ static bool image_open_multiview(Scene *scene, Image *ima, ReportList *reports)
 		/* exists? */
 		file = BLI_open(str, O_BINARY | O_RDONLY, 0);
 		if (file == -1) {
-			ok = false;
-			BKE_reportf(reports, RPT_ERROR, "File %s not found", str);
-			goto finally;
+			ImageView *iv_del = iv;
+			iv = iv_del->prev;
+			BLI_remlink(&ima->views, iv_del);
+			MEM_freeN(iv_del);
 		}
 		close(file);
 	}
 
 	/* all good */
-	ima->flag |= IMA_IS_MULTIVIEW;
-	if (BKE_scene_is_stereo3d(&scene->r))
-		ima->flag |= IMA_IS_STEREO;
-
-finally:
-	if (!ok)
+	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);
+	}
 
-	return ok;
+	/* monoview and multiview rely on individual images */
+	ima->views_format = R_IMF_VIEWS_INDIVIDUAL;
 }
 
 static int image_open_exec(bContext *C, wmOperator *op)
@@ -1130,7 +1160,6 @@ static int image_open_exec(bContext *C, wmOperator *op)
 	int frame_seq_len = 0;
 	int frame_ofs = 1;
 
-	const bool is_multiview = RNA_boolean_get(op->ptr, "use_multiple_views");
 	const bool is_relative_path = RNA_boolean_get(op->ptr, "relative_path");
 
 	RNA_string_get(op->ptr, "filepath", path);
@@ -1157,16 +1186,12 @@ static int image_open_exec(bContext *C, wmOperator *op)
 		return OPERATOR_CANCELLED;
 	}
 
-	if (is_multiview) {
-		if(!image_open_multiview(scene, ima, op->reports)) {
-			BKE_image_free(ima);
-			return OPERATOR_CANCELLED;
-		}
-	}
-
 	if (!op->customdata)
 		image_open_init(C, op);
 
+	/* handle multiview images */
+	image_open_multiview(op, scene, ima);
+
 	/* only image path after save, never ibuf */
 	if (is_relative_path) {
 		const char *relbase = ID_BLEND_PATH(bmain, &ima->id);
@@ -1268,7 +1293,7 @@ static int image_open_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(
 	
 	image_open_init(C, op);
 
-	/* show multiview save options only if image has multiviews */
+	/* show multiview save options only if scene has multiviews */
 	prop = RNA_struct_find_property(op->ptr, "use_multiple_views");
 	RNA_property_boolean_set(op->ptr, prop, (scene->r.scemode & R_MULTIVIEW));
 
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index 039dcb2..31ae562 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -126,12 +126,13 @@ typedef struct Image {
 	ColorManagedColorspaceSettings colorspace_settings;
 	char alpha_mode;
 
-	char pad[6];
+	char pad[5];
 
-	/* multiview */
+	/* Multiview */
 	char eye; /* for viewer node stereoscopy */
+	char views_format;
 	ListBase views;
-
+	struct StereoDisplay *stereo_format;
 } Image;




More information about the Bf-blender-cvs mailing list