[Bf-blender-cvs] [477daa9] multiview: Compositor handling all views on update (so you can edit the views individually and see the updates) and viewer node fully working.

Dalai Felinto noreply at git.blender.org
Thu Aug 21 22:38:22 CEST 2014


Commit: 477daa9337fd5b699ce1c59ed04f05d868a5894b
Author: Dalai Felinto
Date:   Thu Aug 21 18:32:38 2014 +0200
Branches: multiview
https://developer.blender.org/rB477daa9337fd5b699ce1c59ed04f05d868a5894b

Compositor handling all views on update (so you can edit the views
individually and see the updates) and viewer node fully working.

SplitViewer Node on the other hand is not working :| not sure why yet.
But apart from SplitViewer and the FileOutput node (easy fix, I'll work
on it shortly), the compositor should be fully functional for
multiview.

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

M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/scene.c
M	source/blender/compositor/nodes/COM_SplitViewerNode.cpp
M	source/blender/compositor/nodes/COM_ViewerNode.cpp
M	source/blender/editors/space_node/node_edit.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 6263fd4..2dee362 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -141,6 +141,10 @@ bool BKE_scene_check_rigidbody_active(const struct Scene *scene);
 int BKE_scene_num_threads(const struct Scene *scene);
 int BKE_render_num_threads(const struct RenderData *r);
 
+/* multiview */
+bool BKE_render_is_stereo3d(const struct RenderData *rd);
+size_t BKE_render_num_views(const struct RenderData *rd);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index d7d2b26..77323a8 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2026,3 +2026,40 @@ int BKE_scene_num_threads(const Scene *scene)
 {
 	return BKE_render_num_threads(&scene->r);
 }
+
+/******************** multiview *************************/
+
+size_t BKE_render_num_views(const RenderData *rd)
+{
+	SceneRenderView *srv;
+	size_t totviews	= 0;
+
+	if (rd->views_setup == SCE_VIEWS_SETUP_BASIC) {
+		if (BLI_findstring(&rd->views, STEREO_LEFT_NAME, offsetof(SceneRenderView, name)))
+		    totviews++;
+
+		if (BLI_findstring(&rd->views, STEREO_RIGHT_NAME, offsetof(SceneRenderView, name)))
+		    totviews++;
+	}
+	else {
+		for (srv = (SceneRenderView *)rd->views.first; srv; srv = srv->next)
+			if ((srv->viewflag & SCE_VIEW_DISABLE) == 0)
+				totviews++;
+	}
+	return totviews;
+}
+
+bool BKE_render_is_stereo3d(const RenderData *rd)
+{
+	SceneRenderView *srv[2];
+
+	if ((rd->scemode & R_MULTIVIEW) == 0)
+		return false;
+
+	srv[0] = (SceneRenderView *)BLI_findstring(&rd->views, STEREO_LEFT_NAME, offsetof(SceneRenderView, name));
+	srv[1] = (SceneRenderView *)BLI_findstring(&rd->views, STEREO_RIGHT_NAME, offsetof(SceneRenderView, name));
+
+	return (srv[0] && ((srv[0]->viewflag & SCE_VIEW_DISABLE) == 0) &&
+	        srv[1] && ((srv[1]->viewflag & SCE_VIEW_DISABLE) == 0));
+}
+
diff --git a/source/blender/compositor/nodes/COM_SplitViewerNode.cpp b/source/blender/compositor/nodes/COM_SplitViewerNode.cpp
index 15eca0a..3dd700c 100644
--- a/source/blender/compositor/nodes/COM_SplitViewerNode.cpp
+++ b/source/blender/compositor/nodes/COM_SplitViewerNode.cpp
@@ -22,6 +22,8 @@
 
 #include "COM_SplitViewerNode.h"
 #include "BKE_global.h"
+#include "BKE_image.h"
+#include "BKE_scene.h"
 
 #include "COM_SplitOperation.h"
 #include "COM_ViewerOperation.h"
@@ -69,4 +71,24 @@ void SplitViewerNode::convertToOperations(NodeConverter &converter, const Compos
 
 	if (do_output)
 		converter.registerViewer(viewerOperation);
+
+	if (image && (context.getViewId() == 0)) {
+		BLI_lock_thread(LOCK_DRAW_IMAGE);
+		if (BKE_render_is_stereo3d(context.getRenderData())) {
+			image->flag |= IMA_IS_STEREO;
+		}
+		else {
+			image->flag &= ~IMA_IS_STEREO;
+			imageUser->flag &= ~IMA_SHOW_STEREO;
+		}
+
+		size_t num_views = BKE_render_num_views(context.getRenderData());
+		size_t num_caches = BKE_image_cache_count(image);
+
+		if (num_views != num_caches) {
+			BKE_image_free_cached_frames(image);
+		}
+
+		BLI_unlock_thread(LOCK_DRAW_IMAGE);
+	}
 }
diff --git a/source/blender/compositor/nodes/COM_ViewerNode.cpp b/source/blender/compositor/nodes/COM_ViewerNode.cpp
index 5c0eb31..7505fc1 100644
--- a/source/blender/compositor/nodes/COM_ViewerNode.cpp
+++ b/source/blender/compositor/nodes/COM_ViewerNode.cpp
@@ -24,6 +24,7 @@
 #include "BKE_global.h"
 #include "BKE_image.h"
 #include "BLI_listbase.h"
+#include "BKE_scene.h"
 
 #include "COM_ViewerOperation.h"
 #include "COM_ExecutionSystem.h"
@@ -33,40 +34,6 @@ ViewerNode::ViewerNode(bNode *editorNode) : Node(editorNode)
 	/* pass */
 }
 
-static size_t ViewerNodeViewsCount(const RenderData *rd)
-{
-	SceneRenderView *srv;
-	size_t totviews	= 0;
-
-	if (rd->views_setup == SCE_VIEWS_SETUP_BASIC) {
-		if (BLI_findstring(&rd->views, STEREO_LEFT_NAME, offsetof(SceneRenderView, name)))
-		    totviews++;
-
-		if (BLI_findstring(&rd->views, STEREO_RIGHT_NAME, offsetof(SceneRenderView, name)))
-		    totviews++;
-	}
-	else {
-		for (srv = (SceneRenderView *)rd->views.first; srv; srv = srv->next)
-			if ((srv->viewflag & SCE_VIEW_DISABLE) == 0)
-				totviews++;
-	}
-	return totviews;
-}
-
-static bool ViewerNodeIsStereo(const RenderData *rd)
-{
-	SceneRenderView *srv[2];
-
-	if ((rd->scemode & R_MULTIVIEW) == 0)
-		return false;
-
-	srv[0] = (SceneRenderView *)BLI_findstring(&rd->views, STEREO_LEFT_NAME, offsetof(SceneRenderView, name));
-	srv[1] = (SceneRenderView *)BLI_findstring(&rd->views, STEREO_RIGHT_NAME, offsetof(SceneRenderView, name));
-
-	return (srv[0] && ((srv[0]->viewflag & SCE_VIEW_DISABLE) == 0) &&
-	        srv[1] && ((srv[1]->viewflag & SCE_VIEW_DISABLE) == 0));
-}
-
 void ViewerNode::convertToOperations(NodeConverter &converter, const CompositorContext &context) const
 {
 	bNode *editorNode = this->getbNode();
@@ -113,9 +80,9 @@ void ViewerNode::convertToOperations(NodeConverter &converter, const CompositorC
 	if (do_output)
 		converter.registerViewer(viewerOperation);
 
-	if (image) {
+	if (image && (context.getViewId() == 0)) {
 		BLI_lock_thread(LOCK_DRAW_IMAGE);
-		if (ViewerNodeIsStereo(context.getRenderData())) {
+		if (BKE_render_is_stereo3d(context.getRenderData())) {
 			image->flag |= IMA_IS_STEREO;
 		}
 		else {
@@ -123,7 +90,7 @@ void ViewerNode::convertToOperations(NodeConverter &converter, const CompositorC
 			imageUser->flag &= ~IMA_SHOW_STEREO;
 		}
 
-		size_t num_views = ViewerNodeViewsCount(context.getRenderData());
+		size_t num_views = BKE_render_num_views(context.getRenderData());
 		size_t num_caches = BKE_image_cache_count(image);
 
 		if (num_views != num_caches) {
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index f401961..1cd6b92 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -226,6 +226,21 @@ static void compo_progressjob(void *cjv, float progress)
 	*(cj->progress) = progress;
 }
 
+/* XXX MV move this to a centralized place */
+static size_t get_rendered_views_count(RenderData *rd)
+{
+	SceneRenderView *srv;
+	size_t tot_views = 0;
+
+	if ((rd->scemode & R_MULTIVIEW) == 0)
+		return 1;
+
+	for (srv = rd->views.first; srv; srv = srv->next)
+		if ((srv->viewflag & SCE_VIEW_DISABLE) == 0)
+			tot_views ++;
+
+	return tot_views;
+}
 
 /* only this runs inside thread */
 static void compo_startjob(void *cjv, short *stop, short *do_update, float *progress)
@@ -233,6 +248,7 @@ static void compo_startjob(void *cjv, short *stop, short *do_update, float *prog
 	CompoJob *cj = cjv;
 	bNodeTree *ntree = cj->localtree;
 	Scene *scene = cj->scene;
+	size_t nr, numviews;
 
 	if (scene->use_nodes == false)
 		return;
@@ -252,8 +268,11 @@ static void compo_startjob(void *cjv, short *stop, short *do_update, float *prog
 
 	// XXX BIF_store_spare();
 	/* 1 is do_previews */
-	//MV XXX not sure if we can/should do multiview here as well
-	ntreeCompositExecTree(cj->scene, ntree, &cj->scene->r, false, true, &scene->view_settings, &scene->display_settings, 0);
+
+	numviews = get_rendered_views_count(&cj->scene->r);
+	for (nr = 0; nr < numviews; nr++) {
+		ntreeCompositExecTree(cj->scene, ntree, &cj->scene->r, false, true, &scene->view_settings, &scene->display_settings, nr);
+	}
 
 	ntree->test_break = NULL;
 	ntree->stats_draw = NULL;
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 334d7c1..c286007 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -3324,14 +3324,7 @@ static size_t get_videos_count(RenderData *rd)
 
 	/* R_IMF_VIEWS_INDIVIDUAL */
 	else {
-		SceneRenderView *srv;
-		size_t tot_views = 0;
-
-		for (srv = rd->views.first; srv; srv = srv->next)
-			if ((srv->viewflag & SCE_VIEW_DISABLE) == 0)
-				tot_views++;
-
-		return tot_views;
+		return BKE_render_num_views(rd);
 	}
 }




More information about the Bf-blender-cvs mailing list