2023-08-15 16:20:26 +02:00
|
|
|
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
2023-05-31 16:19:06 +02:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
2021-12-21 15:18:56 +01:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
/** \file
|
|
|
|
* \ingroup bke
|
|
|
|
*/
|
|
|
|
|
2022-01-24 11:16:06 +01:00
|
|
|
struct ID;
|
2022-02-16 03:02:52 +01:00
|
|
|
struct ImageUser;
|
2022-01-24 11:16:06 +01:00
|
|
|
struct Main;
|
2021-12-21 15:18:56 +01:00
|
|
|
struct bNode;
|
2022-01-24 11:16:06 +01:00
|
|
|
struct bNodeLink;
|
2021-12-21 15:18:56 +01:00
|
|
|
struct bNodeSocket;
|
|
|
|
struct bNodeTree;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Tag tree as changed without providing any more information about what has changed exactly.
|
|
|
|
* The update process has to assume that everything may have changed.
|
|
|
|
*
|
2022-01-06 03:54:52 +01:00
|
|
|
* Using one of the methods below to tag the tree after changes is preferred when possible.
|
2021-12-21 15:18:56 +01:00
|
|
|
*/
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_tag_all(bNodeTree *ntree);
|
2021-12-21 15:18:56 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* More specialized tag functions that may result in a more efficient update.
|
|
|
|
*/
|
|
|
|
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_tag_node_property(bNodeTree *ntree, bNode *node);
|
|
|
|
void BKE_ntree_update_tag_node_new(bNodeTree *ntree, bNode *node);
|
|
|
|
void BKE_ntree_update_tag_node_removed(bNodeTree *ntree);
|
|
|
|
void BKE_ntree_update_tag_node_mute(bNodeTree *ntree, bNode *node);
|
|
|
|
void BKE_ntree_update_tag_node_internal_link(bNodeTree *ntree, bNode *node);
|
2021-12-21 15:18:56 +01:00
|
|
|
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_tag_socket_property(bNodeTree *ntree, bNodeSocket *socket);
|
|
|
|
void BKE_ntree_update_tag_socket_new(bNodeTree *ntree, bNodeSocket *socket);
|
|
|
|
void BKE_ntree_update_tag_socket_type(bNodeTree *ntree, bNodeSocket *socket);
|
|
|
|
void BKE_ntree_update_tag_socket_availability(bNodeTree *ntree, bNodeSocket *socket);
|
|
|
|
void BKE_ntree_update_tag_socket_removed(bNodeTree *ntree);
|
2021-12-21 15:18:56 +01:00
|
|
|
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_tag_link_changed(bNodeTree *ntree);
|
|
|
|
void BKE_ntree_update_tag_link_removed(bNodeTree *ntree);
|
|
|
|
void BKE_ntree_update_tag_link_added(bNodeTree *ntree, bNodeLink *link);
|
|
|
|
void BKE_ntree_update_tag_link_mute(bNodeTree *ntree, bNodeLink *link);
|
2021-12-21 15:18:56 +01:00
|
|
|
|
2022-02-10 12:07:48 +01:00
|
|
|
/** Used when the a new output node becomes active and therefore changes the output. */
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_tag_active_output_changed(bNodeTree *ntree);
|
2021-12-21 15:18:56 +01:00
|
|
|
/** Used after file loading when run-time data on the tree has not been initialized yet. */
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_tag_missing_runtime_data(bNodeTree *ntree);
|
2022-11-18 11:20:13 +01:00
|
|
|
/** Used when change parent node. */
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_tag_parent_change(bNodeTree *ntree, bNode *node);
|
2021-12-21 15:18:56 +01:00
|
|
|
/** Used when an id data block changed that might be used by nodes that need to be updated. */
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_tag_id_changed(Main *bmain, ID *id);
|
2022-02-10 17:31:04 +01:00
|
|
|
/** Used when an image user is updated that is used by any part of the node tree. */
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_tag_image_user_changed(bNodeTree *ntree, ImageUser *iuser);
|
2021-12-21 15:18:56 +01:00
|
|
|
|
2023-11-16 12:00:12 +01:00
|
|
|
struct NodeTreeUpdateExtraParams {
|
2021-12-21 15:18:56 +01:00
|
|
|
/**
|
|
|
|
* Data passed into the callbacks.
|
|
|
|
*/
|
|
|
|
void *user_data;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called for every tree that has been changed during the update. This can be used to send
|
|
|
|
* notifiers to trigger redraws or depsgraph updates.
|
|
|
|
*/
|
2023-11-16 12:00:12 +01:00
|
|
|
void (*tree_changed_fn)(ID *, bNodeTree *, void *user_data);
|
2021-12-21 15:18:56 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Called for every tree whose output value may have changed based on the provided update tags.
|
|
|
|
* This can be used to tag the depsgraph if necessary.
|
|
|
|
*/
|
2023-11-16 12:00:12 +01:00
|
|
|
void (*tree_output_changed_fn)(ID *, bNodeTree *, void *user_data);
|
|
|
|
};
|
2021-12-21 15:18:56 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Updates #bmain based on changes to node trees.
|
|
|
|
*/
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_main(Main *bmain, NodeTreeUpdateExtraParams *params);
|
2021-12-21 15:18:56 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Same as #BKE_ntree_update_main, but will first only look at the provided tree and only looks
|
|
|
|
* at #bmain when something relevant for other data-blocks changed. This avoids scanning #bmain in
|
|
|
|
* many cases.
|
|
|
|
*
|
|
|
|
* If #bmain is null, only the provided tree is updated. This should only be used in very rare
|
|
|
|
* cases because it may result it incorrectly synced data in DNA.
|
|
|
|
*
|
|
|
|
* If #tree is null, this is the same as calling #BKE_ntree_update_main.
|
|
|
|
*/
|
2023-11-16 12:00:12 +01:00
|
|
|
void BKE_ntree_update_main_tree(Main *bmain, bNodeTree *ntree, NodeTreeUpdateExtraParams *params);
|