[Bf-blender-cvs] [2c35b52] multiview: OpenGL Preview Export - final

Dalai Felinto noreply at git.blender.org
Fri Aug 29 16:08:18 CEST 2014


Commit: 2c35b52d168b5ea9e1fd3fe437266f21822b1c3a
Author: Dalai Felinto
Date:   Fri Aug 29 15:34:14 2014 +0200
Branches: multiview
https://developer.blender.org/rB2c35b52d168b5ea9e1fd3fe437266f21822b1c3a

OpenGL Preview Export - final

Animation exporting works, stereo output works, ... =)

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

M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/scene.c
M	source/blender/editors/render/render_opengl.c
M	source/blender/render/extern/include/RE_pipeline.h
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 69e5a32..47fd27b 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -150,6 +150,8 @@ bool BKE_scene_is_stereo3d(const struct RenderData *rd);
 size_t BKE_scene_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);
+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);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 6e65b67..83574fe 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -90,6 +90,7 @@
 #include "PIL_time.h"
 
 #include "IMB_colormanagement.h"
+#include "IMB_imbuf.h"
 
 #include "bmesh.h"
 
@@ -2136,3 +2137,34 @@ SceneRenderView *BKE_scene_render_view_findindex(const RenderData *rd, const int
 	}
 	return srv;
 }
+
+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) &&
+	    rd->im_format.views_output == R_IMF_VIEWS_STEREO_3D)
+	{
+		IMB_stereo_dimensions(rd->im_format.stereo_output.display_mode, ((rd->im_format.stereo_output.flag & S3D_UNSQUEEZED_FRAME) == 0), width, height, r_width, r_height);
+	}
+	else {
+		*r_width = width;
+		*r_height = height;
+	}
+}
+
+size_t BKE_scene_num_videos(const RenderData *rd)
+{
+	if (BKE_imtype_is_movie(rd->im_format.imtype) == false)
+		return 0;
+
+	if ((rd->scemode & R_MULTIVIEW) == 0)
+		return 1;
+
+	if (rd->im_format.views_output == R_IMF_VIEWS_STEREO_3D)
+		return 1;
+
+	/* R_IMF_VIEWS_INDIVIDUAL */
+	else {
+		return BKE_scene_num_views(rd);
+	}
+}
+
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index 60ab1a4..0faf7da 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -100,9 +100,10 @@ typedef struct OGLRender {
 	int write_still;
 
 	ReportList *reports;
-	bMovieHandle *mh;
+	bMovieHandle **mh;
 	int cfrao, nfra;
 
+	size_t totvideos;
 	int view_id;
 
 	/* wm vars for timer and progress cursor */
@@ -454,7 +455,7 @@ static void screen_opengl_render_write(OGLRender *oglrender)
 	                  &scene->r.im_format, (scene->r.scemode & R_EXTENSION) != 0, false, "");
 
 	/* write images as individual images or stereo */
-	ok = RE_WriteRenderViews(oglrender->reports, rr, scene, false, name);
+	ok = RE_WriteRenderViewsImage(oglrender->reports, rr, scene, false, name);
 
 	RE_ReleaseResultImage(oglrender->re);
 
@@ -475,8 +476,6 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 		screen_opengl_render_doit(oglrender, rr);
 	}
 
-	/* XXX MV we no longer have the option to save as BW */
-
 	RE_ReleaseResult(oglrender->re);
 
 	if (oglrender->write_still) {
@@ -565,7 +564,6 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
 		oglrender->sseq = CTX_wm_space_seq(C);
 	}
 
-
 	oglrender->prevsa = prevsa;
 	oglrender->prevar = prevar;
 
@@ -604,6 +602,9 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
 	oglrender->wm = wm;
 	oglrender->win = win;
 
+	oglrender->totvideos = 0;
+	oglrender->mh = NULL;
+
 	return true;
 }
 
@@ -611,10 +612,15 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender)
 {
 	Main *bmain = CTX_data_main(C);
 	Scene *scene = oglrender->scene;
+	size_t i;
 
 	if (oglrender->mh) {
-		if (BKE_imtype_is_movie(scene->r.im_format.imtype))
-			oglrender->mh->end_movie();
+		for (i = 0; i < oglrender->totvideos; i++){
+			if (BKE_imtype_is_movie(scene->r.im_format.imtype)) {
+				oglrender->mh[i]->end_movie();
+			}
+		}
+		MEM_freeN(oglrender->mh);
 	}
 
 	if (oglrender->timer) { /* exec will not have a timer */
@@ -654,13 +660,26 @@ static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op)
 
 	oglrender = op->customdata;
 	scene = oglrender->scene;
+	oglrender->totvideos = BKE_scene_num_videos(&scene->r);
 
 	oglrender->reports = op->reports;
-	oglrender->mh = BKE_movie_handle_get(scene->r.im_format.imtype);
+
 	if (BKE_imtype_is_movie(scene->r.im_format.imtype)) {
-		if (!oglrender->mh->start_movie(scene, &scene->r, oglrender->sizex, oglrender->sizey, oglrender->reports)) {
-			screen_opengl_render_end(C, oglrender);
-			return 0;
+		size_t i, width, height;
+
+		BKE_scene_videos_dimensions(&scene->r, oglrender->sizex, oglrender->sizey, &width, &height);
+
+		oglrender->mh = MEM_mallocN(sizeof(bMovieHandle) * oglrender->totvideos, "Movies");
+
+		for (i = 0; i < oglrender->totvideos; i++){
+			oglrender->mh[i] = BKE_movie_handle_get(scene->r.im_format.imtype);
+
+			/*XXX MV MOV need to come up with a solution for the name issue, because at the moment
+			 * it's handling the name entirely inside the movie format */
+			if (!oglrender->mh[i]->start_movie(scene, &scene->r, oglrender->sizex, oglrender->sizey, oglrender->reports)) {
+				screen_opengl_render_end(C, oglrender);
+				return 0;
+			}
 		}
 	}
 
@@ -670,18 +689,17 @@ static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op)
 
 	return 1;
 }
+
 static bool screen_opengl_render_anim_step(bContext *C, wmOperator *op)
 {
 	Main *bmain = CTX_data_main(C);
 	OGLRender *oglrender = op->customdata;
 	Scene *scene = oglrender->scene;
-	ImBuf *ibuf, *ibuf_save = NULL;
-	void *lock;
 	char name[FILE_MAX];
 	bool ok = false;
 	const bool view_context = (oglrender->v3d != NULL);
-	Object *camera = NULL;
 	bool is_movie;
+	RenderResult *rr;
 
 	/* go to next frame */
 	if (CFRA < oglrender->nfra)
@@ -720,91 +738,39 @@ static bool screen_opengl_render_anim_step(bContext *C, wmOperator *op)
 			if (BKE_scene_camera_switch_update(scene)) {
 				oglrender->v3d->camera = scene->camera;
 			}
-
-			camera = oglrender->v3d->camera;
 		}
 	}
 	else {
 		BKE_scene_camera_switch_update(scene);
-
-		camera = scene->camera;
 	}
 
 	/* render into offscreen buffer */
 	screen_opengl_render_apply(oglrender);
 
-	//XXX MV OGL remove this and incorpoorate with the still image part
-
 	/* save to disk */
-	ibuf = BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock);
-
-	if (ibuf) {
-		bool needs_free = false;
-
-		ibuf_save = ibuf;
-
-		if (is_movie || !BKE_imtype_requires_linear_float(scene->r.im_format.imtype)) {
-			ibuf_save = IMB_colormanagement_imbuf_for_write(ibuf, true, true, &scene->view_settings,
-			                                                &scene->display_settings, &scene->r.im_format);
-
-			needs_free = true;
-		}
-
-		/* color -> grayscale */
-		/* editing directly would alter the render view */
-		if (scene->r.im_format.planes == R_IMF_PLANES_BW) {
-			ImBuf *ibuf_bw = IMB_dupImBuf(ibuf_save);
-			IMB_color_to_bw(ibuf_bw);
-
-			if (needs_free)
-				IMB_freeImBuf(ibuf_save);
-
-			ibuf_save = ibuf_bw;
-		}
-		else {
-			/* this is lightweight & doesnt re-alloc the buffers, only do this
-			 * to save the correct bit depth since the image is always RGBA */
-			ImBuf *ibuf_cpy = IMB_allocImBuf(ibuf_save->x, ibuf_save->y, scene->r.im_format.planes, 0);
-
-			ibuf_cpy->rect = ibuf_save->rect;
-			ibuf_cpy->rect_float = ibuf_save->rect_float;
-			ibuf_cpy->zbuf_float = ibuf_save->zbuf_float;
-
-			if (needs_free) {
-				ibuf_cpy->mall = ibuf_save->mall;
-				ibuf_save->mall = 0;
-				IMB_freeImBuf(ibuf_save);
-			}
+	rr = RE_AcquireResultRead(oglrender->re);
 
-			ibuf_save = ibuf_cpy;
+	if (is_movie) {
+		ok = RE_WriteRenderViewsMovie(oglrender->reports, rr, scene, &scene->r, oglrender->mh, oglrender->sizex, oglrender->sizey, oglrender->totvideos);
+		if (ok) {
+			printf("Append frame %d", scene->r.cfra);
+			BKE_reportf(op->reports, RPT_INFO, "Appended frame: %d", scene->r.cfra);
 		}
-
-		if (is_movie) {
-			ok = oglrender->mh->append_movie(&scene->r, PSFRA, CFRA, (int *)ibuf_save->rect,
-			                                 oglrender->sizex, oglrender->sizey, oglrender->reports);
-			if (ok) {
-				printf("Append frame %d", scene->r.cfra);
-				BKE_reportf(op->reports, RPT_INFO, "Appended frame: %d", scene->r.cfra);
-			}
+	}
+	else {
+		ok = RE_WriteRenderViewsImage(op->reports, rr, scene, true, name);
+		if (ok) {
+			printf("Saved: %s", name);
+			BKE_reportf(op->reports, RPT_INFO, "Saved file: %s", name);
 		}
 		else {
-			ok = BKE_imbuf_write_stamp(scene, camera, ibuf_save, name, &scene->r.im_format);
-
-			if (ok == 0) {
-				printf("Write error: cannot save %s\n", name);
-				BKE_reportf(op->reports, RPT_ERROR, "Write error: cannot save %s", name);
-			}
-			else {
-				printf("Saved: %s", name);
-				BKE_reportf(op->reports, RPT_INFO, "Saved file: %s", name);
-			}
+			printf("Write error: cannot save %s\n", name);
+			BKE_reportf(op->reports, RPT_ERROR, "Write error: cannot save %s", name);
 		}
-
-		if (needs_free)
-			IMB_freeImBuf(ibuf_save);
 	}
 
-	BKE_image_release_ibuf(oglrender->ima, ibuf, lock);
+	RE_ReleaseResult(oglrender->re);
+
 
 	/* movie stats prints have no line break */
 	printf("\n");
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 369571b..6b4d8df 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -35,6 +35,7 @@
 #include "DNA_listBase.h"
 #include "DNA_vec_types.h"
 
+struct bMovieHandle;
 struct bNodeTree;
 struct Image;
 struct ImageFormatData;
@@ -261,7 +262,8 @@ void RE_init_threadcount(Render *re);
 /* the main processor, assumes all was set OK! */
 void RE_TileProcessor(struct Render *re);
 
-bool RE_WriteRenderViews(struct ReportList *reports, struct RenderResult *rr, struct Scene *scene, const bool stamp, char *name);
+bool RE_WriteRenderViewsImage(struct ReportList *reports, struct RenderResult *rr, struct Scene *scene, const bool stamp, char *name);
+bool RE_WriteRenderViewsMovie(struct R

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list