[Bf-blender-cvs] [abfca9375c6] soc-2018-hair-shader: Cleanup: keep BSDF local frame computation out of curve code.
Brecht Van Lommel
noreply at git.blender.org
Sun May 27 01:40:40 CEST 2018
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 */
More information about the Bf-blender-cvs
mailing list