Add panels to Principled BSDF node #112314

Merged
Lukas Stockner merged 5 commits from Alaska/blender:principled-panels into main 2023-09-17 15:42:24 +02:00
2 changed files with 104 additions and 86 deletions

View File

@ -19,33 +19,33 @@ float principled_sheen(float NV, float rough)
} }
void node_bsdf_principled(vec4 base_color, void node_bsdf_principled(vec4 base_color,
float metallic,
float roughness,
float ior,
float transmission,
float alpha,
vec3 N,
float weight,
float subsurface, float subsurface,
float subsurface_scale, float subsurface_scale,
vec3 subsurface_radius, vec3 subsurface_radius,
float subsurface_ior, float subsurface_ior,
float subsurface_anisotropy, float subsurface_anisotropy,
float metallic,
float specular, float specular,
float specular_tint, float specular_tint,
float roughness,
float anisotropic, float anisotropic,
float anisotropic_rotation, float anisotropic_rotation,
float sheen, vec3 T,
float sheen_roughness,
vec4 sheen_tint,
float coat, float coat,
float coat_roughness, float coat_roughness,
float coat_ior, float coat_ior,
vec4 coat_tint, vec4 coat_tint,
float ior, vec3 CN,
float transmission, float sheen,
float sheen_roughness,
vec4 sheen_tint,
vec4 emission, vec4 emission,
float emission_strength, float emission_strength,
float alpha,
vec3 N,
vec3 CN,
vec3 T,
float weight,
const float do_diffuse, const float do_diffuse,
const float do_coat, const float do_coat,
const float do_refraction, const float do_refraction,

View File

@ -19,9 +19,43 @@ static void node_declare(NodeDeclarationBuilder &b)
* Define static socket numbers to avoid string based lookups for GPU material creation as these * Define static socket numbers to avoid string based lookups for GPU material creation as these
* could run on animated materials. * could run on animated materials.
*/ */
b.use_custom_socket_order();
b.add_output<decl::Shader>("BSDF");
b.add_input<decl::Color>("Base Color").default_value({0.8f, 0.8f, 0.8f, 1.0f}); b.add_input<decl::Color>("Base Color").default_value({0.8f, 0.8f, 0.8f, 1.0f});
#define SOCK_BASE_COLOR_ID 0 #define SOCK_BASE_COLOR_ID 0
b.add_input<decl::Float>("Subsurface") b.add_input<decl::Float>("Metallic")
.default_value(0.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR);
#define SOCK_METALLIC_ID 1
b.add_input<decl::Float>("Roughness")
.default_value(0.5f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR);
#define SOCK_ROUGHNESS_ID 2
b.add_input<decl::Float>("IOR").default_value(1.45f).min(1.0f).max(1000.0f);
#define SOCK_IOR_ID 3
b.add_input<decl::Float>("Transmission")
.default_value(0.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR);
#define SOCK_TRANSMISSION_ID 4
b.add_input<decl::Float>("Alpha").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
#define SOCK_ALPHA_ID 5
b.add_input<decl::Vector>("Normal").hide_value();
#define SOCK_NORMAL_ID 6
b.add_input<decl::Float>("Weight").unavailable();
#define SOCK_WEIGHT_ID 7
/* Panel for Subsurface scattering settings. */
PanelDeclarationBuilder &sss = b.add_panel("Subsurface").default_closed(true);
sss.add_input<decl::Float>("Subsurface")
.default_value(0.0f) .default_value(0.0f)
.min(0.0f) .min(0.0f)
.max(1.0f) .max(1.0f)
@ -29,81 +63,67 @@ static void node_declare(NodeDeclarationBuilder &b)
.description( .description(
"Blend between diffuse surface and subsurface scattering. " "Blend between diffuse surface and subsurface scattering. "
"Typically should be zero or one (either fully diffuse or subsurface)"); "Typically should be zero or one (either fully diffuse or subsurface)");
#define SOCK_SUBSURFACE_ID 1 #define SOCK_SUBSURFACE_ID 8
b.add_input<decl::Float>("Subsurface Scale") sss.add_input<decl::Float>("Subsurface Scale")
.default_value(0.05f) .default_value(0.05f)
.min(0.0f) .min(0.0f)
.max(10.0f) .max(10.0f)
.subtype(PROP_DISTANCE) .subtype(PROP_DISTANCE)
.description("Scale of the subsurface scattering (multiplied with Radius)"); .description("Scale of the subsurface scattering (multiplied with Radius)");
#define SOCK_SUBSURFACE_SCALE_ID 2 #define SOCK_SUBSURFACE_SCALE_ID 9
b.add_input<decl::Vector>("Subsurface Radius") sss.add_input<decl::Vector>("Subsurface Radius")
.default_value({1.0f, 0.2f, 0.1f}) .default_value({1.0f, 0.2f, 0.1f})
.min(0.0f) .min(0.0f)
.max(100.0f) .max(100.0f)
.compact() .compact()
.description("Scattering radius to use for subsurface component (multiplied with Scale)"); .description("Scattering radius to use for subsurface component (multiplied with Scale)");
#define SOCK_SUBSURFACE_RADIUS_ID 3 #define SOCK_SUBSURFACE_RADIUS_ID 10
b.add_input<decl::Float>("Subsurface IOR") sss.add_input<decl::Float>("Subsurface IOR")
.default_value(1.4f) .default_value(1.4f)
.min(1.01f) .min(1.01f)
.max(3.8f) .max(3.8f)
.subtype(PROP_FACTOR) .subtype(PROP_FACTOR)
.description("Index of refraction used for rays that enter the subsurface component"); .description("Index of refraction used for rays that enter the subsurface component");
#define SOCK_SUBSURFACE_IOR_ID 4 #define SOCK_SUBSURFACE_IOR_ID 11
b.add_input<decl::Float>("Subsurface Anisotropy") sss.add_input<decl::Float>("Subsurface Anisotropy")
.default_value(0.0f) .default_value(0.0f)
.min(0.0f) .min(0.0f)
.max(1.0f) .max(1.0f)
.subtype(PROP_FACTOR); .subtype(PROP_FACTOR);
#define SOCK_SUBSURFACE_ANISOTROPY_ID 5 #define SOCK_SUBSURFACE_ANISOTROPY_ID 12
b.add_input<decl::Float>("Metallic")
.default_value(0.0f) /* Panel for Specular settings. */
.min(0.0f) PanelDeclarationBuilder &spec = b.add_panel("Specular").default_closed(true);
.max(1.0f) spec.add_input<decl::Float>("Specular")
.subtype(PROP_FACTOR);
#define SOCK_METALLIC_ID 6
b.add_input<decl::Float>("Specular")
.default_value(0.5f) .default_value(0.5f)
.min(0.0f) .min(0.0f)
.max(1.0f) .max(1.0f)
.subtype(PROP_FACTOR); .subtype(PROP_FACTOR);
#define SOCK_SPECULAR_ID 7 #define SOCK_SPECULAR_ID 13
b.add_input<decl::Float>("Specular Tint") spec.add_input<decl::Float>("Specular Tint")
.default_value(0.0f) .default_value(0.0f)
.min(0.0f) .min(0.0f)
.max(1.0f) .max(1.0f)
.subtype(PROP_FACTOR); .subtype(PROP_FACTOR);
#define SOCK_SPECULAR_TINT_ID 8 #define SOCK_SPECULAR_TINT_ID 14
b.add_input<decl::Float>("Roughness") spec.add_input<decl::Float>("Anisotropic")
.default_value(0.5f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR);
#define SOCK_ROUGHNESS_ID 9
b.add_input<decl::Float>("Anisotropic")
.default_value(0.0f) .default_value(0.0f)
.min(0.0f) .min(0.0f)
.max(1.0f) .max(1.0f)
.subtype(PROP_FACTOR); .subtype(PROP_FACTOR);
#define SOCK_ANISOTROPIC_ID 10 #define SOCK_ANISOTROPIC_ID 15
b.add_input<decl::Float>("Anisotropic Rotation") spec.add_input<decl::Float>("Anisotropic Rotation")
.default_value(0.0f) .default_value(0.0f)
.min(0.0f) .min(0.0f)
.max(1.0f) .max(1.0f)
.subtype(PROP_FACTOR); .subtype(PROP_FACTOR);
#define SOCK_ANISOTROPIC_ROTATION_ID 11 #define SOCK_ANISOTROPIC_ROTATION_ID 16
b.add_input<decl::Float>("Sheen").default_value(0.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); spec.add_input<decl::Vector>("Tangent").hide_value();
#define SOCK_SHEEN_ID 12 #define SOCK_TANGENT_ID 17
b.add_input<decl::Float>("Sheen Roughness")
.default_value(0.5f) /* Panel for Coat settings. */
.min(0.0f) PanelDeclarationBuilder &coat = b.add_panel("Coat").default_closed(true);
.max(1.0f) coat.add_input<decl::Float>("Coat")
.subtype(PROP_FACTOR);
#define SOCK_SHEEN_ROUGHNESS_ID 13
b.add_input<decl::Color>("Sheen Tint").default_value({1.0f, 1.0f, 1.0f, 1.0f});
#define SOCK_SHEEN_TINT_ID 14
b.add_input<decl::Float>("Coat")
.default_value(0.0f) .default_value(0.0f)
.min(0.0f) .min(0.0f)
.max(1.0f) .max(1.0f)
@ -111,54 +131,52 @@ static void node_declare(NodeDeclarationBuilder &b)
.description( .description(
"Controls the intensity of the coat layer, both the reflection and the tinting. " "Controls the intensity of the coat layer, both the reflection and the tinting. "
"Typically should be zero or one for physically-based materials"); "Typically should be zero or one for physically-based materials");
#define SOCK_COAT_ID 15 #define SOCK_COAT_ID 18
b.add_input<decl::Float>("Coat Roughness") coat.add_input<decl::Float>("Coat Roughness")
.default_value(0.03f) .default_value(0.03f)
.min(0.0f) .min(0.0f)
.max(1.0f) .max(1.0f)
.subtype(PROP_FACTOR) .subtype(PROP_FACTOR)
.description("The roughness of the coat layer"); .description("The roughness of the coat layer");
#define SOCK_COAT_ROUGHNESS_ID 16 #define SOCK_COAT_ROUGHNESS_ID 19
b.add_input<decl::Float>("Coat IOR") coat.add_input<decl::Float>("Coat IOR")
.default_value(1.5f) .default_value(1.5f)
.min(1.0f) .min(1.0f)
.max(4.0f) .max(4.0f)
.description( .description(
"The index of refraction of the coat layer (affects its reflectivity as well " "The index of refraction of the coat layer "
"as the falloff of coat tinting)"); "(affects its reflectivity as well as the falloff of coat tinting)");
#define SOCK_COAT_IOR_ID 17 #define SOCK_COAT_IOR_ID 20
b.add_input<decl::Color>("Coat Tint") coat.add_input<decl::Color>("Coat Tint")
.default_value({1.0f, 1.0f, 1.0f, 1.0f}) .default_value({1.0f, 1.0f, 1.0f, 1.0f})
.description( .description(
"Adds a colored tint to the coat layer by modeling absorption in the layer. " "Adds a colored tint to the coat layer by modeling absorption in the layer. "
"Saturation increases at shallower angles, as the light travels farther through the " "Saturation increases at shallower angles, as the light travels farther "
"medium " "through the medium (depending on the Coat IOR)");
"(depending on the Coat IOR)"); #define SOCK_COAT_TINT_ID 21
#define SOCK_COAT_TINT_ID 18 coat.add_input<decl::Vector>("Coat Normal").hide_value();
b.add_input<decl::Float>("IOR").default_value(1.45f).min(1.0f).max(1000.0f); #define SOCK_COAT_NORMAL_ID 22
#define SOCK_IOR_ID 19
b.add_input<decl::Float>("Transmission") /* Panel for Sheen settings. */
.default_value(0.0f) PanelDeclarationBuilder &sheen = b.add_panel("Sheen").default_closed(true);
sheen.add_input<decl::Float>("Sheen").default_value(0.0f).min(0.0f).max(1.0f).subtype(
PROP_FACTOR);
#define SOCK_SHEEN_ID 23
sheen.add_input<decl::Float>("Sheen Roughness")
.default_value(0.5f)
.min(0.0f) .min(0.0f)
.max(1.0f) .max(1.0f)
.subtype(PROP_FACTOR); .subtype(PROP_FACTOR);
#define SOCK_TRANSMISSION_ID 20 #define SOCK_SHEEN_ROUGHNESS_ID 24
b.add_input<decl::Color>("Emission").default_value({1.0f, 1.0f, 1.0f, 1.0f}); sheen.add_input<decl::Color>("Sheen Tint").default_value({1.0f, 1.0f, 1.0f, 1.0f});
#define SOCK_EMISSION_ID 21 #define SOCK_SHEEN_TINT_ID 25
b.add_input<decl::Float>("Emission Strength").default_value(0.0).min(0.0f).max(1000000.0f);
#define SOCK_EMISSION_STRENGTH_ID 22 /* Panel for Emission settings. */
b.add_input<decl::Float>("Alpha").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); PanelDeclarationBuilder &emis = b.add_panel("Emission").default_closed(true);
#define SOCK_ALPHA_ID 23 emis.add_input<decl::Color>("Emission").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_input<decl::Vector>("Normal").hide_value(); #define SOCK_EMISSION_ID 26
#define SOCK_NORMAL_ID 24 emis.add_input<decl::Float>("Emission Strength").default_value(0.0).min(0.0f).max(1000000.0f);
b.add_input<decl::Vector>("Coat Normal").hide_value(); #define SOCK_EMISSION_STRENGTH_ID 27
#define SOCK_COAT_NORMAL_ID 25
b.add_input<decl::Vector>("Tangent").hide_value();
#define SOCK_TANGENT_ID 26
b.add_input<decl::Float>("Weight").unavailable();
#define SOCK_WEIGHT_ID 27
b.add_output<decl::Shader>("BSDF");
#define SOCK_BSDF_ID 28
} }
static void node_shader_buts_principled(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) static void node_shader_buts_principled(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)