[Bf-blender-cvs] [00233f5f78e] blender2.8: Wireframe: Fix edges or non manifold meshes not showing.
Clément Foucault
noreply at git.blender.org
Thu Jun 7 18:01:40 CEST 2018
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
More information about the Bf-blender-cvs
mailing list