[Bf-blender-cvs] [5ed6e4a] multiview: Sequencer Multi-View/Stereo 3D initial commit

Dalai Felinto noreply at git.blender.org
Tue Oct 14 20:04:34 CEST 2014


Commit: 5ed6e4a0296b50b4b21c0e7e1c5cc444bdefa134
Author: Dalai Felinto
Date:   Mon Oct 13 15:42:50 2014 -0300
Branches: multiview
https://developer.blender.org/rB5ed6e4a0296b50b4b21c0e7e1c5cc444bdefa134

Sequencer Multi-View/Stereo 3D initial commit

What works:
* Scene strips.
* Any non-image strips.

What doesn't work well:
* OpenGL Render (and preview) from sequencer is buggy (it doesn't use
  the correct camera shift). It's particularly bad for Stereo 3D.
* Right now there is no way of previewing only a view (e.g., left)
  in a way it's the same we do with the Compositor backdrop.

What doesn't work yet:
* Any image or movie strip (they work as mono at the moment).

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

M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/BKE_sequencer.h
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenkernel/intern/seqcache.c
M	source/blender/blenkernel/intern/sequencer.c
M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/render/render_opengl.c
M	source/blender/editors/sculpt_paint/paint_image_proj.c
M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/editors/space_sequencer/sequencer_intern.h
M	source/blender/editors/space_sequencer/sequencer_view.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/render/intern/include/render_result.h
M	source/blender/render/intern/source/pipeline.c
M	source/blender/render/intern/source/render_result.c
M	source/blender/windowmanager/intern/wm_draw.c
M	source/blender/windowmanager/intern/wm_files.c
M	source/blender/windowmanager/intern/wm_stereo.c

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

diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 4716c69..45891b4 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -153,6 +153,7 @@ bool BKE_scene_render_view_active(const struct RenderData *rd, const struct Scen
 bool BKE_scene_render_view_first(const struct RenderData *rd, const char *viewname);
 bool BKE_scene_render_view_last(const struct RenderData *rd, const char *viewname);
 struct SceneRenderView *BKE_scene_render_view_findindex(const struct RenderData *rd, const int view_id);
+const char *BKE_scene_render_view_name(const struct RenderData *rd, const int view_id);
 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);
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index 13cc5d2..b44ec60 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -100,6 +100,7 @@ typedef struct SeqRenderData {
 	float motion_blur_shutter;
 	bool skip_cache;
 	bool is_proxy_render;
+	size_t view_id;
 } SeqRenderData;
 
 SeqRenderData BKE_sequencer_new_render_data(struct EvaluationContext *eval_ctx, struct Main *bmain,
@@ -376,7 +377,7 @@ struct Sequence *BKE_sequencer_add_sound_strip(struct bContext *C, ListBase *seq
 struct Sequence *BKE_sequencer_add_movie_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load);
 
 /* view3d draw callback, run when not in background view */
-typedef struct ImBuf *(*SequencerDrawView)(struct Scene *, struct Object *, int, int, unsigned int, int, bool, bool, int, char[256]);
+typedef struct ImBuf *(*SequencerDrawView)(struct Scene *, struct Object *, int, int, unsigned int, int, bool, bool, int, char[256], const char *viewname);
 extern SequencerDrawView sequencer_view3d_cb;
 
 /* copy/paste */
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 416f059..d8ab3fb 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2189,6 +2189,16 @@ SceneRenderView *BKE_scene_render_view_findindex(const RenderData *rd, const int
 	return srv;
 }
 
+const char *BKE_scene_render_view_name(const RenderData *rd, const int view_id)
+{
+	SceneRenderView *srv = BKE_scene_render_view_findindex(rd, view_id);
+
+	if (srv)
+		return srv->name;
+	else
+		return "";
+}
+
 size_t BKE_scene_view_get_id(const RenderData *rd, const char *viewname)
 {
 	SceneRenderView *srv;
diff --git a/source/blender/blenkernel/intern/seqcache.c b/source/blender/blenkernel/intern/seqcache.c
index 4268b33..3974eda 100644
--- a/source/blender/blenkernel/intern/seqcache.c
+++ b/source/blender/blenkernel/intern/seqcache.c
@@ -33,6 +33,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "DNA_sequence_types.h"
+#include "DNA_scene_types.h"
 
 #include "IMB_moviecache.h"
 #include "IMB_imbuf.h"
@@ -41,6 +42,7 @@
 #include "BLI_listbase.h"
 
 #include "BKE_sequencer.h"
+#include "BKE_scene.h"
 
 typedef struct SeqCacheKey {
 	struct Sequence *seq;
@@ -77,7 +79,9 @@ static bool seq_cmp_render_data(const SeqRenderData *a, const SeqRenderData *b)
 	        (a->bmain != b->bmain) ||
 	        (a->scene != b->scene) ||
 	        (a->motion_blur_shutter != b->motion_blur_shutter) ||
-	        (a->motion_blur_samples != b->motion_blur_samples));
+	        (a->motion_blur_samples != b->motion_blur_samples) ||
+	        (a->scene->r.views_setup != b->scene->r.views_setup) ||
+	        (a->view_id != b->view_id));
 }
 
 static unsigned int seq_hash_render_data(const SeqRenderData *a)
@@ -89,6 +93,7 @@ static unsigned int seq_hash_render_data(const SeqRenderData *a)
 	rval ^= ((intptr_t) a->scene) << 6;
 	rval ^= (int)(a->motion_blur_shutter * 100.0f) << 10;
 	rval ^= a->motion_blur_samples << 24;
+	rval ^= ((a->scene->r.views_setup * 2) + a->view_id) << 32;
 
 	return rval;
 }
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 6c17c30..6f3ae3b 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -515,6 +515,7 @@ SeqRenderData BKE_sequencer_new_render_data(EvaluationContext *eval_ctx,
 	rval.eval_ctx = eval_ctx;
 	rval.skip_cache = false;
 	rval.is_proxy_render = false;
+	rval.view_id = 0;
 
 	return rval;
 }
@@ -2555,6 +2556,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq
 		char err_out[256] = "unknown";
 		int width = (scene->r.xsch * scene->r.size) / 100;
 		int height = (scene->r.ysch * scene->r.size) / 100;
+		const char *viewname = BKE_scene_render_view_name(&scene->r, context->view_id);
 
 		/* for old scened this can be uninitialized,
 		 * should probably be added to do_versions at some point if the functionality stays */
@@ -2566,7 +2568,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq
 		ibuf = sequencer_view3d_cb(scene, camera, width, height, IB_rect,
 		                           context->scene->r.seq_prev_type,
 		                           (context->scene->r.seq_flag & R_SEQ_SOLID_TEX) != 0,
-		                           true, scene->r.alphamode, err_out);
+		                           true, scene->r.alphamode, err_out, viewname);
 		if (ibuf == NULL) {
 			fprintf(stderr, "seq_render_scene_strip failed to get opengl buffer: %s\n", err_out);
 		}
@@ -2587,6 +2589,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq
 			if (re == NULL)
 				re = RE_NewRender(scene->id.name);
 
+			RE_SetActiveRenderView(re, BKE_scene_render_view_name(&scene->r, context->view_id));
 			BKE_scene_update_for_newframe(context->eval_ctx, context->bmain, scene, scene->lay);
 			RE_BlenderFrame(re, context->bmain, scene, NULL, camera, scene->lay, frame, false);
 
@@ -2594,8 +2597,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq
 			G.is_rendering = is_rendering;
 		}
 		
-		/* XXX MV SEQ */
-		RE_AcquireResultImage(re, &rres, 0);
+		RE_AcquireResultImage(re, &rres, context->view_id);
 		
 		if (rres.rectf) {
 			ibuf = IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rectfloat);
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index e7f51f2..e1b516d 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -308,9 +308,9 @@ void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct AR
                               const char *viewname);
 
 struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey, unsigned int flag,
-                                             bool draw_background, int alpha_mode, char err_out[256]);
+                                             bool draw_background, int alpha_mode, char err_out[256], const char *viewname);
 struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(struct Scene *scene, struct Object *camera, int width, int height, unsigned int flag, int drawtype,
-                                                    bool use_solid_tex, bool draw_background, int alpha_mode, char err_out[256]);
+                                                    bool use_solid_tex, bool draw_background, int alpha_mode, char err_out[256], const char *viewname);
 void ED_view3d_offscreen_sky_color_get(struct Scene *scene, float sky_color[3]);
 
 struct Base *ED_view3d_give_base_under_cursor(struct bContext *C, const int mval[2]);
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index a8f6904..a0c2165 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -131,10 +131,10 @@ static bool screen_opengl_is_multiview(OGLRender *oglrender)
 	RegionView3D *rv3d = oglrender->rv3d;
 	RenderData *rd = &oglrender->scene->r;
 
-	if ((rd == NULL) || (rv3d == NULL) || (v3d == NULL))
+	if ((rd == NULL) || ((!oglrender->is_sequencer) && ((rv3d == NULL) || (v3d == NULL))))
 		return false;
 
-	return (rd->scemode & R_MULTIVIEW) && rv3d->persp == RV3D_CAMOB && v3d->camera;
+	return (rd->scemode & R_MULTIVIEW) && ((oglrender->is_sequencer) || (rv3d->persp == RV3D_CAMOB && v3d->camera));
 }
 
 static void screen_opengl_views_setup(OGLRender *oglrender)
@@ -174,7 +174,9 @@ static void screen_opengl_views_setup(OGLRender *oglrender)
 		}
 	}
 	else {
-		RE_SetOverrideCamera(oglrender->re, V3D_CAMERA_SCENE(oglrender->scene, v3d));
+		if (!oglrender->is_sequencer)
+			RE_SetOverrideCamera(oglrender->re, V3D_CAMERA_SCENE(oglrender->scene, v3d));
+
 		/* remove all the views that are not needed */
 		rv = rr->views.last;
 		while (rv) {
@@ -261,6 +263,7 @@ static void screen_opengl_render_doit(OGLRender *oglrender, RenderResult *rr)
 		context = BKE_sequencer_new_render_data(oglrender->bmain->eval_ctx, oglrender->bmain,
 		                                        scene, oglrender->sizex, oglrender->sizey, 100.0f);
 
+		context.view_id = BKE_scene_view_get_id(&scene->r, viewname);
 		ibuf = BKE_sequencer_give_ibuf(&context, CFRA, chanshown);
 
 		if (ibuf) {
@@ -387,7 +390,7 @@ static void screen_opengl_render_doit(OGLRender *oglrender, RenderResult *rr)
 		char err_out[256] = "unknown";
 		ImBuf *ibuf_view = ED_view3d_draw_offscreen_imbuf_simple(scene, scene->camera, oglrender->sizex, oglrender->sizey,
 		                                                         IB_rect, OB_SOLID, false, true,
-		                                                         (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL, err_out);
+		                                                         (draw_sky) ? R_ADDSKY : R_ALPHAPREMUL, err_out, viewname);
 		camera = scene->camera;
 
 		if (ibuf_view) {
diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c
index 858e9f5..ccbb3eb 100644
-

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list