Nodes: Dynamic node class for Map Range node
This patch makes it possible to set the UI color of a node's header bar and override the default from the node's typeinfo. Currently the color is taken from the `.nclass` member of the node's bNodeType->TypeInfo struct. This is created once when registering the node. The TypeInfo is used for both UI and non-UI functionality. Since the TypeInfo is shared, the header bar for the node can't be changed without changing all nodes of that type. The Map Range node is shown as a `Converter` or blue color by default. This patch allows this to be changed dynamically to `Vector` or purple. This is done by adding a `ui_class` callback to node typeinfo struct. Reviewed By: HooglyBoogly Differential Revision: https://developer.blender.org/D13936
This commit is contained in:
parent
a7b5982030
commit
fe4e85a924
|
@ -274,6 +274,9 @@ typedef struct bNodeType {
|
|||
char *label,
|
||||
int maxlen);
|
||||
|
||||
/** Optional override for node class, used for drawing node header. */
|
||||
int (*ui_class)(const struct bNode *node);
|
||||
|
||||
/** Called when the node is updated in the editor. */
|
||||
void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
|
||||
/** Check and update if internal ID data has changed. */
|
||||
|
|
|
@ -626,7 +626,9 @@ static void node_update_hidden(bNode &node, uiBlock &block)
|
|||
|
||||
static int node_get_colorid(const bNode &node)
|
||||
{
|
||||
switch (node.typeinfo->nclass) {
|
||||
const int nclass = (node.typeinfo->ui_class == nullptr) ? node.typeinfo->nclass :
|
||||
node.typeinfo->ui_class(&node);
|
||||
switch (nclass) {
|
||||
case NODE_CLASS_INPUT:
|
||||
return TH_NODE_INPUT;
|
||||
case NODE_CLASS_OUTPUT:
|
||||
|
|
|
@ -66,6 +66,16 @@ static void node_shader_buts_map_range(uiLayout *layout, bContext *UNUSED(C), Po
|
|||
}
|
||||
}
|
||||
|
||||
static int node_shader_map_range_ui_class(const bNode *node)
|
||||
{
|
||||
const NodeMapRange &storage = node_storage(*node);
|
||||
const CustomDataType data_type = static_cast<CustomDataType>(storage.data_type);
|
||||
if (data_type == CD_PROP_FLOAT3) {
|
||||
return NODE_CLASS_OP_VECTOR;
|
||||
}
|
||||
return NODE_CLASS_CONVERTER;
|
||||
}
|
||||
|
||||
static void node_shader_update_map_range(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
const NodeMapRange &storage = node_storage(*node);
|
||||
|
@ -665,6 +675,7 @@ void register_node_type_sh_map_range()
|
|||
sh_fn_node_type_base(&ntype, SH_NODE_MAP_RANGE, "Map Range", NODE_CLASS_CONVERTER);
|
||||
ntype.declare = file_ns::sh_node_map_range_declare;
|
||||
ntype.draw_buttons = file_ns::node_shader_buts_map_range;
|
||||
ntype.ui_class = file_ns::node_shader_map_range_ui_class;
|
||||
node_type_init(&ntype, file_ns::node_shader_init_map_range);
|
||||
node_type_storage(
|
||||
&ntype, "NodeMapRange", node_free_standard_storage, node_copy_standard_storage);
|
||||
|
|
Loading…
Reference in New Issue