Commit: 8c3a98e5834ded791f1c1ff18f4dd74f49ab59a2
Author: Clément Foucault
Date:   Wed Jan 11 01:49:03 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB8c3a98e5834ded791f1c1ff18f4dd74f49ab59a2

Added Matcap HSV variation (only Hue exposed).

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

M       source/blender/draw/engines/clay/clay.c
M       source/blender/draw/engines/clay/shaders/clay_frag.glsl

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

diff --git a/source/blender/draw/engines/clay/clay.c 
b/source/blender/draw/engines/clay/clay.c
index 074fe6db69..6320479a6d 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -52,6 +52,7 @@ static struct CLAY_data {
        struct GPUTexture *matcap_array;
        float matcap_colors[24][3];
        float matcap_rot[2];
+       float matcap_hsv[3];
        int matcap_id;
 
        /* Ssao */
@@ -254,6 +255,7 @@ static void clay_engine_init(void)
        if (!data.clay_sh) {
                const char *defines =
                        "#define USE_AO;\n"
+                       "#define USE_HSV;\n"
                        "#define USE_ROTATION;\n";
 
                /* TODO Optimisation : Create shader combinations and bind the 
right 
@@ -304,6 +306,7 @@ static void clay_populate_passes(CLAY_PassList *passes, 
const struct bContext *C
                DRW_batch_uniform_vec3(batch, "matcaps_color", (float 
*)data.matcap_colors, 24);
                DRW_batch_uniform_vec2(batch, "matcap_rotation", (float 
*)data.matcap_rot, 1);
                DRW_batch_uniform_int(batch, "matcap_index", &data.matcap_id, 
1);
+               DRW_batch_uniform_vec3(batch, "matcap_hsv", (float 
*)data.matcap_hsv, 1);
 
                /* SSAO */
                DRW_batch_uniform_mat4(batch, "WinMatrix", (float 
*)data.winmat);
@@ -324,6 +327,10 @@ static void clay_populate_passes(CLAY_PassList *passes, 
const struct bContext *C
                data.matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 
2.0f);
                data.matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 
2.0f);
 
+               data.matcap_hsv[0] = settings->matcap_hue;
+               data.matcap_hsv[1] = 1.0f;
+               data.matcap_hsv[2] = 1.0f;
+
                data.ssao_params_var[0] = settings->ssao_distance;
                data.ssao_params_var[1] = settings->ssao_factor_cavity;
                data.ssao_params_var[2] = settings->ssao_factor_edge;
diff --git a/source/blender/draw/engines/clay/shaders/clay_frag.glsl 
b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
index d79cc615ab..4db8b56ab6 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -4,10 +4,10 @@ uniform mat4 WinMatrix;
 
 /* Matcap */
 uniform sampler2DArray matcaps;
+uniform vec3 matcaps_color[24];
 uniform int matcap_index;
 uniform vec2 matcap_rotation;
-uniform vec3 matcaps_color[24];
-uniform float matcap_hue;
+uniform vec3 matcap_hsv;
 
 /* Screen Space Occlusion */
 /* store the view space vectors for the corners of the view frustum here.
@@ -37,6 +37,95 @@ in vec3 normal;
 out vec4 fragColor;
 #endif
 
+#ifdef USE_HSV
+void rgb_to_hsv(vec3 rgb, out vec3 outcol)
+{
+       float cmax, cmin, h, s, v, cdelta;
+       vec3 c;
+
+       cmax = max(rgb[0], max(rgb[1], rgb[2]));
+       cmin = min(rgb[0], min(rgb[1], rgb[2]));
+       cdelta = cmax - cmin;
+
+       v = cmax;
+       if (cmax != 0.0)
+               s = cdelta / cmax;
+       else {
+               s = 0.0;
+               h = 0.0;
+       }
+
+       if (s == 0.0) {
+               h = 0.0;
+       }
+       else {
+               c = (vec3(cmax, cmax, cmax) - rgb.xyz) / cdelta;
+
+               if (rgb.x == cmax) h = c[2] - c[1];
+               else if (rgb.y == cmax) h = 2.0 + c[0] -  c[2];
+               else h = 4.0 + c[1] - c[0];
+
+               h /= 6.0;
+
+               if (h < 0.0)
+                       h += 1.0;
+       }
+
+       outcol = vec3(h, s, v);
+}
+
+void hsv_to_rgb(vec3 hsv, out vec3 outcol)
+{
+       float i, f, p, q, t, h, s, v;
+       vec3 rgb;
+
+       h = hsv[0];
+       s = hsv[1];
+       v = hsv[2];
+
+       if (s == 0.0) {
+               rgb = vec3(v, v, v);
+       }
+       else {
+               if (h == 1.0)
+                       h = 0.0;
+
+               h *= 6.0;
+               i = floor(h);
+               f = h - i;
+               rgb = vec3(f, f, f);
+               p = v * (1.0 - s);
+               q = v * (1.0 - (s * f));
+               t = v * (1.0 - (s * (1.0 - f)));
+
+               if (i == 0.0) rgb = vec3(v, t, p);
+               else if (i == 1.0) rgb = vec3(q, v, p);
+               else if (i == 2.0) rgb = vec3(p, v, t);
+               else if (i == 3.0) rgb = vec3(p, q, v);
+               else if (i == 4.0) rgb = vec3(t, p, v);
+               else rgb = vec3(v, p, q);
+       }
+
+       outcol = rgb;
+}
+
+void hue_sat(float hue, float sat, float value, inout vec3 col)
+{
+       vec3 hsv;
+
+       rgb_to_hsv(col, hsv);
+
+       hsv.x += hue;
+       hsv.x -= floor(hsv.x);
+       hsv.y *= sat;
+       hsv.y = clamp(hsv.y, 0.0, 1.0);
+       hsv.z *= value;
+       hsv.z = clamp(hsv.z, 0.0, 1.0);
+
+       hsv_to_rgb(hsv, col);
+}
+#endif
+
 /* simple depth reconstruction, see 
http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer
  * we change the factors from the article to fit the OpenGL model.  */
 
@@ -152,5 +241,14 @@ void main() {
        col *= edges + 1.0;
 #endif
 
+#ifdef USE_HSV
+       hue_sat(matcap_hsv.x, matcap_hsv.y, matcap_hsv.z, col);
+#endif
+
+#ifdef USE_AO
+       /* Apply highlights after hue shift */
+       col *= edges + 1.0;
+#endif
+
        fragColor = vec4(col, 1.0);
 }
\ No newline at end of file

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

Reply via email to