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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to