Blender  V3.3
node_shader_normal_map.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2005 Blender Foundation. All rights reserved. */
3 
4 #include "node_shader_util.hh"
5 
6 #include "BKE_context.h"
7 
8 #include "UI_interface.h"
9 #include "UI_resources.h"
10 
12 
14 {
15  b.add_input<decl::Float>(N_("Strength")).default_value(1.0f).min(0.0f).max(10.0f);
16  b.add_input<decl::Color>(N_("Color")).default_value({0.5f, 0.5f, 1.0f, 1.0f});
17  b.add_output<decl::Vector>(N_("Normal"));
18 }
19 
21 {
22  uiItemR(layout, ptr, "space", UI_ITEM_R_SPLIT_EMPTY_NAME, "", 0);
23 
24  if (RNA_enum_get(ptr, "space") == SHD_SPACE_TANGENT) {
25  PointerRNA obptr = CTX_data_pointer_get(C, "active_object");
26 
27  if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
28  PointerRNA dataptr = RNA_pointer_get(&obptr, "data");
29  uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_NONE);
30  }
31  else {
32  uiItemR(layout, ptr, "uv_map", UI_ITEM_R_SPLIT_EMPTY_NAME, "", 0);
33  }
34  }
35 }
36 
38 {
39  NodeShaderNormalMap *attr = MEM_cnew<NodeShaderNormalMap>("NodeShaderNormalMap");
40  node->storage = attr;
41 }
42 
44  bNode *node,
45  bNodeExecData *UNUSED(execdata),
46  GPUNodeStack *in,
48 {
49  NodeShaderNormalMap *nm = static_cast<NodeShaderNormalMap *>(node->storage);
50 
51  GPUNodeLink *strength;
52  if (in[0].link) {
53  strength = in[0].link;
54  }
55  else if (node->original) {
56  bNodeSocket *socket = static_cast<bNodeSocket *>(BLI_findlink(&node->original->inputs, 0));
57  bNodeSocketValueFloat *socket_data = static_cast<bNodeSocketValueFloat *>(
58  socket->default_value);
59  strength = GPU_uniform(&socket_data->value);
60  }
61  else {
62  strength = GPU_constant(in[0].vec);
63  }
64 
65  GPUNodeLink *newnormal;
66  if (in[1].link) {
67  newnormal = in[1].link;
68  }
69  else if (node->original) {
70  bNodeSocket *socket = static_cast<bNodeSocket *>(BLI_findlink(&node->original->inputs, 1));
71  bNodeSocketValueRGBA *socket_data = static_cast<bNodeSocketValueRGBA *>(socket->default_value);
72  newnormal = GPU_uniform(socket_data->value);
73  }
74  else {
75  newnormal = GPU_constant(in[1].vec);
76  }
77 
78  const char *color_to_normal_fnc_name = "color_to_normal_new_shading";
80  color_to_normal_fnc_name = "color_to_blender_normal_new_shading";
81  }
82 
83  GPU_link(mat, color_to_normal_fnc_name, newnormal, &newnormal);
84  switch (nm->space) {
85  case SHD_SPACE_TANGENT:
87  GPU_link(mat,
88  "node_normal_map",
89  GPU_attribute(mat, CD_TANGENT, nm->uv_map),
90  newnormal,
91  &newnormal);
92  break;
93  case SHD_SPACE_OBJECT:
95  GPU_link(mat, "normal_transform_object_to_world", newnormal, &newnormal);
96  break;
97  case SHD_SPACE_WORLD:
99  /* Nothing to do. */
100  break;
101  }
102 
103  GPU_link(mat, "node_normal_map_mix", strength, newnormal, &out[0].link);
104 
105  return true;
106 }
107 
108 } // namespace blender::nodes::node_shader_normal_map_cc
109 
110 /* node type definition */
112 {
113  namespace file_ns = blender::nodes::node_shader_normal_map_cc;
114 
115  static bNodeType ntype;
116 
123  &ntype, "NodeShaderNormalMap", node_free_standard_storage, node_copy_standard_storage);
125 
126  nodeRegisterType(&ntype);
127 }
PointerRNA CTX_data_pointer_get(const bContext *C, const char *member)
Definition: context.c:462
void node_type_gpu(struct bNodeType *ntype, NodeGPUExecFunction gpu_fn)
Definition: node.cc:4465
void node_type_init(struct bNodeType *ntype, void(*initfunc)(struct bNodeTree *ntree, struct bNode *node))
Definition: node.cc:4390
void node_type_size_preset(struct bNodeType *ntype, eNodeSizePreset size)
Definition: node.cc:4408
void node_type_storage(struct bNodeType *ntype, const char *storagename, void(*freefunc)(struct bNode *node), void(*copyfunc)(struct bNodeTree *dest_ntree, struct bNode *dest_node, const struct bNode *src_node))
Definition: node.cc:4426
#define NODE_CLASS_OP_VECTOR
Definition: BKE_node.h:348
void nodeRegisterType(struct bNodeType *ntype)
Definition: node.cc:1357
@ NODE_SIZE_MIDDLE
Definition: BKE_node.h:366
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define UNUSED(x)
#define ELEM(...)
@ CD_TANGENT
#define SHD_SPACE_WORLD
#define SHD_SPACE_TANGENT
#define SHD_SPACE_BLENDER_OBJECT
#define SHD_SPACE_BLENDER_WORLD
#define SHD_SPACE_OBJECT
@ OB_MESH
GPUNodeLink * GPU_attribute(GPUMaterial *mat, eCustomDataType type, const char *name)
GPUNodeLink * GPU_constant(const float *num)
@ GPU_MATFLAG_OBJECT_INFO
Definition: GPU_material.h:82
void GPU_material_flag_set(GPUMaterial *mat, eGPUMaterialFlag flag)
Definition: gpu_material.c:596
GPUNodeLink * GPU_uniform(const float *num)
bool GPU_link(GPUMaterial *mat, const char *name,...)
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value SH_NODE_NORMAL_MAP
#define C
Definition: RandGen.cpp:25
@ UI_ITEM_R_SPLIT_EMPTY_NAME
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
OperationNode * node
bNodeTree * ntree
static void node_shader_buts_normal_map(uiLayout *layout, bContext *C, PointerRNA *ptr)
static int gpu_shader_normal_map(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
static void node_declare(NodeDeclarationBuilder &b)
static void node_shader_init_normal_map(bNodeTree *UNUSED(ntree), bNode *node)
static const pxr::TfToken out("out", pxr::TfToken::Immortal)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
void register_node_type_sh_normal_map()
void sh_node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass)
void node_copy_standard_storage(bNodeTree *UNUSED(dest_ntree), bNode *dest_node, const bNode *src_node)
Definition: node_util.c:55
void node_free_standard_storage(bNode *node)
Definition: node_util.c:43
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5167
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
struct GPUNodeLink * link
Definition: GPU_material.h:106
void * data
Definition: RNA_types.h:38
void * default_value
Defines a node type.
Definition: BKE_node.h:226
void(* draw_buttons)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr)
Definition: BKE_node.h:244
NodeDeclareFunction declare
Definition: BKE_node.h:324
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480