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

Reply via email to