18 b.use_custom_socket_order();
23#define SOCK_WEIGHT_ID 0
27 .default_value({1.0f, 1.0f, 1.0f})
31 "Probability density per color channel that light is absorbed per unit distance "
32 "traveled in the medium");
33#define SOCK_ABSORPTION_COEFFICIENTS_ID 1
39 .default_value({1.0f, 1.0f, 1.0f})
43 "Probability density per color channel of an out-scattering event occurring per unit "
45#define SOCK_SCATTER_COEFFICIENTS_ID 2
52 "Directionality of the scattering. Zero is isotropic, negative is backward, "
53 "positive is forward");
54#define SOCK_SCATTER_ANISOTROPY_ID 3
60 .description(
"Index Of Refraction of the scattering particles");
61#define SOCK_SCATTER_IOR_ID 4
67 .description(
"Fraction of light that is scattered backwards");
68#define SOCK_SCATTER_BACKSCATTER_ID 5
70#define SOCK_SCATTER_ALPHA_ID 6
75 .
description(
"Diameter of the water droplets, in micrometers");
76#define SOCK_SCATTER_DIAMETER_ID 7
79 .default_value({0.0f, 0.0f, 0.0f})
82 .
description(
"Emitted radiance per color channel that is added to a ray per unit distance");
83#define SOCK_EMISSION_COEFFICIENTS_ID 8
93 const int phase_function = node->
custom1;
96 if (
STR_ELEM(sock->name,
"IOR",
"Backscatter")) {
100 else if (
STR_ELEM(sock->name,
"Anisotropy")) {
104 else if (
STR_ELEM(sock->name,
"Alpha")) {
107 else if (
STR_ELEM(sock->name,
"Diameter")) {
129#undef SOCK_ABSORPTION_COEFFICIENTS_ID
130#undef SOCK_SCATTER_COEFFICIENTS_ID
131#undef SOCK_SCATTER_ANISOTROPY_ID
132#undef SOCK_SCATTER_IOR_ID
133#undef SOCK_SCATTER_BACKSCATTER_ID
134#undef SOCK_SCATTER_ALPHA_ID
135#undef SOCK_SCATTER_DIAMETER_ID
136#undef SOCK_EMISSION_COEFFICIENTS_ID
148 ntype.
ui_name =
"Volume Coefficients";
150 "Model all three physical processes in a volume, represented by their coefficients";
153 ntype.
declare = file_ns::node_declare;
156 ntype.
initfunc = file_ns::node_shader_init_coefficients;
157 ntype.
gpu_fn = file_ns::node_shader_gpu_volume_coefficients;
158 ntype.
updatefunc = file_ns::node_shader_update_coefficients;
#define NODE_CLASS_SHADER
#define SH_NODE_VOLUME_COEFFICIENTS
#define LISTBASE_FOREACH(type, var, list)
#define BLT_I18NCONTEXT_ID_ID
@ SHD_PHASE_HENYEY_GREENSTEIN
@ SHD_PHASE_FOURNIER_FORAND
bool GPU_stack_link(GPUMaterial *mat, const bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out,...)
@ GPU_MATFLAG_VOLUME_SCATTER
@ GPU_MATFLAG_VOLUME_ABSORPTION
void GPU_material_flag_set(GPUMaterial *mat, eGPUMaterialFlag flag)
@ UI_ITEM_R_SPLIT_EMPTY_NAME
void add_layout(std::function< void(uiLayout *, bContext *, PointerRNA *)> draw)
DeclType::Builder & add_input(StringRef name, StringRef identifier="")
void node_register_type(bNodeType &ntype)
void node_set_socket_availability(bNodeTree &ntree, bNodeSocket &sock, bool is_available)
void node_type_size_preset(bNodeType &ntype, eNodeSizePreset size)
static int node_shader_gpu_volume_coefficients(GPUMaterial *mat, bNode *node, bNodeExecData *, GPUNodeStack *in, GPUNodeStack *out)
static void node_shader_update_coefficients(bNodeTree *ntree, bNode *node)
static void node_declare(NodeDeclarationBuilder &b)
static void node_shader_init_coefficients(bNodeTree *, bNode *node)
void sh_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
bool object_shader_nodes_poll(const bContext *C)
bool node_socket_not_black(const GPUNodeStack &socket)
#define SOCK_ABSORPTION_COEFFICIENTS_ID
void register_node_type_sh_volume_coefficients()
#define SOCK_SCATTER_COEFFICIENTS_ID
std::string ui_description
bool(* add_ui_poll)(const bContext *C)
void(* initfunc)(bNodeTree *ntree, bNode *node)
NodeGPUExecFunction gpu_fn
const char * enum_name_legacy
NodeDeclareFunction declare
void(* updatefunc)(bNodeTree *ntree, bNode *node)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)