Fix [#20773] NODE ANIMATION: Animating node values broken
authorMatt Ebb <matt@mke3.net>
Wed, 27 Jan 2010 05:42:17 +0000 (05:42 +0000)
committerMatt Ebb <matt@mke3.net>
Wed, 27 Jan 2010 05:42:17 +0000 (05:42 +0000)
Now the compositing node tree will update on frame change if any of the
nodes are animated.

This doesn't work for playback (i.e. alt a), that's better off waiting until we
have some kind of frame caching system.

source/blender/blenkernel/BKE_fcurve.h
source/blender/blenkernel/intern/fcurve.c
source/blender/blenkernel/intern/node.c
source/blender/editors/interface/interface_anim.c
source/blender/editors/space_node/node_draw.c
source/blender/editors/space_node/space_node.c

index d3457a5f5aea15ad24df958bd16c0aaaeb9d2500..9839cde9a225657400da55b82d8b19b97724e809 100644 (file)
@@ -36,6 +36,8 @@ struct DriverTarget;
 
 struct BezTriple;
 struct StructRNA;
+struct PointerRNA;
+struct PropertyRNA;
 
 #include "DNA_curve_types.h"
 
@@ -191,6 +193,9 @@ struct FCurve *id_data_find_fcurve(ID *id, void *data, struct StructRNA *type, c
  */
 int list_find_data_fcurves(ListBase *dst, ListBase *src, const char *dataPrefix, const char *dataName);
 
+/* find an f-curve based on an rna property */
+struct FCurve *rna_get_fcurve(struct PointerRNA *ptr, struct PropertyRNA *prop, int rnaindex, struct bAction **action, int *driven);
+
 /* Binary search algorithm for finding where to 'insert' BezTriple with given frame number.
  * Returns the index to insert at (data already at that index will be offset if replace is 0)
  */
index 28de10a64f9dd9daf7332604c01d3d6e8b172a10..2084dc7ede759be6f8580244ca704384471c246b 100644 (file)
@@ -284,6 +284,46 @@ int list_find_data_fcurves (ListBase *dst, ListBase *src, const char *dataPrefix
        return matches;
 }
 
+FCurve *rna_get_fcurve(PointerRNA *ptr, PropertyRNA *prop, int rnaindex, bAction **action, int *driven)
+{
+       FCurve *fcu= NULL;
+       
+       *driven= 0;
+       
+       /* there must be some RNA-pointer + property combon */
+       if(prop && ptr->id.data && RNA_property_animateable(ptr, prop)) {
+               AnimData *adt= BKE_animdata_from_id(ptr->id.data);
+               char *path;
+               
+               if(adt) {
+                       if((adt->action && adt->action->curves.first) || (adt->drivers.first)) {
+                               /* XXX this function call can become a performance bottleneck */
+                               path= RNA_path_from_ID_to_property(ptr, prop);
+                               
+                               if(path) {
+                                       /* animation takes priority over drivers */
+                                       if(adt->action && adt->action->curves.first)
+                                               fcu= list_find_fcurve(&adt->action->curves, path, rnaindex);
+                                       
+                                       /* if not animated, check if driven */
+                                       if(!fcu && (adt->drivers.first)) {
+                                               fcu= list_find_fcurve(&adt->drivers, path, rnaindex);
+                                               
+                                               if(fcu)
+                                                       *driven= 1;
+                                       }
+                                       
+                                       if(fcu && action)
+                                               *action= adt->action;
+                                       
+                                       MEM_freeN(path);
+                               }
+                       }
+               }
+       }
+       
+       return fcu;
+}
 
 /* threshold for binary-searching keyframes - threshold here should be good enough for now, but should become userpref */
 #define BEZT_BINARYSEARCH_THRESH       0.00001f
index e4bab3fbfa1ab7c591fef1d118c17388591888f3..ec3cf453c4bc1cbcb679935cfe0e3a17a2bc9a78 100644 (file)
@@ -35,6 +35,7 @@
 #include <stddef.h>
 #include <string.h>
 
+#include "DNA_anim_types.h"
 #include "DNA_ID.h"
 #include "DNA_image_types.h"
 #include "DNA_node_types.h"
 #include "DNA_text_types.h"
 #include "DNA_scene_types.h"
 
+#include "RNA_access.h"
+
 #include "BKE_blender.h"
 #include "BKE_colortools.h"
+#include "BKE_fcurve.h"
 #include "BKE_global.h"
 #include "BKE_image.h"
 #include "BKE_library.h"
@@ -2865,6 +2869,54 @@ void ntreeCompositTagRender(Scene *curscene)
        }
 }
 
+static int node_animation_properties(bNodeTree *ntree, bNode *node)
+{
+       bNodeSocket *sock;
+       ListBase *lb;
+       Link *link;
+       PointerRNA ptr;
+       PropertyRNA *prop;
+       
+       /* check to see if any of the node's properties have fcurves */
+       RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr);
+       lb = RNA_struct_defined_properties(ptr.type);
+       
+       for (link=lb->first; link; link=link->next) {
+               int driven, len=1, index;
+               prop = (PropertyRNA *)link;
+               
+               if (RNA_property_array_check(&ptr, prop))
+                       len = RNA_property_array_length(&ptr, prop);
+               
+               for (index=0; index<len; index++) {
+                       if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
+                               NodeTagChanged(ntree, node);
+                               return 1;
+                       }
+               }
+       }
+       
+       /* now check node sockets */
+       for (sock = node->inputs.first; sock; sock=sock->next) {
+               int driven, len=1, index;
+               
+               RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
+               prop = RNA_struct_find_property(&ptr, "default_value");
+               
+               if (RNA_property_array_check(&ptr, prop))
+                       len = RNA_property_array_length(&ptr, prop);
+               
+               for (index=0; index<len; index++) {
+                       if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
+                               NodeTagChanged(ntree, node);
+                               return 1;
+                       }
+               }
+       }
+
+       return 0;
+}
+
 /* tags nodes that have animation capabilities */
 int ntreeCompositTagAnimated(bNodeTree *ntree)
 {
@@ -2874,6 +2926,10 @@ int ntreeCompositTagAnimated(bNodeTree *ntree)
        if(ntree==NULL) return 0;
        
        for(node= ntree->nodes.first; node; node= node->next) {
+               
+               tagged = node_animation_properties(ntree, node);
+               
+               /* otherwise always tag these node types */
                if(node->type==CMP_NODE_IMAGE) {
                        Image *ima= (Image *)node->id;
                        if(ima && ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
index 1a747edce11a8a7093f071870411de6079593f55..6a7f2b2fcb76f379cea05e75ae3e54048eb470c8 100644 (file)
 
 static FCurve *ui_but_get_fcurve(uiBut *but, bAction **action, int *driven)
 {
-       FCurve *fcu= NULL;
-
-       *driven= 0;
-
-       /* there must be some RNA-pointer + property combo for this button */
-       if(but->rnaprop && but->rnapoin.id.data && 
-               RNA_property_animateable(&but->rnapoin, but->rnaprop)) 
-       {
-               AnimData *adt= BKE_animdata_from_id(but->rnapoin.id.data);
-               char *path;
-               
-               if(adt) {
-                       if((adt->action && adt->action->curves.first) || (adt->drivers.first)) {
-                               /* XXX this function call can become a performance bottleneck */
-                               path= RNA_path_from_ID_to_property(&but->rnapoin, but->rnaprop);
-
-                               if(path) {
-                                       /* animation takes priority over drivers */
-                                       if(adt->action && adt->action->curves.first)
-                                               fcu= list_find_fcurve(&adt->action->curves, path, but->rnaindex);
-                                       
-                                       /* if not animated, check if driven */
-                                       if(!fcu && (adt->drivers.first)) {
-                                               fcu= list_find_fcurve(&adt->drivers, path, but->rnaindex);
-                                               
-                                               if(fcu)
-                                                       *driven= 1;
-                                       }
-
-                                       if(fcu && action)
-                                               *action= adt->action;
-
-                                       MEM_freeN(path);
-                               }
-                       }
-               }
-       }
-
-       return fcu;
+       return rna_get_fcurve(&but->rnapoin, but->rnaprop, but->rnaindex, action, driven);
 }
 
 void ui_but_anim_flag(uiBut *but, float cfra)
index f6a2323b0f4ec0de083b5f6e7c7f653884d2bc6a..03bc83408106e9cbadf611e5d600b89cdb9d2556 100644 (file)
@@ -109,22 +109,9 @@ void ED_node_changed_update(ID *id, bNode *node)
                NodeTagChanged(edittree, node);
                /* don't use NodeTagIDChanged, it gives far too many recomposites for image, scene layers, ... */
                        
-               /* not the best implementation of the world... but we need it to work now :) */
-               if(node->type==CMP_NODE_R_LAYERS && node->custom2) {
-                       /* add event for this window (after render curarea can be changed) */
-                       //addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
-                       
-                       //composite_node_render(snode, node);
-                       //snode_notify(snode);
-                       
-                       /* add another event, a render can go fullscreen and open new window */
-                       //addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
-               }
-               else {
-                       node= node_tree_get_editgroup(nodetree);
-                       if(node)
-                               NodeTagIDChanged(nodetree, node->id);
-               }
+               node= node_tree_get_editgroup(nodetree);
+               if(node)
+                       NodeTagIDChanged(nodetree, node->id);
 
                WM_main_add_notifier(NC_SCENE|ND_NODES, id);
        }                       
index 2229e19c251cd4d541989f89a1339f1e41edc09e..40f7f56bf217c07a1baa5db10462861356c38129 100644 (file)
@@ -170,8 +170,12 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
        /* preview renders */
        switch(wmn->category) {
                case NC_SCENE:
-                       if(wmn->data==ND_NODES)
-                               ED_area_tag_refresh(sa);
+                       switch (wmn->data) {
+                               case ND_NODES:
+                               case ND_FRAME:
+                                       ED_area_tag_refresh(sa);
+                                       break;
+                       }
                        break;
                case NC_WM:
                        if(wmn->data==ND_FILEREAD)