Since a year and a half ago we've been switching to a new way to represent what sockets a node should have called "declarations" that's easier to use, clearer, and more flexible for upcoming features like dynamic socket counts or generic type sockets. All builtin nodes with a static set of sockets have switched, but one missing area has been group nodes and group input/output nodes. These nodes have **dynamic** declarations which change based on their properties or the group they're inside of. This patch addresses that, in preparation for using the same dynamic declaration feature for simulation nodes. Generally there shouldn't be user-visible differences, but one benefit is that user-created socket descriptions are now visible directly in the node editor for group nodes and group input/output nodes. The commit contains a few changes: - Add a node type callback for building dynamic declarations with different arguments - Add an `Extend` socket declaration for the "virtual" sockets used for connecting new links - A similar `Custom` socket declaration is used for addon-defined socket - Simplify the node update loop to use the declaration to build update sockets - Replace the "group update" functions with the declaration building - Move the node group input/output link creation to link drag operator - Make the field status part of group node declarations (not for group input/output nodes though) - Some fixes for declarations to make them update and build properly Differential Revision: https://developer.blender.org/D16850
104 lines
3.8 KiB
C++
104 lines
3.8 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2007 Blender Foundation. All rights reserved. */
|
|
|
|
/** \file
|
|
* \ingroup nodes
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct bNode;
|
|
struct bNodeTree;
|
|
|
|
/* data for initializing node execution */
|
|
typedef struct bNodeExecContext {
|
|
struct bNodeInstanceHash *previews;
|
|
} bNodeExecContext;
|
|
|
|
typedef struct bNodeExecData {
|
|
void *data; /* custom data storage */
|
|
struct bNodePreview *preview; /* optional preview image */
|
|
} bNodeExecData;
|
|
|
|
/**** Storage Data ****/
|
|
|
|
void node_free_curves(struct bNode *node);
|
|
void node_free_standard_storage(struct bNode *node);
|
|
|
|
void node_copy_curves(struct bNodeTree *dest_ntree,
|
|
struct bNode *dest_node,
|
|
const struct bNode *src_node);
|
|
void node_copy_standard_storage(struct bNodeTree *dest_ntree,
|
|
struct bNode *dest_node,
|
|
const struct bNode *src_node);
|
|
void *node_initexec_curves(struct bNodeExecContext *context,
|
|
struct bNode *node,
|
|
bNodeInstanceKey key);
|
|
|
|
/**** Updates ****/
|
|
void node_sock_label(struct bNodeSocket *sock, const char *name);
|
|
void node_sock_label_clear(struct bNodeSocket *sock);
|
|
void node_math_update(struct bNodeTree *ntree, struct bNode *node);
|
|
|
|
/**** Labels ****/
|
|
void node_blend_label(const struct bNodeTree *ntree,
|
|
const struct bNode *node,
|
|
char *label,
|
|
int maxlen);
|
|
void node_image_label(const struct bNodeTree *ntree,
|
|
const struct bNode *node,
|
|
char *label,
|
|
int maxlen);
|
|
void node_math_label(const struct bNodeTree *ntree,
|
|
const struct bNode *node,
|
|
char *label,
|
|
int maxlen);
|
|
void node_vector_math_label(const struct bNodeTree *ntree,
|
|
const struct bNode *node,
|
|
char *label,
|
|
int maxlen);
|
|
void node_filter_label(const struct bNodeTree *ntree,
|
|
const struct bNode *node,
|
|
char *label,
|
|
int maxlen);
|
|
void node_combsep_color_label(const ListBase *sockets, NodeCombSepColorMode mode);
|
|
|
|
/*** Link Handling */
|
|
|
|
/**
|
|
* The idea behind this is: When a user connects an input to a socket that is
|
|
* already linked (and if its not an Multi Input Socket), we try to find a replacement socket for
|
|
* the link that we try to overwrite and connect that previous link to the new socket.
|
|
*/
|
|
bool node_insert_link_default(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link);
|
|
|
|
float node_socket_get_float(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
|
|
void node_socket_set_float(struct bNodeTree *ntree,
|
|
struct bNode *node,
|
|
struct bNodeSocket *sock,
|
|
float value);
|
|
void node_socket_get_color(struct bNodeTree *ntree,
|
|
struct bNode *node,
|
|
struct bNodeSocket *sock,
|
|
float *value);
|
|
void node_socket_set_color(struct bNodeTree *ntree,
|
|
struct bNode *node,
|
|
struct bNodeSocket *sock,
|
|
const float *value);
|
|
void node_socket_get_vector(struct bNodeTree *ntree,
|
|
struct bNode *node,
|
|
struct bNodeSocket *sock,
|
|
float *value);
|
|
void node_socket_set_vector(struct bNodeTree *ntree,
|
|
struct bNode *node,
|
|
struct bNodeSocket *sock,
|
|
const float *value);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|