[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