Cycles: Update Velvet BSDF to Sheen BSDF with new Microfiber sheen model

This patch extends the old Velvet BSDF node with a new shading model,
and renames it to Sheen BSDF accordingly.

The old model is still available, but new nodes now default to the
"Microfiber" model, which is an implementation of
https://tizianzeltner.com/projects/Zeltner2022Practical/.

Pull Request: https://projects.blender.org/blender/blender/pulls/108869
This commit is contained in:
Lukas Stockner 2023-07-24 15:36:36 +02:00 committed by Lukas Stockner
parent 6f1f2b9830
commit b220ec27d7
31 changed files with 454 additions and 91 deletions

View File

@ -661,8 +661,18 @@ static ShaderNode *add_node(Scene *scene,
else if (b_node.is_a(&RNA_ShaderNodeBsdfTransparent)) {
node = graph->create_node<TransparentBsdfNode>();
}
else if (b_node.is_a(&RNA_ShaderNodeBsdfVelvet)) {
node = graph->create_node<VelvetBsdfNode>();
else if (b_node.is_a(&RNA_ShaderNodeBsdfSheen)) {
BL::ShaderNodeBsdfSheen b_sheen_node(b_node);
SheenBsdfNode *sheen = graph->create_node<SheenBsdfNode>();
switch (b_sheen_node.distribution()) {
case BL::ShaderNodeBsdfSheen::distribution_ASHIKHMIN:
sheen->set_distribution(CLOSURE_BSDF_ASHIKHMIN_VELVET_ID);
break;
case BL::ShaderNodeBsdfSheen::distribution_MICROFIBER:
sheen->set_distribution(CLOSURE_BSDF_SHEEN_ID);
break;
}
node = sheen;
}
else if (b_node.is_a(&RNA_ShaderNodeEmission)) {
node = graph->create_node<EmissionNode>();

View File

@ -126,6 +126,7 @@ set(SRC_KERNEL_CLOSURE_HEADERS
closure/bsdf_microfacet.h
closure/bsdf_oren_nayar.h
closure/bsdf_phong_ramp.h
closure/bsdf_sheen.h
closure/bsdf_toon.h
closure/bsdf_transparent.h
closure/bsdf_util.h

View File

@ -11,6 +11,7 @@
#include "kernel/closure/bsdf_phong_ramp.h"
#include "kernel/closure/bsdf_diffuse_ramp.h"
#include "kernel/closure/bsdf_microfacet.h"
#include "kernel/closure/bsdf_sheen.h"
#include "kernel/closure/bsdf_transparent.h"
#include "kernel/closure/bsdf_ashikhmin_shirley.h"
#include "kernel/closure/bsdf_toon.h"
@ -214,6 +215,11 @@ ccl_device_inline int bsdf_sample(KernelGlobals kg,
*sampled_roughness = one_float2();
*eta = 1.0f;
break;
case CLOSURE_BSDF_SHEEN_ID:
label = bsdf_sheen_sample(sc, Ng, sd->wi, rand_xy, eval, wo, pdf);
*sampled_roughness = one_float2();
*eta = 1.0f;
break;
#endif
default:
label = LABEL_NONE;
@ -349,6 +355,11 @@ ccl_device_inline void bsdf_roughness_eta(const KernelGlobals kg,
*roughness = one_float2();
*eta = 1.0f;
break;
case CLOSURE_BSDF_SHEEN_ID:
alpha = ((ccl_private SheenBsdf *)sc)->roughness;
*roughness = make_float2(alpha, alpha);
*eta = 1.0f;
break;
#endif
default:
*roughness = one_float2();
@ -429,6 +440,7 @@ ccl_device_inline int bsdf_label(const KernelGlobals kg,
label = LABEL_REFLECT | LABEL_DIFFUSE;
break;
case CLOSURE_BSDF_PRINCIPLED_SHEEN_ID:
case CLOSURE_BSDF_SHEEN_ID:
label = LABEL_REFLECT | LABEL_DIFFUSE;
break;
#endif
@ -525,6 +537,9 @@ ccl_device_inline
case CLOSURE_BSDF_PRINCIPLED_SHEEN_ID:
eval = bsdf_principled_sheen_eval(sc, sd->wi, wo, pdf);
break;
case CLOSURE_BSDF_SHEEN_ID:
eval = bsdf_sheen_eval(sc, sd->wi, wo, pdf);
break;
#endif
default:
break;

View File

@ -0,0 +1,104 @@
/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#pragma once
/* Shading model by Tizian Zeltner, Brent Burley, Matt Jen-Yuan Chiang:
* "Practical Multiple-Scattering Sheen Using Linearly Transformed Cosines" (2022)
* https://tizianzeltner.com/projects/Zeltner2022Practical/
*/
#include "kernel/closure/bsdf_util.h"
CCL_NAMESPACE_BEGIN
typedef struct SheenBsdf {
SHADER_CLOSURE_BASE;
float roughness;
float transformA, transformB;
float3 T, B;
} SheenBsdf;
static_assert(sizeof(ShaderClosure) >= sizeof(SheenBsdf), "SheenBsdf is too large!");
ccl_device int bsdf_sheen_setup(KernelGlobals kg,
ccl_private const ShaderData *sd,
ccl_private SheenBsdf *bsdf)
{
bsdf->type = CLOSURE_BSDF_SHEEN_ID;
bsdf->roughness = clamp(bsdf->roughness, 1e-3f, 1.0f);
make_orthonormals_tangent(bsdf->N, sd->wi, &bsdf->T, &bsdf->B);
float cosNI = dot(bsdf->N, sd->wi);
int offset = kernel_data.tables.sheen_ltc;
bsdf->transformA = lookup_table_read_2D(kg, cosNI, bsdf->roughness, offset, 32, 32);
bsdf->transformB = lookup_table_read_2D(kg, cosNI, bsdf->roughness, offset + 32 * 32, 32, 32);
float albedo = lookup_table_read_2D(kg, cosNI, bsdf->roughness, offset + 2 * 32 * 32, 32, 32);
bsdf->weight *= albedo;
bsdf->sample_weight *= albedo;
return SD_BSDF | SD_BSDF_HAS_EVAL;
}
ccl_device Spectrum bsdf_sheen_eval(ccl_private const ShaderClosure *sc,
const float3 wi,
const float3 wo,
ccl_private float *pdf)
{
ccl_private const SheenBsdf *bsdf = (ccl_private const SheenBsdf *)sc;
const float3 N = bsdf->N, T = bsdf->T, B = bsdf->B;
float a = bsdf->transformA, b = bsdf->transformB;
if (dot(N, wo) <= 0.0f) {
*pdf = 0.0f;
return zero_spectrum();
}
float3 localO = make_float3(dot(T, wo), dot(B, wo), dot(N, wo));
if (localO.z <= 0.0f) {
*pdf = 0.0f;
return zero_spectrum();
}
float lenSqr = sqr(a * localO.x + b * localO.z) + sqr(a * localO.y) + sqr(localO.z);
float val = M_1_PI_F * localO.z * sqr(a / lenSqr);
*pdf = val;
return make_spectrum(val);
}
ccl_device int bsdf_sheen_sample(ccl_private const ShaderClosure *sc,
float3 Ng,
float3 wi,
float2 rand,
ccl_private Spectrum *eval,
ccl_private float3 *wo,
ccl_private float *pdf)
{
ccl_private const SheenBsdf *bsdf = (ccl_private const SheenBsdf *)sc;
const float3 N = bsdf->N, T = bsdf->T, B = bsdf->B;
float a = bsdf->transformA, b = bsdf->transformB;
float2 disk = concentric_sample_disk(rand);
float diskZ = safe_sqrtf(1.0f - dot(disk, disk));
float3 localO = normalize(make_float3((disk.x - diskZ * b) / a, disk.y / a, diskZ));
*wo = localO.x * T + localO.y * B + localO.z * N;
if (dot(Ng, *wo) <= 0) {
*eval = zero_spectrum();
*pdf = 0.0f;
return LABEL_REFLECT | LABEL_DIFFUSE;
}
float lenSqr = sqr(a * localO.x + b * localO.z) + sqr(a * localO.y) + sqr(localO.z);
float val = M_1_PI_F * localO.z * sqr(a / lenSqr);
*pdf = val;
*eval = make_spectrum(val);
return LABEL_REFLECT | LABEL_DIFFUSE;
}
CCL_NAMESPACE_END

View File

@ -14,6 +14,7 @@
#include "kernel/closure/bsdf_diffuse.h"
#include "kernel/closure/bsdf_microfacet.h"
#include "kernel/closure/bsdf_oren_nayar.h"
#include "kernel/closure/bsdf_sheen.h"
#include "kernel/closure/bsdf_transparent.h"
#include "kernel/closure/bsdf_ashikhmin_shirley.h"
#include "kernel/closure/bsdf_toon.h"
@ -555,6 +556,30 @@ ccl_device void osl_closure_ashikhmin_velvet_setup(
sd->flag |= bsdf_ashikhmin_velvet_setup(bsdf);
}
/* Sheen */
ccl_device void osl_closure_sheen_setup(KernelGlobals kg,
ccl_private ShaderData *sd,
uint32_t path_flag,
float3 weight,
ccl_private const SheenClosure *closure)
{
if (osl_closure_skip(kg, sd, path_flag, LABEL_DIFFUSE)) {
return;
}
ccl_private SheenBsdf *bsdf = (ccl_private SheenBsdf *)bsdf_alloc(
sd, sizeof(SheenBsdf), rgb_to_spectrum(weight));
if (!bsdf) {
return;
}
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->roughness = closure->roughness;
sd->flag |= bsdf_sheen_setup(kg, sd, bsdf);
}
ccl_device void osl_closure_diffuse_toon_setup(KernelGlobals kg,
ccl_private ShaderData *sd,
uint32_t path_flag,

View File

@ -115,6 +115,11 @@ OSL_CLOSURE_STRUCT_BEGIN(AshikhminVelvet, ashikhmin_velvet)
OSL_CLOSURE_STRUCT_MEMBER(AshikhminVelvet, FLOAT, float, sigma, NULL)
OSL_CLOSURE_STRUCT_END(AshikhminVelvet, ashikhmin_velvet)
OSL_CLOSURE_STRUCT_BEGIN(Sheen, sheen)
OSL_CLOSURE_STRUCT_MEMBER(Sheen, VECTOR, packed_float3, N, NULL)
OSL_CLOSURE_STRUCT_MEMBER(Sheen, FLOAT, float, roughness, NULL)
OSL_CLOSURE_STRUCT_END(Sheen, sheen)
OSL_CLOSURE_STRUCT_BEGIN(DiffuseToon, diffuse_toon)
OSL_CLOSURE_STRUCT_MEMBER(DiffuseToon, VECTOR, packed_float3, N, NULL)
OSL_CLOSURE_STRUCT_MEMBER(DiffuseToon, FLOAT, float, size, NULL)

View File

@ -78,6 +78,7 @@ set(SRC_OSL
node_separate_hsv.osl
node_separate_xyz.osl
node_set_normal.osl
node_sheen_bsdf.osl
node_sky_texture.osl
node_subsurface_scattering.osl
node_tangent.osl
@ -91,7 +92,6 @@ set(SRC_OSL
node_vector_map_range.osl
node_vector_rotate.osl
node_vector_transform.osl
node_velvet_bsdf.osl
node_vertex_color.osl
node_voronoi_texture.osl
node_voxel_texture.osl

View File

@ -0,0 +1,19 @@
/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#include "node_fresnel.h"
#include "stdcycles.h"
shader node_sheen_bsdf(color Color = 0.8,
string distribution = "microfiber",
float Roughness = 0.0,
normal Normal = N,
output closure color BSDF = 0)
{
float roughness = clamp(Roughness, 0.0, 1.0);
if (distribution == "ashikhmin")
BSDF = Color * ashikhmin_velvet(Normal, roughness);
else if (distribution == "microfiber")
BSDF = Color * sheen(Normal, roughness);
}

View File

@ -1,15 +0,0 @@
/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#include "node_fresnel.h"
#include "stdcycles.h"
shader node_velvet_bsdf(color Color = 0.8,
float Sigma = 0.0,
normal Normal = N,
output closure color BSDF = 0)
{
float sigma = clamp(Sigma, 0.0, 1.0);
BSDF = Color * ashikhmin_velvet(Normal, sigma);
}

View File

@ -23,6 +23,7 @@ closure color phong_ramp(normal N, float exponent, color colors[8]) BUILTIN;
closure color diffuse_toon(normal N, float size, float smooth) BUILTIN;
closure color glossy_toon(normal N, float size, float smooth) BUILTIN;
closure color ashikhmin_velvet(normal N, float sigma) BUILTIN;
closure color sheen(normal N, float roughness) BUILTIN;
closure color ambient_occlusion() BUILTIN;
closure color principled_diffuse(normal N, float roughness) BUILTIN;
closure color principled_sheen(normal N) BUILTIN;

View File

@ -540,6 +540,19 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
}
break;
}
case CLOSURE_BSDF_SHEEN_ID: {
Spectrum weight = sd->svm_closure_weight * mix_weight;
ccl_private SheenBsdf *bsdf = (ccl_private SheenBsdf *)bsdf_alloc(
sd, sizeof(SheenBsdf), weight);
if (bsdf) {
bsdf->N = N;
bsdf->roughness = param1;
sd->flag |= bsdf_sheen_setup(kg, sd, bsdf);
}
break;
}
case CLOSURE_BSDF_GLOSSY_TOON_ID:
#ifdef __CAUSTICS_TRICKS__
if (!kernel_data.integrator.caustics_reflective && (path_flag & PATH_RAY_DIFFUSE))

View File

@ -416,6 +416,7 @@ typedef enum ClosureType {
CLOSURE_BSDF_DIFFUSE_RAMP_ID,
CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID,
CLOSURE_BSDF_PRINCIPLED_SHEEN_ID,
CLOSURE_BSDF_SHEEN_ID,
CLOSURE_BSDF_DIFFUSE_TOON_ID,
CLOSURE_BSDF_TRANSLUCENT_ID,

View File

@ -1233,7 +1233,7 @@ typedef struct KernelTables {
int ggx_glass_Eavg;
int ggx_glass_inv_E;
int ggx_glass_inv_Eavg;
int pad1;
int sheen_ltc;
} KernelTables;
static_assert_align(KernelTables, 16);

View File

@ -574,6 +574,7 @@ void ShaderManager::device_update_common(Device * /*device*/,
ktables->ggx_glass_Eavg = ensure_bsdf_table(dscene, scene, table_ggx_glass_Eavg);
ktables->ggx_glass_inv_E = ensure_bsdf_table(dscene, scene, table_ggx_glass_inv_E);
ktables->ggx_glass_inv_Eavg = ensure_bsdf_table(dscene, scene, table_ggx_glass_inv_Eavg);
ktables->sheen_ltc = ensure_bsdf_table(dscene, scene, table_sheen_ltc);
/* integrator */
KernelIntegrator *kintegrator = &dscene->data.integrator;

View File

@ -632,4 +632,105 @@ static const float table_ggx_glass_inv_Eavg[256] = {
1.000000f, 0.999883f, 0.998572f, 0.994065f, 0.984146f, 0.966784f, 0.940421f, 0.904186f, 0.858056f, 0.802932f, 0.740578f, 0.673420f, 0.604211f, 0.535654f, 0.470057f, 0.409136f
};
static const float table_sheen_ltc[3072] = {
0.01415f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
0.01941f, 0.01741f, 0.04610f, 0.10367f, 0.06244f, 0.23927f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
0.01927f, 0.01895f, 0.03002f, 0.03912f, 0.04938f, 0.05239f, 0.06018f, 0.06520f, 0.08253f, 0.21093f, 0.12785f, 0.19030f, 0.15254f, 0.16585f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
0.03084f, 0.03764f, 0.03952f, 0.04092f, 0.04433f, 0.05014f, 0.05570f, 0.06215f, 0.06660f, 0.07902f, 0.10099f, 0.10794f, 0.10632f, 0.12623f, 0.13931f, 0.15353f, 0.16109f, 0.14583f, 0.27891f, 0.22622f, 0.18932f, 0.20219f, 0.30269f, 0.38379f, 0.39038f, 0.46310f, 0.44663f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
0.04118f, 0.05152f, 0.05724f, 0.05863f, 0.05952f, 0.06149f, 0.06448f, 0.07004f, 0.07774f, 0.08632f, 0.09629f, 0.10592f, 0.10718f, 0.12207f, 0.13413f, 0.13702f, 0.15294f, 0.15121f, 0.17652f, 0.19532f, 0.20831f, 0.19762f, 0.24202f, 0.32995f, 0.30857f, 0.39596f, 0.38346f, 0.42503f, 0.41592f, 0.42512f, 0.36714f, 0.46502f,
0.05088f, 0.06485f, 0.07697f, 0.08334f, 0.08654f, 0.08950f, 0.09263f, 0.09711f, 0.10113f, 0.10913f, 0.11586f, 0.12425f, 0.12986f, 0.13530f, 0.15037f, 0.15165f, 0.15858f, 0.16660f, 0.18051f, 0.18022f, 0.19896f, 0.21095f, 0.21862f, 0.23861f, 0.25384f, 0.27394f, 0.28563f, 0.29160f, 0.29300f, 0.33458f, 0.36514f, 0.38746f,
0.06054f, 0.07710f, 0.09569f, 0.10917f, 0.11813f, 0.12469f, 0.12958f, 0.13406f, 0.13801f, 0.14324f, 0.14801f, 0.15359f, 0.15945f, 0.16688f, 0.17552f, 0.17956f, 0.18275f, 0.19293f, 0.20081f, 0.20817f, 0.21658f, 0.22866f, 0.23912f, 0.24736f, 0.26573f, 0.26821f, 0.28767f, 0.30592f, 0.31228f, 0.35297f, 0.35570f, 0.37077f,
0.07075f, 0.08974f, 0.11306f, 0.13241f, 0.14704f, 0.15763f, 0.16591f, 0.17258f, 0.17781f, 0.18234f, 0.18700f, 0.19101f, 0.19657f, 0.20165f, 0.20731f, 0.21150f, 0.21692f, 0.22536f, 0.23235f, 0.23720f, 0.24295f, 0.25154f, 0.26200f, 0.26907f, 0.28040f, 0.28922f, 0.30452f, 0.31567f, 0.33294f, 0.35084f, 0.37226f, 0.37956f,
0.08222f, 0.10394f, 0.13034f, 0.15361f, 0.17244f, 0.18620f, 0.19671f, 0.20509f, 0.21199f, 0.21726f, 0.22245f, 0.22702f, 0.23174f, 0.23571f, 0.23966f, 0.24384f, 0.24877f, 0.25548f, 0.26047f, 0.26863f, 0.27404f, 0.28088f, 0.29010f, 0.29704f, 0.30559f, 0.31519f, 0.32721f, 0.33828f, 0.35424f, 0.36868f, 0.38570f, 0.39707f,
0.09597f, 0.11972f, 0.14796f, 0.17350f, 0.19481f, 0.21136f, 0.22369f, 0.23330f, 0.24109f, 0.24787f, 0.25359f, 0.25878f, 0.26320f, 0.26831f, 0.27305f, 0.27810f, 0.28206f, 0.28734f, 0.29228f, 0.29719f, 0.30256f, 0.30857f, 0.31652f, 0.32438f, 0.33291f, 0.34012f, 0.35087f, 0.36243f, 0.37467f, 0.38986f, 0.40394f, 0.41719f,
0.11173f, 0.13694f, 0.16797f, 0.19358f, 0.21571f, 0.23427f, 0.24900f, 0.26011f, 0.26884f, 0.27668f, 0.28326f, 0.28928f, 0.29445f, 0.29932f, 0.30454f, 0.30943f, 0.31431f, 0.31861f, 0.32326f, 0.32881f, 0.33479f, 0.34094f, 0.34705f, 0.35341f, 0.36079f, 0.36863f, 0.37512f, 0.38607f, 0.39611f, 0.41085f, 0.42341f, 0.43959f,
0.12869f, 0.15653f, 0.18847f, 0.21397f, 0.23632f, 0.25652f, 0.27273f, 0.28564f, 0.29568f, 0.30413f, 0.31142f, 0.31801f, 0.32424f, 0.32941f, 0.33479f, 0.33933f, 0.34444f, 0.34892f, 0.35415f, 0.35873f, 0.36457f, 0.36975f, 0.37684f, 0.38258f, 0.39038f, 0.39755f, 0.40428f, 0.41192f, 0.42141f, 0.43074f, 0.44659f, 0.46013f,
0.14693f, 0.17828f, 0.20991f, 0.23513f, 0.25809f, 0.27850f, 0.29576f, 0.30999f, 0.32128f, 0.33053f, 0.33854f, 0.34549f, 0.35212f, 0.35806f, 0.36371f, 0.36901f, 0.37416f, 0.37907f, 0.38378f, 0.38887f, 0.39366f, 0.39953f, 0.40534f, 0.41134f, 0.41832f, 0.42583f, 0.43323f, 0.44084f, 0.44897f, 0.45832f, 0.47095f, 0.48340f,
0.16755f, 0.20139f, 0.23191f, 0.25781f, 0.28103f, 0.30124f, 0.31874f, 0.33379f, 0.34648f, 0.35662f, 0.36536f, 0.37289f, 0.37956f, 0.38585f, 0.39167f, 0.39736f, 0.40272f, 0.40787f, 0.41311f, 0.41811f, 0.42324f, 0.42871f, 0.43459f, 0.44015f, 0.44634f, 0.45322f, 0.46073f, 0.46815f, 0.47699f, 0.48579f, 0.49728f, 0.50776f,
0.19101f, 0.22471f, 0.25559f, 0.28173f, 0.30495f, 0.32541f, 0.34337f, 0.35848f, 0.37152f, 0.38267f, 0.39205f, 0.40013f, 0.40731f, 0.41385f, 0.41996f, 0.42572f, 0.43136f, 0.43675f, 0.44210f, 0.44729f, 0.45254f, 0.45786f, 0.46336f, 0.46904f, 0.47514f, 0.48162f, 0.48829f, 0.49548f, 0.50339f, 0.51184f, 0.52150f, 0.53151f,
0.21608f, 0.24910f, 0.28069f, 0.30724f, 0.33032f, 0.35096f, 0.36879f, 0.38457f, 0.39755f, 0.40917f, 0.41915f, 0.42790f, 0.43555f, 0.44253f, 0.44886f, 0.45491f, 0.46058f, 0.46590f, 0.47137f, 0.47670f, 0.48207f, 0.48730f, 0.49275f, 0.49832f, 0.50411f, 0.51004f, 0.51646f, 0.52320f, 0.53028f, 0.53801f, 0.54612f, 0.55540f,
0.24162f, 0.27454f, 0.30746f, 0.33408f, 0.35697f, 0.37775f, 0.39587f, 0.41165f, 0.42539f, 0.43716f, 0.44735f, 0.45639f, 0.46453f, 0.47188f, 0.47840f, 0.48473f, 0.49060f, 0.49627f, 0.50156f, 0.50672f, 0.51205f, 0.51720f, 0.52258f, 0.52812f, 0.53331f, 0.53939f, 0.54508f, 0.55110f, 0.55773f, 0.56432f, 0.57204f, 0.58012f,
0.26781f, 0.30184f, 0.33546f, 0.36236f, 0.38543f, 0.40587f, 0.42394f, 0.43980f, 0.45355f, 0.46600f, 0.47658f, 0.48605f, 0.49437f, 0.50188f, 0.50886f, 0.51521f, 0.52114f, 0.52686f, 0.53234f, 0.53760f, 0.54305f, 0.54802f, 0.55334f, 0.55850f, 0.56350f, 0.56858f, 0.57426f, 0.57961f, 0.58579f, 0.59207f, 0.59839f, 0.60588f,
0.29552f, 0.33034f, 0.36464f, 0.39162f, 0.41468f, 0.43479f, 0.45273f, 0.46884f, 0.48278f, 0.49535f, 0.50635f, 0.51611f, 0.52482f, 0.53261f, 0.53981f, 0.54631f, 0.55239f, 0.55818f, 0.56348f, 0.56875f, 0.57406f, 0.57898f, 0.58395f, 0.58890f, 0.59356f, 0.59866f, 0.60366f, 0.60857f, 0.61392f, 0.61896f, 0.62446f, 0.63114f,
0.32493f, 0.36044f, 0.39500f, 0.42214f, 0.44504f, 0.46513f, 0.48260f, 0.49819f, 0.51220f, 0.52491f, 0.53607f, 0.54604f, 0.55497f, 0.56304f, 0.57042f, 0.57716f, 0.58338f, 0.58922f, 0.59463f, 0.59983f, 0.60510f, 0.60997f, 0.61473f, 0.61957f, 0.62409f, 0.62852f, 0.63251f, 0.63750f, 0.64231f, 0.64613f, 0.65086f, 0.65651f,
0.35603f, 0.39159f, 0.42682f, 0.45440f, 0.47706f, 0.49652f, 0.51370f, 0.52869f, 0.54234f, 0.55442f, 0.56541f, 0.57520f, 0.58426f, 0.59238f, 0.59985f, 0.60666f, 0.61307f, 0.61890f, 0.62438f, 0.62953f, 0.63458f, 0.63958f, 0.64422f, 0.64882f, 0.65331f, 0.65733f, 0.66150f, 0.66582f, 0.66990f, 0.67332f, 0.67675f, 0.68186f,
0.38874f, 0.42458f, 0.46012f, 0.48761f, 0.51008f, 0.52938f, 0.54611f, 0.56050f, 0.57333f, 0.58470f, 0.59503f, 0.60417f, 0.61278f, 0.62064f, 0.62794f, 0.63473f, 0.64102f, 0.64684f, 0.65232f, 0.65750f, 0.66247f, 0.66730f, 0.67176f, 0.67590f, 0.68040f, 0.68408f, 0.68813f, 0.69178f, 0.69592f, 0.69962f, 0.70287f, 0.70573f,
0.42286f, 0.45893f, 0.49450f, 0.52171f, 0.54404f, 0.56282f, 0.57891f, 0.59290f, 0.60505f, 0.61587f, 0.62546f, 0.63399f, 0.64186f, 0.64911f, 0.65567f, 0.66186f, 0.66775f, 0.67323f, 0.67844f, 0.68333f, 0.68809f, 0.69262f, 0.69697f, 0.70127f, 0.70529f, 0.70896f, 0.71278f, 0.71635f, 0.71997f, 0.72323f, 0.72673f, 0.72944f,
0.45873f, 0.49433f, 0.52949f, 0.55633f, 0.57809f, 0.59634f, 0.61180f, 0.62517f, 0.63669f, 0.64685f, 0.65584f, 0.66376f, 0.67113f, 0.67765f, 0.68370f, 0.68930f, 0.69443f, 0.69947f, 0.70415f, 0.70855f, 0.71287f, 0.71661f, 0.72066f, 0.72451f, 0.72821f, 0.73152f, 0.73501f, 0.73849f, 0.74160f, 0.74481f, 0.74776f, 0.75105f,
0.49554f, 0.53027f, 0.56475f, 0.59075f, 0.61170f, 0.62919f, 0.64398f, 0.65664f, 0.66758f, 0.67700f, 0.68535f, 0.69283f, 0.69943f, 0.70556f, 0.71100f, 0.71624f, 0.72083f, 0.72523f, 0.72925f, 0.73339f, 0.73715f, 0.74070f, 0.74402f, 0.74744f, 0.75049f, 0.75399f, 0.75685f, 0.75973f, 0.76249f, 0.76538f, 0.76785f, 0.77115f,
0.53272f, 0.56610f, 0.59929f, 0.62423f, 0.64430f, 0.66087f, 0.67490f, 0.68693f, 0.69725f, 0.70612f, 0.71373f, 0.72045f, 0.72654f, 0.73215f, 0.73731f, 0.74188f, 0.74597f, 0.74997f, 0.75337f, 0.75709f, 0.76060f, 0.76378f, 0.76659f, 0.76955f, 0.77230f, 0.77514f, 0.77793f, 0.78043f, 0.78282f, 0.78468f, 0.78754f, 0.78995f,
0.56932f, 0.60103f, 0.63267f, 0.65651f, 0.67543f, 0.69104f, 0.70419f, 0.71550f, 0.72506f, 0.73326f, 0.74047f, 0.74675f, 0.75230f, 0.75728f, 0.76209f, 0.76616f, 0.76990f, 0.77334f, 0.77650f, 0.77934f, 0.78214f, 0.78495f, 0.78732f, 0.78980f, 0.79245f, 0.79502f, 0.79706f, 0.79938f, 0.80116f, 0.80364f, 0.80529f, 0.80743f,
0.60446f, 0.63433f, 0.66433f, 0.68668f, 0.70457f, 0.71943f, 0.73164f, 0.74200f, 0.75088f, 0.75865f, 0.76531f, 0.77096f, 0.77604f, 0.78047f, 0.78462f, 0.78846f, 0.79171f, 0.79502f, 0.79763f, 0.80039f, 0.80272f, 0.80522f, 0.80755f, 0.80954f, 0.81129f, 0.81256f, 0.81479f, 0.81667f, 0.81865f, 0.82066f, 0.82209f, 0.82367f,
0.63783f, 0.66580f, 0.69379f, 0.71493f, 0.73184f, 0.74566f, 0.75715f, 0.76684f, 0.77502f, 0.78192f, 0.78802f, 0.79346f, 0.79805f, 0.80183f, 0.80557f, 0.80900f, 0.81218f, 0.81485f, 0.81744f, 0.81962f, 0.82179f, 0.82385f, 0.82598f, 0.82778f, 0.82910f, 0.83055f, 0.83184f, 0.83322f, 0.83509f, 0.83626f, 0.83803f, 0.83936f,
0.66881f, 0.69495f, 0.72127f, 0.74089f, 0.75676f, 0.76971f, 0.78031f, 0.78909f, 0.79688f, 0.80339f, 0.80909f, 0.81375f, 0.81807f, 0.82174f, 0.82535f, 0.82861f, 0.83083f, 0.83320f, 0.83559f, 0.83745f, 0.84005f, 0.84070f, 0.84245f, 0.84401f, 0.84503f, 0.84665f, 0.84777f, 0.84905f, 0.84999f, 0.85072f, 0.85236f, 0.85341f,
0.69740f, 0.72178f, 0.74630f, 0.76475f, 0.77931f, 0.79173f, 0.80171f, 0.81003f, 0.81725f, 0.82283f, 0.82781f, 0.83251f, 0.83628f, 0.83983f, 0.84284f, 0.84559f, 0.84790f, 0.85013f, 0.85214f, 0.85384f, 0.85537f, 0.85665f, 0.85860f, 0.85961f, 0.86039f, 0.86098f, 0.86192f, 0.86278f, 0.86425f, 0.86491f, 0.86581f, 0.86677f,
0.72363f, 0.74617f, 0.76908f, 0.78618f, 0.79981f, 0.81110f, 0.82060f, 0.82853f, 0.83504f, 0.84058f, 0.84521f, 0.84932f, 0.85275f, 0.85605f, 0.85877f, 0.86129f, 0.86320f, 0.86521f, 0.86654f, 0.86846f, 0.86997f, 0.87153f, 0.87288f, 0.87352f, 0.87465f, 0.87549f, 0.87626f, 0.87676f, 0.87714f, 0.87859f, 0.87952f, 0.87958f,
0.00060f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
-0.00232f, -0.00581f, -0.00769f, -0.00740f, -0.02445f, -0.00242f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
-0.01424f, -0.00218f, -0.00194f, -0.00384f, -0.00668f, -0.01107f, -0.00746f, -0.01591f, -0.01052f, -0.01495f, -0.01530f, -0.01428f, -0.01276f, -0.02071f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
-0.04909f, -0.00710f, -0.00236f, -0.00201f, -0.00298f, -0.00546f, -0.00834f, -0.01121f, -0.01294f, -0.01692f, -0.01639f, -0.01738f, -0.02032f, -0.01947f, -0.02354f, -0.02910f, -0.02565f, -0.02903f, -0.03066f, -0.03044f, -0.04045f, -0.03226f, -0.03443f, -0.03023f, -0.03610f, -0.02022f, -0.02590f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
-0.10668f, -0.02772f, -0.00717f, -0.00421f, -0.00351f, -0.00399f, -0.00522f, -0.00676f, -0.00866f, -0.01099f, -0.01332f, -0.01590f, -0.01724f, -0.02041f, -0.02237f, -0.02503f, -0.02664f, -0.02803f, -0.03188f, -0.03147f, -0.03346f, -0.03476f, -0.03464f, -0.03125f, -0.03303f, -0.03009f, -0.03198f, -0.02518f, -0.03195f, -0.01668f, -0.02978f, -0.00394f,
-0.16006f, -0.05552f, -0.01274f, -0.00932f, -0.00582f, -0.00507f, -0.00531f, -0.00616f, -0.00792f, -0.00949f, -0.01167f, -0.01421f, -0.01635f, -0.01858f, -0.02237f, -0.02450f, -0.02714f, -0.03145f, -0.03321f, -0.03295f, -0.03492f, -0.03365f, -0.03733f, -0.03930f, -0.03879f, -0.03580f, -0.04089f, -0.03604f, -0.03863f, -0.03575f, -0.02621f, 0.00124f,
-0.18133f, -0.08871f, -0.02800f, -0.01456f, -0.01052f, -0.00904f, -0.00864f, -0.00898f, -0.01019f, -0.01110f, -0.01354f, -0.01614f, -0.01922f, -0.02116f, -0.02363f, -0.02606f, -0.02887f, -0.03270f, -0.03492f, -0.03607f, -0.03714f, -0.03827f, -0.03832f, -0.03918f, -0.04071f, -0.04382f, -0.03860f, -0.03690f, -0.04032f, -0.03136f, -0.02365f, -0.00281f,
-0.18042f, -0.10806f, -0.04959f, -0.02418f, -0.01632f, -0.01333f, -0.01204f, -0.01177f, -0.01198f, -0.01284f, -0.01408f, -0.01571f, -0.01794f, -0.02041f, -0.02235f, -0.02516f, -0.02822f, -0.03168f, -0.03631f, -0.03840f, -0.04024f, -0.04645f, -0.04435f, -0.04644f, -0.04369f, -0.05007f, -0.04809f, -0.04719f, -0.04179f, -0.03537f, -0.02633f, 0.00196f,
-0.17531f, -0.13135f, -0.08092f, -0.04065f, -0.02431f, -0.01864f, -0.01620f, -0.01498f, -0.01460f, -0.01487f, -0.01549f, -0.01665f, -0.01802f, -0.01985f, -0.02185f, -0.02424f, -0.02636f, -0.02871f, -0.03133f, -0.03455f, -0.03705f, -0.03931f, -0.04546f, -0.04797f, -0.04990f, -0.04903f, -0.04842f, -0.04495f, -0.04310f, -0.03925f, -0.02709f, 0.00103f,
-0.17397f, -0.15003f, -0.10394f, -0.06278f, -0.03698f, -0.02667f, -0.02186f, -0.01962f, -0.01854f, -0.01810f, -0.01829f, -0.01882f, -0.01990f, -0.02103f, -0.02243f, -0.02425f, -0.02611f, -0.02809f, -0.03045f, -0.03211f, -0.03413f, -0.03666f, -0.03882f, -0.04150f, -0.04323f, -0.04376f, -0.04590f, -0.04591f, -0.04202f, -0.03859f, -0.03046f, 0.00025f,
-0.17686f, -0.16229f, -0.12071f, -0.08778f, -0.05746f, -0.03882f, -0.03044f, -0.02620f, -0.02412f, -0.02290f, -0.02247f, -0.02235f, -0.02283f, -0.02349f, -0.02444f, -0.02562f, -0.02725f, -0.02859f, -0.03047f, -0.03199f, -0.03417f, -0.03618f, -0.03771f, -0.03920f, -0.04070f, -0.04138f, -0.04066f, -0.04125f, -0.03916f, -0.03764f, -0.02956f, 0.00020f,
-0.17952f, -0.16921f, -0.13634f, -0.10854f, -0.08164f, -0.05663f, -0.04256f, -0.03522f, -0.03124f, -0.02895f, -0.02760f, -0.02688f, -0.02653f, -0.02669f, -0.02714f, -0.02784f, -0.02878f, -0.02988f, -0.03136f, -0.03261f, -0.03429f, -0.03567f, -0.03742f, -0.03792f, -0.03954f, -0.04002f, -0.04014f, -0.03889f, -0.03739f, -0.03386f, -0.02810f, 0.00013f,
-0.17953f, -0.17294f, -0.14837f, -0.12458f, -0.10127f, -0.07912f, -0.05884f, -0.04715f, -0.04041f, -0.03637f, -0.03401f, -0.03244f, -0.03165f, -0.03113f, -0.03104f, -0.03134f, -0.03173f, -0.03225f, -0.03304f, -0.03406f, -0.03515f, -0.03594f, -0.03728f, -0.03825f, -0.03910f, -0.03960f, -0.03950f, -0.03877f, -0.03647f, -0.03283f, -0.02659f, -0.00002f,
-0.17802f, -0.17499f, -0.15708f, -0.13619f, -0.11601f, -0.09763f, -0.07926f, -0.06262f, -0.05277f, -0.04616f, -0.04217f, -0.03952f, -0.03771f, -0.03664f, -0.03576f, -0.03561f, -0.03531f, -0.03537f, -0.03577f, -0.03606f, -0.03657f, -0.03725f, -0.03790f, -0.03830f, -0.03850f, -0.03897f, -0.03886f, -0.03764f, -0.03576f, -0.03199f, -0.02678f, -0.00003f,
-0.17570f, -0.17630f, -0.16233f, -0.14459f, -0.12739f, -0.11162f, -0.09667f, -0.08188f, -0.06821f, -0.05887f, -0.05240f, -0.04793f, -0.04499f, -0.04300f, -0.04151f, -0.04033f, -0.03975f, -0.03947f, -0.03943f, -0.03917f, -0.03889f, -0.03887f, -0.03909f, -0.03903f, -0.03922f, -0.03917f, -0.03827f, -0.03702f, -0.03465f, -0.03118f, -0.02485f, -0.00021f,
-0.17314f, -0.17599f, -0.16514f, -0.15021f, -0.13557f, -0.12161f, -0.10876f, -0.09665f, -0.08454f, -0.07412f, -0.06463f, -0.05848f, -0.05371f, -0.05046f, -0.04821f, -0.04588f, -0.04438f, -0.04412f, -0.04304f, -0.04215f, -0.04161f, -0.04144f, -0.04059f, -0.04032f, -0.03974f, -0.03905f, -0.03800f, -0.03639f, -0.03436f, -0.03031f, -0.02493f, 0.00004f,
-0.17052f, -0.17439f, -0.16579f, -0.15358f, -0.14112f, -0.12867f, -0.11735f, -0.10700f, -0.09729f, -0.08817f, -0.07945f, -0.07137f, -0.06390f, -0.05902f, -0.05627f, -0.05274f, -0.05014f, -0.04809f, -0.04704f, -0.04617f, -0.04471f, -0.04402f, -0.04284f, -0.04140f, -0.04084f, -0.03922f, -0.03852f, -0.03648f, -0.03362f, -0.02977f, -0.02257f, 0.00013f,
-0.16726f, -0.17130f, -0.16494f, -0.15479f, -0.14389f, -0.13313f, -0.12315f, -0.11396f, -0.10555f, -0.09751f, -0.08994f, -0.08303f, -0.07661f, -0.07012f, -0.06435f, -0.06079f, -0.05751f, -0.05490f, -0.05237f, -0.05016f, -0.04763f, -0.04636f, -0.04452f, -0.04311f, -0.04186f, -0.04059f, -0.03828f, -0.03642f, -0.03293f, -0.02837f, -0.02183f, 0.00014f,
-0.16307f, -0.16735f, -0.16269f, -0.15439f, -0.14491f, -0.13568f, -0.12677f, -0.11827f, -0.11077f, -0.10366f, -0.09707f, -0.09088f, -0.08505f, -0.07920f, -0.07391f, -0.06982f, -0.06584f, -0.06111f, -0.05885f, -0.05560f, -0.05216f, -0.04974f, -0.04738f, -0.04525f, -0.04361f, -0.04122f, -0.03869f, -0.03626f, -0.03267f, -0.02853f, -0.02146f, 0.00013f,
-0.15800f, -0.16239f, -0.15918f, -0.15229f, -0.14422f, -0.13589f, -0.12801f, -0.12058f, -0.11368f, -0.10715f, -0.10121f, -0.09561f, -0.09044f, -0.08553f, -0.08073f, -0.07643f, -0.07244f, -0.06816f, -0.06506f, -0.06156f, -0.05721f, -0.05394f, -0.05071f, -0.04764f, -0.04512f, -0.04243f, -0.04049f, -0.03634f, -0.03217f, -0.02798f, -0.02084f, -0.00002f,
-0.15221f, -0.15659f, -0.15414f, -0.14815f, -0.14135f, -0.13430f, -0.12720f, -0.12066f, -0.11418f, -0.10835f, -0.10297f, -0.09810f, -0.09325f, -0.08885f, -0.08462f, -0.08047f, -0.07647f, -0.07278f, -0.06918f, -0.06581f, -0.06234f, -0.05873f, -0.05531f, -0.05182f, -0.04822f, -0.04527f, -0.04160f, -0.03748f, -0.03270f, -0.02788f, -0.02071f, 0.00002f,
-0.14547f, -0.14938f, -0.14757f, -0.14257f, -0.13671f, -0.13046f, -0.12415f, -0.11845f, -0.11284f, -0.10773f, -0.10264f, -0.09831f, -0.09386f, -0.08976f, -0.08593f, -0.08203f, -0.07852f, -0.07474f, -0.07134f, -0.06788f, -0.06462f, -0.06134f, -0.05808f, -0.05475f, -0.05106f, -0.04764f, -0.04367f, -0.03955f, -0.03412f, -0.02813f, -0.02016f, 0.00006f,
-0.13764f, -0.14091f, -0.13944f, -0.13527f, -0.13016f, -0.12479f, -0.11949f, -0.11426f, -0.10951f, -0.10470f, -0.10029f, -0.09638f, -0.09229f, -0.08880f, -0.08519f, -0.08157f, -0.07846f, -0.07504f, -0.07174f, -0.06833f, -0.06521f, -0.06204f, -0.05878f, -0.05553f, -0.05205f, -0.04825f, -0.04429f, -0.03988f, -0.03495f, -0.02900f, -0.02079f, 0.00004f,
-0.12835f, -0.13100f, -0.12981f, -0.12616f, -0.12174f, -0.11714f, -0.11273f, -0.10827f, -0.10407f, -0.09994f, -0.09624f, -0.09244f, -0.08921f, -0.08575f, -0.08256f, -0.07941f, -0.07619f, -0.07326f, -0.07019f, -0.06708f, -0.06409f, -0.06080f, -0.05775f, -0.05456f, -0.05117f, -0.04735f, -0.04351f, -0.03929f, -0.03433f, -0.02845f, -0.02023f, 0.00006f,
-0.11754f, -0.11957f, -0.11844f, -0.11545f, -0.11182f, -0.10788f, -0.10410f, -0.10044f, -0.09697f, -0.09338f, -0.09011f, -0.08701f, -0.08398f, -0.08119f, -0.07822f, -0.07555f, -0.07263f, -0.06975f, -0.06691f, -0.06419f, -0.06130f, -0.05852f, -0.05539f, -0.05231f, -0.04891f, -0.04558f, -0.04169f, -0.03736f, -0.03256f, -0.02662f, -0.01865f, 0.00005f,
-0.10493f, -0.10643f, -0.10534f, -0.10298f, -0.10006f, -0.09686f, -0.09377f, -0.09079f, -0.08792f, -0.08524f, -0.08232f, -0.07970f, -0.07708f, -0.07461f, -0.07219f, -0.06976f, -0.06728f, -0.06490f, -0.06230f, -0.05978f, -0.05720f, -0.05462f, -0.05180f, -0.04891f, -0.04571f, -0.04252f, -0.03908f, -0.03509f, -0.03041f, -0.02457f, -0.01737f, 0.00006f,
-0.09075f, -0.09168f, -0.09087f, -0.08897f, -0.08664f, -0.08420f, -0.08174f, -0.07948f, -0.07710f, -0.07491f, -0.07278f, -0.07074f, -0.06867f, -0.06656f, -0.06453f, -0.06249f, -0.06046f, -0.05835f, -0.05612f, -0.05390f, -0.05159f, -0.04919f, -0.04660f, -0.04409f, -0.04133f, -0.03835f, -0.03500f, -0.03151f, -0.02721f, -0.02228f, -0.01553f, 0.00008f,
-0.07481f, -0.07540f, -0.07476f, -0.07333f, -0.07166f, -0.06986f, -0.06808f, -0.06634f, -0.06465f, -0.06301f, -0.06140f, -0.05975f, -0.05817f, -0.05654f, -0.05499f, -0.05337f, -0.05168f, -0.04998f, -0.04815f, -0.04639f, -0.04448f, -0.04252f, -0.04044f, -0.03811f, -0.03571f, -0.03305f, -0.03031f, -0.02709f, -0.02350f, -0.01932f, -0.01368f, 0.00002f,
-0.05754f, -0.05784f, -0.05736f, -0.05642f, -0.05529f, -0.05410f, -0.05290f, -0.05171f, -0.05055f, -0.04938f, -0.04824f, -0.04716f, -0.04606f, -0.04480f, -0.04364f, -0.04245f, -0.04128f, -0.03999f, -0.03873f, -0.03727f, -0.03580f, -0.03429f, -0.03268f, -0.03089f, -0.02898f, -0.02688f, -0.02463f, -0.02206f, -0.01925f, -0.01574f, -0.01128f, -0.00001f,
-0.03902f, -0.03917f, -0.03890f, -0.03836f, -0.03768f, -0.03701f, -0.03631f, -0.03559f, -0.03488f, -0.03421f, -0.03354f, -0.03284f, -0.03212f, -0.03140f, -0.03066f, -0.02992f, -0.02915f, -0.02828f, -0.02745f, -0.02649f, -0.02553f, -0.02440f, -0.02332f, -0.02210f, -0.02076f, -0.01940f, -0.01782f, -0.01601f, -0.01390f, -0.01143f, -0.00812f, 0.00002f,
-0.01972f, -0.01980f, -0.01969f, -0.01946f, -0.01916f, -0.01888f, -0.01860f, -0.01833f, -0.01802f, -0.01768f, -0.01737f, -0.01712f, -0.01681f, -0.01645f, -0.01610f, -0.01577f, -0.01538f, -0.01498f, -0.01455f, -0.01407f, -0.01356f, -0.01304f, -0.01251f, -0.01189f, -0.01119f, -0.01040f, -0.00953f, -0.00857f, -0.00751f, -0.00614f, -0.00433f, 0.00002f,
0.00000f, -0.00002f, 0.00000f, -0.00002f, -0.00003f, -0.00001f, -0.00001f, -0.00004f, -0.00002f, -0.00003f, -0.00005f, -0.00002f, -0.00000f, -0.00001f, -0.00001f, -0.00001f, -0.00005f, -0.00004f, -0.00002f, -0.00002f, -0.00001f, 0.00003f, 0.00002f, 0.00003f, 0.00004f, 0.00003f, 0.00006f, 0.00004f, 0.00006f, 0.00006f, 0.00009f, 0.00003f,
0.00001f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
0.05839f, 0.00071f, 0.00007f, 0.00002f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
0.38834f, 0.09768f, 0.01072f, 0.00150f, 0.00039f, 0.00012f, 0.00006f, 0.00003f, 0.00002f, 0.00002f, 0.00001f, 0.00001f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
0.55348f, 0.29827f, 0.11755f, 0.03677f, 0.00983f, 0.00288f, 0.00101f, 0.00046f, 0.00023f, 0.00014f, 0.00010f, 0.00006f, 0.00004f, 0.00003f, 0.00002f, 0.00002f, 0.00001f, 0.00001f, 0.00001f, 0.00001f, 0.00001f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f, 0.00000f,
0.63273f, 0.42999f, 0.24931f, 0.13040f, 0.05910f, 0.02430f, 0.00981f, 0.00433f, 0.00200f, 0.00105f, 0.00062f, 0.00039f, 0.00024f, 0.00018f, 0.00013f, 0.00009f, 0.00008f, 0.00006f, 0.00005f, 0.00004f, 0.00003f, 0.00002f, 0.00002f, 0.00002f, 0.00002f, 0.00002f, 0.00001f, 0.00001f, 0.00001f, 0.00001f, 0.00001f, 0.00001f,
0.67021f, 0.50797f, 0.34475f, 0.22264f, 0.13300f, 0.07375f, 0.03867f, 0.02006f, 0.01032f, 0.00570f, 0.00324f, 0.00197f, 0.00122f, 0.00080f, 0.00059f, 0.00040f, 0.00030f, 0.00022f, 0.00018f, 0.00013f, 0.00012f, 0.00009f, 0.00008f, 0.00007f, 0.00006f, 0.00005f, 0.00004f, 0.00003f, 0.00003f, 0.00002f, 0.00002f, 0.00002f,
0.68765f, 0.55387f, 0.41042f, 0.29613f, 0.20481f, 0.13463f, 0.08432f, 0.05135f, 0.03073f, 0.01861f, 0.01132f, 0.00706f, 0.00454f, 0.00304f, 0.00212f, 0.00145f, 0.00102f, 0.00078f, 0.00059f, 0.00046f, 0.00036f, 0.00030f, 0.00025f, 0.00020f, 0.00017f, 0.00013f, 0.00012f, 0.00010f, 0.00008f, 0.00008f, 0.00006f, 0.00006f,
0.69478f, 0.58263f, 0.45689f, 0.35318f, 0.26617f, 0.19342f, 0.13650f, 0.09391f, 0.06299f, 0.04183f, 0.02782f, 0.01845f, 0.01259f, 0.00864f, 0.00604f, 0.00421f, 0.00303f, 0.00228f, 0.00172f, 0.00129f, 0.00099f, 0.00079f, 0.00066f, 0.00052f, 0.00044f, 0.00034f, 0.00029f, 0.00024f, 0.00021f, 0.00019f, 0.00017f, 0.00013f,
0.69794f, 0.60100f, 0.49085f, 0.39802f, 0.31773f, 0.24683f, 0.18787f, 0.13964f, 0.10220f, 0.07319f, 0.05252f, 0.03747f, 0.02685f, 0.01915f, 0.01375f, 0.00996f, 0.00733f, 0.00552f, 0.00415f, 0.00322f, 0.00247f, 0.00194f, 0.00157f, 0.00126f, 0.00102f, 0.00082f, 0.00069f, 0.00059f, 0.00048f, 0.00042f, 0.00037f, 0.00030f,
0.69862f, 0.61474f, 0.51662f, 0.43321f, 0.35989f, 0.29352f, 0.23483f, 0.18491f, 0.14298f, 0.10960f, 0.08309f, 0.06268f, 0.04689f, 0.03539f, 0.02666f, 0.02015f, 0.01519f, 0.01160f, 0.00888f, 0.00683f, 0.00531f, 0.00417f, 0.00334f, 0.00270f, 0.00220f, 0.00178f, 0.00148f, 0.00123f, 0.00101f, 0.00087f, 0.00073f, 0.00061f,
0.69840f, 0.62456f, 0.53780f, 0.46227f, 0.39486f, 0.33234f, 0.27724f, 0.22722f, 0.18345f, 0.14737f, 0.11687f, 0.09223f, 0.07219f, 0.05639f, 0.04424f, 0.03460f, 0.02709f, 0.02113f, 0.01656f, 0.01309f, 0.01041f, 0.00831f, 0.00665f, 0.00534f, 0.00434f, 0.00355f, 0.00288f, 0.00241f, 0.00200f, 0.00170f, 0.00142f, 0.00123f,
0.69766f, 0.63215f, 0.55391f, 0.48615f, 0.42355f, 0.36707f, 0.31348f, 0.26549f, 0.22185f, 0.18403f, 0.15141f, 0.12380f, 0.10104f, 0.08149f, 0.06598f, 0.05291f, 0.04275f, 0.03428f, 0.02771f, 0.02222f, 0.01807f, 0.01456f, 0.01195f, 0.00969f, 0.00798f, 0.00653f, 0.00534f, 0.00441f, 0.00368f, 0.00307f, 0.00264f, 0.00224f,
0.69641f, 0.63746f, 0.56861f, 0.50592f, 0.44888f, 0.39646f, 0.34628f, 0.30001f, 0.25727f, 0.21872f, 0.18530f, 0.15569f, 0.13073f, 0.10901f, 0.09059f, 0.07509f, 0.06205f, 0.05112f, 0.04199f, 0.03458f, 0.02839f, 0.02356f, 0.01946f, 0.01604f, 0.01337f, 0.01115f, 0.00925f, 0.00766f, 0.00639f, 0.00536f, 0.00456f, 0.00390f,
0.69548f, 0.64297f, 0.57917f, 0.52314f, 0.47074f, 0.42115f, 0.37424f, 0.33015f, 0.29017f, 0.25188f, 0.21825f, 0.18762f, 0.16043f, 0.13705f, 0.11638f, 0.09898f, 0.08360f, 0.07050f, 0.05948f, 0.04991f, 0.04182f, 0.03523f, 0.02974f, 0.02485f, 0.02085f, 0.01764f, 0.01489f, 0.01243f, 0.01052f, 0.00882f, 0.00762f, 0.00638f,
0.69518f, 0.64677f, 0.58896f, 0.53726f, 0.48924f, 0.44375f, 0.40045f, 0.35844f, 0.31901f, 0.28296f, 0.24905f, 0.21813f, 0.19041f, 0.16557f, 0.14360f, 0.12396f, 0.10719f, 0.09240f, 0.07951f, 0.06811f, 0.05809f, 0.04960f, 0.04242f, 0.03607f, 0.03098f, 0.02650f, 0.02249f, 0.01911f, 0.01630f, 0.01385f, 0.01187f, 0.01004f,
0.69404f, 0.65077f, 0.59738f, 0.55038f, 0.50616f, 0.46415f, 0.42260f, 0.38393f, 0.34548f, 0.31090f, 0.27757f, 0.24745f, 0.21932f, 0.19400f, 0.17119f, 0.15001f, 0.13153f, 0.11577f, 0.10099f, 0.08803f, 0.07655f, 0.06667f, 0.05763f, 0.05000f, 0.04326f, 0.03745f, 0.03233f, 0.02793f, 0.02410f, 0.02070f, 0.01799f, 0.01521f,
0.69373f, 0.65370f, 0.60556f, 0.56229f, 0.52099f, 0.48220f, 0.44396f, 0.40686f, 0.37145f, 0.33754f, 0.30538f, 0.27528f, 0.24688f, 0.22137f, 0.19867f, 0.17677f, 0.15718f, 0.13948f, 0.12389f, 0.10988f, 0.09688f, 0.08560f, 0.07528f, 0.06603f, 0.05819f, 0.05082f, 0.04467f, 0.03901f, 0.03404f, 0.02969f, 0.02565f, 0.02208f,
0.69374f, 0.65782f, 0.61300f, 0.57350f, 0.53560f, 0.49892f, 0.46321f, 0.42810f, 0.39357f, 0.36179f, 0.33055f, 0.30167f, 0.27438f, 0.24851f, 0.22461f, 0.20331f, 0.18338f, 0.16512f, 0.14824f, 0.13281f, 0.11850f, 0.10604f, 0.09447f, 0.08417f, 0.07499f, 0.06675f, 0.05906f, 0.05240f, 0.04618f, 0.04061f, 0.03571f, 0.03099f,
0.69478f, 0.66097f, 0.62010f, 0.58318f, 0.54812f, 0.51374f, 0.48033f, 0.44784f, 0.41543f, 0.38456f, 0.35481f, 0.32656f, 0.29983f, 0.27402f, 0.25049f, 0.22916f, 0.20899f, 0.18974f, 0.17283f, 0.15672f, 0.14161f, 0.12804f, 0.11552f, 0.10412f, 0.09392f, 0.08435f, 0.07566f, 0.06785f, 0.06058f, 0.05418f, 0.04812f, 0.04224f,
0.69636f, 0.66479f, 0.62662f, 0.59208f, 0.55948f, 0.52832f, 0.49686f, 0.46577f, 0.43550f, 0.40640f, 0.37791f, 0.35063f, 0.32440f, 0.29963f, 0.27592f, 0.25430f, 0.23411f, 0.21474f, 0.19748f, 0.18085f, 0.16496f, 0.15071f, 0.13745f, 0.12513f, 0.11401f, 0.10365f, 0.09444f, 0.08526f, 0.07697f, 0.06969f, 0.06274f, 0.05589f,
0.69769f, 0.66832f, 0.63306f, 0.60175f, 0.57114f, 0.54130f, 0.51227f, 0.48316f, 0.45520f, 0.42705f, 0.39979f, 0.37306f, 0.34799f, 0.32368f, 0.30051f, 0.27914f, 0.25902f, 0.24017f, 0.22242f, 0.20569f, 0.18950f, 0.17436f, 0.16053f, 0.14758f, 0.13555f, 0.12469f, 0.11431f, 0.10458f, 0.09545f, 0.08731f, 0.07957f, 0.07179f,
0.69990f, 0.67322f, 0.63986f, 0.61072f, 0.58210f, 0.55452f, 0.52757f, 0.49993f, 0.47308f, 0.44623f, 0.42075f, 0.39479f, 0.37078f, 0.34736f, 0.32486f, 0.30393f, 0.28339f, 0.26497f, 0.24680f, 0.23017f, 0.21383f, 0.19836f, 0.18437f, 0.17126f, 0.15847f, 0.14730f, 0.13611f, 0.12594f, 0.11582f, 0.10669f, 0.09818f, 0.09005f,
0.70253f, 0.67808f, 0.64711f, 0.61953f, 0.59306f, 0.56710f, 0.54128f, 0.51588f, 0.48993f, 0.46536f, 0.44072f, 0.41598f, 0.39289f, 0.36972f, 0.34812f, 0.32779f, 0.30734f, 0.28886f, 0.27113f, 0.25452f, 0.23828f, 0.22301f, 0.20869f, 0.19491f, 0.18216f, 0.17048f, 0.15888f, 0.14822f, 0.13785f, 0.12826f, 0.11891f, 0.11016f,
0.70614f, 0.68304f, 0.65400f, 0.62850f, 0.60424f, 0.57985f, 0.55495f, 0.53092f, 0.50671f, 0.48305f, 0.45902f, 0.43645f, 0.41315f, 0.39173f, 0.37068f, 0.35059f, 0.33162f, 0.31286f, 0.29534f, 0.27878f, 0.26263f, 0.24796f, 0.23332f, 0.21962f, 0.20663f, 0.19465f, 0.18279f, 0.17160f, 0.16118f, 0.15104f, 0.14164f, 0.13208f,
0.70978f, 0.68862f, 0.66139f, 0.63717f, 0.61414f, 0.59143f, 0.56846f, 0.54542f, 0.52211f, 0.49989f, 0.47731f, 0.45504f, 0.43352f, 0.41218f, 0.39227f, 0.37245f, 0.35421f, 0.33639f, 0.31941f, 0.30275f, 0.28712f, 0.27199f, 0.25799f, 0.24427f, 0.23147f, 0.21879f, 0.20716f, 0.19611f, 0.18534f, 0.17518f, 0.16553f, 0.15588f,
0.71478f, 0.69461f, 0.66938f, 0.64618f, 0.62412f, 0.60285f, 0.58132f, 0.55910f, 0.53711f, 0.51494f, 0.49425f, 0.47333f, 0.45290f, 0.43265f, 0.41291f, 0.39410f, 0.37624f, 0.35873f, 0.34249f, 0.32632f, 0.31088f, 0.29607f, 0.28230f, 0.26889f, 0.25622f, 0.24377f, 0.23184f, 0.22064f, 0.21005f, 0.20018f, 0.19021f, 0.18089f,
0.71955f, 0.70070f, 0.67652f, 0.65469f, 0.63411f, 0.61379f, 0.59365f, 0.57227f, 0.55184f, 0.53105f, 0.51035f, 0.49002f, 0.47031f, 0.45135f, 0.43250f, 0.41451f, 0.39705f, 0.38038f, 0.36453f, 0.34929f, 0.33447f, 0.32031f, 0.30694f, 0.29376f, 0.28119f, 0.26903f, 0.25765f, 0.24642f, 0.23605f, 0.22580f, 0.21630f, 0.20694f,
0.72541f, 0.70789f, 0.68481f, 0.66418f, 0.64427f, 0.62480f, 0.60530f, 0.58563f, 0.56577f, 0.54574f, 0.52594f, 0.50704f, 0.48812f, 0.46984f, 0.45179f, 0.43440f, 0.41775f, 0.40149f, 0.38649f, 0.37146f, 0.35737f, 0.34354f, 0.33020f, 0.31798f, 0.30606f, 0.29475f, 0.28330f, 0.27265f, 0.26226f, 0.25205f, 0.24262f, 0.23366f,
0.73110f, 0.71450f, 0.69314f, 0.67318f, 0.65409f, 0.63543f, 0.61665f, 0.59776f, 0.57875f, 0.56005f, 0.54142f, 0.52249f, 0.50438f, 0.48754f, 0.47040f, 0.45369f, 0.43725f, 0.42211f, 0.40702f, 0.39305f, 0.37945f, 0.36620f, 0.35338f, 0.34141f, 0.33004f, 0.31907f, 0.30846f, 0.29842f, 0.28818f, 0.27866f, 0.26919f, 0.26038f,
0.73750f, 0.72144f, 0.70116f, 0.68204f, 0.66379f, 0.64562f, 0.62792f, 0.61014f, 0.59193f, 0.57344f, 0.55536f, 0.53793f, 0.52063f, 0.50374f, 0.48732f, 0.47141f, 0.45633f, 0.44181f, 0.42730f, 0.41385f, 0.40059f, 0.38881f, 0.37643f, 0.36506f, 0.35431f, 0.34339f, 0.33324f, 0.32345f, 0.31425f, 0.30523f, 0.29632f, 0.28782f,
0.74339f, 0.72804f, 0.70892f, 0.69082f, 0.67367f, 0.65573f, 0.63826f, 0.62090f, 0.60355f, 0.58677f, 0.56971f, 0.55229f, 0.53567f, 0.51970f, 0.50407f, 0.48879f, 0.47446f, 0.46044f, 0.44710f, 0.43403f, 0.42174f, 0.41005f, 0.39844f, 0.38755f, 0.37756f, 0.36805f, 0.35846f, 0.34911f, 0.33962f, 0.33144f, 0.32300f, 0.31508f,
0.74973f, 0.73527f, 0.71668f, 0.69953f, 0.68291f, 0.66623f, 0.64940f, 0.63212f, 0.61545f, 0.59849f, 0.58226f, 0.56605f, 0.55034f, 0.53461f, 0.51974f, 0.50561f, 0.49191f, 0.47875f, 0.46632f, 0.45401f, 0.44209f, 0.43044f, 0.42005f, 0.40990f, 0.39997f, 0.39069f, 0.38171f, 0.37342f, 0.36523f, 0.35675f, 0.34897f, 0.34187f
};
CCL_NAMESPACE_END

View File

@ -2559,35 +2559,42 @@ void ToonBsdfNode::compile(OSLCompiler &compiler)
compiler.add(this, "node_toon_bsdf");
}
/* Velvet BSDF Closure */
/* Sheen BSDF Closure */
NODE_DEFINE(VelvetBsdfNode)
NODE_DEFINE(SheenBsdfNode)
{
NodeType *type = NodeType::add("velvet_bsdf", create, NodeType::SHADER);
NodeType *type = NodeType::add("sheen_bsdf", create, NodeType::SHADER);
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
SOCKET_IN_FLOAT(sigma, "Sigma", 1.0f);
SOCKET_IN_FLOAT(roughness, "Roughness", 1.0f);
static NodeEnum distribution_enum;
distribution_enum.insert("ashikhmin", CLOSURE_BSDF_ASHIKHMIN_VELVET_ID);
distribution_enum.insert("microfiber", CLOSURE_BSDF_SHEEN_ID);
SOCKET_ENUM(distribution, "Distribution", distribution_enum, CLOSURE_BSDF_SHEEN_ID);
SOCKET_OUT_CLOSURE(BSDF, "BSDF");
return type;
}
VelvetBsdfNode::VelvetBsdfNode() : BsdfNode(get_node_type())
SheenBsdfNode::SheenBsdfNode() : BsdfNode(get_node_type())
{
closure = CLOSURE_BSDF_ASHIKHMIN_VELVET_ID;
closure = CLOSURE_BSDF_SHEEN_ID;
}
void VelvetBsdfNode::compile(SVMCompiler &compiler)
void SheenBsdfNode::compile(SVMCompiler &compiler)
{
BsdfNode::compile(compiler, input("Sigma"), NULL);
closure = distribution;
BsdfNode::compile(compiler, input("Roughness"), NULL);
}
void VelvetBsdfNode::compile(OSLCompiler &compiler)
void SheenBsdfNode::compile(OSLCompiler &compiler)
{
compiler.add(this, "node_velvet_bsdf");
compiler.parameter(this, "distribution");
compiler.add(this, "node_sheen_bsdf");
}
/* Diffuse BSDF Closure */

View File

@ -584,11 +584,17 @@ class TransparentBsdfNode : public BsdfNode {
}
};
class VelvetBsdfNode : public BsdfNode {
class SheenBsdfNode : public BsdfNode {
public:
SHADER_NODE_CLASS(VelvetBsdfNode)
SHADER_NODE_CLASS(SheenBsdfNode)
NODE_SOCKET_API(float, sigma)
NODE_SOCKET_API(float, roughness)
NODE_SOCKET_API(ClosureType, distribution)
ClosureType get_closure_type()
{
return distribution;
}
};
class GlossyBsdfNode : public BsdfNode {

View File

@ -194,7 +194,7 @@ shader_node_categories = [
NodeItem("ShaderNodeBsdfRefraction", poll=object_eevee_cycles_shader_nodes_poll),
NodeItem("ShaderNodeBsdfGlass", poll=object_eevee_cycles_shader_nodes_poll),
NodeItem("ShaderNodeBsdfTranslucent", poll=object_eevee_cycles_shader_nodes_poll),
NodeItem("ShaderNodeBsdfVelvet", poll=object_cycles_shader_nodes_poll),
NodeItem("ShaderNodeBsdfSheen", poll=object_cycles_shader_nodes_poll),
NodeItem("ShaderNodeBsdfToon", poll=object_cycles_shader_nodes_poll),
NodeItem("ShaderNodeSubsurfaceScattering", poll=object_eevee_cycles_shader_nodes_poll),
NodeItem("ShaderNodeEmission", poll=eevee_cycles_shader_nodes_poll),

View File

@ -952,7 +952,7 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, i
#define SH_NODE_BSDF_GLASS 134
#define SH_NODE_BSDF_TRANSLUCENT 137
#define SH_NODE_BSDF_TRANSPARENT 138
#define SH_NODE_BSDF_VELVET 139
#define SH_NODE_BSDF_SHEEN 139
#define SH_NODE_EMISSION 140
#define SH_NODE_NEW_GEOMETRY 141
#define SH_NODE_LIGHT_PATH 142

View File

@ -279,6 +279,23 @@ static void version_principled_transmission_roughness(bNodeTree *ntree)
}
}
/* Convert legacy Velvet BSDF nodes into the new Sheen BSDF node. */
static void version_replace_velvet_sheen_node(bNodeTree *ntree)
{
LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
if (node->type == SH_NODE_BSDF_SHEEN) {
STRNCPY(node->idname, "ShaderNodeBsdfSheen");
bNodeSocket *sigmaInput = nodeFindSocket(node, SOCK_IN, "Sigma");
if (sigmaInput != NULL) {
node->custom1 = SHD_SHEEN_ASHIKHMIN;
STRNCPY(sigmaInput->identifier, "Roughness");
STRNCPY(sigmaInput->name, "Roughness");
}
}
}
}
void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
{
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 1)) {
@ -387,6 +404,12 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
* \note Keep this message at the bottom of the function.
*/
{
FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
if (ntree->type == NTREE_SHADER) {
}
}
FOREACH_NODETREE_END;
/* Keep this block, even when empty. */
if (!DNA_struct_elem_find(fd->filesdna, "LightProbe", "int", "grid_bake_samples")) {
@ -427,10 +450,12 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
}
}
/* Remove Transmission Roughness from Principled BSDF. */
FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
if (ntree->type == NTREE_SHADER) {
/* Remove Transmission Roughness from Principled BSDF. */
version_principled_transmission_roughness(ntree);
/* Convert legacy Velvet BSDF nodes into the new Sheen BSDF node. */
version_replace_velvet_sheen_node(ntree);
}
}
FOREACH_NODETREE_END;

View File

@ -514,6 +514,7 @@ set(GLSL_SRC
shaders/material/gpu_shader_material_separate_xyz.glsl
shaders/material/gpu_shader_material_set.glsl
shaders/material/gpu_shader_material_shader_to_rgba.glsl
shaders/material/gpu_shader_material_sheen.glsl
shaders/material/gpu_shader_material_squeeze.glsl
shaders/material/gpu_shader_material_subsurface_scattering.glsl
shaders/material/gpu_shader_material_tangent.glsl
@ -538,7 +539,6 @@ set(GLSL_SRC
shaders/material/gpu_shader_material_vector_displacement.glsl
shaders/material/gpu_shader_material_vector_math.glsl
shaders/material/gpu_shader_material_vector_rotate.glsl
shaders/material/gpu_shader_material_velvet.glsl
shaders/material/gpu_shader_material_vertex_color.glsl
shaders/material/gpu_shader_material_volume_absorption.glsl
shaders/material/gpu_shader_material_volume_principled.glsl

View File

@ -1,5 +1,5 @@
void node_bsdf_velvet(vec4 color, float roughness, vec3 N, float weight, out Closure result)
void node_bsdf_sheen(vec4 color, float roughness, vec3 N, float weight, out Closure result)
{
N = safe_normalize(N);

View File

@ -1873,6 +1873,10 @@ enum {
SHD_GLOSSY_MULTI_GGX = 4,
};
/* sheen distributions */
#define SHD_SHEEN_ASHIKHMIN 0
#define SHD_SHEEN_MICROFIBER 1
/* vector transform */
enum {
SHD_VECT_TRANSFORM_TYPE_VECTOR = 0,

View File

@ -4512,6 +4512,16 @@ static const EnumPropertyItem node_refraction_items[] = {
{0, nullptr, 0, nullptr, nullptr},
};
static const EnumPropertyItem node_sheen_items[] = {
{SHD_SHEEN_ASHIKHMIN, "ASHIKHMIN", 0, "Ashikhmin", "Classic Ashikhmin velvet (legacy model)"},
{SHD_SHEEN_MICROFIBER,
"MICROFIBER",
0,
"Microfiber",
"Microflake-based model of multiple scattering between normal-oriented fibers"},
{0, NULL, 0, NULL, NULL},
};
static const EnumPropertyItem node_toon_items[] = {
{SHD_TOON_DIFFUSE, "DIFFUSE", 0, "Diffuse", "Use diffuse BSDF"},
{SHD_TOON_GLOSSY, "GLOSSY", 0, "Glossy", "Use glossy BSDF"},
@ -5985,6 +5995,17 @@ static void def_glass(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
static void def_sheen(StructRNA *srna)
{
PropertyRNA *prop;
prop = RNA_def_property(srna, "distribution", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
RNA_def_property_enum_items(prop, node_sheen_items);
RNA_def_property_ui_text(prop, "Distribution", "Sheen shading model");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
static void def_principled(StructRNA *srna)
{
PropertyRNA *prop;

View File

@ -68,7 +68,7 @@ DefNode(ShaderNode, SH_NODE_BSDF_GLASS, def_glass, "BSD
DefNode(ShaderNode, SH_NODE_BSDF_REFRACTION, def_refraction, "BSDF_REFRACTION", BsdfRefraction, "Refraction BSDF", "Glossy refraction with sharp or microfacet distribution, typically used for materials that transmit light")
DefNode(ShaderNode, SH_NODE_BSDF_TRANSLUCENT, 0, "BSDF_TRANSLUCENT", BsdfTranslucent, "Translucent BSDF", "Lambertian diffuse transmission")
DefNode(ShaderNode, SH_NODE_BSDF_TRANSPARENT, 0, "BSDF_TRANSPARENT", BsdfTransparent, "Transparent BSDF", "Transparency without refraction, passing straight through the surface as if there were no geometry")
DefNode(ShaderNode, SH_NODE_BSDF_VELVET, 0, "BSDF_VELVET", BsdfVelvet, "Velvet BSDF", "Reflection for materials such as cloth.\nTypically mixed with other shaders (such as a Diffuse Shader) and is not particularly useful on its own")
DefNode(ShaderNode, SH_NODE_BSDF_SHEEN, def_sheen, "BSDF_SHEEN", BsdfSheen, "Sheen BSDF", "Reflection for materials such as cloth.\nTypically mixed with other shaders (such as a Diffuse Shader) and is not particularly useful on its own")
DefNode(ShaderNode, SH_NODE_BSDF_TOON, def_toon, "BSDF_TOON", BsdfToon, "Toon BSDF", "Diffuse and Glossy shaders with cartoon light effects")
DefNode(ShaderNode, SH_NODE_BSDF_HAIR, def_hair, "BSDF_HAIR", BsdfHair, "Hair BSDF", "Reflection and transmission shaders optimized for hair rendering")
DefNode(ShaderNode, SH_NODE_BSDF_HAIR_PRINCIPLED, def_hair_principled, "BSDF_HAIR_PRINCIPLED", BsdfHairPrincipled, "Principled Hair BSDF", "Physically-based, easy-to-use shader for rendering hair and fur")

View File

@ -33,10 +33,10 @@ set(SRC
nodes/node_shader_bsdf_hair_principled.cc
nodes/node_shader_bsdf_principled.cc
nodes/node_shader_bsdf_refraction.cc
nodes/node_shader_bsdf_sheen.cc
nodes/node_shader_bsdf_toon.cc
nodes/node_shader_bsdf_translucent.cc
nodes/node_shader_bsdf_transparent.cc
nodes/node_shader_bsdf_velvet.cc
nodes/node_shader_bump.cc
nodes/node_shader_camera.cc
nodes/node_shader_clamp.cc

View File

@ -29,7 +29,7 @@ void register_shader_nodes()
register_node_type_sh_bsdf_toon();
register_node_type_sh_bsdf_translucent();
register_node_type_sh_bsdf_transparent();
register_node_type_sh_bsdf_velvet();
register_node_type_sh_bsdf_sheen();
register_node_type_sh_bump();
register_node_type_sh_camera();
register_node_type_sh_clamp();

View File

@ -25,7 +25,7 @@ void register_node_type_sh_bsdf_refraction();
void register_node_type_sh_bsdf_toon();
void register_node_type_sh_bsdf_translucent();
void register_node_type_sh_bsdf_transparent();
void register_node_type_sh_bsdf_velvet();
void register_node_type_sh_bsdf_sheen();
void register_node_type_sh_bump();
void register_node_type_sh_camera();
void register_node_type_sh_clamp();

View File

@ -893,7 +893,7 @@ static void ntree_shader_weight_tree_invert(bNodeTree *ntree, bNode *output_node
case SH_NODE_BSDF_TOON:
case SH_NODE_BSDF_TRANSLUCENT:
case SH_NODE_BSDF_TRANSPARENT:
case SH_NODE_BSDF_VELVET:
case SH_NODE_BSDF_SHEEN:
case SH_NODE_EEVEE_SPECULAR:
case SH_NODE_EMISSION:
case SH_NODE_HOLDOUT:
@ -950,7 +950,7 @@ static bool closure_node_filter(const bNode *node)
case SH_NODE_BSDF_TOON:
case SH_NODE_BSDF_TRANSLUCENT:
case SH_NODE_BSDF_TRANSPARENT:
case SH_NODE_BSDF_VELVET:
case SH_NODE_BSDF_SHEEN:
case SH_NODE_EEVEE_SPECULAR:
case SH_NODE_EMISSION:
case SH_NODE_HOLDOUT:

View File

@ -0,0 +1,67 @@
/* SPDX-FileCopyrightText: 2005 Blender Foundation
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "node_shader_util.hh"
#include "UI_interface.h"
#include "UI_resources.h"
namespace blender::nodes::node_shader_bsdf_sheen_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Color>("Color").default_value({0.8f, 0.8f, 0.8f, 1.0f});
b.add_input<decl::Float>("Roughness")
.default_value(0.5f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR);
b.add_input<decl::Vector>("Normal").hide_value();
b.add_input<decl::Float>("Weight").unavailable();
b.add_output<decl::Shader>("BSDF");
}
static void node_shader_buts_sheen(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
{
uiItemR(layout, ptr, "distribution", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE);
}
static void node_shader_init_sheen(bNodeTree * /*ntree*/, bNode *node)
{
node->custom1 = SHD_SHEEN_MICROFIBER;
}
static int node_shader_gpu_bsdf_sheen(GPUMaterial *mat,
bNode *node,
bNodeExecData * /*execdata*/,
GPUNodeStack *in,
GPUNodeStack *out)
{
if (!in[2].link) {
GPU_link(mat, "world_normals_get", &in[2].link);
}
GPU_material_flag_set(mat, GPU_MATFLAG_DIFFUSE);
return GPU_stack_link(mat, node, "node_bsdf_sheen", in, out);
}
} // namespace blender::nodes::node_shader_bsdf_sheen_cc
/* node type definition */
void register_node_type_sh_bsdf_sheen()
{
namespace file_ns = blender::nodes::node_shader_bsdf_sheen_cc;
static bNodeType ntype;
sh_node_type_base(&ntype, SH_NODE_BSDF_SHEEN, "Sheen BSDF", NODE_CLASS_SHADER);
ntype.add_ui_poll = object_cycles_shader_nodes_poll;
ntype.declare = file_ns::node_declare;
ntype.initfunc = file_ns::node_shader_init_sheen;
ntype.gpu_fn = file_ns::node_shader_gpu_bsdf_sheen;
ntype.draw_buttons = file_ns::node_shader_buts_sheen;
nodeRegisterType(&ntype);
}

View File

@ -1,48 +0,0 @@
/* SPDX-FileCopyrightText: 2005 Blender Foundation
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "node_shader_util.hh"
namespace blender::nodes::node_shader_bsdf_velvet_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Color>("Color").default_value({0.8f, 0.8f, 0.8f, 1.0f});
b.add_input<decl::Float>("Sigma").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_input<decl::Vector>("Normal").hide_value();
b.add_input<decl::Float>("Weight").unavailable();
b.add_output<decl::Shader>("BSDF");
}
static int node_shader_gpu_bsdf_velvet(GPUMaterial *mat,
bNode *node,
bNodeExecData * /*execdata*/,
GPUNodeStack *in,
GPUNodeStack *out)
{
if (!in[2].link) {
GPU_link(mat, "world_normals_get", &in[2].link);
}
GPU_material_flag_set(mat, GPU_MATFLAG_DIFFUSE);
return GPU_stack_link(mat, node, "node_bsdf_velvet", in, out);
}
} // namespace blender::nodes::node_shader_bsdf_velvet_cc
/* node type definition */
void register_node_type_sh_bsdf_velvet()
{
namespace file_ns = blender::nodes::node_shader_bsdf_velvet_cc;
static bNodeType ntype;
sh_node_type_base(&ntype, SH_NODE_BSDF_VELVET, "Velvet BSDF", NODE_CLASS_SHADER);
ntype.add_ui_poll = object_cycles_shader_nodes_poll;
ntype.declare = file_ns::node_declare;
ntype.gpu_fn = file_ns::node_shader_gpu_bsdf_velvet;
nodeRegisterType(&ntype);
}