Blender V5.0
node_shader_common.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2006 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "DNA_node_types.h"
10
11#include "BKE_node.hh"
12#include "BKE_node_runtime.hh"
13
14#include "NOD_common.hh"
15#include "NOD_shader.h"
16#include "node_common.h"
17#include "node_exec.hh"
18#include "node_shader_util.hh"
19
20#include "RNA_access.hh"
21
22/**** GROUP ****/
23
25{
26 bNodeTree *ngroup = (bNodeTree *)gnode->id;
27
28 for (bNode *node : ngroup->all_nodes()) {
29 if (node->is_group_input()) {
30 int a;
31 LISTBASE_FOREACH_INDEX (bNodeSocket *, sock, &node->outputs, a) {
32 bNodeStack *ns = node_get_socket_stack(gstack, sock);
33 if (ns) {
34 /* convert the external gpu stack back to internal node stack data */
36 }
37 }
38 }
39 }
40}
41
42/* Copy internal results to the external outputs.
43 */
45{
46 const bNodeTree &ngroup = *reinterpret_cast<bNodeTree *>(gnode->id);
47
48 ngroup.ensure_topology_cache();
49 const bNode *group_output_node = ngroup.group_output_node();
50 if (!group_output_node) {
51 return;
52 }
53
54 int a;
55 LISTBASE_FOREACH_INDEX (bNodeSocket *, sock, &group_output_node->inputs, a) {
56 bNodeStack *ns = node_get_socket_stack(gstack, sock);
57 if (ns) {
58 /* convert the node stack data result back to gpu stack */
59 node_gpu_stack_from_data(&out[a], sock->type, ns);
60 }
61 }
62}
63
66{
67 bNodeTreeExec *exec = static_cast<bNodeTreeExec *>(execdata->data);
68
69 if (!node->id) {
70 return 0;
71 }
72
73 group_gpu_copy_inputs(node, in, exec->stack);
74 ntreeExecGPUNodes(exec, mat, nullptr);
75 group_gpu_move_outputs(node, out, exec->stack);
76
77 return 1;
78}
79
81{
82 static blender::bke::bNodeType ntype;
83
84 /* NOTE: cannot use #sh_node_type_base for node group, because it would map the node type
85 * to the shared #NODE_GROUP integer type id. */
86
88 ntype, "ShaderNodeGroup", "Group", "GROUP", NODE_CLASS_GROUP);
89 ntype.enum_name_legacy = "GROUP";
90 ntype.type_legacy = NODE_GROUP;
96 ntype.rna_ext.srna = RNA_struct_find("ShaderNodeGroup");
97 BLI_assert(ntype.rna_ext.srna != nullptr);
99
105
107}
108
110{
111 /* These methods can be overridden but need a default implementation otherwise. */
112 if (ntype->poll == nullptr) {
113 ntype->poll = sh_node_poll_default;
114 }
115 if (ntype->insert_link == nullptr) {
117 }
119 ntype->gpu_fn = gpu_group_execute;
120}
constexpr int GROUP_NODE_MIN_WIDTH
Definition BKE_node.hh:1253
constexpr int GROUP_NODE_DEFAULT_WIDTH
Definition BKE_node.hh:1251
constexpr int GROUP_NODE_MAX_WIDTH
Definition BKE_node.hh:1252
#define NODE_GROUP
Definition BKE_node.hh:811
#define NODE_CLASS_GROUP
Definition BKE_node.hh:452
#define BLI_assert(a)
Definition BLI_assert.h:46
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
#define in
#define out
void node_type_size(bNodeType &ntype, int width, int minwidth, int maxwidth)
Definition node.cc:5384
void node_register_type(bNodeType &ntype)
Definition node.cc:2416
void node_type_base_custom(bNodeType &ntype, StringRefNull idname, StringRefNull name, StringRefNull enum_name, short nclass)
Definition node.cc:5129
void node_group_declare(NodeDeclarationBuilder &b)
int node_group_ui_class(const bNode *node)
void node_group_label(const bNodeTree *, const bNode *node, char *label, int label_maxncpy)
bool node_group_poll_instance(const bNode *node, const bNodeTree *nodetree, const char **r_disabled_hint)
std::string node_group_ui_description(const bNode &node)
bNodeStack * node_get_socket_stack(bNodeStack *stack, bNodeSocket *sock)
Definition node_exec.cc:30
static int gpu_group_execute(GPUMaterial *mat, bNode *node, bNodeExecData *execdata, GPUNodeStack *in, GPUNodeStack *out)
void register_node_type_sh_group()
void register_node_type_sh_custom_group(blender::bke::bNodeType *ntype)
static void group_gpu_copy_inputs(bNode *gnode, GPUNodeStack *in, bNodeStack *gstack)
static void group_gpu_move_outputs(bNode *gnode, GPUNodeStack *out, bNodeStack *gstack)
void node_data_from_gpu_stack(bNodeStack *ns, GPUNodeStack *gs)
void node_gpu_stack_from_data(GPUNodeStack *gs, int type, bNodeStack *ns)
void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, bNode *output_node, const int *depth_level)
bool sh_node_poll_default(const blender::bke::bNodeType *, const bNodeTree *ntree, const char **r_disabled_hint)
static void exec(void *data, int, bNode *node, bNodeExecData *execdata, bNodeStack **in, bNodeStack **out)
bool node_insert_link_default(blender::bke::NodeInsertLinkParams &)
Definition node_util.cc:266
StructRNA * RNA_struct_find(const char *identifier)
void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type)
StructRNA * srna
ListBase inputs
struct ID * id
Defines a node type.
Definition BKE_node.hh:238
int(* ui_class)(const bNode *node)
Definition BKE_node.hh:276
bool(* poll_instance)(const bNode *node, const bNodeTree *nodetree, const char **r_disabled_hint)
Definition BKE_node.hh:328
void(* labelfunc)(const bNodeTree *ntree, const bNode *node, char *label, int label_maxncpy)
Definition BKE_node.hh:270
NodeGPUExecFunction gpu_fn
Definition BKE_node.hh:342
std::string(* ui_description_fn)(const bNode &node)
Definition BKE_node.hh:278
const char * enum_name_legacy
Definition BKE_node.hh:247
bool(* insert_link)(NodeInsertLinkParams &params)
Definition BKE_node.hh:333
bool(* poll)(const bNodeType *ntype, const bNodeTree *nodetree, const char **r_disabled_hint)
Definition BKE_node.hh:321
NodeDeclareFunction declare
Definition BKE_node.hh:362