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. @@

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

Reply via email to