diff options
-rw-r--r-- | source/blender/blenkernel/BKE_fcurve.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/fcurve.c | 40 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 56 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_anim.c | 40 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_draw.c | 19 | ||||
-rw-r--r-- | source/blender/editors/space_node/space_node.c | 8 |
6 files changed, 111 insertions, 57 deletions
diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h index d3457a5f5ae..9839cde9a22 100644 --- a/source/blender/blenkernel/BKE_fcurve.h +++ b/source/blender/blenkernel/BKE_fcurve.h @@ -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) */ diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 28de10a64f9..2084dc7ede7 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -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 diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index e4bab3fbfa1..ec3cf453c4b 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -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" @@ -43,8 +44,11 @@ #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)) { diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 1a747edce11..6a7f2b2fcb7 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -30,45 +30,7 @@ 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) diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index f6a2323b0f4..03bc8340810 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -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); } diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 2229e19c251..40f7f56bf21 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -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) |