[Bf-blender-cvs] [131c5d46d92] hair_guides_grooming: Nicer return value for interpolation function in a struct.

Lukas Tönne noreply at git.blender.org
Wed Jun 13 21:15:44 CEST 2018


Commit: 131c5d46d92f9163111e2c90b1105f76aac28c2c
Author: Lukas Tönne
Date:   Wed Jun 13 20:15:26 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rB131c5d46d92f9163111e2c90b1105f76aac28c2c

Nicer return value for interpolation function in a struct.

===================================================================

M	source/blender/draw/modes/shaders/common_hair_guides_lib.glsl

===================================================================

diff --git a/source/blender/draw/modes/shaders/common_hair_guides_lib.glsl b/source/blender/draw/modes/shaders/common_hair_guides_lib.glsl
index 67399698e53..86afcc67827 100644
--- a/source/blender/draw/modes/shaders/common_hair_guides_lib.glsl
+++ b/source/blender/draw/modes/shaders/common_hair_guides_lib.glsl
@@ -215,12 +215,28 @@ void get_fiber_data(int fiber_index, out ivec4 parent_index, out vec4 parent_wei
 	pos = vec3(e.rg, f.r);
 }
 
-void interpolate_parent_curve(int index, float curve_param, out vec3 co, out vec3 nor, out vec3 tang, out vec3 rootco, out DeformParams deform_params)
+struct ParentCurveResult
 {
+	vec3 co;
+	vec3 nor;
+	vec3 tang;
+
+	// Only needed for the primary parent curve
+	vec3 rootco;
+	DeformParams deform_params;
+};
+
+bool interpolate_parent_curve(int index, float curve_param, out ParentCurveResult result)
+{
+	if (index == INDEX_INVALID)
+	{
+		return false;
+	}
+
 	int start, count;
-	get_strand_data(index, start, count, deform_params);
-	
-	get_strand_root(start, rootco);
+	get_strand_data(index, start, count, result.deform_params);
+
+	get_strand_root(start, result.rootco);
 	
 #if 0 // Don't have to worry about out-of-bounds segment here, as long as lerpfac becomes 0.0 when curve_param==1.0
 	float maxlen = float(count - 1);
@@ -239,9 +255,11 @@ void interpolate_parent_curve(int index, float curve_param, out vec3 co, out vec
 	get_strand_vertex(start + segment, co0, nor0, tang0);
 	get_strand_vertex(start + segment + 1, co1, nor1, tang1);
 	
-	co = mix(co0, co1, lerpfac) - rootco;
-	nor = mix(nor0, nor1, lerpfac);
-	tang = mix(tang0, tang1, lerpfac);
+	result.co = mix(co0, co1, lerpfac) - result.rootco;
+	result.nor = mix(nor0, nor1, lerpfac);
+	result.tang = mix(tang0, tang1, lerpfac);
+
+	return true;
 }
 
 void interpolate_vertex(int fiber_index, float curve_param,
@@ -257,38 +275,32 @@ void interpolate_vertex(int fiber_index, float curve_param,
 	vec3 rootco;
 	get_fiber_data(fiber_index, parent_index, parent_weight, rootco);
 
-	if (parent_index.x != INDEX_INVALID) {
-		vec3 pco, pnor, ptang, prootco;
-		interpolate_parent_curve(parent_index.x, curve_param, pco, pnor, ptang, prootco, deform_params);
-		co += parent_weight.x * pco;
-		tang += parent_weight.x * normalize(ptang);
-
-		target_matrix = mat4_from_vectors(pnor, ptang, pco + prootco);
+	ParentCurveResult p1, p2, p3, p4;
+	if (interpolate_parent_curve(parent_index.x, curve_param, p1))
+	{
+		co += parent_weight.x * p1.co;
+		tang += parent_weight.x * normalize(p1.tang);
 	}
-	if (parent_index.y != INDEX_INVALID) {
-		vec3 pco, pnor, ptang, prootco;
-		DeformParams pdeform_params;
-		interpolate_parent_curve(parent_index.y, curve_param, pco, pnor, ptang, prootco, pdeform_params);
-		co += parent_weight.y * pco;
-		tang += parent_weight.y * normalize(ptang);
+	if (interpolate_parent_curve(parent_index.y, curve_param, p2))
+	{
+		co += parent_weight.y * p2.co;
+		tang += parent_weight.y * normalize(p2.tang);
 	}
-	if (parent_index.z != INDEX_INVALID) {
-		vec3 pco, pnor, ptang, prootco;
-		DeformParams pdeform_params;
-		interpolate_parent_curve(parent_index.z, curve_param, pco, pnor, ptang, prootco, pdeform_params);
-		co += parent_weight.z * pco;
-		tang += parent_weight.z * normalize(ptang);
+	if (interpolate_parent_curve(parent_index.z, curve_param, p3))
+	{
+		co += parent_weight.z * p3.co;
+		tang += parent_weight.z * normalize(p3.tang);
 	}
-	if (parent_index.w != INDEX_INVALID) {
-		vec3 pco, pnor, ptang, prootco;
-		DeformParams pdeform_params;
-		interpolate_parent_curve(parent_index.w, curve_param, pco, pnor, ptang, prootco, pdeform_params);
-		co += parent_weight.w * pco;
-		tang += parent_weight.w * normalize(ptang);
+	if (interpolate_parent_curve(parent_index.w, curve_param, p4))
+	{
+		co += parent_weight.w * p4.co;
+		tang += parent_weight.w * normalize(p4.tang);
 	}
 	
 	co += rootco;
 	tang = normalize(tang);
+	target_matrix = mat4_from_vectors(p1.nor, p1.tang, p1.co + p1.rootco);
+	deform_params = p1.deform_params;
 }
 
 void hair_fiber_get_vertex(



More information about the Bf-blender-cvs mailing list