Commit: abfca9375c6ae75320b7538d547545350ad47c85 Author: Brecht Van Lommel Date: Sat May 26 23:00:51 2018 +0200 Branches: soc-2018-hair-shader https://developer.blender.org/rBabfca9375c6ae75320b7538d547545350ad47c85
Cleanup: keep BSDF local frame computation out of curve code. =================================================================== M intern/cycles/kernel/closure/bsdf_hair_principled.h M intern/cycles/kernel/geom/geom_curve.h =================================================================== diff --git a/intern/cycles/kernel/closure/bsdf_hair_principled.h b/intern/cycles/kernel/closure/bsdf_hair_principled.h index c17294b90d6..791f0ab32aa 100644 --- a/intern/cycles/kernel/closure/bsdf_hair_principled.h +++ b/intern/cycles/kernel/closure/bsdf_hair_principled.h @@ -158,10 +158,15 @@ ccl_device int bsdf_principled_hair_setup(KernelGlobals *kg, ShaderData *sd, Pri bsdf->v = sqr(0.726f*bsdf->v + 0.812f*sqr(bsdf->v) + 3.700f*pow20(bsdf->v)); bsdf->s = (0.265f*bsdf->s + 1.194f*sqr(bsdf->s) + 5.372f*pow22(bsdf->s))*M_SQRT_PI_8_F; - float3 dPdCD, curve_P; - float h = curve_core_distance(kg, sd, &curve_P, &dPdCD); + float curve_r; + float3 curve_P = curve_center(kg, sd, &curve_r); + float3 dPdCD = normalize(cross(sd->dPdu, sd->I)); + float h = safe_divide(dot(dPdCD, sd->P - curve_P), curve_r); + + assert(isfinite3_safe(dPdCD)); assert(isfinite_safe(h)); - dPdCD = normalize(dPdCD); + assert(fabsf(h) <= 2.0f); + bsdf->geom = make_float4(dPdCD.x, dPdCD.y, dPdCD.z, h); return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_NEEDS_LCG; diff --git a/intern/cycles/kernel/geom/geom_curve.h b/intern/cycles/kernel/geom/geom_curve.h index 887f1927a94..f947106f17b 100644 --- a/intern/cycles/kernel/geom/geom_curve.h +++ b/intern/cycles/kernel/geom/geom_curve.h @@ -126,10 +126,13 @@ ccl_device float3 curve_attribute_float3(KernelGlobals *kg, const ShaderData *sd } } -ccl_device float curve_core_distance(KernelGlobals *kg, ShaderData *sd, float3 *curve_P, float3 *dPdCD) +/* Curve center point and radius corresponding to shading position. */ + +ccl_device float3 curve_center(KernelGlobals *kg, ShaderData *sd, float *radius) { if((sd->type & PRIMITIVE_ALL_CURVE) == 0) { - return 0.0f; + *radius = 0.0f; + return sd->P; } assert(isfinite3_safe(sd->P)); @@ -139,7 +142,6 @@ ccl_device float curve_core_distance(KernelGlobals *kg, ShaderData *sd, float3 * int k0 = __float_as_int(curvedata.x) + PRIMITIVE_UNPACK_SEGMENT(sd->type); int k1 = k0 + 1; - float curve_r; if(flag & CURVE_KN_INTERPOLATE) { int ka = max(k0 - 1, __float_as_int(curvedata.x)); int kb = min(k1 + 1, __float_as_int(curvedata.x) + __float_as_int(curvedata.y) - 1); @@ -155,12 +157,12 @@ ccl_device float curve_core_distance(KernelGlobals *kg, ShaderData *sd, float3 * motion_cardinal_curve_keys(kg, sd->object, sd->prim, sd->time, ka, k0, k1, kb, P_curve); } - *curve_P = curvepoint(sd->u, - float4_to_float3(P_curve[0]), - float4_to_float3(P_curve[1]), - float4_to_float3(P_curve[2]), - float4_to_float3(P_curve[3])); - curve_r = mix(P_curve[1].w, P_curve[2].w, sd->u); + *radius = mix(P_curve[1].w, P_curve[2].w, sd->u); + return curvepoint(sd->u, + float4_to_float3(P_curve[0]), + float4_to_float3(P_curve[1]), + float4_to_float3(P_curve[2]), + float4_to_float3(P_curve[3])); } else { float4 P_curve[2]; @@ -171,14 +173,10 @@ ccl_device float curve_core_distance(KernelGlobals *kg, ShaderData *sd, float3 * else { motion_curve_keys(kg, sd->object, sd->prim, sd->time, k0, k1, P_curve); } - *curve_P = mix(float4_to_float3(P_curve[0]), float4_to_float3(P_curve[1]), sd->u); - curve_r = mix(P_curve[0].w, P_curve[1].w, sd->u); - } - *dPdCD = normalize(cross(sd->dPdu, sd->I)); - float h = dot(*dPdCD, sd->P - *curve_P)/curve_r; - assert(fabsf(h) <= 2.f); - return h; + *radius = mix(P_curve[0].w, P_curve[1].w, sd->u); + return mix(float4_to_float3(P_curve[0]), float4_to_float3(P_curve[1]), sd->u); + } } /* Curve thickness */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs