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

Reply via email to