[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