From b220ec27d7db68aca9a8c500ecd8c99efcdecbc5 Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Mon, 24 Jul 2023 15:36:36 +0200 Subject: [PATCH] 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 --- intern/cycles/blender/shader.cpp | 14 ++- intern/cycles/kernel/CMakeLists.txt | 1 + intern/cycles/kernel/closure/bsdf.h | 15 +++ intern/cycles/kernel/closure/bsdf_sheen.h | 104 ++++++++++++++++++ intern/cycles/kernel/osl/closures_setup.h | 25 +++++ intern/cycles/kernel/osl/closures_template.h | 5 + .../cycles/kernel/osl/shaders/CMakeLists.txt | 2 +- .../kernel/osl/shaders/node_sheen_bsdf.osl | 19 ++++ .../kernel/osl/shaders/node_velvet_bsdf.osl | 15 --- intern/cycles/kernel/osl/shaders/stdcycles.h | 1 + intern/cycles/kernel/svm/closure.h | 13 +++ intern/cycles/kernel/svm/types.h | 1 + intern/cycles/kernel/types.h | 2 +- intern/cycles/scene/shader.cpp | 1 + intern/cycles/scene/shader.tables | 101 +++++++++++++++++ intern/cycles/scene/shader_nodes.cpp | 27 +++-- intern/cycles/scene/shader_nodes.h | 12 +- scripts/startup/nodeitems_builtins.py | 2 +- source/blender/blenkernel/BKE_node.h | 2 +- .../blenloader/intern/versioning_400.cc | 27 ++++- source/blender/gpu/CMakeLists.txt | 2 +- ...et.glsl => gpu_shader_material_sheen.glsl} | 2 +- source/blender/makesdna/DNA_node_types.h | 4 + .../blender/makesrna/intern/rna_nodetree.cc | 21 ++++ source/blender/nodes/NOD_static_types.h | 2 +- source/blender/nodes/shader/CMakeLists.txt | 2 +- .../nodes/shader/node_shader_register.cc | 2 +- .../nodes/shader/node_shader_register.hh | 2 +- .../blender/nodes/shader/node_shader_tree.cc | 4 +- .../shader/nodes/node_shader_bsdf_sheen.cc | 67 +++++++++++ .../shader/nodes/node_shader_bsdf_velvet.cc | 48 -------- 31 files changed, 454 insertions(+), 91 deletions(-) create mode 100644 intern/cycles/kernel/closure/bsdf_sheen.h create mode 100644 intern/cycles/kernel/osl/shaders/node_sheen_bsdf.osl delete mode 100644 intern/cycles/kernel/osl/shaders/node_velvet_bsdf.osl rename source/blender/gpu/shaders/material/{gpu_shader_material_velvet.glsl => gpu_shader_material_sheen.glsl} (72%) create mode 100644 source/blender/nodes/shader/nodes/node_shader_bsdf_sheen.cc delete mode 100644 source/blender/nodes/shader/nodes/node_shader_bsdf_velvet.cc diff --git a/intern/cycles/blender/shader.cpp b/intern/cycles/blender/shader.cpp index d643c5ebf85..e6315b0820f 100644 --- a/intern/cycles/blender/shader.cpp +++ b/intern/cycles/blender/shader.cpp @@ -661,8 +661,18 @@ static ShaderNode *add_node(Scene *scene, else if (b_node.is_a(&RNA_ShaderNodeBsdfTransparent)) { node = graph->create_node(); } - else if (b_node.is_a(&RNA_ShaderNodeBsdfVelvet)) { - node = graph->create_node(); + else if (b_node.is_a(&RNA_ShaderNodeBsdfSheen)) { + BL::ShaderNodeBsdfSheen b_sheen_node(b_node); + SheenBsdfNode *sheen = graph->create_node(); + 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(); diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index c2a7781c46f..53c92e0bab7 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -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 diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h index 7384064678c..00e238d296e 100644 --- a/intern/cycles/kernel/closure/bsdf.h +++ b/intern/cycles/kernel/closure/bsdf.h @@ -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; diff --git a/intern/cycles/kernel/closure/bsdf_sheen.h b/intern/cycles/kernel/closure/bsdf_sheen.h new file mode 100644 index 00000000000..a546ab28942 --- /dev/null +++ b/intern/cycles/kernel/closure/bsdf_sheen.h @@ -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 diff --git a/intern/cycles/kernel/osl/closures_setup.h b/intern/cycles/kernel/osl/closures_setup.h index f6359f6823a..d929e77d246 100644 --- a/intern/cycles/kernel/osl/closures_setup.h +++ b/intern/cycles/kernel/osl/closures_setup.h @@ -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, diff --git a/intern/cycles/kernel/osl/closures_template.h b/intern/cycles/kernel/osl/closures_template.h index b20a13e1c66..c6d6e755542 100644 --- a/intern/cycles/kernel/osl/closures_template.h +++ b/intern/cycles/kernel/osl/closures_template.h @@ -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) diff --git a/intern/cycles/kernel/osl/shaders/CMakeLists.txt b/intern/cycles/kernel/osl/shaders/CMakeLists.txt index 33eb149d71d..766277d248c 100644 --- a/intern/cycles/kernel/osl/shaders/CMakeLists.txt +++ b/intern/cycles/kernel/osl/shaders/CMakeLists.txt @@ -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 diff --git a/intern/cycles/kernel/osl/shaders/node_sheen_bsdf.osl b/intern/cycles/kernel/osl/shaders/node_sheen_bsdf.osl new file mode 100644 index 00000000000..5b348514d7b --- /dev/null +++ b/intern/cycles/kernel/osl/shaders/node_sheen_bsdf.osl @@ -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); +} diff --git a/intern/cycles/kernel/osl/shaders/node_velvet_bsdf.osl b/intern/cycles/kernel/osl/shaders/node_velvet_bsdf.osl deleted file mode 100644 index 07950e8830f..00000000000 --- a/intern/cycles/kernel/osl/shaders/node_velvet_bsdf.osl +++ /dev/null @@ -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); -} diff --git a/intern/cycles/kernel/osl/shaders/stdcycles.h b/intern/cycles/kernel/osl/shaders/stdcycles.h index c72af45bd4a..0e9036a286b 100644 --- a/intern/cycles/kernel/osl/shaders/stdcycles.h +++ b/intern/cycles/kernel/osl/shaders/stdcycles.h @@ -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; diff --git a/intern/cycles/kernel/svm/closure.h b/intern/cycles/kernel/svm/closure.h index 53200152edd..39844158fce 100644 --- a/intern/cycles/kernel/svm/closure.h +++ b/intern/cycles/kernel/svm/closure.h @@ -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)) diff --git a/intern/cycles/kernel/svm/types.h b/intern/cycles/kernel/svm/types.h index feee44b7e6c..b22a7737775 100644 --- a/intern/cycles/kernel/svm/types.h +++ b/intern/cycles/kernel/svm/types.h @@ -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, diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h index 42aaa09a588..a32dd6d97f8 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -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); diff --git a/intern/cycles/scene/shader.cpp b/intern/cycles/scene/shader.cpp index a9ee192d1ea..789dfbd9d66 100644 --- a/intern/cycles/scene/shader.cpp +++ b/intern/cycles/scene/shader.cpp @@ -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; diff --git a/intern/cycles/scene/shader.tables b/intern/cycles/scene/shader.tables index bbd4c5cae42..3c38d72be8b 100644 --- a/intern/cycles/scene/shader.tables +++ b/intern/cycles/scene/shader.tables @@ -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 diff --git a/intern/cycles/scene/shader_nodes.cpp b/intern/cycles/scene/shader_nodes.cpp index 923e7b52a91..e463c0a0f81 100644 --- a/intern/cycles/scene/shader_nodes.cpp +++ b/intern/cycles/scene/shader_nodes.cpp @@ -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 */ diff --git a/intern/cycles/scene/shader_nodes.h b/intern/cycles/scene/shader_nodes.h index 14b2c1b0fee..82909cbdf30 100644 --- a/intern/cycles/scene/shader_nodes.h +++ b/intern/cycles/scene/shader_nodes.h @@ -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 { diff --git a/scripts/startup/nodeitems_builtins.py b/scripts/startup/nodeitems_builtins.py index 5aa1c96c212..df5d62af348 100644 --- a/scripts/startup/nodeitems_builtins.py +++ b/scripts/startup/nodeitems_builtins.py @@ -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), diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 9b5595c1227..3aa805d6669 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -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 diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index c2ff647f595..7ecd431a9e2 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -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; diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 4bbbc95a859..b6ec95d7663 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -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 diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_velvet.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_sheen.glsl similarity index 72% rename from source/blender/gpu/shaders/material/gpu_shader_material_velvet.glsl rename to source/blender/gpu/shaders/material/gpu_shader_material_sheen.glsl index 97726bfe66f..5a6af3133a3 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_velvet.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_sheen.glsl @@ -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); diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 12b9d81b0d2..a0d5e96a816 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -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, diff --git a/source/blender/makesrna/intern/rna_nodetree.cc b/source/blender/makesrna/intern/rna_nodetree.cc index 03572c1cf40..290df6b7bed 100644 --- a/source/blender/makesrna/intern/rna_nodetree.cc +++ b/source/blender/makesrna/intern/rna_nodetree.cc @@ -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; diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 6387722e390..7085fca48d6 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -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") diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 2bdaad06eaf..a73b2ce6097 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -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 diff --git a/source/blender/nodes/shader/node_shader_register.cc b/source/blender/nodes/shader/node_shader_register.cc index 5e8f12924f8..a3557e96f47 100644 --- a/source/blender/nodes/shader/node_shader_register.cc +++ b/source/blender/nodes/shader/node_shader_register.cc @@ -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(); diff --git a/source/blender/nodes/shader/node_shader_register.hh b/source/blender/nodes/shader/node_shader_register.hh index 47b3e8977df..86bf20efc50 100644 --- a/source/blender/nodes/shader/node_shader_register.hh +++ b/source/blender/nodes/shader/node_shader_register.hh @@ -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(); diff --git a/source/blender/nodes/shader/node_shader_tree.cc b/source/blender/nodes/shader/node_shader_tree.cc index 0c2585b9c60..ade210e9c3b 100644 --- a/source/blender/nodes/shader/node_shader_tree.cc +++ b/source/blender/nodes/shader/node_shader_tree.cc @@ -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: diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_sheen.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_sheen.cc new file mode 100644 index 00000000000..b45005db8e6 --- /dev/null +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_sheen.cc @@ -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("Color").default_value({0.8f, 0.8f, 0.8f, 1.0f}); + b.add_input("Roughness") + .default_value(0.5f) + .min(0.0f) + .max(1.0f) + .subtype(PROP_FACTOR); + b.add_input("Normal").hide_value(); + b.add_input("Weight").unavailable(); + b.add_output("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); +} diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_velvet.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_velvet.cc deleted file mode 100644 index 27f963a20f3..00000000000 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_velvet.cc +++ /dev/null @@ -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("Color").default_value({0.8f, 0.8f, 0.8f, 1.0f}); - b.add_input("Sigma").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); - b.add_input("Normal").hide_value(); - b.add_input("Weight").unavailable(); - b.add_output("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); -}