Commit: 00233f5f78e6cb4b38fdb1d09d0f4b56dca8a306 Author: Clément Foucault Date: Thu Jun 7 18:01:29 2018 +0200 Branches: blender2.8 https://developer.blender.org/rB00233f5f78e6cb4b38fdb1d09d0f4b56dca8a306
Wireframe: Fix edges or non manifold meshes not showing. This will show the associated edges to the vertices but that's the only workaround I can think of right now. =================================================================== M source/blender/draw/intern/draw_cache_impl_mesh.c M source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl M source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl =================================================================== diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index b6bd15ba2c2..c5d5eac51b7 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -3391,22 +3391,21 @@ static EdgeHash *create_looptri_edge_adjacency_hash(MeshRenderData *rdata) return eh; } -static Gwn_VertBuf *mesh_batch_cache_create_edges_overlay_adj_texture_buf(MeshRenderData *rdata, bool do_adjacency) +static Gwn_VertBuf *mesh_batch_cache_create_edges_overlay_texture_buf(MeshRenderData *rdata) { const int tri_len = mesh_render_data_looptri_len_get(rdata); Gwn_VertFormat format = {0}; - uint index_id = GWN_vertformat_attr_add(&format, "index", GWN_COMP_I32, 1, GWN_FETCH_INT); + uint index_id = GWN_vertformat_attr_add(&format, "index", GWN_COMP_U32, 1, GWN_FETCH_INT); Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format); - int vbo_len_capacity = tri_len * ((do_adjacency) ? 6 : 3); + int vbo_len_capacity = tri_len * 3; GWN_vertbuf_data_alloc(vbo, vbo_len_capacity); int vidx = 0; EdgeHash *eh = NULL; - if (do_adjacency) { - eh = create_looptri_edge_adjacency_hash(rdata); - } + eh = create_looptri_edge_adjacency_hash(rdata); + for (int i = 0; i < tri_len; i++) { bool edge_is_real[3] = {false, false, false}; @@ -3427,33 +3426,23 @@ static Gwn_VertBuf *mesh_batch_cache_create_edges_overlay_adj_texture_buf(MeshRe } for (int e = 0; e < 3; ++e) { - /* Save if there is an edge or not inside the sign bit. */ int v0 = mloop[mlt->tri[e]].v; - int value = (int)v0 + 1; /* Int 0 cannot be signed */ - value = (edge_is_real[e]) ? -value : value; - GWN_vertbuf_attr_set(vbo, index_id, vidx++, &value); - - if (do_adjacency) { - int v1 = mloop[mlt->tri[(e + 1) % 3]].v; - int v2 = mloop[mlt->tri[(e + 2) % 3]].v; - EdgeAdjacentVerts *eav = BLI_edgehash_lookup(eh, v0, v1); - int adj_v; - if (eav->vert_index[0] != v2) { - adj_v = eav->vert_index[0]; - } - else if (eav->vert_index[1] != -1) { - adj_v = eav->vert_index[1]; - } - else { - adj_v = v2; /* Non-manifold edge */ - } - GWN_vertbuf_attr_set(vbo, index_id, vidx++, &adj_v); + int v1 = mloop[mlt->tri[(e + 1) % 3]].v; + EdgeAdjacentVerts *eav = BLI_edgehash_lookup(eh, v0, v1); + uint value = (uint)v0; + /* Real edge */ + if (edge_is_real[e]) { + value |= (1 << 30); + } + /* Non-manifold edge */ + if (eav->vert_index[1] == -1) { + value |= (1 << 31); } + GWN_vertbuf_attr_set(vbo, index_id, vidx++, &value); } } - if (do_adjacency) { - BLI_edgehash_free(eh, MEM_freeN); - } + + BLI_edgehash_free(eh, MEM_freeN); int vbo_len_used = vidx; @@ -3474,7 +3463,7 @@ static GPUTexture *mesh_batch_cache_get_edges_overlay_texture_buf(MeshRenderData return cache->edges_face_overlay_tx; } - Gwn_VertBuf *vbo = cache->edges_face_overlay = mesh_batch_cache_create_edges_overlay_adj_texture_buf(rdata, false); + Gwn_VertBuf *vbo = cache->edges_face_overlay = mesh_batch_cache_create_edges_overlay_texture_buf(rdata); /* Upload data early because we need to create the texture for it. */ GWN_vertbuf_use(vbo); diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl index 7f2239fad5d..6e833a4e16b 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl @@ -18,6 +18,7 @@ out float facing; #ifdef LIGHT_EDGES in vec3 obPos[]; in vec3 vNor[]; +in float forceEdge[]; out float edgeSharpness; #endif @@ -52,6 +53,7 @@ void main(void) vec3 fnor = normalize(cross(obPos[1] - obPos[0], obPos[2] - obPos[0])); edgeSharpness = get_edge_sharpness(fnor, vNor[0]); + edgeSharpness = (forceEdge[0] == 1.0 || forceEdge[2] == 1.0) ? 1.0 : edgeSharpness; #endif gl_Position = gl_in[0].gl_Position; facing = facings.x; @@ -59,6 +61,7 @@ void main(void) #ifdef LIGHT_EDGES edgeSharpness = get_edge_sharpness(fnor, vNor[1]); + edgeSharpness = (forceEdge[1] == 1.0 || forceEdge[0] == 1.0) ? 1.0 : edgeSharpness; #endif gl_Position = gl_in[1].gl_Position; facing = facings.y; @@ -66,6 +69,7 @@ void main(void) #ifdef LIGHT_EDGES edgeSharpness = get_edge_sharpness(fnor, vNor[2]); + edgeSharpness = (forceEdge[2] == 1.0 || forceEdge[1] == 1.0) ? 1.0 : edgeSharpness; #endif gl_Position = gl_in[2].gl_Position; facing = facings.z; diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl index eca2e6bf530..616cd5379e9 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl @@ -9,7 +9,7 @@ uniform vec2 viewportSize; uniform float nearDist; uniform samplerBuffer vertData; -uniform isamplerBuffer faceIds; +uniform usamplerBuffer faceIds; #ifdef USE_GEOM_SHADER out vec2 ssPos; @@ -25,6 +25,7 @@ out float facing; #ifdef USE_GEOM_SHADER out vec3 obPos; out vec3 vNor; +out float forceEdge; #else out float edgeSharpness; #endif @@ -52,9 +53,9 @@ float short_to_unit_float(uint s) return float(value) / float(0x7FFF); } -vec3 get_vertex_nor(int v_id) +vec3 get_vertex_nor(uint id) { - v_id *= 5; /* See vertex format for explanation. */ + int v_id = int(id) * 5; /* See vertex format for explanation. */ /* Fetch compressed normal as float and unpack them. */ vec2 data; data.x = texelFetch(vertData, v_id + 3).r; @@ -69,9 +70,9 @@ vec3 get_vertex_nor(int v_id) return nor; } -vec3 get_vertex_pos(int v_id) +vec3 get_vertex_pos(uint id) { - v_id *= 5; /* See vertex format for explanation. */ + int v_id = int(id) * 5; /* See vertex format for explanation. */ vec3 pos; pos.x = texelFetch(vertData, v_id).r; pos.y = texelFetch(vertData, v_id + 1).r; @@ -90,10 +91,11 @@ float get_edge_sharpness(vec3 fnor, vec3 vnor) void main() { #ifdef USE_GEOM_SHADER - int v_id = texelFetch(faceIds, gl_VertexID).r; + uint v_id = texelFetch(faceIds, gl_VertexID).r; - bool do_edge = v_id < 0; - v_id = abs(v_id) - 1; + bool do_edge = (v_id & (1u << 30u)) != 0u; + bool force_edge = (v_id & (1u << 31u)) != 0u; + v_id = (v_id << 2u) >> 2u; vec3 pos = get_vertex_pos(v_id); vec3 nor = get_vertex_nor(v_id); @@ -106,6 +108,7 @@ void main() # ifdef LIGHT_EDGES obPos = pos; vNor = nor; + forceEdge = float(force_edge); /* meh, could try to also encode it in facingOut */ # endif #else @@ -113,13 +116,19 @@ void main() int v_n = gl_VertexID % 3; /* Getting the same positions for each of the 3 verts. */ - ivec3 v_id; + uvec3 v_id; v_id.x = texelFetch(faceIds, v_0).r; v_id.y = texelFetch(faceIds, v_0 + 1).r; v_id.z = texelFetch(faceIds, v_0 + 2).r; - bvec3 do_edge = lessThan(v_id, ivec3(0)); - v_id = abs(v_id) - 1; + bvec3 do_edge, force_edge; + do_edge.x = (v_id.x & (1u << 30u)) != 0u; + do_edge.y = (v_id.y & (1u << 30u)) != 0u; + do_edge.z = (v_id.z & (1u << 30u)) != 0u; + force_edge.x = (v_id.x & (1u << 31u)) != 0u; + force_edge.y = (v_id.y & (1u << 31u)) != 0u; + force_edge.z = (v_id.z & (1u << 31u)) != 0u; + v_id = (v_id << 2u) >> 2u; vec3 pos[3]; pos[0] = get_vertex_pos(v_id.x); @@ -144,12 +153,22 @@ void main() gl_Position = p_pos[v_n]; vec3 nor = get_vertex_nor(v_id[v_n]); - vec3 vnor = normalize(NormalMatrix * nor); - facing = vnor.z; + facing = normalize(NormalMatrix * nor).z; # ifdef LIGHT_EDGES vec3 fnor = normalize(cross(pos[1] - pos[0], pos[2] - pos[0])); edgeSharpness = get_edge_sharpness(fnor, nor); + + /* Fix disapearing edges. */ + if (v_n == 0) { + force_edge.xy = force_edge.xz; + } + else if (v_n == 2) { + force_edge.xy = force_edge.yz; + } + if (any(force_edge.xy)) { + edgeSharpness = 1.0; + } # endif #endif _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs