/* tags nodes that have animation capabilities */
int ntreeCompositTagAnimated(bNodeTree *ntree)
{
	bNode *node;
	int tagged= 0;
	
	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)) {
				NodeTagChanged(ntree, node);
				tagged= 1;
			}
		}
		else if(node->type==CMP_NODE_TIME) {
			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);
			}
		}
	}
	
	return tagged;
}
static int node_animation_properties(bNodeTree *ntree, bNode *node)
{
	bNodeSocket *sock;
	const 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_type_properties(ptr.type);
	
	for (link=lb->first; link; link=link->next) {
		int driven, len=1, index;
		prop = (PropertyRNA *)link;
		
		if (RNA_property_array_check(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 (prop) {
			if (RNA_property_array_check(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;
}
Beispiel #3
0
void ED_node_changed_update(ID *id, bNode *node)
{
    bNodeTree *nodetree, *edittree;
    int treetype;

    node_tree_from_ID(id, &nodetree, &edittree, &treetype);

    if(treetype==NTREE_SHADER) {
        DAG_id_tag_update(id, 0);
        WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, id);
    }
    else if(treetype==NTREE_COMPOSIT) {
        NodeTagChanged(edittree, node);
        /* don't use NodeTagIDChanged, it gives far too many recomposites for image, scene layers, ... */

        node= node_tree_get_editgroup(nodetree);
        if(node)
            NodeTagIDChanged(nodetree, node->id);

        WM_main_add_notifier(NC_SCENE|ND_NODES, id);
    }
    else if(treetype==NTREE_TEXTURE) {
        DAG_id_tag_update(id, 0);
        WM_main_add_notifier(NC_TEXTURE|ND_NODES, id);
    }
}
/* need to do all scenes, to prevent errors when you re-render 1 scene */
void ntreeCompositTagRender(Scene *curscene)
{
	Scene *sce;
	
	for(sce= G.main->scene.first; sce; sce= sce->id.next) {
		if(sce->nodetree) {
			bNode *node;
			
			for(node= sce->nodetree->nodes.first; node; node= node->next) {
				if(node->id==(ID *)curscene || node->type==CMP_NODE_COMPOSITE)
					NodeTagChanged(sce->nodetree, node);
				else if(node->type==CMP_NODE_TEXTURE) /* uses scene sizex/sizey */
					NodeTagChanged(sce->nodetree, node);
			}
		}
	}
}
/* called from image window preview */
void ntreeCompositTagGenerators(bNodeTree *ntree)
{
	bNode *node;
	
	if(ntree==NULL) return;
	
	for(node= ntree->nodes.first; node; node= node->next) {
		if( ELEM(node->type, CMP_NODE_R_LAYERS, CMP_NODE_IMAGE))
			NodeTagChanged(ntree, node);
	}
}