[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