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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to