Blender V4.3
node_shader_normal_map.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "node_shader_util.hh"
6#include "node_util.hh"
7
8#include "BKE_context.hh"
9#include "BKE_node_runtime.hh"
10
12
13#include "RNA_access.hh"
14
15#include "UI_interface.hh"
16#include "UI_resources.hh"
17
19
21{
22 b.add_input<decl::Float>("Strength")
23 .default_value(1.0f)
24 .min(0.0f)
25 .max(10.0f)
26 .description("Strength of the normal mapping effect");
27 b.add_input<decl::Color>("Color")
28 .default_value({0.5f, 0.5f, 1.0f, 1.0f})
29 .description("Color that encodes the normal map in the specified space");
30 b.add_output<decl::Vector>("Normal");
31}
32
34{
35 uiItemR(layout, ptr, "space", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE);
36
37 if (RNA_enum_get(ptr, "space") == SHD_SPACE_TANGENT) {
38 PointerRNA obptr = CTX_data_pointer_get(C, "active_object");
39
40 if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
41 PointerRNA eval_obptr;
42
44 if (depsgraph) {
45 DEG_get_evaluated_rna_pointer(depsgraph, &obptr, &eval_obptr);
46 PointerRNA dataptr = RNA_pointer_get(&eval_obptr, "data");
47 uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
48 return;
49 }
50 }
51
52 uiItemR(layout, ptr, "uv_map", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE);
53 }
54}
55
56static void node_shader_init_normal_map(bNodeTree * /*ntree*/, bNode *node)
57{
58 NodeShaderNormalMap *attr = MEM_cnew<NodeShaderNormalMap>("NodeShaderNormalMap");
59 node->storage = attr;
60}
61
63 bNode *node,
64 bNodeExecData * /*execdata*/,
65 GPUNodeStack *in,
66 GPUNodeStack *out)
67{
68 NodeShaderNormalMap *nm = static_cast<NodeShaderNormalMap *>(node->storage);
69
70 GPUNodeLink *strength;
71 if (in[0].link) {
72 strength = in[0].link;
73 }
74 else if (node->runtime->original) {
75 bNodeSocket *socket = static_cast<bNodeSocket *>(
76 BLI_findlink(&node->runtime->original->inputs, 0));
77 bNodeSocketValueFloat *socket_data = static_cast<bNodeSocketValueFloat *>(
78 socket->default_value);
79 strength = GPU_uniform(&socket_data->value);
80 }
81 else {
82 strength = GPU_constant(in[0].vec);
83 }
84
85 GPUNodeLink *newnormal;
86 if (in[1].link) {
87 newnormal = in[1].link;
88 }
89 else if (node->runtime->original) {
90 bNodeSocket *socket = static_cast<bNodeSocket *>(
91 BLI_findlink(&node->runtime->original->inputs, 1));
92 bNodeSocketValueRGBA *socket_data = static_cast<bNodeSocketValueRGBA *>(socket->default_value);
93 newnormal = GPU_uniform(socket_data->value);
94 }
95 else {
96 newnormal = GPU_constant(in[1].vec);
97 }
98
99 const char *color_to_normal_fnc_name = "color_to_normal_new_shading";
101 color_to_normal_fnc_name = "color_to_blender_normal_new_shading";
102 }
103
104 GPU_link(mat, color_to_normal_fnc_name, newnormal, &newnormal);
105 switch (nm->space) {
108 /* We return directly from the node_normal_map as strength
109 * has already been applied for the tangent case */
110 GPU_link(mat,
111 "node_normal_map",
113 strength,
114 newnormal,
115 &out[0].link);
116 return true;
117 case SHD_SPACE_OBJECT:
119 GPU_link(mat, "normal_transform_object_to_world", newnormal, &newnormal);
120 break;
121 case SHD_SPACE_WORLD:
123 /* Nothing to do. */
124 break;
125 }
126
127 /* Final step - mix and apply strength for all other than tangent space. */
128 GPU_link(mat, "node_normal_map_mix", strength, newnormal, &out[0].link);
129
130 return true;
131}
132
134#ifdef WITH_MATERIALX
135{
136 NodeShaderNormalMap *normal_map_node = static_cast<NodeShaderNormalMap *>(node_->storage);
137 NodeItem color = get_input_value("Color", NodeItem::Type::Vector3);
138 NodeItem strength = get_input_value("Strength", NodeItem::Type::Float);
139
140 std::string space;
141 switch (normal_map_node->space) {
143 space = "tangent";
144 break;
145 case SHD_SPACE_OBJECT:
147 space = "object";
148 break;
149 case SHD_SPACE_WORLD:
151 /* World isn't supported, tangent space will be used */
152 space = "tangent";
153 break;
154 default:
156 }
157
158 return create_node("normalmap",
159 NodeItem::Type::Vector3,
160 {{"in", color}, {"scale", strength}, {"space", val(space)}});
161}
162#endif
164
165} // namespace blender::nodes::node_shader_normal_map_cc
166
167/* node type definition */
169{
171
172 static blender::bke::bNodeType ntype;
173
175 ntype.declare = file_ns::node_declare;
176 ntype.draw_buttons = file_ns::node_shader_buts_normal_map;
178 ntype.initfunc = file_ns::node_shader_init_normal_map;
180 &ntype, "NodeShaderNormalMap", node_free_standard_storage, node_copy_standard_storage);
181 ntype.gpu_fn = file_ns::gpu_shader_normal_map;
182 ntype.materialx_fn = file_ns::node_shader_materialx;
183
185}
PointerRNA CTX_data_pointer_get(const bContext *C, const char *member)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
#define SH_NODE_NORMAL_MAP
Definition BKE_node.hh:958
#define NODE_CLASS_OP_VECTOR
Definition BKE_node.hh:407
#define BLI_assert_unreachable()
Definition BLI_assert.h:97
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define ELEM(...)
void DEG_get_evaluated_rna_pointer(const Depsgraph *depsgraph, PointerRNA *ptr, PointerRNA *r_ptr_eval)
@ SHD_SPACE_BLENDER_OBJECT
@ SHD_SPACE_OBJECT
@ SHD_SPACE_TANGENT
@ SHD_SPACE_WORLD
@ SHD_SPACE_BLENDER_WORLD
@ OB_MESH
GPUNodeLink * GPU_constant(const float *num)
@ GPU_MATFLAG_OBJECT_INFO
void GPU_material_flag_set(GPUMaterial *mat, eGPUMaterialFlag flag)
GPUNodeLink * GPU_attribute(GPUMaterial *mat, eCustomDataType type, const char *name)
bool GPU_link(GPUMaterial *mat, const char *name,...)
GPUNodeLink * GPU_uniform(const float *num)
void uiItemPointerR(uiLayout *layout, PointerRNA *ptr, const char *propname, PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ UI_ITEM_R_SPLIT_EMPTY_NAME
local_group_size(16, 16) .push_constant(Type b
const Depsgraph * depsgraph
void node_type_size_preset(bNodeType *ntype, eNodeSizePreset size)
Definition node.cc:4614
void node_type_storage(bNodeType *ntype, const char *storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
Definition node.cc:4632
void node_register_type(bNodeType *ntype)
Definition node.cc:1708
static int gpu_shader_normal_map(GPUMaterial *mat, bNode *node, bNodeExecData *, GPUNodeStack *in, GPUNodeStack *out)
static void node_shader_buts_normal_map(uiLayout *layout, bContext *C, PointerRNA *ptr)
static void node_declare(NodeDeclarationBuilder &b)
static void node_shader_init_normal_map(bNodeTree *, bNode *node)
#define NODE_SHADER_MATERIALX_BEGIN
#define NODE_SHADER_MATERIALX_END
void register_node_type_sh_normal_map()
void sh_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
void node_free_standard_storage(bNode *node)
Definition node_util.cc:46
void node_copy_standard_storage(bNodeTree *, bNode *dest_node, const bNode *src_node)
Definition node_util.cc:58
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
void * data
Definition RNA_types.hh:42
void * default_value
Defines a node type.
Definition BKE_node.hh:218
NodeMaterialXFunction materialx_fn
Definition BKE_node.hh:320
void(* initfunc)(bNodeTree *ntree, bNode *node)
Definition BKE_node.hh:267
NodeGPUExecFunction gpu_fn
Definition BKE_node.hh:318
void(* draw_buttons)(uiLayout *, bContext *C, PointerRNA *ptr)
Definition BKE_node.hh:238
NodeDeclareFunction declare
Definition BKE_node.hh:347
PointerRNA * ptr
Definition wm_files.cc:4126