Commit: 007a2e09c08e552f96650dc148d5b054775e26d2
Author: Lukas Tönne
Date:   Tue Jul 12 13:00:46 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB007a2e09c08e552f96650dc148d5b054775e26d2

Common control curve interpolation utility function.

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

M       source/blender/gpu/shaders/gpu_shader_strand_geom.glsl
M       source/blender/gpu/shaders/gpu_shader_strand_util.glsl
M       source/blender/gpu/shaders/gpu_shader_strand_vert.glsl

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

diff --git a/source/blender/gpu/shaders/gpu_shader_strand_geom.glsl 
b/source/blender/gpu/shaders/gpu_shader_strand_geom.glsl
index a5ccb80..35019fd 100644
--- a/source/blender/gpu/shaders/gpu_shader_strand_geom.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_strand_geom.glsl
@@ -86,15 +86,13 @@ void main()
                        if (!valid[k])
                                continue;
 
-                       int ci0 = min(int(t[k]), num_cverts[k] - 2);
-                       int ci1 = ci0 + 1;
-                       float lambda = t[k] - float(ci0);
-                       /* XXX could use texture filtering to do this for us? */
-                       vec3 next_cloc0 = texelFetch(control_points, 
cvert_begin[k] + ci0).xyz;
-                       vec3 next_cloc1 = texelFetch(control_points, 
cvert_begin[k] + ci1).xyz;
-                       vec3 next_cloc = mix(next_cloc0, next_cloc1, lambda) + 
offset[k];
-
-                       next_loc += weight[k] * next_cloc;
+                       vec3 cloc;
+                       vec3 ctangent;
+                       mat3 cframe;
+                       interpolate_control_curve(control_points, 
control_normals, control_tangents,
+                                                     t[k], cvert_begin[k], 
num_cverts[k], cloc, ctangent, cframe);
+
+                       next_loc += weight[k] * cloc;
                        t[k] += dt[k];
                }
 
diff --git a/source/blender/gpu/shaders/gpu_shader_strand_util.glsl 
b/source/blender/gpu/shaders/gpu_shader_strand_util.glsl
index 433e24d..ca06166 100644
--- a/source/blender/gpu/shaders/gpu_shader_strand_util.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_strand_util.glsl
@@ -4,3 +4,23 @@ mat3 mat3_emu(mat4 m4) {
       m4[1][0], m4[1][1], m4[1][2],
       m4[2][0], m4[2][1], m4[2][2]);
 }
+
+void interpolate_control_curve(in samplerBuffer control_points,
+                                  in samplerBuffer control_normals,
+                                  in samplerBuffer control_tangents,
+                                  in float param, in int verts_begin, in int 
num_verts,
+                                  out vec3 loc, out vec3 tangent, out mat3 
frame)
+{
+       int idx0 = min(int(param), num_verts - 2);
+       int idx1 = idx0 + 1;
+       float lambda = param - float(idx0);
+       vec3 loc0 = texelFetch(control_points, verts_begin + idx0).xyz;
+       vec3 loc1 = texelFetch(control_points, verts_begin + idx1).xyz;
+       
+       /* XXX could use texture filtering to do this for us? */
+       loc = mix(loc0, loc1, lambda);
+       tangent = loc1 - loc0;
+       frame = mat3(1.0, 0.0, 0.0,
+                        0.0, 1.0, 0.0,
+                        0.0, 0.0, 1.0);
+}
diff --git a/source/blender/gpu/shaders/gpu_shader_strand_vert.glsl 
b/source/blender/gpu/shaders/gpu_shader_strand_vert.glsl
index 7a6c868..7034e1a 100644
--- a/source/blender/gpu/shaders/gpu_shader_strand_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_strand_vert.glsl
@@ -57,22 +57,21 @@ void main()
                uvec2 curve = texelFetch(control_curves, 
int(control_index[k])).xy;
                int verts_begin = int(curve.x);
                int num_verts = int(curve.y);
+               float segment = curve_param * float(num_verts);
 
                vec3 croot = texelFetch(control_points, verts_begin).xyz;
                vec3 offset = root - croot;
                if (k == 0)
                        offset0 = offset;
 
-               float segment = curve_param * float(num_verts);
-               int idx0 = min(int(segment), num_verts - 2);
-               int idx1 = idx0 + 1;
-               float lambda = segment - float(idx0);
-               vec3 cloc0 = texelFetch(control_points, verts_begin + idx0).xyz;
-               vec3 cloc1 = texelFetch(control_points, verts_begin + idx1).xyz;
-               vec3 cloc = mix(cloc0, cloc1, lambda) + offset;
+               vec3 cloc;
+               vec3 ctangent;
+               mat3 cframe;
+               interpolate_control_curve(control_points, control_normals, 
control_tangents,
+                                             segment, verts_begin, num_verts, 
cloc, ctangent, cframe);
 
-               loc += control_weight[k] * cloc;
-               tangent += control_weight[k] * (cloc1 - cloc0);
+               loc += control_weight[k] * (cloc + offset);
+               tangent += control_weight[k] * ctangent;
        }
 
        displace_vertex(loc, curve_param, offset0, mat3(1.0, 0.0, 0.0, 0.0, 
1.0, 0.0, 0.0, 0.0, 1.0), vec2(0.0, 0.0));

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to