[Bf-blender-cvs] [8c3a98e583] clay-engine: Added Matcap HSV variation (only Hue exposed).

Clément Foucault noreply at git.blender.org
Wed Jan 11 01:49:40 CET 2017


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




More information about the Bf-blender-cvs mailing list