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.
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
return pos;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
#define NO_EDGE vec3(10000.0);
|
||||
@@ -91,12 +90,7 @@ float get_edge_sharpness(vec3 e0, vec3 e1, vec3 e2)
|
||||
void main()
|
||||
{
|
||||
#ifdef USE_GEOM_SHADER
|
||||
|
||||
# ifdef LIGHT_EDGES
|
||||
int v_id = texelFetch(faceIds, gl_VertexID * 2).r;
|
||||
# else
|
||||
int v_id = texelFetch(faceIds, gl_VertexID).r;
|
||||
# endif
|
||||
|
||||
bool do_edge = v_id < 0;
|
||||
v_id = abs(v_id) - 1;
|
||||
@@ -110,27 +104,19 @@ void main()
|
||||
ssPos = proj(gl_Position);
|
||||
|
||||
# ifdef LIGHT_EDGES
|
||||
int adj_id = texelFetch(faceIds, gl_VertexID * 2 + 1).r;
|
||||
obPos = pos;
|
||||
edgeAdj = get_vertex_pos(adj_id);
|
||||
vNor = nor;
|
||||
# endif
|
||||
|
||||
#else
|
||||
|
||||
# ifdef LIGHT_EDGES
|
||||
int v_0 = (gl_VertexID / 3) * 6;
|
||||
ivec2 ofs = ivec2(2, 4); /* GL_TRIANGLE_ADJACENCY */
|
||||
# else
|
||||
int v_0 = (gl_VertexID / 3) * 3;
|
||||
ivec2 ofs = ivec2(1, 2); /* GL_TRIANGLES */
|
||||
# endif
|
||||
int v_n = gl_VertexID % 3;
|
||||
|
||||
/* Getting the same positions for each of the 3 verts. */
|
||||
ivec3 v_id;
|
||||
v_id.x = texelFetch(faceIds, v_0).r;
|
||||
v_id.y = texelFetch(faceIds, v_0 + ofs.x).r;
|
||||
v_id.z = texelFetch(faceIds, v_0 + ofs.y).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;
|
||||
@@ -158,30 +144,12 @@ void main()
|
||||
gl_Position = p_pos[v_n];
|
||||
|
||||
vec3 nor = get_vertex_nor(v_id[v_n]);
|
||||
facing = normalize(NormalMatrix * nor).z;
|
||||
vec3 vnor = normalize(NormalMatrix * nor);
|
||||
facing = vnor.z;
|
||||
|
||||
# ifdef LIGHT_EDGES
|
||||
ivec3 adj_id;
|
||||
adj_id.x = texelFetch(faceIds, v_0 + 1).r;
|
||||
adj_id.y = texelFetch(faceIds, v_0 + 3).r;
|
||||
adj_id.z = texelFetch(faceIds, v_0 + 5).r;
|
||||
|
||||
vec3 adj_pos[3];
|
||||
adj_pos[0] = get_vertex_pos(adj_id.x);
|
||||
adj_pos[1] = get_vertex_pos(adj_id.y);
|
||||
adj_pos[2] = get_vertex_pos(adj_id.z);
|
||||
|
||||
vec3 edges[3];
|
||||
edges[0] = pos[1] - pos[0];
|
||||
edges[1] = pos[2] - pos[1];
|
||||
edges[2] = pos[0] - pos[2];
|
||||
|
||||
edgeSharpness.x = get_edge_sharpness(adj_pos[0] - pos[0], edges[0], -edges[2]);
|
||||
edgeSharpness.y = get_edge_sharpness(adj_pos[1] - pos[1], edges[1], -edges[0]);
|
||||
edgeSharpness.z = get_edge_sharpness(adj_pos[2] - pos[2], edges[2], -edges[1]);
|
||||
|
||||
/* Easy to adjust parameters. */
|
||||
edgeSharpness = smoothstep(wireStepParam.xxx, wireStepParam.yyy, edgeSharpness);
|
||||
vec3 fnor = normalize(cross(pos[1] - pos[0], pos[2] - pos[0]));
|
||||
edgeSharpness = get_edge_sharpness(fnor, nor);
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user