[Bf-blender-cvs] [8884eb8] multiview: OpenGL Preview Export (work in progress)

Dalai Felinto noreply at git.blender.org
Fri Aug 29 00:29:49 CEST 2014


Commit: 8884eb8882ba70507996d6ea7a1598f20f4e34ad
Author: Dalai Felinto
Date:   Fri Aug 29 00:27:52 2014 +0200
Branches: multiview
https://developer.blender.org/rB8884eb8882ba70507996d6ea7a1598f20f4e34ad

OpenGL Preview Export (work in progress)

OpenGL Preview Export is working for still images, and not breaking for sequencer, movie, ...

That includes some refactoring to unify the code of render_opengl.c and
pipeline.c (the part related to saving).

Next tasks:
* Get it to work for the movie opengl preview
* Get the sequencer 3dview preview to show in stereo
* Get the sequencer OpenGL still/movie to export in stereo

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

M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/scene.c
M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/render/render_opengl.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/render/extern/include/RE_pipeline.h
M	source/blender/render/intern/include/render_result.h
M	source/blender/render/intern/source/initrender.c
M	source/blender/render/intern/source/pipeline.c

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

diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index ec0798a..af42e69 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -148,6 +148,8 @@ double BKE_scene_unit_scale(const struct UnitSettings *unit, const int unit_type
 /* multiview */
 bool BKE_render_is_stereo3d(const struct RenderData *rd);
 size_t BKE_render_num_views(const struct RenderData *rd);
+bool BKE_scene_render_view_active(const struct RenderData *rd, const struct SceneRenderView *srv);
+struct SceneRenderView *BKE_scene_render_view_findindex(const struct RenderData *rd, const int view_id);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 4dd9f2e..019a340 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2094,3 +2094,45 @@ bool BKE_render_is_stereo3d(const RenderData *rd)
 	        srv[1] && ((srv[1]->viewflag & SCE_VIEW_DISABLE) == 0));
 }
 
+/* return whether to render this SceneRenderView */
+bool BKE_scene_render_view_active(const RenderData *rd, const SceneRenderView *srv)
+{
+	if (srv == NULL)
+		return false;
+
+	if ((rd->scemode & R_MULTIVIEW) == 0)
+		return false;
+
+	if ((srv->viewflag & SCE_VIEW_DISABLE))
+		return false;
+
+	if (rd->views_setup == SCE_VIEWS_SETUP_ADVANCED)
+		return true;
+
+	/* SCE_VIEWS_SETUP_BASIC */
+	if ((strcmp(srv->name, STEREO_LEFT_NAME) == 0) ||
+	    (strcmp(srv->name, STEREO_RIGHT_NAME) == 0))
+	{
+		return true;
+	}
+
+	return false;
+}
+
+SceneRenderView *BKE_scene_render_view_findindex(const RenderData *rd, const int view_id)
+{
+	SceneRenderView *srv;
+	size_t nr;
+
+	if ((rd->scemode & R_MULTIVIEW) == 0)
+		return NULL;
+
+	nr = 0;
+	for (srv = rd->views.first, nr = 0; srv; srv = srv->next) {
+		if (BKE_scene_render_view_active(rd, srv)) {
+			if (nr++ == view_id)
+				return srv;
+		}
+	}
+	return srv;
+}
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index bd4f37c..878038a 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -304,7 +304,7 @@ int ED_view3d_scene_layer_set(int lay, const int *values, int *active);
 bool ED_view3d_context_activate(struct bContext *C);
 void ED_view3d_draw_offscreen_init(struct Scene *scene, struct View3D *v3d);
 void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct ARegion *ar,
-                              int winx, int winy, float viewmat[4][4], float winmat[4][4], bool do_bgpic, bool do_sky);
+                              int winx, int winy, float viewmat[4][4], float winmat[4][4], bool do_bgpic, bool do_sky, const int view_id);
 
 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]);
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index bd219eb..f0123e9 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -40,10 +40,12 @@
 #include "BLI_blenlib.h"
 #include "BLI_utildefines.h"
 #include "BLI_jitter.h"
+#include "BLI_threads.h"
 
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"
 
+#include "BKE_camera.h"
 #include "BKE_context.h"
 #include "BKE_global.h"
 #include "BKE_image.h"
@@ -101,6 +103,8 @@ typedef struct OGLRender {
 	bMovieHandle *mh;
 	int cfrao, nfra;
 
+	int view_id;
+
 	/* wm vars for timer and progress cursor */
 	wmWindowManager *wm;
 	wmWindow *win;
@@ -119,16 +123,132 @@ static unsigned int screen_opengl_layers(OGLRender *oglrender)
 	}
 }
 
-static void screen_opengl_render_apply(OGLRender *oglrender)
+static bool screen_opengl_is_multiview(OGLRender *oglrender)
+{
+	View3D *v3d = oglrender->v3d;
+	RegionView3D *rv3d = oglrender->rv3d;
+	RenderData *rd = &oglrender->scene->r;
+
+	if ((rd == NULL) || (rv3d == NULL) || (v3d == NULL))
+		return false;
+
+	return (rd->scemode & R_MULTIVIEW) && rv3d->persp == RV3D_CAMOB && v3d->camera;
+}
+
+static void screen_opengl_views_setup(OGLRender *oglrender)
+{
+	RenderResult *rr;
+	RenderView *rv;
+	SceneRenderView *srv;
+	bool is_multiview;
+	View3D *v3d = oglrender->v3d;
+
+	RenderData *rd = &oglrender->scene->r;
+
+	rr = RE_AcquireResultWrite(oglrender->re);
+
+	is_multiview = screen_opengl_is_multiview(oglrender);
+
+	if (!is_multiview) {
+		/* we only have one view when multiview is off */
+		rv = (RenderView *) rr->views.first;
+
+		if (rv == NULL) {
+			rv = MEM_callocN(sizeof(RenderView), "new opengl render view");
+			BLI_addtail(&rr->views, rv);
+		}
+
+		rv->camera = v3d ? v3d->camera : NULL;
+
+		while (rv->next) {
+			RenderView *rv_del = rv->next;
+			BLI_remlink(&rr->views, rv_del);
+
+			if (rv_del->rectf)
+				MEM_freeN(rv_del->rectf);
+
+			if (rv_del->rectz)
+				MEM_freeN(rv_del->rectz);
+
+			MEM_freeN(rv_del);
+		}
+	}
+	else {
+		RE_SetOverrideCamera(oglrender->re, V3D_CAMERA_SCENE(oglrender->scene, v3d));
+		RE_RenderInitializeStereo(oglrender->re, rd);
+
+		/* remove all the views that are not needed */
+		rv = rr->views.last;
+		while (rv) {
+			srv = BLI_findstring(&rd->views, rv->name, offsetof(SceneRenderView, name));
+			if (BKE_scene_render_view_active(rd, srv)) {
+				if (rv->rectf == NULL)
+					rv->rectf = MEM_callocN(sizeof(float) * 4 * oglrender->sizex * oglrender->sizey, "screen_opengl_render_init rect");
+				rv = rv->prev;
+			}
+			else {
+				RenderView *rv_del = rv;
+				rv  = rv_del->prev;
+
+				BLI_remlink(&rr->views, rv_del);
+
+				if (rv_del->rectf)
+					MEM_freeN(rv_del->rectf);
+
+				if (rv_del->rectz)
+					MEM_freeN(rv_del->rectz);
+
+				MEM_freeN(rv_del);
+			}
+		}
+
+		/* create all the views that are needed */
+		for (srv = rd->views.first; srv; srv = srv->next) {
+			if (BKE_scene_render_view_active(rd, srv) == false)
+				continue;
+
+			rv = BLI_findstring(&rr->views, srv->name, offsetof(SceneRenderView, name));
+
+			if (rv == NULL) {
+				rv = MEM_callocN(sizeof(RenderView), "new opengl render view");
+				BLI_strncpy(rv->name, srv->name, sizeof(rv->name));
+				BLI_addtail(&rr->views, rv);
+			}
+
+			if (rd->views_setup == SCE_VIEWS_SETUP_BASIC)
+				rv->camera = RE_GetCameraStereo(oglrender->re, (strcmp(srv->name, STEREO_LEFT_NAME) == 0));
+			else
+				rv->camera = BKE_camera_multiview_advanced(oglrender->scene, rd, v3d->camera, srv->suffix);
+		}
+	}
+
+	for (rv = rr->views.first; rv; rv = rv->next) {
+		if (rv->rectf == NULL) {
+			rv->rectf = MEM_callocN(sizeof(float) * 4 * oglrender->sizex * oglrender->sizey, "screen_opengl_render_init rect");
+		}
+	}
+
+	BLI_lock_thread(LOCK_DRAW_IMAGE);
+	if (BKE_render_is_stereo3d(rd)) {
+		oglrender->ima->flag |= IMA_IS_STEREO;
+	}
+	else {
+		oglrender->ima->flag &= ~IMA_IS_STEREO;
+		oglrender->iuser.flag &= ~IMA_SHOW_STEREO;
+	}
+	BLI_unlock_thread(LOCK_DRAW_IMAGE);
+
+	RE_ReleaseResult(oglrender->re);
+}
+
+static void screen_opengl_render_doit(OGLRender *oglrender, RenderResult *rr)
 {
 	Scene *scene = oglrender->scene;
 	ARegion *ar = oglrender->ar;
 	View3D *v3d = oglrender->v3d;
 	RegionView3D *rv3d = oglrender->rv3d;
-	RenderResult *rr;
 	Object *camera = NULL;
 	ImBuf *ibuf;
-	void *lock;
 	float winmat[4][4];
 	int sizex = oglrender->sizex;
 	int sizey = oglrender->sizey;
@@ -136,8 +256,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 	bool draw_bgpic = true;
 	bool draw_sky = (scene->r.alphamode == R_ADDSKY);
 	unsigned char *rect = NULL;
-
-	rr = RE_AcquireResultRead(oglrender->re);
+	const bool is_multiview = screen_opengl_is_multiview(oglrender);
 
 	if (oglrender->is_sequencer) {
 		SeqRenderData context;
@@ -151,6 +270,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 		ibuf = BKE_sequencer_give_ibuf(&context, CFRA, chanshown);
 
 		if (ibuf) {
+			float *rectf;
 			ImBuf *linear_ibuf;
 
 			BLI_assert((oglrender->sizex == ibuf->x) && (oglrender->sizey == ibuf->y));
@@ -171,7 +291,8 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 				BKE_sequencer_imbuf_from_sequencer_space(scene, linear_ibuf);
 			}
 
-			memcpy(rr->rectf, linear_ibuf->rect_float, sizeof(float) * 4 * oglrender->sizex * oglrender->sizey);
+			rectf = RE_RenderViewGetRectf(rr, oglrender->view_id);
+			memcpy(rectf, linear_ibuf->rect_float, sizeof(float) * 4 * oglrender->sizex * oglrender->sizey);
 
 			IMB_freeImBuf(linear_ibuf);
 		}
@@ -211,9 +332,9 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 		/* render 3d view */
 		if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
 			/*int is_ortho = scene->r.mode & R_ORTHO;*/
-			camera = v3d->camera;
+			RenderView *rv = BLI_findlink(&rr->views, oglrender->view_id);
+			camera = rv->camera;
 			RE_GetCameraWindow(oglrender->re, camera, scene->r.cfra, winmat);
-			
 		}
 		else {
 			rctf viewplane;
@@ -227,7 +348,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 		rect = MEM_mallocN(sizex * sizey * sizeof(unsigned char) * 4, "offscreen rect");
 
 		if ((scene->r.mode & R_OSA) == 0) {
-			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky);
+			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, is_multiview ? oglrender->view_id : STEREO_MONO_ID);
 			GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
 		}
 		else {
@@ -240,7 +361,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 			BLI_jitter_init(jit_ofs, scene->r.osa);
 
 			/* first sample buffer, also initializes 'rv3d->persmat' */
-			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky);
+			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, is_multiview ? oglrender->view_id : STEREO_MONO_ID);
 			GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
 
 			for (i = 0; i < sizex * sizey * 4; i++)
@@ -253,7 +374,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 				                  

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list