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:
authorClément Foucault <foucault.clem@gmail.com>2018-12-17 23:24:43 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-12-18 04:19:52 +0300
commit6a1315d6e72689907207a1202b6372402ace59af (patch)
tree8938905d8d8d8e43cbb6ff0f7341873183d46e58 /source/blender/draw/modes
parent4fceaf3848b6ff926a8f0ffdb8f5a7b1537da57b (diff)
Weight Paint Overlay: Refactor wire drawing
This reduce the number of batch/data needed. Stores a select/visiblee flag inside the vert/loop normals.
Diffstat (limited to 'source/blender/draw/modes')
-rw-r--r--source/blender/draw/modes/paint_texture_mode.c1
-rw-r--r--source/blender/draw/modes/paint_weight_mode.c16
-rw-r--r--source/blender/draw/modes/shaders/paint_vert_frag.glsl8
-rw-r--r--source/blender/draw/modes/shaders/paint_wire_frag.glsl21
-rw-r--r--source/blender/draw/modes/shaders/paint_wire_vert.glsl23
5 files changed, 36 insertions, 33 deletions
diff --git a/source/blender/draw/modes/paint_texture_mode.c b/source/blender/draw/modes/paint_texture_mode.c
index 8fb854efd0d..985ab5455e3 100644
--- a/source/blender/draw/modes/paint_texture_mode.c
+++ b/source/blender/draw/modes/paint_texture_mode.c
@@ -351,6 +351,7 @@ static void PAINT_TEXTURE_engine_free(void)
{
DRW_SHADER_FREE_SAFE(e_data.image_sh);
DRW_SHADER_FREE_SAFE(e_data.wire_overlay_shader);
+ DRW_SHADER_FREE_SAFE(e_data.face_overlay_shader);
}
static const DrawEngineDataSize PAINT_TEXTURE_data_size = DRW_VIEWPORT_DATA_SIZE(PAINT_TEXTURE_Data);
diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c
index c050df43e24..ac04af728dd 100644
--- a/source/blender/draw/modes/paint_weight_mode.c
+++ b/source/blender/draw/modes/paint_weight_mode.c
@@ -45,6 +45,7 @@ extern struct GlobalsUboStorage ts; /* draw_common.c */
extern struct GPUTexture *globals_weight_ramp; /* draw_common.c */
+extern char datatoc_paint_face_vert_glsl[];
extern char datatoc_paint_weight_vert_glsl[];
extern char datatoc_paint_weight_frag_glsl[];
extern char datatoc_paint_wire_vert_glsl[];
@@ -52,6 +53,8 @@ extern char datatoc_paint_wire_frag_glsl[];
extern char datatoc_paint_vert_frag_glsl[];
extern char datatoc_common_globals_lib_glsl[];
+extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
+
/* *********** LISTS *********** */
typedef struct PAINT_WEIGHT_PassList {
@@ -109,7 +112,9 @@ static void PAINT_WEIGHT_engine_init(void *UNUSED(vedata))
}
if (!e_data.face_overlay_shader) {
- e_data.face_overlay_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR);
+ e_data.face_overlay_shader = DRW_shader_create(
+ datatoc_paint_face_vert_glsl, NULL,
+ datatoc_gpu_shader_uniform_color_frag_glsl, NULL);
}
if (!e_data.vert_overlay_shader) {
@@ -150,7 +155,7 @@ 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_EQUAL);
+ DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_OFFSET_NEGATIVE);
stl->g_data->lwire_shgrp = DRW_shgroup_create(e_data.wire_overlay_shader, psl->wire_overlay);
DRW_shgroup_uniform_block(stl->g_data->lwire_shgrp, "globalsBlock", globals_ubo);
@@ -170,7 +175,7 @@ static void PAINT_WEIGHT_cache_init(void *vedata)
{
psl->vert_overlay = DRW_pass_create(
"Vert Mask Pass",
- DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL);
+ DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_OFFSET_NEGATIVE);
stl->g_data->vert_shgrp = DRW_shgroup_create(e_data.vert_overlay_shader, psl->vert_overlay);
DRW_shgroup_uniform_block(stl->g_data->vert_shgrp, "globalsBlock", globals_ubo);
@@ -202,12 +207,12 @@ static void PAINT_WEIGHT_cache_populate(void *vedata, Object *ob)
}
if (use_face_sel) {
- geom = DRW_cache_mesh_faces_weight_overlay_get(ob);
+ geom = DRW_cache_mesh_surface_get(ob);
DRW_shgroup_call_add(stl->g_data->face_shgrp, geom, ob->obmat);
}
if (use_vert_sel) {
- geom = DRW_cache_mesh_verts_weight_overlay_get(ob);
+ geom = DRW_cache_mesh_verts_get(ob);
DRW_shgroup_call_add(stl->g_data->vert_shgrp, geom, ob->obmat);
}
}
@@ -228,6 +233,7 @@ static void PAINT_WEIGHT_engine_free(void)
DRW_SHADER_FREE_SAFE(e_data.weight_face_shader);
DRW_SHADER_FREE_SAFE(e_data.wire_overlay_shader);
DRW_SHADER_FREE_SAFE(e_data.vert_overlay_shader);
+ DRW_SHADER_FREE_SAFE(e_data.face_overlay_shader);
}
static const DrawEngineDataSize PAINT_WEIGHT_data_size = DRW_VIEWPORT_DATA_SIZE(PAINT_WEIGHT_Data);
diff --git a/source/blender/draw/modes/shaders/paint_vert_frag.glsl b/source/blender/draw/modes/shaders/paint_vert_frag.glsl
index 5ea8c11ff9a..d7f604d5c2c 100644
--- a/source/blender/draw/modes/shaders/paint_vert_frag.glsl
+++ b/source/blender/draw/modes/shaders/paint_vert_frag.glsl
@@ -1,5 +1,5 @@
-flat in int finalFlag;
+flat in vec4 finalColor;
out vec4 fragColor;
#define VERTEX_SELECTED (1 << 0)
@@ -7,10 +7,6 @@ out vec4 fragColor;
void main()
{
- if (bool(finalFlag & VERTEX_HIDE)) {
- discard;
- }
-
vec2 centered = gl_PointCoord - vec2(0.5);
float dist_squared = dot(centered, centered);
const float rad_squared = 0.25;
@@ -22,5 +18,5 @@ void main()
discard;
}
- fragColor = bool(finalFlag & VERTEX_SELECTED) ? colSel : colUnsel;
+ fragColor = finalColor;
}
diff --git a/source/blender/draw/modes/shaders/paint_wire_frag.glsl b/source/blender/draw/modes/shaders/paint_wire_frag.glsl
index c5d6198fc21..d738ed5ddb2 100644
--- a/source/blender/draw/modes/shaders/paint_wire_frag.glsl
+++ b/source/blender/draw/modes/shaders/paint_wire_frag.glsl
@@ -1,25 +1,8 @@
-flat in int finalFlag;
+flat in vec4 finalColor;
out vec4 fragColor;
-#define VERTEX_SELECTED (1 << 0)
-#define VERTEX_HIDE (1 << 4)
-
void main()
{
- if (bool(finalFlag & VERTEX_HIDE)) {
- discard;
- }
-
- /* Apply depth offset by taking slope and distance into account. */
- gl_FragDepth = gl_FragCoord.z - mix(exp2(-10), exp2(-23), gl_FragCoord.z) - 2.0 * fwidth(gl_FragCoord.z);
-
-#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
-
- fragColor = bool(finalFlag & VERTEX_SELECTED) ? colSel : colorWire;
+ fragColor = finalColor;
}
diff --git a/source/blender/draw/modes/shaders/paint_wire_vert.glsl b/source/blender/draw/modes/shaders/paint_wire_vert.glsl
index 253c21745e2..a92591b957d 100644
--- a/source/blender/draw/modes/shaders/paint_wire_vert.glsl
+++ b/source/blender/draw/modes/shaders/paint_wire_vert.glsl
@@ -2,13 +2,30 @@
uniform mat4 ModelViewProjectionMatrix;
in vec3 pos;
-in int data;
+in vec4 nor; /* flag stored in w */
-flat out int finalFlag;
+flat out vec4 finalColor;
void main()
{
+ bool is_select = (nor.w > 0.0);
+ bool is_hidden = (nor.w < 0.0);
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ /* Add offset in Z to avoid zfighting and render selected wires on top. */
+ /* TODO scale this bias using znear and zfar range. */
+ gl_Position.zw -= exp2(-20) * (is_select ? 2.0 : 1.0);
- finalFlag = data;
+ if (is_hidden) {
+ gl_Position = vec4(-2.0, -2.0, -2.0, 1.0);
+ }
+
+#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
+
+ finalColor = (is_select) ? colSel : colorWire;
+ finalColor.a = nor.w;
}