Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_fcurve.h5
-rw-r--r--source/blender/blenkernel/intern/fcurve.c40
-rw-r--r--source/blender/blenkernel/intern/node.c56
-rw-r--r--source/blender/editors/interface/interface_anim.c40
-rw-r--r--source/blender/editors/space_node/node_draw.c19
-rw-r--r--source/blender/editors/space_node/space_node.c8
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)