[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34695] trunk/blender: Todo/ feature request

Ton Roosendaal ton at blender.org
Mon Feb 7 17:42:01 CET 2011


Revision: 34695
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34695
Author:   ton
Date:     2011-02-07 16:41:57 +0000 (Mon, 07 Feb 2011)
Log Message:
-----------
Todo/feature request

When using masks or other simple 3D elements in composites, doing
a layer re-rendering on a node is a bit clumsy all the time.

This commit does two things to help:
- new hotkey "Z" in node editor automatically finds render layer
  that changed and re-renders it + composites
- option "Auto Render" does same, but then after every transform
  edit in 3D window

The latter is experimental; real & proper system for this requires
full threaded render support (like previews). But it works!

Demo file:
http://download.blender.org/demo/test/auto_composite.blend

Important fix:
After any render, all the render layers were tagged "changed", which
caused any edit to first totally recomposte everthing. Now it only
composites changes.

Implementation notes

- DAG scene flush now sets 'changed' flags in render layer nodes
- Added notifier for 'transform finished' to trigger the update,
  this is temporarily.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_node.py
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/editors/space_node/node_intern.h
    trunk/blender/source/blender/editors/space_node/node_ops.c
    trunk/blender/source/blender/editors/space_node/space_node.c
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/makesdna/DNA_space_types.h
    trunk/blender/source/blender/makesrna/intern/rna_space.c
    trunk/blender/source/blender/windowmanager/WM_types.h

Modified: trunk/blender/release/scripts/ui/space_node.py
===================================================================
--- trunk/blender/release/scripts/ui/space_node.py	2011-02-07 14:53:40 UTC (rev 34694)
+++ trunk/blender/release/scripts/ui/space_node.py	2011-02-07 16:41:57 UTC (rev 34695)
@@ -71,6 +71,7 @@
             if snode.show_backdrop:
                 row = layout.row(align=True)
                 row.prop(snode, "backdrop_channels", text="", expand=True)
+            layout.prop(snode, "use_auto_render")
 
         layout.separator()
 

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2011-02-07 14:53:40 UTC (rev 34694)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2011-02-07 16:41:57 UTC (rev 34695)
@@ -193,6 +193,7 @@
 
 void			NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
 int				NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
+void			ntreeClearTags(struct bNodeTree *ntree);
 
 /* ************** Groups ****************** */
 

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2011-02-07 14:53:40 UTC (rev 34694)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2011-02-07 16:41:57 UTC (rev 34695)
@@ -41,6 +41,7 @@
 #include "DNA_lattice_types.h"
 #include "DNA_key_types.h"
 #include "DNA_mesh_types.h"
+#include "DNA_node_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_windowmanager_types.h"
@@ -54,6 +55,7 @@
 #include "BKE_key.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
+#include "BKE_node.h"
 #include "BKE_mball.h"
 #include "BKE_modifier.h"
 #include "BKE_object.h"
@@ -1923,6 +1925,28 @@
 			flush_layer_node(sce, itA->node, lasttime);
 }
 
+static void dag_tag_renderlayers(Scene *sce, unsigned int lay)
+{
+	if(sce->nodetree) {
+		bNode *node;
+		Base *base;
+		unsigned int lay_changed;
+		
+		for(base= sce->base.first; base; base= base->next)
+			if(base->lay & lay)
+				if(base->object->recalc)
+					lay_changed |= base->lay;
+			
+		for(node= sce->nodetree->nodes.first; node; node= node->next) {
+			if(node->id==(ID *)sce) {
+				SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
+				if(srl && (srl->lay & lay_changed))
+					NodeTagChanged(sce->nodetree, node);
+			}
+		}
+	}
+}
+
 /* flushes all recalc flags in objects down the dependency tree */
 void DAG_scene_flush_update(Main *bmain, Scene *sce, unsigned int lay, const short time)
 {
@@ -1967,6 +1991,8 @@
 			}
 		}
 	}
+	
+	dag_tag_renderlayers(sce, lay);
 }
 
 static int object_modifiers_use_time(Object *ob)

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2011-02-07 14:53:40 UTC (rev 34694)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2011-02-07 16:41:57 UTC (rev 34695)
@@ -3182,10 +3182,7 @@
 			NodeTagChanged(ntree, node);
 			tagged= 1;
 		}
-		else if(node->type==CMP_NODE_R_LAYERS) {
-			NodeTagChanged(ntree, node);
-			tagged= 1;
-		}
+		/* here was tag render layer, but this is called after a render, so re-composites fail */
 		else if(node->type==NODE_GROUP) {
 			if( ntreeCompositTagAnimated((bNodeTree *)node->id) ) {
 				NodeTagChanged(ntree, node);
@@ -3210,6 +3207,21 @@
 	}
 }
 
+/* XXX after render animation system gets a refresh, this call allows composite to end clean */
+void ntreeClearTags(bNodeTree *ntree)
+{
+	bNode *node;
+	
+	if(ntree==NULL) return;
+	
+	for(node= ntree->nodes.first; node; node= node->next) {
+		node->need_exec= 0;
+		if(node->type==NODE_GROUP)
+			ntreeClearTags((bNodeTree *)node->id);
+	}
+}
+
+
 int ntreeTexTagAnimated(bNodeTree *ntree)
 {
 	bNode *node;

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2011-02-07 14:53:40 UTC (rev 34694)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2011-02-07 16:41:57 UTC (rev 34695)
@@ -596,6 +596,9 @@
 	/* else the frame will not update for the original value */
 	ED_update_for_newframe(G.main, rj->scene, rj->win->screen, 1);
 	
+	/* XXX above function sets all tags in nodes */
+	ntreeClearTags(rj->scene->nodetree);
+	
 	if(rj->srl) {
 		NodeTagIDChanged(rj->scene->nodetree, &rj->scene->id);
 		WM_main_add_notifier(NC_NODE|NA_EDITED, rj->scene);
@@ -648,6 +651,7 @@
 	wmJob *steve;
 	RenderJob *rj;
 	Image *ima;
+	int jobflag;
 	const short is_animation= RNA_boolean_get(op->ptr, "animation");
 	const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
 	
@@ -701,6 +705,8 @@
 	/* ensure at least 1 area shows result */
 	screen_set_image_output(C, event->x, event->y);
 
+	jobflag= WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS;
+	
 	/* single layer re-render */
 	if(RNA_property_is_set(op->ptr, "layer")) {
 		SceneRenderLayer *rl;
@@ -712,11 +718,12 @@
 
 		scn = (Scene *)BLI_findstring(&mainp->scene, scene_name, offsetof(ID, name) + 2);
 		rl = (SceneRenderLayer *)BLI_findstring(&scene->r.layers, rl_name, offsetof(SceneRenderLayer, name));
-
+		
 		if (scn && rl) {
 			scene = scn;
 			srl = rl;
 		}
+		jobflag |= WM_JOB_SUSPEND;
 	}
 
 	/* job custom data */
@@ -733,7 +740,7 @@
 	rj->reports= op->reports;
 
 	/* setup job */
-	steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Render", WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS);
+	steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Render", jobflag);
 	WM_jobs_customdata(steve, rj, render_freejob);
 	WM_jobs_timer(steve, 0.2, NC_SCENE|ND_RENDER_RESULT, 0);
 	WM_jobs_callbacks(steve, render_startjob, NULL, NULL, render_endjob);

Modified: trunk/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_edit.c	2011-02-07 14:53:40 UTC (rev 34694)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c	2011-02-07 16:41:57 UTC (rev 34695)
@@ -2158,7 +2158,52 @@
 	ot->flag= 0;
 }
 
+int node_render_changed_exec(bContext *C, wmOperator *UNUSED(op))
+{
+	Scene *sce= CTX_data_scene(C);
+	bNode *node;
+	
+	for(node= sce->nodetree->nodes.first; node; node= node->next) {
+		if(node->id==(ID *)sce && node->need_exec) {
+			break;
+		}
+	}
+	if(node) {
+		SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
+		
+		if(srl) {
+			PointerRNA op_ptr;
+			
+			WM_operator_properties_create(&op_ptr, "RENDER_OT_render");
+			RNA_string_set(&op_ptr, "layer", srl->name);
+			RNA_string_set(&op_ptr, "scene", sce->id.name+2);
+			
+			WM_operator_name_call(C, "RENDER_OT_render", WM_OP_INVOKE_DEFAULT, &op_ptr);
 
+			WM_operator_properties_free(&op_ptr);
+			
+			return OPERATOR_FINISHED;
+		}
+		   
+	}
+	return OPERATOR_CANCELLED;
+}
+
+void NODE_OT_render_changed(wmOperatorType *ot)
+{
+	
+	ot->name= "Render Changed Layer";
+	ot->idname= "NODE_OT_render_changed";
+	
+	ot->exec= node_render_changed_exec;
+	
+	ot->poll= composite_node_active;
+	
+	/* flags */
+	ot->flag= 0;
+}
+
+
 /* ****************** Make Group operator ******************* */
 
 static int node_group_make_exec(bContext *C, wmOperator *op)

Modified: trunk/blender/source/blender/editors/space_node/node_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_intern.h	2011-02-07 14:53:40 UTC (rev 34694)
+++ trunk/blender/source/blender/editors/space_node/node_intern.h	2011-02-07 16:41:57 UTC (rev 34695)
@@ -92,8 +92,8 @@
 void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace);
 int node_has_hidden_sockets(bNode *node);
 void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set);
+int node_render_changed_exec(bContext *, wmOperator *);
 
-
 void NODE_OT_duplicate(struct wmOperatorType *ot);
 void NODE_OT_delete(struct wmOperatorType *ot);
 void NODE_OT_resize(struct wmOperatorType *ot);
@@ -115,6 +115,7 @@
 void NODE_OT_link_viewer(struct wmOperatorType *ot);
 void NODE_OT_read_fullsamplelayers(struct wmOperatorType *ot);
 void NODE_OT_read_renderlayers(struct wmOperatorType *ot);
+void NODE_OT_render_changed(struct wmOperatorType *ot);
 
 void NODE_OT_backimage_move(struct wmOperatorType *ot);
 void NODE_OT_backimage_zoom(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/space_node/node_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_ops.c	2011-02-07 14:53:40 UTC (rev 34694)
+++ trunk/blender/source/blender/editors/space_node/node_ops.c	2011-02-07 16:41:57 UTC (rev 34695)
@@ -78,6 +78,7 @@
 	
 	WM_operatortype_append(NODE_OT_read_renderlayers);
 	WM_operatortype_append(NODE_OT_read_fullsamplelayers);
+	WM_operatortype_append(NODE_OT_render_changed);
 	
 	WM_operatortype_append(NODE_OT_backimage_move);
 	WM_operatortype_append(NODE_OT_backimage_zoom);
@@ -170,6 +171,8 @@
 	
 	WM_keymap_add_item(keymap, "NODE_OT_read_renderlayers", RKEY, KM_PRESS, KM_CTRL, 0);
 	WM_keymap_add_item(keymap, "NODE_OT_read_fullsamplelayers", RKEY, KM_PRESS, KM_SHIFT, 0);
+	WM_keymap_add_item(keymap, "NODE_OT_render_changed", ZKEY, KM_PRESS, 0, 0);
 	
+	
 	transform_keymap_for_space(keyconf, keymap, SPACE_NODE);
 }

Modified: trunk/blender/source/blender/editors/space_node/space_node.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/space_node.c	2011-02-07 14:53:40 UTC (rev 34694)
+++ trunk/blender/source/blender/editors/space_node/space_node.c	2011-02-07 16:41:57 UTC (rev 34695)
@@ -172,13 +172,21 @@
 				case ND_FRAME:
 					ED_area_tag_refresh(sa);
 					break;
+				case ND_TRANSFORM_DONE:
+					if(type==NTREE_COMPOSIT) {
+						if(snode->flag & SNODE_AUTO_RENDER) {
+							snode->recalc= 1;
+							ED_area_tag_refresh(sa);
+						}
+					}
+					break;
 			}
 			break;
 		case NC_WM:
 			if(wmn->data==ND_FILEREAD)
 				ED_area_tag_refresh(sa);
 			break;
-			
+		
 		/* future: add ID checks? */
 		case NC_MATERIAL:
 			if(type==NTREE_SHADER) {
@@ -212,7 +220,7 @@
 
 		case NC_IMAGE:
 			if (wmn->action == NA_EDITED) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list