[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