Commit: 6d6e0a77365d04bb7d0e13415e9ca06e0a31f877
Author: Dalai Felinto
Date:   Thu Oct 23 19:46:59 2014 +0200
Branches: multiview
https://developer.blender.org/rB6d6e0a77365d04bb7d0e13415e9ca06e0a31f877

Sequencer: Support for stereo 3d image strips

Note: there is a bug when you render the image and try to render another frame. 
It seems like a lock problem (blender just hangs).
So as with anything else in this branch do not use it with production files 
that you have no backup.

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

M       release/scripts/startup/bl_ui/space_sequencer.py
M       source/blender/blenkernel/BKE_scene.h
M       source/blender/blenkernel/intern/image.c
M       source/blender/blenkernel/intern/scene.c
M       source/blender/blenkernel/intern/sequencer.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/makesdna/DNA_sequence_types.h
M       source/blender/makesrna/intern/rna_sequencer.c

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

diff --git a/release/scripts/startup/bl_ui/space_sequencer.py 
b/release/scripts/startup/bl_ui/space_sequencer.py
index 2f90dae..156f06c 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -1012,5 +1012,35 @@ class SEQUENCER_PT_modifiers(SequencerButtonsPanel, 
Panel):
                     col.prop(mod, "contrast")
 
 
+class SEQUENCER_PT_stereo_3d(SequencerButtonsPanel, Panel):
+    bl_label = "Stereoscopy"
+    bl_options = {'DEFAULT_CLOSED'}
+
+    @classmethod
+    def poll(cls, context):
+        if not cls.has_sequencer(context):
+            return False
+
+        strip = act_strip(context)
+        if not strip:
+            return False
+
+        return (strip.type in {'IMAGE', 'MOVIE'} and \
+                context.scene.render.use_multiple_views)
+
+    def draw(self, context):
+        layout = self.layout
+
+        strip = act_strip(context)
+
+        col = layout
+        col.label(text="Views Format:")
+        col.row().prop(strip, "views_format", expand=True)
+
+        box = col.box()
+        box.active = strip.views_format == 'STEREO_3D'
+        box.template_image_stereo_3d(strip.stereo_3d_format)
+
+
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
diff --git a/source/blender/blenkernel/BKE_scene.h 
b/source/blender/blenkernel/BKE_scene.h
index 45891b4..b0ef199 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -157,6 +157,7 @@ const char *BKE_scene_render_view_name(const struct 
RenderData *rd, const int vi
 size_t BKE_scene_view_get_id(const struct RenderData *rd, const char 
*viewname);
 void BKE_scene_view_get_filepath(const struct RenderData *rd, const char 
*filepath, const char *view, char *r_filepath);
 const char *BKE_scene_view_get_suffix(const struct RenderData *rd, const char 
*viewname);
+void BKE_scene_view_get_prefix(struct Scene *scene, const char *name, char 
*rprefix, char **rext);
 void BKE_scene_videos_dimensions(const struct RenderData *rd, const size_t 
width, const size_t height, size_t *r_width, size_t *r_height);
 size_t BKE_scene_num_videos(const struct RenderData *rd);
 
diff --git a/source/blender/blenkernel/intern/image.c 
b/source/blender/blenkernel/intern/image.c
index 222bb2e..fee62ea 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -4418,25 +4418,9 @@ void BKE_image_update_views_format(Scene *scene, Image 
*ima)
                /* R_IMF_VIEWS_INDIVIDUAL */
                char prefix[FILE_MAX] = {'\0'};
                char *name = ima->name;
-               char *ext;
+               char *ext = NULL;
 
-               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;
-                               }
-                       }
-               }
+               BKE_scene_view_get_prefix(scene, name, prefix, &ext);
 
                if (prefix[0] == '\0') {
                        goto monoview;
diff --git a/source/blender/blenkernel/intern/scene.c 
b/source/blender/blenkernel/intern/scene.c
index d8ab3fb..3601c0c 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2257,6 +2257,30 @@ const char *BKE_scene_view_get_suffix(const RenderData 
*rd, const char *viewname
                return viewname;
 }
 
+void BKE_scene_view_get_prefix(Scene *scene, const char *name, char *rprefix, 
char **rext)
+{
+       SceneRenderView *srv;
+       size_t index_act;
+       char *suf_act;
+       const char delims[] = {'.', '\0'};
+
+       rprefix[0] = '\0';
+
+       /* begin of extension */
+       index_act = BLI_str_rpartition(name, delims, rext, &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(*rext - len, srv->suffix, len)) {
+                               BLI_strncpy(rprefix, name, strlen(name) - 
strlen(*rext) - len + 1);
+                               break;
+                       }
+               }
+       }
+}
+
 void BKE_scene_videos_dimensions(const RenderData *rd, const size_t width, 
const size_t height, size_t *r_width, size_t *r_height)
 {
        if ((rd->scemode & R_MULTIVIEW) &&
diff --git a/source/blender/blenkernel/intern/sequencer.c 
b/source/blender/blenkernel/intern/sequencer.c
index 8d421a3..e20e265 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -195,6 +195,10 @@ static void BKE_sequence_free_ex(Scene *scene, Sequence 
*seq, const bool do_cach
                ((ID *)seq->sound)->us--; 
        }
 
+       if (seq->stereo3d_format) {
+               MEM_freeN(seq->stereo3d_format);
+       }
+
        /* clipboard has no scene and will never have a sound handle or be 
active
         * same goes to sequences copy for proxy rebuild job
         */
@@ -2653,6 +2657,24 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData 
*context, Sequence *seq
        return ibuf;
 }
 
+/* the number of files will vary according to the stereo format */
+static size_t seq_num_files(const SeqRenderData *context, Sequence *seq)
+{
+       Scene *scene = context->scene;
+       const bool is_multiview = (scene->r.scemode & R_MULTIVIEW) != 0;
+
+       if (!is_multiview) {
+               return 1;
+       }
+       else if (seq->views_format == R_IMF_VIEWS_STEREO_3D) {
+               return 1;
+       }
+       /* R_IMF_VIEWS_INDIVIDUAL */
+       else {
+               return BKE_scene_num_views(&scene->r);
+       }
+}
+
 static ImBuf *do_render_strip_uncached(const SeqRenderData *context, Sequence 
*seq, float cfra)
 {
        ImBuf *ibuf = NULL;
@@ -2718,6 +2740,7 @@ static ImBuf *do_render_strip_uncached(const 
SeqRenderData *context, Sequence *s
 
                case SEQ_TYPE_IMAGE:
                {
+                       bool is_multiview = (context->scene->r.scemode & 
R_MULTIVIEW) != 0;
                        StripElem *s_elem = BKE_sequencer_give_stripelem(seq, 
cfra);
                        int flag;
 
@@ -2730,18 +2753,82 @@ static ImBuf *do_render_strip_uncached(const 
SeqRenderData *context, Sequence *s
                        if (seq->alpha_mode == SEQ_ALPHA_PREMUL)
                                flag |= IB_alphamode_premul;
 
-                       if (s_elem && (ibuf = IMB_loadiffname(name, flag, 
seq->strip->colorspace_settings.name))) {
-                               /* we don't need both (speed reasons)! */
-                               if (ibuf->rect_float && ibuf->rect)
-                                       imb_freerectImBuf(ibuf);
+                       if (!s_elem) {
+                               /* don't do anything */
+                       }
+                       else if (is_multiview) {
+                               size_t totfiles = seq_num_files(context, seq);
+                               size_t totviews = 
BKE_scene_num_views(&context->scene->r);
+                               struct ImBuf **ibufs;
+                               char prefix[FILE_MAX] = {'\0'};
+                               char *ext = NULL;
+                               int i;
+
+                               ibufs = MEM_mallocN(sizeof(ImBuf *) * totviews, 
"Sequence Image Views Imbufs");
+                               BKE_scene_view_get_prefix(context->scene, name, 
prefix, &ext);
+
+                               for (i = 0; i < totfiles; i++) {
+                                       const char *viewname = 
BKE_scene_render_view_name(&context->scene->r, i);
+                                       const char *suffix = 
BKE_scene_view_get_suffix(&context->scene->r, viewname);
+                                       char str[FILE_MAX] = {'\0'};
+
+                                       sprintf(str, "%s%s%s", prefix, suffix, 
ext);
+
+                                       ibufs[i] = IMB_loadiffname(str, flag, 
seq->strip->colorspace_settings.name);
+                                       if (ibufs[i] == NULL)
+                                               ibufs[i] = 
IMB_loadiffname(name, flag, seq->strip->colorspace_settings.name);
+
+                                       if (ibufs[i]) {
+                                               /* we don't need both (speed 
reasons)! */
+                                               if (ibufs[i]->rect_float && 
ibufs[i]->rect)
+                                                       
imb_freerectImBuf(ibufs[i]);
+                                       }
+                               }
 
-                               /* all sequencer color is done in SRGB space, 
linear gives odd crossfades */
-                               
BKE_sequencer_imbuf_to_sequencer_space(context->scene, ibuf, false);
+                               if (seq->views_format == R_IMF_VIEWS_STEREO_3D)
+                                       
IMB_ImBufFromStereo(seq->stereo3d_format, &ibufs[0], &ibufs[1]);
 
-                               copy_to_ibuf_still(context, seq, nr, ibuf);
+                               for (i = 0; i < totviews; i++) {
+                                       if (ibufs[i]) {
+                                               SeqRenderData localcontext = 
*context;
+                                               localcontext.view_id = i;
+
+                                               /* all sequencer color is done 
in SRGB space, linear gives odd crossfades */
+                                               
BKE_sequencer_imbuf_to_sequencer_space(context->scene, ibufs[i], false);
+                                               
copy_to_ibuf_still(&localcontext, seq, nr, ibufs[i]);
+                                       }
+                               }
 
-                               s_elem->orig_width  = ibuf->x;
-                               s_elem->orig_height = ibuf->y;
+                               /* return the original requested ImBuf */
+                               ibuf = ibufs[context->view_id];
+                               if (ibuf) {
+                                       s_elem->orig_width  = ibufs[0]->x;
+                                       s_elem->orig_height = ibufs[0]->y;
+                               }
+
+                               /* "remove" the others (decrease their 
refcount) */
+                               for (i = 0; i < totviews; i++) {
+                                       if (ibufs[i] != ibuf) {
+                                               IMB_freeImBuf(ibufs[i]);
+                                       }
+                               }
+
+                               MEM_freeN(ibufs);
+                       }
+                       else {
+                               if ((ibuf = IMB_loadiffname(name, flag, 
seq->strip->colorspace_settings.name))) {
+                                       /* we don't need both (speed reasons)! 
*/
+                                       if (ibuf->rect_float && ibuf->rect)
+                                               imb_freerectImBuf(ibuf);
+
+                                       /* all sequencer color is done in SRGB 
space, linear gives odd crossfades */
+                                       
BKE_sequencer_imbuf_to_sequencer_space(context->scene, ibuf, false);
+
+                                       copy_to_ibuf_still(context, seq, nr, 
ibuf);
+
+                                       s_elem->orig_width  = ibuf->x;
+                                       s_elem->orig_height = ibuf->y;
+                               }
                        }
                        break;
                }
@@ -4329,6 +4416,8 @@ Sequence *BKE_sequence_alloc(ListBase *lb, int cfra, int 
machine)
        seq->pitch = 1.0f;
        seq->scene_sound = NULL;
 
+       seq->stereo3d_format = MEM_callocN(sizeof(Stereo3dFormat), "Sequence 
Stereo Format");
+
        return seq;
 }
 
@@ -4535,6 +4624,8 @@ static Sequence *seq_dupli(Scene *scene, Scene *scene_to, 
Sequence *seq, int dup
        seq->tmp = seqn;
        seqn->strip = MEM_dupallocN(seq->strip);
 
+       seqn->stereo3d_format = MEM_dupallocN(seq->stereo3d_format);
+
        /* XXX: add F-Curve duplication stuff? */
 
        if (seq->strip->crop) {
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index be62a58..92b2235 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5425,6 +5425,7 @@ static void direct_link_scene(FileData *fd, Scene *sce)
                        if (seq->seq3 == NULL) seq->seq3 = seq->seq2;
                        
                        seq->effectdata = newdataadr(fd, seq->effectdata);
+                       seq->stereo3d_format = 

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