[Bf-blender-cvs] [6d6e0a7] multiview: Sequencer: Support for stereo 3d image strips

Dalai Felinto noreply at git.blender.org
Thu Oct 23 19:58:39 CEST 2014


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




More information about the Bf-blender-cvs mailing list