[Bf-blender-cvs] [f9ca750bdf5] blender2.8: Wireframe: Change / Optimize the limited wireframe visibility option.

Clément Foucault noreply at git.blender.org
Thu Jun 7 18:01:38 CEST 2018


Commit: f9ca750bdf5e071eb240b55ee1e701e04dd7423c
Author: Clément Foucault
Date:   Thu Jun 7 16:55:41 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBf9ca750bdf5e071eb240b55ee1e701e04dd7423c

Wireframe: Change / Optimize the limited wireframe visibility option.

This make the limited wireframe not a performance problem anymore.

However, this does change the number of edges displayed as the threshold
is now computed per vertex instead of per edges.

For this reason we extended (internaly) the range of the slider so that the
users can hide more edge.

===================================================================

M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl.h
M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/draw/modes/overlay_mode.c
M	source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
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.c b/source/blender/draw/intern/draw_cache.c
index d6cea03d573..14addfe9bcb 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -526,17 +526,6 @@ void DRW_cache_object_face_wireframe_get(
 	}
 }
 
-void DRW_cache_object_face_wireframe_pretty_get(
-        Object *ob, struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count)
-{
-	switch (ob->type) {
-		case OB_MESH:
-			DRW_mesh_batch_cache_get_pretty_wireframes_face_texbuf((Mesh *)ob->data, r_vert_tx, r_faceid_tx, r_tri_count);
-
-		/* TODO, should match 'DRW_cache_object_surface_get' */
-	}
-}
-
 Gwn_Batch *DRW_cache_object_loose_edges_get(struct Object *ob)
 {
 	switch (ob->type) {
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 705192653f5..7a1c14b5076 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -56,8 +56,6 @@ struct Gwn_Batch **DRW_cache_object_surface_material_get(
         char **auto_layer_names, int **auto_layer_is_srgb, int *auto_layer_count);
 void DRW_cache_object_face_wireframe_get(
         Object *ob, struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count);
-void DRW_cache_object_face_wireframe_pretty_get(
-        Object *ob, struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count);
 
 /* Empties */
 struct Gwn_Batch *DRW_cache_plain_axes_get(void);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 2824021bb29..0f990c72d01 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -126,8 +126,6 @@ struct Gwn_Batch *DRW_mesh_batch_cache_get_verts_with_select_id(struct Mesh *me,
 /* Object mode Wireframe overlays */
 void DRW_mesh_batch_cache_get_wireframes_face_texbuf(
         struct Mesh *me, struct GPUTexture **verts_data, struct GPUTexture **face_indices, int *tri_count);
-void DRW_mesh_batch_cache_get_pretty_wireframes_face_texbuf(
-        struct Mesh *me, struct GPUTexture **verts_data, struct GPUTexture **face_indices, int *tri_count);
 
 void DRW_mesh_cache_sculpt_coords_ensure(struct Mesh *me);
 
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 53b3cadafe2..b6bd15ba2c2 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -1592,9 +1592,7 @@ typedef struct MeshBatchCache {
 	Gwn_Batch *edge_detection;
 
 	Gwn_VertBuf *edges_face_overlay;
-	Gwn_VertBuf *edges_face_overlay_adj;
 	GPUTexture *edges_face_overlay_tx;
-	GPUTexture *edges_face_overlay_adj_tx;
 	int edges_face_overlay_tri_count; /* Number of tri in edges_face_overlay(_adj)_tx */
 
 	/* Maybe have shaded_triangles_data split into pos_nor and uv_tangent
@@ -1877,9 +1875,7 @@ static void mesh_batch_cache_clear(Mesh *me)
 	GWN_BATCH_DISCARD_SAFE(cache->edge_detection);
 
 	GWN_VERTBUF_DISCARD_SAFE(cache->edges_face_overlay);
-	GWN_VERTBUF_DISCARD_SAFE(cache->edges_face_overlay_adj);
 	DRW_TEXTURE_FREE_SAFE(cache->edges_face_overlay_tx);
-	DRW_TEXTURE_FREE_SAFE(cache->edges_face_overlay_adj_tx);
 
 	GWN_VERTBUF_DISCARD_SAFE(cache->shaded_triangles_data);
 	if (cache->shaded_triangles_in_order) {
@@ -3468,26 +3464,6 @@ static Gwn_VertBuf *mesh_batch_cache_create_edges_overlay_adj_texture_buf(MeshRe
 	return vbo;
 }
 
-static GPUTexture *mesh_batch_cache_get_edges_overlay_adj_texture_buf(MeshRenderData *rdata, MeshBatchCache *cache)
-{
-	BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI));
-
-	BLI_assert(rdata->edit_bmesh == NULL); /* Not supported in edit mode */
-
-	if (cache->edges_face_overlay_adj_tx != NULL) {
-		return cache->edges_face_overlay_adj_tx;
-	}
-
-	Gwn_VertBuf *vbo = cache->edges_face_overlay_adj = mesh_batch_cache_create_edges_overlay_adj_texture_buf(rdata, true);
-
-	/* Upload data early because we need to create the texture for it. */
-	GWN_vertbuf_use(vbo);
-	cache->edges_face_overlay_adj_tx = GPU_texture_create_from_vertbuf(vbo);
-	cache->edges_face_overlay_tri_count = vbo->vertex_alloc / 6;
-
-	return cache->edges_face_overlay_adj_tx;
-}
-
 static GPUTexture *mesh_batch_cache_get_edges_overlay_texture_buf(MeshRenderData *rdata, MeshBatchCache *cache)
 {
 	BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI));
@@ -4129,27 +4105,6 @@ void DRW_mesh_batch_cache_get_wireframes_face_texbuf(
 	*verts_data = cache->pos_in_order_tx;
 }
 
-void DRW_mesh_batch_cache_get_pretty_wireframes_face_texbuf(
-        Mesh *me, GPUTexture **verts_data, GPUTexture **face_indices, int *tri_count)
-{
-	MeshBatchCache *cache = mesh_batch_cache_get(me);
-
-	if (cache->edges_face_overlay_adj_tx == NULL || cache->pos_in_order_tx == NULL) {
-		const int options = MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI;
-
-		MeshRenderData *rdata = mesh_render_data_create(me, options);
-
-		mesh_batch_cache_get_edges_overlay_adj_texture_buf(rdata, cache);
-		mesh_batch_cache_get_vert_pos_and_nor_in_order_buf(rdata, cache);
-
-		mesh_render_data_free(rdata);
-	}
-
-	*tri_count = cache->edges_face_overlay_tri_count;
-	*face_indices = cache->edges_face_overlay_adj_tx;
-	*verts_data = cache->pos_in_order_tx;
-}
-
 static void mesh_batch_cache_create_overlay_batches(Mesh *me)
 {
 	BLI_assert(me->edit_btmesh != NULL);
diff --git a/source/blender/draw/modes/overlay_mode.c b/source/blender/draw/modes/overlay_mode.c
index 721f659f253..97403b14ac5 100644
--- a/source/blender/draw/modes/overlay_mode.c
+++ b/source/blender/draw/modes/overlay_mode.c
@@ -156,8 +156,8 @@ static void overlay_cache_init(void *vedata)
 		 * The range controls the falloff effect. If range was 0.0f we would get a hard cut (as in 2.7).
 		 * That said we are using a different algorithm so the results will always differ.
 		 */
-		const float factor = 0.006f;
-		const float range = 0.0025f;
+		const float factor = 0.0045f;
+		const float range = 0.00125f;
 		stl->g_data->wire_step_param[1] = (1.0f - factor) + stl->g_data->overlay.wireframe_threshold * factor;
 		stl->g_data->wire_step_param[0] = stl->g_data->wire_step_param[1] + range;
 	}
@@ -186,12 +186,7 @@ static void overlay_cache_populate(void *vedata, Object *ob)
 		if ((ob != draw_ctx->object_edit) && !BKE_object_is_in_editmode(ob)) {
 			int tri_count;
 			GPUTexture *verts = NULL, *faceids;
-			if (stl->g_data->overlay.wireframe_threshold == 1.0f) {
-				DRW_cache_object_face_wireframe_get(ob, &verts, &faceids, &tri_count);
-			}
-			else {
-				DRW_cache_object_face_wireframe_pretty_get(ob, &verts, &faceids, &tri_count);
-			}
+			DRW_cache_object_face_wireframe_get(ob, &verts, &faceids, &tri_count);
 			if (verts) {
 				float *rim_col = ts.colorWire;
 				if ((ob->base_flag & BASE_SELECTED) != 0) {
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
index 5dfbb4352e4..00ababc624d 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
@@ -7,7 +7,7 @@ flat in vec3 ssVec2;
 in float facing;
 
 #ifdef LIGHT_EDGES
-flat in vec3 edgeSharpness;
+in float edgeSharpness;
 #endif
 
 out vec4 fragColor;
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 8f5712cca03..7f2239fad5d 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
@@ -17,9 +17,9 @@ out float facing;
 
 #ifdef LIGHT_EDGES
 in vec3 obPos[];
-in vec3 edgeAdj[];
+in vec3 vNor[];
 
-flat out vec3 edgeSharpness;
+out float edgeSharpness;
 #endif
 
 #define NO_EDGE vec3(10000.0);
@@ -32,11 +32,10 @@ vec3 compute_vec(vec2 v0, vec2 v1)
 	return vec3(v, -dot(v, v0));
 }
 
-float get_edge_sharpness(vec3 e0, vec3 e1, vec3 e2)
+float get_edge_sharpness(vec3 fnor, vec3 vnor)
 {
-	vec3 n0 = normalize(cross(e0, e1));
-	vec3 n1 = normalize(cross(e1, e2));
-	return dot(n0, n1);
+	float sharpness = abs(dot(fnor, vnor));
+	return smoothstep(wireStepParam.x, wireStepParam.y, sharpness);
 }
 
 void main(void)
@@ -50,25 +49,24 @@ void main(void)
 	ssVec2 = do_edge.z ? compute_vec(ssPos[2], ssPos[0]) : NO_EDGE;
 
 #ifdef LIGHT_EDGES
-	vec3 edges[3];
-	edges[0] = obPos[1] - obPos[0];
-	edges[1] = obPos[2] - obPos[1];
-	edges[2] = obPos[0] - obPos[2];
+	vec3 fnor = normalize(cross(obPos[1] - obPos[0], obPos[2] - obPos[0]));
 
-	edgeSharpness.x = get_edge_sharpness(edgeAdj[0] - obPos[0], edges[0], -edges[2]);
-	edgeSharpness.y = get_edge_sharpness(edgeAdj[1] - obPos[1], edges[1], -edges[0]);
-	edgeSharpness.z = get_edge_sharpness(edgeAdj[2] - obPos[2], edges[2], -edges[1]);
-
-	/* Easy to adjust parameters. */
-	edgeSharpness = smoothstep(wireStepParam.xxx, wireStepParam.yyy, edgeSharpness);
+	edgeSharpness = get_edge_sharpness(fnor, vNor[0]);
 #endif
-
 	gl_Position = gl_in[0].gl_Position;
 	facing = facings.x;
 	EmitVertex();
+
+#ifdef LIGHT_EDGES
+	edgeSharpness = get_edge_sharpness(fnor, vNor[1]);
+#endif
 	gl_Position = gl_in[1].gl_Position;
 	facing = facings.y;
 	EmitVertex();
+
+#ifdef LIGHT_EDGES
+	edgeSharpness = get_edge_sharpness(fnor, vNor[2]);
+#endif
 	gl_Position = gl_in[2].gl_Position;
 	facing = facings.z;
 	EmitVertex();
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 96afb8748b6..eca2e6bf530 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
@@ -24,9 +24,9 @@ out float facing;
 #ifdef LIGHT_EDGES
 #ifdef USE_GEOM_SHADER
 out vec3 obPos;
-out vec3 edgeAdj;
+out vec3 vNor;
 #else
-flat out vec3 edgeSharpness;
+out float edgeSharpness;
 #endif
 #endif
 
@@ -79,11 +79,10 @@ vec3 get_vertex_pos(int v_id)
 	

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list