[Bf-blender-cvs] [1f2b48eb45c] temp_bmesh_multires: Add a little todo list
Joseph Eagar
noreply at git.blender.org
Sat Mar 6 01:54:39 CET 2021
Commit: 1f2b48eb45c7d5714be452463738a9866fe71a65
Author: Joseph Eagar
Date: Fri Mar 5 16:54:19 2021 -0800
Branches: temp_bmesh_multires
https://developer.blender.org/rB1f2b48eb45c7d5714be452463738a9866fe71a65
Add a little todo list
===================================================================
M release/scripts/addons
M source/blender/blenkernel/intern/pbvh_bmesh.c
===================================================================
diff --git a/release/scripts/addons b/release/scripts/addons
index 8adb0dce852..c8752443311 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 8adb0dce852d84bfe1f9e81399681fa615b5aa8e
+Subproject commit c8752443311b133f8783a6b9b2152eb7c92d06a7
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index 2be64d19fd1..48b23c0c85f 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -18,6 +18,25 @@
* \ingroup bli
*/
+ /*
+ TODO:
+
+ Convergence improvements:
+ 1. DONE: Limit number of edges processed per run.
+ 2. Scale split steps by ratio of long to short edges to
+ prevent runaway tesselation.
+ 3. Detect and dissole three and four valence vertices that are surrounded by
+ all tris.
+
+ Drawing improvements:
+ 4. Build and cache vertex index buffers, to reduce GPU bandwidth
+
+ Topology rake:
+ 5. Enable new curvature topology rake code and add to UI.
+ 6. Add code to cache curvature data per vertex in a CD layer.
+
+*/
+
#include "MEM_guardedalloc.h"
#include "BLI_array.h"
@@ -40,8 +59,9 @@
#include "bmesh.h"
#include "pbvh_intern.h"
-#define DYNTOPO_TIME_LIMIT 0.015
+//#define DYNTOPO_TIME_LIMIT 0.015
#define DYNTOPO_RUN_INTERVAL 0.02
+#define DYNTOPO_MAX_ITER 1024
#define DYNTOPO_USE_HEAP
@@ -893,7 +913,7 @@ BLI_INLINE float calc_weighted_edge_collapse(EdgeQueueContext *eq_ctx, BMVert *v
return l * (n*n*4.0f);
#elif 1 // penalize 4-valence verts
float l = len_squared_v3v3(v1->co, v2->co);
- //if (BM_vert_edge_count(v1) == 4 || BM_vert_edge_count(v2) == 4) {
+ // if (BM_vert_edge_count(v1) == 4 || BM_vert_edge_count(v2) == 4) {
// l *= 0.25f;
//}
@@ -1927,23 +1947,6 @@ static void pbvh_bmesh_split_edge(EdgeQueueContext *eq_ctx,
if (!BLI_table_gset_haskey(pbvh->nodes[ni].bm_unique_verts, v_new)) {
BLI_table_gset_add(pbvh->nodes[ni].bm_other_verts, v_new);
}
- //*
- if (BM_vert_edge_count_is_over(v_opp, 8)) {
- BMIter bm_iter;
- BMEdge *e2;
-
- BM_ITER_ELEM (e2, &bm_iter, v_opp, BM_EDGES_OF_VERT) {
- BMVert *v2 = BM_edge_other_vert(e2, v_opp);
- bool add = eq_ctx->q->edge_queue_vert_in_range(eq_ctx->q, v2);
-
- add = add && BM_edge_calc_length_squared(e2) > eq_ctx->q->limit_len_squared;
-
- if (add) {
- long_edge_queue_edge_add(eq_ctx, e2);
- }
- }
- }
- //*/
}
BM_edge_kill(pbvh->bm, e);
@@ -1957,11 +1960,18 @@ static bool pbvh_bmesh_subdivide_long_edges(EdgeQueueContext *eq_ctx,
double time = PIL_check_seconds_timer();
RNG *rng = BLI_rng_new((int)(time * 1000.0f));
+ int step = 0;
while (!BLI_heapsimple_is_empty(eq_ctx->q->heap)) {
+ if (step++ > DYNTOPO_MAX_ITER) {
+ break;
+ }
+
+#ifdef DYNTOPO_TIME_LIMIT
if (PIL_check_seconds_timer() - time > DYNTOPO_TIME_LIMIT) {
break;
}
+#endif
#ifndef DYNTOPO_USE_HEAP
if (eq_ctx->q->totelems == 0) {
@@ -2368,10 +2378,18 @@ static bool pbvh_bmesh_collapse_short_edges(EdgeQueueContext *eq_ctx,
int _i = 0;
#endif
+ int step = 0;
+
while (!BLI_heapsimple_is_empty(eq_ctx->q->heap)) {
+ if (step++ > DYNTOPO_MAX_ITER) {
+ break;
+ }
+#ifdef DYNTOPO_TIME_LIMIT
if (PIL_check_seconds_timer() - time > DYNTOPO_TIME_LIMIT) {
break;
}
+#endif
+
#ifndef DYNTOPO_USE_HEAP
if (eq_ctx->q->totelems == 0) {
break;
@@ -3011,23 +3029,23 @@ bool BKE_pbvh_bmesh_update_topology_nodes(PBVH *pbvh,
continue;
}
- undopush(node, searchdata);
-
- modified =
- modified ||
- BKE_pbvh_bmesh_update_topology(
- pbvh, mode, center, view_normal, radius, use_frontface, use_projected, sym_axis, updatePBVH);
-
- if (i < pbvh->totnode) { //nodes could have been reallocated on us
- node = pbvh->nodes + i;
+ if (node->flag & PBVH_Leaf) {
+ undopush(node, searchdata);
- if (node->flag & PBVH_Leaf) {
- BKE_pbvh_node_mark_topology_update(pbvh->nodes + i);
- BKE_pbvh_bmesh_node_save_ortri(pbvh->bm, pbvh->nodes + i);
- }
+ BKE_pbvh_node_mark_topology_update(pbvh->nodes + i);
+ BKE_pbvh_bmesh_node_save_ortri(pbvh->bm, pbvh->nodes + i);
}
}
+ modified = modified || BKE_pbvh_bmesh_update_topology(pbvh,
+ mode,
+ center,
+ view_normal,
+ radius,
+ use_frontface,
+ use_projected,
+ sym_axis,
+ updatePBVH);
return modified;
}
More information about the Bf-blender-cvs
mailing list