diff options
Diffstat (limited to 'source/blender/blenkernel/intern/node.c')
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 56 |
1 files changed, 56 insertions, 0 deletions
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)) { |