[Bf-blender-cvs] [ec4786d00b3] temp_bmesh_multires: Dyntopo branch
Joseph Eagar
noreply at git.blender.org
Thu May 13 01:40:24 CEST 2021
Commit: ec4786d00b357458dd11d5d3ee28e00da4cbf859
Author: Joseph Eagar
Date: Wed May 12 16:22:39 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rBec4786d00b357458dd11d5d3ee28e00da4cbf859
Dyntopo branch
* Sculpt expand now works with dyntopo in more cases
* Fixed various dyntopo face set bugs
Stuff from several commits ago:
* There is now an API to get face sets using SculptFaceRef's.
+ SCULPT_face_set_get
+ SCULPT_face_set_set
* Prototyped a faster geodesic propagation function, but it currently
doesn't work.
* Dyntopo triangulation now preserves face flags (took some work as BM_triangulate_face explicitly prevents selection flags from being preserved).
* Also face smooth flags are no longer being overriden.
* Most of the faceset create operators work (I'm not sure I've tested
all of them though).
* SCULPT_face_set.c now has helper functions that checks if a pbvh
is *not* PBVH_BMESH, in which case it builds a temporary bmesh,
otherwise ss->bm is used (sculpt_faceset_bm_begin and sculpt_faceset_bm_end).
+ Note that some functions were able to use SCULPT_face_set_XXX
instead and avoid bmesh entirely.
===================================================================
M source/blender/bmesh/intern/bmesh_log.c
M source/blender/editors/sculpt_paint/paint_mask.c
M source/blender/editors/sculpt_paint/sculpt.c
M source/blender/editors/sculpt_paint/sculpt_dyntopo.c
M source/blender/editors/sculpt_paint/sculpt_expand.c
M source/blender/editors/sculpt_paint/sculpt_face_set.c
M source/blender/editors/sculpt_paint/sculpt_geodesic.c
M source/blender/editors/sculpt_paint/sculpt_intern.h
M source/blender/editors/sculpt_paint/sculpt_undo.c
===================================================================
diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c
index a5ce2d67e0c..94f0187df4c 100644
--- a/source/blender/bmesh/intern/bmesh_log.c
+++ b/source/blender/bmesh/intern/bmesh_log.c
@@ -882,7 +882,7 @@ BMLog *BM_log_from_existing_entries_create(BMesh *bm, BMLogEntry *entry)
return log;
}
-ATTR_NO_OPT BMLog *BM_log_unfreeze(BMesh *bm, BMLogEntry *entry)
+BMLog *BM_log_unfreeze(BMesh *bm, BMLogEntry *entry)
{
if (!entry || !entry->log) {
return NULL;
diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c
index da3dbe03e3f..d1d0bf6a138 100644
--- a/source/blender/editors/sculpt_paint/paint_mask.c
+++ b/source/blender/editors/sculpt_paint/paint_mask.c
@@ -1366,7 +1366,7 @@ static void sculpt_gesture_trim_end(bContext *UNUSED(C), SculptGestureContext *s
sculpt_gesture_trim_geometry_free(sgcontext);
if (sgcontext->ss && sgcontext->ss->bm) {
- SCULPT_dynamic_topology_triangulate(sgcontext->ss->bm);
+ SCULPT_dynamic_topology_triangulate(sgcontext->ss, sgcontext->ss->bm);
}
SCULPT_undo_push_node(sgcontext->vc.obact, NULL, SCULPT_UNDO_GEOMETRY);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 84f655be0c6..795b0b2e215 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -112,6 +112,9 @@
void SCULPT_vertex_random_access_ensure(SculptSession *ss)
{
if (ss->bm) {
+ ss->totfaces = ss->totpoly = ss->bm->totface;
+ ss->totvert = ss->bm->totvert;
+
BM_mesh_elem_index_ensure(ss->bm, BM_VERT);
BM_mesh_elem_table_ensure(ss->bm, BM_VERT);
}
@@ -129,10 +132,14 @@ void SCULPT_vertex_random_access_ensure(SculptSession *ss)
void SCULPT_face_random_access_ensure(SculptSession *ss)
{
if (ss->bm) {
+ ss->totfaces = ss->totpoly = ss->bm->totface;
+ ss->totvert = ss->bm->totvert;
+
BM_mesh_elem_index_ensure(ss->bm, BM_FACE);
BM_mesh_elem_table_ensure(ss->bm, BM_FACE);
}
}
+
int SCULPT_vertex_count_get(SculptSession *ss)
{
switch (BKE_pbvh_type(ss->pbvh)) {
@@ -986,7 +993,7 @@ bool SCULPT_vertex_has_unique_face_set(SculptSession *ss, SculptVertRef index)
face_set = face_set2;
}
- return !first;
+ return true;
}
case PBVH_GRIDS: {
const CCGKey *key = BKE_pbvh_get_grid_key(ss->pbvh);
@@ -1468,15 +1475,15 @@ void SCULPT_floodfill_init(SculptSession *ss, SculptFloodFill *flood)
flood->visited_vertices = BLI_BITMAP_NEW(vertex_count, "visited vertices");
}
-void SCULPT_floodfill_add_initial(SculptFloodFill *flood, SculptVertRef index)
+void SCULPT_floodfill_add_initial(SculptFloodFill *flood, SculptVertRef vertex)
{
- BLI_gsqueue_push(flood->queue, &index);
+ BLI_gsqueue_push(flood->queue, &vertex);
}
-void SCULPT_floodfill_add_and_skip_initial(SculptFloodFill *flood, int index)
+void SCULPT_floodfill_add_and_skip_initial(SculptSession *ss, SculptFloodFill *flood, SculptVertRef vertex)
{
- BLI_gsqueue_push(flood->queue, &index);
- BLI_BITMAP_ENABLE(flood->visited_vertices, index);
+ BLI_gsqueue_push(flood->queue, &vertex);
+ BLI_BITMAP_ENABLE(flood->visited_vertices, BKE_pbvh_vertex_index_to_table(ss->pbvh, vertex));
}
void SCULPT_floodfill_add_initial_with_symmetry(Sculpt *sd,
@@ -6467,6 +6474,9 @@ static void sculpt_topology_update(Sculpt *sd,
/* Update average stroke position. */
copy_v3_v3(location, ss->cache->true_location);
mul_m4_v3(ob->obmat, location);
+
+ ss->totfaces = ss->totpoly = ss->bm->totface;
+ ss->totvert = ss->bm->totvert;
}
static void do_brush_action_task_cb(void *__restrict userdata,
@@ -9093,7 +9103,7 @@ static int sculpt_symmetrize_exec(bContext *C, wmOperator *op)
sd->symmetrize_direction,
dist,
true);
- SCULPT_dynamic_topology_triangulate(ss->bm);
+ SCULPT_dynamic_topology_triangulate(ss, ss->bm);
/* Bisect operator flags edges (keep tags clean for edge queue). */
BM_mesh_elem_hflag_disable_all(ss->bm, BM_EDGE, BM_ELEM_TAG, false);
diff --git a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
index 4b746757997..d531f0ffa0e 100644
--- a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
@@ -82,9 +82,12 @@
#include <math.h>
#include <stdlib.h>
-void SCULPT_dynamic_topology_triangulate(BMesh *bm)
+void SCULPT_dynamic_topology_triangulate(SculptSession *ss, BMesh *bm)
{
if (bm->totloop == bm->totface * 3) {
+ ss->totfaces = ss->totpoly = ss->bm->totface;
+ ss->totvert = ss->bm->totvert;
+
return;
}
@@ -152,6 +155,9 @@ void SCULPT_dynamic_topology_triangulate(BMesh *bm)
BLI_memarena_free(pf_arena);
+ ss->totfaces = ss->totpoly = ss->bm->totface;
+ ss->totvert = ss->bm->totvert;
+
// BM_mesh_triangulate(
// bm, MOD_TRIANGULATE_QUAD_BEAUTY, MOD_TRIANGULATE_NGON_EARCLIP, 4, false, NULL, NULL,
// NULL);
@@ -445,7 +451,8 @@ void SCULPT_dynamic_topology_enable_ex(Main *bmain, Depsgraph *depsgraph, Scene
.use_shapekey = true,
.active_shapekey = ob->shapenr,
}));
- SCULPT_dynamic_topology_triangulate(ss->bm);
+ SCULPT_dynamic_topology_triangulate(ss, ss->bm);
+
BM_data_layer_add(ss->bm, &ss->bm->vdata, CD_PAINT_MASK);
SCULPT_dyntopo_node_layers_add(ss);
diff --git a/source/blender/editors/sculpt_paint/sculpt_expand.c b/source/blender/editors/sculpt_paint/sculpt_expand.c
index a26f5622e71..1ccfb19400d 100644
--- a/source/blender/editors/sculpt_paint/sculpt_expand.c
+++ b/source/blender/editors/sculpt_paint/sculpt_expand.c
@@ -176,14 +176,16 @@ static bool sculpt_expand_is_face_in_active_component(SculptSession *ss,
const SculptFaceRef f)
{
if (ss->bm) {
- BMFace *bf = (BMFace*)f.i;
+ BMFace *bf = (BMFace *)f.i;
BMLoop *l = bf->l_first;
SculptVertRef v = {(intptr_t)l->v};
return sculpt_expand_is_vert_in_active_component(ss, expand_cache, v);
- } else {
+ }
+ else {
const MLoop *loop = &ss->mloop[ss->mpoly[f.i].loopstart];
- return sculpt_expand_is_vert_in_active_component(ss, expand_cache, BKE_pbvh_table_index_to_vertex(ss->pbvh, loop->v));
+ return sculpt_expand_is_vert_in_active_component(
+ ss, expand_cache, BKE_pbvh_table_index_to_vertex(ss->pbvh, loop->v));
}
}
@@ -237,7 +239,9 @@ static float sculpt_expand_max_vertex_falloff_get(ExpandCache *expand_cache)
* Main function to get the state of a vertex for the current state and settings of a #ExpandCache.
* Returns true when the target data should be modified by expand.
*/
-static bool sculpt_expand_state_get(SculptSession *ss, ExpandCache *expand_cache, const SculptVertRef v)
+static bool sculpt_expand_state_get(SculptSession *ss,
+ ExpandCache *expand_cache,
+ const SculptVertRef v)
{
if (!SCULPT_vertex_visible_get(ss, v)) {
return false;
@@ -283,11 +287,14 @@ static bool sculpt_expand_state_get(SculptSession *ss, ExpandCache *expand_cache
* Main function to get the state of a face for the current state and settings of a #ExpandCache.
* Returns true when the target data should be modified by expand.
*/
-static bool sculpt_expand_face_state_get(SculptSession *ss, ExpandCache *expand_cache, const SculptFaceRef f)
+static bool sculpt_expand_face_state_get(SculptSession *ss,
+ ExpandCache *expand_cache,
+ const SculptFaceRef f)
{
const int f_i = BKE_pbvh_face_index_to_table(ss->pbvh, f);
+ const int fset = SCULPT_face_set_get(ss, f);
- if (ss->face_sets[f_i] <= 0) {
+ if (fset <= 0) {
return false;
}
@@ -315,7 +322,7 @@ static bool sculpt_expand_face_state_get(SculptSession *ss, ExpandCache *expand_
}
if (expand_cache->falloff_type == SCULPT_EXPAND_FALLOFF_ACTIVE_FACE_SET) {
- if (ss->face_sets[f_i] == expand_cache->initial_active_face_set) {
+ if (fset == expand_cache->initial_active_face_set) {
enabled = false;
}
}
@@ -377,7 +384,8 @@ static BLI_bitmap *sculpt_expand_bitmap_from_enabled(SculptSession *ss, ExpandCa
const int totvert = SCULPT_vertex_count_get(ss);
BLI_bitmap *enabled_vertices = BLI_BITMAP_NEW(totvert, "enabled vertices");
for (int i = 0; i < totvert; i++) {
- const bool enabled = sculpt_expand_state_get(ss, expand_cache, BKE_pbvh_table_index_to_vertex(ss->pbvh, i));
+ const bool enabled = sculpt_expand_state_get(
+ ss, expand_cache, BKE_pbvh_table_index_to_vertex(ss->pbvh, i));
BLI_BITMAP_SET(enabled_vertices, i, enabled);
}
return enabled_vertices;
@@ -639,7 +647,8 @@ static float *sculpt_expand_boundary_topology_falloff_create(Object *ob, const S
for (int i = 0; i < boundary->num_vertices; i++) {
BLI_gsqueue_push(queue, &boundary->vertices[i]);
- BLI_BITMAP_ENABLE(visited_vertices, BKE_pbvh_vertex_index_to_table(ss->pbvh, boundary->vertices[i]));
+ BLI_BITMAP_ENABLE(visited_vertices,
+ BKE_pbvh_vertex_index_to_table(ss->pbvh, boundary->vertices[i]));
}
SCULPT_boundary_data_free(boundary);
}
@@ -686,12 +695,17 @@ static float *sculpt_expand_diagonals_falloff_create(Object *ob, const SculptVer
float *dists = MEM_calloc_arrayN(sizeof(float), totvert, "spherical dist");
/* This algorithm uses mesh data (polys and loops), so this falloff type can't be initialized for
- * Multires. It also does not make sense to implement it for dyntopo as the result will be the
- * same as Topology falloff. */
- if (BKE_pbvh_type(ss->pbvh) != PBVH_FACES) {
+ * Multires. Also supports non-tri PBVH_BMESH, though untested until we implement that properly*/
+ if (BKE_pbvh_type(ss->pbvh) != PBVH_FACES ||
+ (ss->bm && ss->bm->totloop != ss->bm->totvert * 3)) {
return dists;
}
+ if (ss->bm) {
+ BM_mesh_elem_index_ensure(ss->bm, BM_VERT);
+ BM_mesh_elem_ta
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list