[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