[Bf-blender-cvs] [fc7c57f4a14] sculpt-dev: Sculpt Expand: Improve support for Multires and dyntopo
Pablo Dobarro
noreply at git.blender.org
Sun Feb 14 20:02:52 CET 2021
Commit: fc7c57f4a1441e348db7f8c3e3457c95b3e8c6c5
Author: Pablo Dobarro
Date: Sun Feb 14 20:02:24 2021 +0100
Branches: sculpt-dev
https://developer.blender.org/rBfc7c57f4a1441e348db7f8c3e3457c95b3e8c6c5
Sculpt Expand: Improve support for Multires and dyntopo
===================================================================
M source/blender/editors/sculpt_paint/sculpt_expand.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/sculpt_expand.c b/source/blender/editors/sculpt_paint/sculpt_expand.c
index e5cb8ba3bac..68bdf1bdc83 100644
--- a/source/blender/editors/sculpt_paint/sculpt_expand.c
+++ b/source/blender/editors/sculpt_paint/sculpt_expand.c
@@ -600,15 +600,10 @@ static void sculpt_expand_update_max_face_falloff_factor(SculptSession *ss,
}
}
-static void sculpt_expand_mesh_face_falloff_from_grids_falloff(SculptSession *ss,
- Mesh *mesh,
- ExpandCache *expand_cache)
+static void sculpt_expand_grids_to_faces_falloff(SculptSession *ss,
+ Mesh *mesh,
+ ExpandCache *expand_cache)
{
- if (expand_cache->face_falloff_factor) {
- MEM_freeN(expand_cache->face_falloff_factor);
- }
- expand_cache->face_falloff_factor = MEM_malloc_arrayN(
- mesh->totpoly, sizeof(float), "face falloff factors");
const CCGKey *key = BKE_pbvh_get_grid_key(ss->pbvh);
@@ -625,15 +620,8 @@ static void sculpt_expand_mesh_face_falloff_from_grids_falloff(SculptSession *ss
}
}
-static void sculpt_expand_mesh_face_falloff_from_vertex_falloff(Mesh *mesh,
- ExpandCache *expand_cache)
+static void sculpt_expand_vertex_to_faces_falloff(Mesh *mesh, ExpandCache *expand_cache)
{
- if (expand_cache->face_falloff_factor) {
- MEM_freeN(expand_cache->face_falloff_factor);
- }
- expand_cache->face_falloff_factor = MEM_malloc_arrayN(
- mesh->totpoly, sizeof(float), "face falloff factors");
-
for (int p = 0; p < mesh->totpoly; p++) {
MPoly *poly = &mesh->mpoly[p];
float accum = 0.0f;
@@ -645,6 +633,27 @@ static void sculpt_expand_mesh_face_falloff_from_vertex_falloff(Mesh *mesh,
}
}
+static void sculpt_expand_mesh_face_falloff_from_vertex_falloff(SculptSession *ss,
+ Mesh *mesh,
+ ExpandCache *expand_cache)
+{
+ if (expand_cache->face_falloff_factor) {
+ MEM_freeN(expand_cache->face_falloff_factor);
+ }
+ expand_cache->face_falloff_factor = MEM_malloc_arrayN(
+ mesh->totpoly, sizeof(float), "face falloff factors");
+
+ if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
+ sculpt_expand_vertex_to_faces_falloff(mesh, expand_cache);
+ }
+ else if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) {
+ sculpt_expand_grids_to_faces_falloff(ss, mesh, expand_cache);
+ }
+ else {
+ BLI_assert(false);
+ }
+}
+
static BLI_bitmap *sculpt_expand_bitmap_from_enabled(SculptSession *ss, ExpandCache *expand_cache)
{
const int totvert = SCULPT_vertex_count_get(ss);
@@ -837,32 +846,25 @@ static void sculpt_expand_falloff_factors_from_vertex_and_symm_create(
const int vertex,
eSculptExpandFalloffType falloff_type)
{
-
MEM_SAFE_FREE(expand_cache->falloff_factor);
expand_cache->falloff_factor_type = falloff_type;
SculptSession *ss = ob->sculpt;
-
- /* Handle limited support for Multires. */
- if (BKE_pbvh_type(ss->pbvh) != PBVH_FACES) {
- expand_cache->falloff_factor = sculpt_expand_topology_falloff_create(sd, ob, vertex);
- sculpt_expand_update_max_falloff_factor(ss, expand_cache);
- if (expand_cache->target == SCULPT_EXPAND_TARGET_FACE_SETS) {
- sculpt_expand_mesh_face_falloff_from_grids_falloff(ss, ob->data, expand_cache);
- sculpt_expand_update_max_face_falloff_factor(ss, expand_cache);
- }
- return;
- }
+ const bool has_topology_info = BKE_pbvh_type(ss->pbvh) == PBVH_FACES;
switch (falloff_type) {
case SCULPT_EXPAND_FALLOFF_GEODESIC:
- expand_cache->falloff_factor = sculpt_expand_geodesic_falloff_create(sd, ob, vertex);
+ expand_cache->falloff_factor = has_topology_info ?
+ sculpt_expand_geodesic_falloff_create(sd, ob, vertex) :
+ sculpt_expand_spherical_falloff_create(sd, ob, vertex);
break;
case SCULPT_EXPAND_FALLOFF_TOPOLOGY:
expand_cache->falloff_factor = sculpt_expand_topology_falloff_create(sd, ob, vertex);
break;
case SCULPT_EXPAND_FALLOFF_TOPOLOGY_DIAGONALS:
- expand_cache->falloff_factor = sculpt_expand_diagonals_falloff_create(sd, ob, vertex);
+ expand_cache->falloff_factor = has_topology_info ?
+ sculpt_expand_diagonals_falloff_create(sd, ob, vertex) :
+ sculpt_expand_topology_falloff_create(sd, ob, vertex);
break;
case SCULPT_EXPAND_FALLOFF_NORMALS:
expand_cache->falloff_factor = sculpt_expand_normal_falloff_create(sd, ob, vertex, 300.0f);
@@ -886,7 +888,7 @@ static void sculpt_expand_falloff_factors_from_vertex_and_symm_create(
sculpt_expand_update_max_falloff_factor(ss, expand_cache);
if (expand_cache->target == SCULPT_EXPAND_TARGET_FACE_SETS) {
- sculpt_expand_mesh_face_falloff_from_vertex_falloff(ob->data, expand_cache);
+ sculpt_expand_mesh_face_falloff_from_vertex_falloff(ss, ob->data, expand_cache);
sculpt_expand_update_max_face_falloff_factor(ss, expand_cache);
}
}
@@ -1337,7 +1339,7 @@ static void sculpt_expand_resursion_step_add(Object *ob,
sculpt_expand_update_max_falloff_factor(ss, expand_cache);
if (expand_cache->target == SCULPT_EXPAND_TARGET_FACE_SETS) {
- sculpt_expand_mesh_face_falloff_from_vertex_falloff(ob->data, expand_cache);
+ sculpt_expand_mesh_face_falloff_from_vertex_falloff(ss, ob->data, expand_cache);
sculpt_expand_update_max_face_falloff_factor(ss, expand_cache);
}
More information about the Bf-blender-cvs
mailing list