Welcome to mirror list, hosted at ThFree Co, Russian Federation.

workbench_curvature_lib.glsl « shaders « workbench « engines « draw « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 22dc906be83f957b94d35021a3fb428b84d08b5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef CURVATURE_OFFSET
#  define CURVATURE_OFFSET 1
#endif

float curvature_soft_clamp(float curvature, float control)
{
  if (curvature < 0.5 / control) {
    return curvature * (1.0 - curvature * control);
  }
  return 0.25 / control;
}

float calculate_curvature(
    usampler2D objectId, sampler2D normalBuffer, ivec2 texel, float ridge, float valley)
{
  uint object_up = texelFetchOffset(objectId, texel, 0, ivec2(0, CURVATURE_OFFSET)).r;
  uint object_down = texelFetchOffset(objectId, texel, 0, ivec2(0, -CURVATURE_OFFSET)).r;
  uint object_left = texelFetchOffset(objectId, texel, 0, ivec2(-CURVATURE_OFFSET, 0)).r;
  uint object_right = texelFetchOffset(objectId, texel, 0, ivec2(CURVATURE_OFFSET, 0)).r;

  if ((object_up != object_down) || (object_right != object_left)) {
    return 0.0;
  }

  vec2 normal_up = texelFetchOffset(normalBuffer, texel, 0, ivec2(0, CURVATURE_OFFSET)).rg;
  vec2 normal_down = texelFetchOffset(normalBuffer, texel, 0, ivec2(0, -CURVATURE_OFFSET)).rg;
  vec2 normal_left = texelFetchOffset(normalBuffer, texel, 0, ivec2(-CURVATURE_OFFSET, 0)).rg;
  vec2 normal_right = texelFetchOffset(normalBuffer, texel, 0, ivec2(CURVATURE_OFFSET, 0)).rg;

  normal_up = workbench_normal_decode(normal_up).rg;
  normal_down = workbench_normal_decode(normal_down).rg;
  normal_left = workbench_normal_decode(normal_left).rg;
  normal_right = workbench_normal_decode(normal_right).rg;

  float normal_diff = ((normal_up.g - normal_down.g) + (normal_right.r - normal_left.r));

  if (normal_diff < 0) {
    return -2.0 * curvature_soft_clamp(-normal_diff, valley);
  }

  return 2.0 * curvature_soft_clamp(normal_diff, ridge);
}