[Bf-blender-cvs] [57cbaa15b64] strand_editmode: Custom shaders for drawing strand selection.

Lukas Tönne noreply at git.blender.org
Sun Jul 23 09:33:08 CEST 2017


Commit: 57cbaa15b64567d4115ab5b16c7dffeeb2acfd5c
Author: Lukas Tönne
Date:   Sun Jul 23 08:32:29 2017 +0100
Branches: strand_editmode
https://developer.blender.org/rB57cbaa15b64567d4115ab5b16c7dffeeb2acfd5c

Custom shaders for drawing strand selection.

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

M	source/blender/blenkernel/BKE_editstrands.h
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/draw_cache_impl_strands.c
M	source/blender/draw/modes/edit_strands_mode.c
A	source/blender/draw/modes/shaders/edit_strands_vert.glsl
M	source/blender/editors/hair/hair_select.c
M	source/blender/editors/space_view3d/view3d_select.c

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

diff --git a/source/blender/blenkernel/BKE_editstrands.h b/source/blender/blenkernel/BKE_editstrands.h
index 90f86701e5d..96706e8ebd2 100644
--- a/source/blender/blenkernel/BKE_editstrands.h
+++ b/source/blender/blenkernel/BKE_editstrands.h
@@ -96,6 +96,7 @@ void BKE_editstrands_mesh_from_bmesh(struct Object *ob);
 /* === Draw Cache === */
 enum {
 	BKE_STRANDS_BATCH_DIRTY_ALL = 0,
+	BKE_STRANDS_BATCH_DIRTY_SELECT = 1,
 };
 void BKE_editstrands_batch_cache_dirty(struct BMEditStrands *es, int mode);
 void BKE_editstrands_batch_cache_free(struct BMEditStrands *es);
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 920b6140e2b..d542d953744 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -178,6 +178,7 @@ data_to_c_simple(modes/shaders/edit_lattice_overlay_frag.glsl SRC)
 data_to_c_simple(modes/shaders/edit_lattice_overlay_loosevert_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_normals_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_normals_geom.glsl SRC)
+data_to_c_simple(modes/shaders/edit_strands_vert.glsl SRC)
 data_to_c_simple(modes/shaders/object_empty_image_frag.glsl SRC)
 data_to_c_simple(modes/shaders/object_empty_image_vert.glsl SRC)
 data_to_c_simple(modes/shaders/object_outline_resolve_frag.glsl SRC)
diff --git a/source/blender/draw/intern/draw_cache_impl_strands.c b/source/blender/draw/intern/draw_cache_impl_strands.c
index 685f72410da..3a720d738ed 100644
--- a/source/blender/draw/intern/draw_cache_impl_strands.c
+++ b/source/blender/draw/intern/draw_cache_impl_strands.c
@@ -46,7 +46,7 @@
 
 typedef enum VertexDrawFlags
 {
-	STRANDS_VERTEX_SELECT = 1,
+	STRANDS_VERTEX_SELECT = (1 << 0),
 } VertexDrawFlags;
 
 typedef struct StrandsBatchCache {
@@ -120,6 +120,7 @@ void DRW_editstrands_batch_cache_dirty(BMEditStrands *es, int mode)
 	}
 	switch (mode) {
 		case BKE_STRANDS_BATCH_DIRTY_ALL:
+		case BKE_STRANDS_BATCH_DIRTY_SELECT:
 			cache->is_dirty = true;
 			break;
 		default:
@@ -163,7 +164,7 @@ static void editstrands_batch_cache_ensure_pos(BMEditStrands *es, StrandsBatchCa
 	/* initialize vertex format */
 	if (format.attrib_ct == 0) {
 		pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
-		flag_id = GWN_vertformat_attr_add(&format, "flags", GWN_COMP_U8, 1, GWN_FETCH_INT);
+		flag_id = GWN_vertformat_attr_add(&format, "flag", GWN_COMP_U8, 1, GWN_FETCH_INT);
 	}
 	
 	BMesh *bm = es->base.bm;
diff --git a/source/blender/draw/modes/edit_strands_mode.c b/source/blender/draw/modes/edit_strands_mode.c
index 9ebedc8efa8..886c265e46f 100644
--- a/source/blender/draw/modes/edit_strands_mode.c
+++ b/source/blender/draw/modes/edit_strands_mode.c
@@ -39,6 +39,10 @@
 
 extern GlobalsUboStorage ts;
 
+extern char datatoc_edit_strands_vert_glsl[];
+extern char datatoc_gpu_shader_point_varying_color_frag_glsl[];
+extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
+
 /* *********** LISTS *********** */
 /* All lists are per viewport specific datas.
  * They are all free when viewport changes engines
@@ -78,6 +82,15 @@ typedef struct EDIT_STRANDS_Data {
 
 /* *********** STATIC *********** */
 
+static struct {
+	/* Custom shaders :
+	 * Add sources to source/blender/draw/modes/shaders
+	 * init in EDIT_STRANDS_engine_init();
+	 * free in EDIT_STRANDS_engine_free(); */
+	struct GPUShader *edit_point_shader;
+	struct GPUShader *edit_wire_shader;
+} e_data = {NULL}; /* Engine data */
+
 typedef struct EDIT_STRANDS_PrivateData {
 	/* resulting curve as 'wire' for fast editmode drawing */
 	DRWShadingGroup *wires_shgrp;
@@ -88,6 +101,56 @@ typedef struct EDIT_STRANDS_PrivateData {
 
 /* *********** FUNCTIONS *********** */
 
+/* Init Textures, Framebuffers, Storage and Shaders.
+ * It is called for every frames.
+ * (Optional) */
+static void EDIT_STRANDS_engine_init(void *vedata)
+{
+	EDIT_STRANDS_StorageList *stl = ((EDIT_STRANDS_Data *)vedata)->stl;
+
+	UNUSED_VARS(stl);
+
+	/* Init Framebuffers like this: order is attachment order (for color texs) */
+	/*
+	 * DRWFboTexture tex[2] = {{&txl->depth, DRW_TEX_DEPTH_24, 0},
+	 *                         {&txl->color, DRW_TEX_RGBA_8, DRW_TEX_FILTER}};
+	 */
+
+	/* DRW_framebuffer_init takes care of checking if
+	 * the framebuffer is valid and has the right size*/
+	/*
+	 * float *viewport_size = DRW_viewport_size_get();
+	 * DRW_framebuffer_init(&fbl->occlude_wire_fb,
+	 *                     (int)viewport_size[0], (int)viewport_size[1],
+	 *                     tex, 2);
+	 */
+
+	if (!e_data.edit_point_shader) {
+		e_data.edit_point_shader = DRW_shader_create(
+		                               datatoc_edit_strands_vert_glsl,
+		                               NULL,
+		                               datatoc_gpu_shader_point_varying_color_frag_glsl,
+		                               NULL);
+	}
+
+	if (!e_data.edit_wire_shader) {
+		e_data.edit_wire_shader = DRW_shader_create(
+		                              datatoc_edit_strands_vert_glsl,
+		                              NULL,
+		                              datatoc_gpu_shader_3D_smooth_color_frag_glsl,
+		                              NULL);
+	}
+}
+
+/* Cleanup when destroying the engine.
+ * This is not per viewport ! only when quitting blender.
+ * Mostly used for freeing shaders */
+static void EDIT_STRANDS_engine_free(void)
+{
+	DRW_SHADER_FREE_SAFE(e_data.edit_point_shader);
+	DRW_SHADER_FREE_SAFE(e_data.edit_wire_shader);
+}
+
 /* Here init all passes and shading groups
  * Assume that all Passes are NULL */
 static void EDIT_STRANDS_cache_init(void *vedata)
@@ -100,16 +163,14 @@ static void EDIT_STRANDS_cache_init(void *vedata)
 		stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
 	}
 
-	GPUShader *point_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA);
-	GPUShader *wire_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
-
 	{
 		/* Strand wires */
 		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND;
 		psl->wires = DRW_pass_create("Strand Wire Verts Pass", state);
 		
-		stl->g_data->wires_shgrp = DRW_shgroup_create(wire_shader, psl->wires);
+		stl->g_data->wires_shgrp = DRW_shgroup_create(e_data.edit_wire_shader, psl->wires);
 		DRW_shgroup_uniform_vec4(stl->g_data->wires_shgrp, "color", ts.colorWireEdit, 1);
+		DRW_shgroup_uniform_vec4(stl->g_data->wires_shgrp, "colorSelect", ts.colorEdgeSelect, 1);
 	}
 
 	{
@@ -117,9 +178,10 @@ static void EDIT_STRANDS_cache_init(void *vedata)
 		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND;
 		psl->tips = DRW_pass_create("Strand Tip Verts Pass", state);
 		
-		stl->g_data->tips_shgrp = DRW_shgroup_create(point_shader, psl->tips);
+		stl->g_data->tips_shgrp = DRW_shgroup_create(e_data.edit_point_shader, psl->tips);
 		DRW_shgroup_uniform_vec4(stl->g_data->tips_shgrp, "color", ts.colorVertex, 1);
-		DRW_shgroup_uniform_float(stl->g_data->tips_shgrp, "size", &ts.sizeVertex, 1);
+		DRW_shgroup_uniform_vec4(stl->g_data->tips_shgrp, "colorSelect", ts.colorVertexSelect, 1);
+		DRW_shgroup_uniform_float(stl->g_data->tips_shgrp, "sizeVertex", &ts.sizeVertex, 1);
 	}
 
 	{
@@ -127,9 +189,10 @@ static void EDIT_STRANDS_cache_init(void *vedata)
 		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND;
 		psl->roots = DRW_pass_create("Strand Root Verts Pass", state);
 		
-		stl->g_data->roots_shgrp = DRW_shgroup_create(point_shader, psl->roots);
+		stl->g_data->roots_shgrp = DRW_shgroup_create(e_data.edit_point_shader, psl->roots);
 		DRW_shgroup_uniform_vec4(stl->g_data->roots_shgrp, "color", ts.colorVertex, 1);
-		DRW_shgroup_uniform_float(stl->g_data->roots_shgrp, "size", &ts.sizeVertex, 1);
+		DRW_shgroup_uniform_vec4(stl->g_data->roots_shgrp, "colorSelect", ts.colorVertexSelect, 1);
+		DRW_shgroup_uniform_float(stl->g_data->roots_shgrp, "sizeVertex", &ts.sizeVertex, 1);
 	}
 
 	{
@@ -137,9 +200,10 @@ static void EDIT_STRANDS_cache_init(void *vedata)
 		DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND;
 		psl->points = DRW_pass_create("Strand Interior Verts Pass", state);
 		
-		stl->g_data->points_shgrp = DRW_shgroup_create(point_shader, psl->points);
+		stl->g_data->points_shgrp = DRW_shgroup_create(e_data.edit_point_shader, psl->points);
 		DRW_shgroup_uniform_vec4(stl->g_data->points_shgrp, "color", ts.colorVertex, 1);
-		DRW_shgroup_uniform_float(stl->g_data->points_shgrp, "size", &ts.sizeVertex, 1);
+		DRW_shgroup_uniform_vec4(stl->g_data->points_shgrp, "colorSelect", ts.colorVertexSelect, 1);
+		DRW_shgroup_uniform_float(stl->g_data->points_shgrp, "sizeVertex", &ts.sizeVertex, 1);
 	}
 }
 
@@ -233,8 +297,8 @@ DrawEngineType draw_engine_edit_strands_type = {
 	NULL, NULL,
 	N_("EditStrandsMode"),
 	&STRANDS_data_size,
-	NULL,
-	NULL,
+	EDIT_STRANDS_engine_init,
+	EDIT_STRANDS_engine_free,
 	&EDIT_STRANDS_cache_init,
 	&EDIT_STRANDS_cache_populate,
 	&EDIT_STRANDS_cache_finish,
diff --git a/source/blender/draw/modes/shaders/edit_strands_vert.glsl b/source/blender/draw/modes/shaders/edit_strands_vert.glsl
new file mode 100644
index 00000000000..7bd622ad6b1
--- /dev/null
+++ b/source/blender/draw/modes/shaders/edit_strands_vert.glsl
@@ -0,0 +1,34 @@
+
+/* Draw Curve Vertices */
+
+uniform mat4 ModelViewProjectionMatrix;
+uniform vec2 viewportSize;
+uniform vec4 color;
+uniform vec4 colorSelect;
+uniform float sizeVertex;
+
+in vec3 pos;
+in int flag;
+
+out vec4 finalColor;
+
+#define VERTEX_SELECTED (1 << 0)
+
+/* project to screen space */
+vec2 proj(vec4 pos)
+{
+	return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize;
+}
+
+void main()
+{
+	gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+	gl_PointSize = sizeVertex;
+
+	if ((flag & VERTEX_SELECTED) != 0) {
+		finalColor = colorSelect;
+	}
+	else {
+		finalColor = color;
+	}
+}
diff --git a/source/blender/editors/hair/hair_select.c b/source/blender/editors/hair/hair_select.c
index 12b32fc510b..90ccfcabd0d 100644
--- a/source/blender/editors/hair/hair_select.c
+++ b/source/blender/editors/hair/hair_select.c
@@ -96,7 +96,9 @@ typedef bool (*PollVertexCb)(void *userdata, struct BMVert *v);
 typedef bool (*Dista

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list