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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Rood <dev@lucarood.com>2017-05-05 15:25:43 +0300
committerLuca Rood <dev@lucarood.com>2017-05-05 16:53:37 +0300
commit872d8993ddda28a4340730a5842af18ccf55fd2b (patch)
tree1fe03d2615d0f49843121363d2249edb8ea21728 /source/blender/draw/modes
parent14bf4ed19407e98575ca7646e942f8230a0b2e8d (diff)
Clean up weight/vertex painting code
Now passing selection state instead of colors for the wire/face mask overlay thing. Also added masking indication on the faces in vertex paint.
Diffstat (limited to 'source/blender/draw/modes')
-rw-r--r--source/blender/draw/modes/paint_vertex_mode.c34
-rw-r--r--source/blender/draw/modes/paint_weight_mode.c32
-rw-r--r--source/blender/draw/modes/shaders/paint_wire_frag.glsl17
-rw-r--r--source/blender/draw/modes/shaders/paint_wire_vert.glsl13
4 files changed, 86 insertions, 10 deletions
diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c
index 6c16601e850..ff2f475713a 100644
--- a/source/blender/draw/modes/paint_vertex_mode.c
+++ b/source/blender/draw/modes/paint_vertex_mode.c
@@ -38,11 +38,16 @@
extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */
extern struct GlobalsUboStorage ts; /* draw_common.c */
+extern char datatoc_paint_wire_vert_glsl[];
+extern char datatoc_paint_wire_frag_glsl[];
+extern char datatoc_common_globals_lib_glsl[];
+
/* *********** LISTS *********** */
typedef struct PAINT_VERTEX_PassList {
struct DRWPass *vcolor_faces;
struct DRWPass *wire_overlay;
+ struct DRWPass *face_overlay;
} PAINT_VERTEX_PassList;
typedef struct PAINT_VERTEX_StorageList {
@@ -62,11 +67,13 @@ typedef struct PAINT_VERTEX_Data {
static struct {
struct GPUShader *vcolor_face_shader;
struct GPUShader *wire_overlay_shader;
+ struct GPUShader *face_overlay_shader;
} e_data = {NULL}; /* Engine data */
typedef struct PAINT_VERTEX_PrivateData {
DRWShadingGroup *fvcolor_shgrp;
DRWShadingGroup *lwire_shgrp;
+ DRWShadingGroup *face_shgrp;
} PAINT_VERTEX_PrivateData; /* Transient data */
/* *********** FUNCTIONS *********** */
@@ -78,7 +85,14 @@ static void PAINT_VERTEX_engine_init(void *UNUSED(vedata))
}
if (!e_data.wire_overlay_shader) {
- e_data.wire_overlay_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_FLAT_COLOR);
+ e_data.wire_overlay_shader = DRW_shader_create_with_lib(
+ datatoc_paint_wire_vert_glsl, NULL,
+ datatoc_paint_wire_frag_glsl,
+ datatoc_common_globals_lib_glsl, "#define VERTEX_MODE\n");
+ }
+
+ if (!e_data.face_overlay_shader) {
+ e_data.face_overlay_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
}
}
@@ -112,6 +126,15 @@ static void PAINT_VERTEX_cache_init(void *vedata)
stl->g_data->lwire_shgrp = DRW_shgroup_create(e_data.wire_overlay_shader, psl->wire_overlay);
}
+
+ {
+ psl->face_overlay = DRW_pass_create("Face Mask Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND);
+
+ stl->g_data->face_shgrp = DRW_shgroup_create(e_data.face_overlay_shader, psl->face_overlay);
+
+ static float col[4] = {1.0f, 1.0f, 1.0f, 0.2f};
+ DRW_shgroup_uniform_vec4(stl->g_data->face_shgrp, "color", col, 1);
+ }
}
static void PAINT_VERTEX_cache_populate(void *vedata, Object *ob)
@@ -132,9 +155,14 @@ static void PAINT_VERTEX_cache_populate(void *vedata, Object *ob)
DRW_shgroup_call_add(stl->g_data->fvcolor_shgrp, geom, ob->obmat);
if (flag & ME_EDIT_PAINT_FACE_SEL || use_wire) {
- geom = DRW_cache_mesh_edges_paint_overlay_get(ob, use_wire, flag & ME_EDIT_PAINT_FACE_SEL, true);
+ geom = DRW_cache_mesh_edges_paint_overlay_get(ob, use_wire, flag & ME_EDIT_PAINT_FACE_SEL);
DRW_shgroup_call_add(stl->g_data->lwire_shgrp, geom, ob->obmat);
}
+
+ if (flag & ME_EDIT_PAINT_FACE_SEL) {
+ geom = DRW_cache_mesh_faces_weight_overlay_get(ob);
+ DRW_shgroup_call_add(stl->g_data->face_shgrp, geom, ob->obmat);
+ }
}
}
@@ -143,11 +171,13 @@ static void PAINT_VERTEX_draw_scene(void *vedata)
PAINT_VERTEX_PassList *psl = ((PAINT_VERTEX_Data *)vedata)->psl;
DRW_draw_pass(psl->vcolor_faces);
+ DRW_draw_pass(psl->face_overlay);
DRW_draw_pass(psl->wire_overlay);
}
static void PAINT_VERTEX_engine_free(void)
{
+ DRW_SHADER_FREE_SAFE(e_data.wire_overlay_shader);
}
void PAINT_VERTEX_collection_settings_create(IDProperty *properties)
diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c
index 1eb9e3caba1..eda65a5d5a5 100644
--- a/source/blender/draw/modes/paint_weight_mode.c
+++ b/source/blender/draw/modes/paint_weight_mode.c
@@ -40,6 +40,10 @@
extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */
extern struct GlobalsUboStorage ts; /* draw_common.c */
+extern char datatoc_paint_wire_vert_glsl[];
+extern char datatoc_paint_wire_frag_glsl[];
+extern char datatoc_common_globals_lib_glsl[];
+
/* *********** LISTS *********** */
typedef struct PAINT_WEIGHT_PassList {
@@ -65,7 +69,8 @@ typedef struct PAINT_WEIGHT_Data {
static struct {
struct GPUShader *weight_face_shader;
- struct GPUShader *flat_overlay_shader;
+ struct GPUShader *wire_overlay_shader;
+ struct GPUShader *face_overlay_shader;
struct GPUShader *vert_overlay_shader;
int actdef;
} e_data = {NULL}; /* Engine data */
@@ -93,8 +98,15 @@ static void PAINT_WEIGHT_engine_init(void *UNUSED(vedata))
e_data.weight_face_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA);
}
- if (!e_data.flat_overlay_shader) {
- e_data.flat_overlay_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_FLAT_COLOR);
+ if (!e_data.wire_overlay_shader) {
+ e_data.wire_overlay_shader = DRW_shader_create_with_lib(
+ datatoc_paint_wire_vert_glsl, NULL,
+ datatoc_paint_wire_frag_glsl,
+ datatoc_common_globals_lib_glsl, "#define WEIGHT_MODE\n");
+ }
+
+ if (!e_data.face_overlay_shader) {
+ e_data.face_overlay_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
}
if (!e_data.vert_overlay_shader) {
@@ -130,17 +142,20 @@ static void PAINT_WEIGHT_cache_init(void *vedata)
{
psl->wire_overlay = DRW_pass_create("Wire Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
- stl->g_data->lwire_shgrp = DRW_shgroup_create(e_data.flat_overlay_shader, psl->wire_overlay);
+ stl->g_data->lwire_shgrp = DRW_shgroup_create(e_data.wire_overlay_shader, psl->wire_overlay);
}
{
- psl->face_overlay = DRW_pass_create("Wire Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND);
+ psl->face_overlay = DRW_pass_create("Face Mask Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND);
+
+ stl->g_data->face_shgrp = DRW_shgroup_create(e_data.face_overlay_shader, psl->face_overlay);
- stl->g_data->face_shgrp = DRW_shgroup_create(e_data.flat_overlay_shader, psl->face_overlay);
+ static float col[4] = {1.0f, 1.0f, 1.0f, 0.2f};
+ DRW_shgroup_uniform_vec4(stl->g_data->face_shgrp, "color", col, 1);
}
{
- psl->vert_overlay = DRW_pass_create("Wire Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+ psl->vert_overlay = DRW_pass_create("Vert Mask Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
stl->g_data->vert_shgrp = DRW_shgroup_create(e_data.vert_overlay_shader, psl->vert_overlay);
}
@@ -164,7 +179,7 @@ static void PAINT_WEIGHT_cache_populate(void *vedata, Object *ob)
DRW_shgroup_call_add(stl->g_data->fweights_shgrp, geom, ob->obmat);
if (flag & ME_EDIT_PAINT_FACE_SEL || use_wire) {
- geom = DRW_cache_mesh_edges_paint_overlay_get(ob, use_wire, flag & ME_EDIT_PAINT_FACE_SEL, false);
+ geom = DRW_cache_mesh_edges_paint_overlay_get(ob, use_wire, flag & ME_EDIT_PAINT_FACE_SEL);
DRW_shgroup_call_add(stl->g_data->lwire_shgrp, geom, ob->obmat);
}
@@ -192,6 +207,7 @@ static void PAINT_WEIGHT_draw_scene(void *vedata)
static void PAINT_WEIGHT_engine_free(void)
{
+ DRW_SHADER_FREE_SAFE(e_data.wire_overlay_shader);
}
void PAINT_WEIGHT_collection_settings_create(IDProperty *properties)
diff --git a/source/blender/draw/modes/shaders/paint_wire_frag.glsl b/source/blender/draw/modes/shaders/paint_wire_frag.glsl
new file mode 100644
index 00000000000..49da0b8ae37
--- /dev/null
+++ b/source/blender/draw/modes/shaders/paint_wire_frag.glsl
@@ -0,0 +1,17 @@
+
+flat in int finalSelect;
+out vec4 fragColor;
+
+void main()
+{
+#ifdef VERTEX_MODE
+ vec4 colSel = colorEdgeSelect;
+ colSel.rgb = clamp(colSel.rgb - 0.2, 0.0, 1.0);
+#else
+ const vec4 colSel = vec4(1.0, 1.0, 1.0, 1.0);
+#endif
+
+ const vec4 colUnsel = vec4(0.5, 0.5, 0.5, 1.0);
+
+ fragColor = bool(finalSelect) ? colSel : colUnsel;
+}
diff --git a/source/blender/draw/modes/shaders/paint_wire_vert.glsl b/source/blender/draw/modes/shaders/paint_wire_vert.glsl
new file mode 100644
index 00000000000..1f404d33c88
--- /dev/null
+++ b/source/blender/draw/modes/shaders/paint_wire_vert.glsl
@@ -0,0 +1,13 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+
+in vec3 pos;
+in int select;
+
+flat out int finalSelect;
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ finalSelect = select;
+}