Edit Mesh: Fix wire opacity when not rotating the view in Xray mode
This commit is contained in:
parent
3927fbf98e
commit
050e91340d
|
@ -336,7 +336,7 @@ static void EDIT_MESH_engine_init(void *vedata)
|
|||
}
|
||||
|
||||
static DRWPass *edit_mesh_create_overlay_pass(
|
||||
float *face_alpha, float *edge_width_scale, int *data_mask, bool do_edges,
|
||||
float *face_alpha, float *edge_width_scale, int *data_mask, bool do_edges, bool xray,
|
||||
DRWState statemod,
|
||||
DRWShadingGroup **r_face_shgrp, DRWShadingGroup **r_verts_shgrp, DRWShadingGroup **r_ledges_shgrp,
|
||||
DRWShadingGroup **r_lverts_shgrp, DRWShadingGroup **r_facedot_shgrp)
|
||||
|
@ -346,6 +346,7 @@ static DRWPass *edit_mesh_create_overlay_pass(
|
|||
RegionView3D *rv3d = draw_ctx->rv3d;
|
||||
Scene *scene = draw_ctx->scene;
|
||||
ToolSettings *tsettings = scene->toolsettings;
|
||||
const int fast_mode = rv3d->rflag & RV3D_NAVIGATING;
|
||||
|
||||
ledge_sh = EDIT_MESH_ensure_shader(tsettings, rv3d, false, true);
|
||||
tri_sh = EDIT_MESH_ensure_shader(tsettings, rv3d, true, false);
|
||||
|
@ -361,6 +362,9 @@ static DRWPass *edit_mesh_create_overlay_pass(
|
|||
DRW_shgroup_uniform_float(*r_face_shgrp, "edgeScale", edge_width_scale, 1);
|
||||
DRW_shgroup_uniform_ivec4(*r_face_shgrp, "dataMask", data_mask, 1);
|
||||
DRW_shgroup_uniform_bool_copy(*r_face_shgrp, "doEdges", do_edges);
|
||||
if (!fast_mode) {
|
||||
DRW_shgroup_uniform_bool_copy(*r_face_shgrp, "isXray", xray);
|
||||
}
|
||||
|
||||
*r_ledges_shgrp = DRW_shgroup_create(ledge_sh, pass);
|
||||
DRW_shgroup_uniform_block(*r_ledges_shgrp, "globalsBlock", globals_ubo);
|
||||
|
@ -512,7 +516,7 @@ static void EDIT_MESH_cache_init(void *vedata)
|
|||
|
||||
if (!stl->g_data->do_zbufclip) {
|
||||
psl->edit_face_overlay = edit_mesh_create_overlay_pass(
|
||||
&face_mod, &stl->g_data->edge_width_scale, stl->g_data->data_mask, stl->g_data->do_edges,
|
||||
&face_mod, &stl->g_data->edge_width_scale, stl->g_data->data_mask, stl->g_data->do_edges, false,
|
||||
DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND,
|
||||
&stl->g_data->face_overlay_shgrp,
|
||||
&stl->g_data->verts_overlay_shgrp,
|
||||
|
@ -523,7 +527,7 @@ static void EDIT_MESH_cache_init(void *vedata)
|
|||
else {
|
||||
/* We render all wires with depth and opaque to a new fbo and blend the result based on depth values */
|
||||
psl->edit_face_occluded = edit_mesh_create_overlay_pass(
|
||||
&zero, &stl->g_data->edge_width_scale, stl->g_data->data_mask, stl->g_data->do_edges,
|
||||
&zero, &stl->g_data->edge_width_scale, stl->g_data->data_mask, stl->g_data->do_edges, true,
|
||||
DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WRITE_DEPTH,
|
||||
&stl->g_data->face_occluded_shgrp,
|
||||
&stl->g_data->verts_occluded_shgrp,
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
uniform float faceAlphaMod;
|
||||
uniform float edgeScale;
|
||||
uniform bool isXray = false;
|
||||
|
||||
flat in vec3 edgesCrease;
|
||||
flat in vec3 edgesBweight;
|
||||
|
@ -31,9 +32,7 @@ out vec4 FragColor;
|
|||
#define LARGE_EDGE_SIZE 2.15
|
||||
|
||||
/* Enough to visually fill gaps and not enough to mess the AA gradient too much. */
|
||||
#define EDGE_FIX_ALPHA 0.6
|
||||
|
||||
/* Style Parameters in pixel */
|
||||
#define EDGE_FIX_ALPHA 0.67
|
||||
|
||||
void distToEdgesAndPoints(out vec3 edges, out vec3 points)
|
||||
{
|
||||
|
@ -107,7 +106,7 @@ void main()
|
|||
|
||||
vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0] & FACE_ACTIVE_) != 0, edgesCrease[v], edgesBweight[v]);
|
||||
#ifdef EDGE_FIX
|
||||
large_edge_color *= EDGE_FIX_ALPHA;
|
||||
large_edge_color *= isXray ? 1.0 : EDGE_FIX_ALPHA;
|
||||
#endif
|
||||
if (large_edge_color.a != 0.0) {
|
||||
colorDistEdge(large_edge_color, largeEdge);
|
||||
|
@ -122,13 +121,13 @@ void main()
|
|||
#ifdef VERTEX_SELECTION
|
||||
vec4 inner_edge_color = vec4(vertexColor, 1.0);
|
||||
# ifdef EDGE_FIX
|
||||
inner_edge_color *= EDGE_FIX_ALPHA;
|
||||
inner_edge_color *= isXray ? 1.0 : EDGE_FIX_ALPHA;
|
||||
# endif
|
||||
colorDistEdge(vec4(vertexColor, 1.0), innerEdge);
|
||||
#else
|
||||
vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0] & FACE_ACTIVE_) != 0);
|
||||
# ifdef EDGE_FIX
|
||||
inner_edge_color *= EDGE_FIX_ALPHA;
|
||||
inner_edge_color *= isXray ? 1.0 : EDGE_FIX_ALPHA;
|
||||
# endif
|
||||
colorDistEdge(inner_edge_color, innerEdge);
|
||||
#endif
|
||||
|
@ -148,7 +147,7 @@ void main()
|
|||
point_color = ((flag[v] & EDGE_VERTEX_SELECTED) != 0) ? colorVertexSelect : point_color;
|
||||
point_color = ((flag[v] & EDGE_VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : point_color;
|
||||
# ifdef EDGE_FIX
|
||||
point_color.a *= EDGE_FIX_ALPHA;
|
||||
point_color *= isXray ? 1.0 : EDGE_FIX_ALPHA;
|
||||
# endif
|
||||
colorDist(point_color, size);
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ layout(triangle_strip, max_vertices=12) out;
|
|||
|
||||
uniform mat4 ProjectionMatrix;
|
||||
uniform vec2 viewportSize;
|
||||
uniform bool isXray = false;
|
||||
|
||||
in vec4 pPos[];
|
||||
in ivec4 vData[];
|
||||
|
@ -181,7 +182,7 @@ void main()
|
|||
|
||||
/* Do face triangle */
|
||||
faceColor = fcol;
|
||||
flag = eflag;
|
||||
flag = (isXray) ? ivec3(0) : eflag;
|
||||
doVertex(2);
|
||||
faceColor.a = 0.0; /* to not let face color bleed */
|
||||
|
||||
|
|
Loading…
Reference in New Issue