Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_cloth.c69
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_expand.c33
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_face_set_topology.c37
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_intern.h4
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_poly_loop.c92
5 files changed, 135 insertions, 100 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt_cloth.c b/source/blender/editors/sculpt_paint/sculpt_cloth.c
index ac78cc67b2e..856a2652e21 100644
--- a/source/blender/editors/sculpt_paint/sculpt_cloth.c
+++ b/source/blender/editors/sculpt_paint/sculpt_cloth.c
@@ -1446,12 +1446,19 @@ typedef enum eSculpClothFilterPinchOriginType {
} eSculptClothFilterPinchOriginType;
static EnumPropertyItem prop_cloth_filter_pinch_origin_type[] = {
- {CLOTH_FILTER_PINCH_ORIGIN_CURSOR, "CURSOR", 0, "Cursor", "Pinches to the location of the cursor"},
- {CLOTH_FILTER_PINCH_ORIGIN_FACE_SET, "FACE_SET", 0, "Face Set", "Pinches to the average location of the Face Set"},
+ {CLOTH_FILTER_PINCH_ORIGIN_CURSOR,
+ "CURSOR",
+ 0,
+ "Cursor",
+ "Pinches to the location of the cursor"},
+ {CLOTH_FILTER_PINCH_ORIGIN_FACE_SET,
+ "FACE_SET",
+ 0,
+ "Face Set",
+ "Pinches to the average location of the Face Set"},
{0, NULL, 0, NULL, NULL},
};
-
static EnumPropertyItem prop_cloth_filter_orientation_items[] = {
{SCULPT_FILTER_ORIENTATION_LOCAL,
"LOCAL",
@@ -1580,7 +1587,8 @@ static void cloth_filter_apply_forces_task_cb(void *__restrict userdata,
char symm_area = SCULPT_get_vertex_symm_area(orig_data.co);
float pinch_point[3];
copy_v3_v3(pinch_point, ss->filter_cache->cloth_sim_pinch_point);
- SCULPT_flip_v3_by_symm_area(pinch_point, symm, symm_area, ss->filter_cache->cloth_sim_pinch_point);
+ SCULPT_flip_v3_by_symm_area(
+ pinch_point, symm, symm_area, ss->filter_cache->cloth_sim_pinch_point);
sub_v3_v3v3(force, pinch_point, vd.co);
normalize_v3(force);
mul_v3_fl(force, fade * data->filter_strength);
@@ -1670,25 +1678,26 @@ static int sculpt_cloth_filter_modal(bContext *C, wmOperator *op, const wmEvent
return OPERATOR_RUNNING_MODAL;
}
-
-static void sculpt_cloth_filter_face_set_pinch_origin_calculate(float r_pinch_origin[3], SculptSession *ss) {
- const int totvert = SCULPT_vertex_count_get(ss);
- const int active_face_set = SCULPT_active_face_set_get(ss);
- float accum[3] = {0.0f};
- int tot = 0;
- for (int i = 0; i < totvert; i++) {
- if (!SCULPT_vertex_has_face_set(ss, i, active_face_set)) {
- continue;
- }
- add_v3_v3(accum, SCULPT_vertex_co_get(ss, i));
- tot++;
- }
- if (tot > 0) {
- mul_v3_v3fl(r_pinch_origin, accum, 1.0f/ tot);
- }
- else {
- copy_v3_v3(r_pinch_origin, SCULPT_active_vertex_co_get(ss));
+static void sculpt_cloth_filter_face_set_pinch_origin_calculate(float r_pinch_origin[3],
+ SculptSession *ss)
+{
+ const int totvert = SCULPT_vertex_count_get(ss);
+ const int active_face_set = SCULPT_active_face_set_get(ss);
+ float accum[3] = {0.0f};
+ int tot = 0;
+ for (int i = 0; i < totvert; i++) {
+ if (!SCULPT_vertex_has_face_set(ss, i, active_face_set)) {
+ continue;
}
+ add_v3_v3(accum, SCULPT_vertex_co_get(ss, i));
+ tot++;
+ }
+ if (tot > 0) {
+ mul_v3_v3fl(r_pinch_origin, accum, 1.0f / tot);
+ }
+ else {
+ copy_v3_v3(r_pinch_origin, SCULPT_active_vertex_co_get(ss));
+ }
}
static int sculpt_cloth_filter_invoke(bContext *C, wmOperator *op, const wmEvent *event)
@@ -1729,14 +1738,14 @@ static int sculpt_cloth_filter_invoke(bContext *C, wmOperator *op, const wmEvent
use_collisions,
cloth_filter_is_deformation_filter(filter_type));
- switch (pinch_origin)
- {
- case CLOTH_FILTER_PINCH_ORIGIN_CURSOR:
- copy_v3_v3(ss->filter_cache->cloth_sim_pinch_point, SCULPT_active_vertex_co_get(ss));
- break;
- case CLOTH_FILTER_PINCH_ORIGIN_FACE_SET:
- sculpt_cloth_filter_face_set_pinch_origin_calculate(ss->filter_cache->cloth_sim_pinch_point, ss);
- break;
+ switch (pinch_origin) {
+ case CLOTH_FILTER_PINCH_ORIGIN_CURSOR:
+ copy_v3_v3(ss->filter_cache->cloth_sim_pinch_point, SCULPT_active_vertex_co_get(ss));
+ break;
+ case CLOTH_FILTER_PINCH_ORIGIN_FACE_SET:
+ sculpt_cloth_filter_face_set_pinch_origin_calculate(ss->filter_cache->cloth_sim_pinch_point,
+ ss);
+ break;
}
SCULPT_cloth_brush_simulation_init(ss, ss->filter_cache->cloth_sim);
diff --git a/source/blender/editors/sculpt_paint/sculpt_expand.c b/source/blender/editors/sculpt_paint/sculpt_expand.c
index 1323994bb9f..6e8a000112f 100644
--- a/source/blender/editors/sculpt_paint/sculpt_expand.c
+++ b/source/blender/editors/sculpt_paint/sculpt_expand.c
@@ -705,9 +705,8 @@ static float *sculpt_expand_diagonals_falloff_create(Object *ob, const int v)
return dists;
}
-
/**
- * Poly Loop:
+ * Poly Loop:
*/
static float *sculpt_expand_poly_loop_falloff_create(Object *ob, const int v)
{
@@ -717,7 +716,7 @@ static float *sculpt_expand_poly_loop_falloff_create(Object *ob, const int v)
BLI_bitmap *visited_vertices = BLI_BITMAP_NEW(totvert, "visited vertices");
GSQueue *queue = BLI_gsqueue_new(sizeof(int));
- printf("POLY LOOP FALLOFF\n");
+ printf("POLY LOOP FALLOFF\n");
/* Search and initialize a boundary per symmetry pass, then mark those vertices as visited. */
const char symm = SCULPT_mesh_symmetry_xyz_get(ob);
@@ -1808,19 +1807,19 @@ static int sculpt_expand_modal(bContext *C, wmOperator *op, const wmEvent *event
break;
}
case SCULPT_EXPAND_MODAL_SNAP_ENABLE: {
- expand_cache->snap = true;
- if (!expand_cache->snap_enabled_face_sets) {
- expand_cache->snap_enabled_face_sets = BLI_gset_int_new("snap face sets");
- }
- sculpt_expand_snap_initialize_from_enabled(ss, expand_cache);
+ expand_cache->snap = true;
+ if (!expand_cache->snap_enabled_face_sets) {
+ expand_cache->snap_enabled_face_sets = BLI_gset_int_new("snap face sets");
+ }
+ sculpt_expand_snap_initialize_from_enabled(ss, expand_cache);
} break;
case SCULPT_EXPAND_MODAL_SNAP_DISABLE: {
- expand_cache->snap = false;
- if (expand_cache->snap_enabled_face_sets) {
- BLI_gset_free(expand_cache->snap_enabled_face_sets, NULL);
- expand_cache->snap_enabled_face_sets = NULL;
- }
- }break;
+ expand_cache->snap = false;
+ if (expand_cache->snap_enabled_face_sets) {
+ BLI_gset_free(expand_cache->snap_enabled_face_sets, NULL);
+ expand_cache->snap_enabled_face_sets = NULL;
+ }
+ } break;
case SCULPT_EXPAND_MODAL_MOVE_TOGGLE: {
if (expand_cache->move) {
expand_cache->move = false;
@@ -2192,7 +2191,11 @@ void sculpt_expand_modal_keymap(wmKeyConfig *keyconf)
""},
{SCULPT_EXPAND_MODAL_FALLOFF_SPHERICAL, "FALLOFF_SPHERICAL", 0, "Spherical Falloff", ""},
{SCULPT_EXPAND_MODAL_SNAP_ENABLE, "SNAP_ENABLE", 0, "Snap expand to Face Sets", ""},
- {SCULPT_EXPAND_MODAL_SNAP_DISABLE, "SNAP_DISABLE", 0, "Disable Snap expand to Face Sets", ""},
+ {SCULPT_EXPAND_MODAL_SNAP_DISABLE,
+ "SNAP_DISABLE",
+ 0,
+ "Disable Snap expand to Face Sets",
+ ""},
{SCULPT_EXPAND_MODAL_LOOP_COUNT_INCREASE,
"LOOP_COUNT_INCREASE",
0,
diff --git a/source/blender/editors/sculpt_paint/sculpt_face_set_topology.c b/source/blender/editors/sculpt_paint/sculpt_face_set_topology.c
index de8dae5e2cb..808515ab723 100644
--- a/source/blender/editors/sculpt_paint/sculpt_face_set_topology.c
+++ b/source/blender/editors/sculpt_paint/sculpt_face_set_topology.c
@@ -77,7 +77,6 @@ typedef enum eSculptFaceSetByTopologyMode {
SCULPT_FACE_SET_TOPOLOGY_POLY_LOOP = 1,
};
-
static EnumPropertyItem prop_sculpt_face_set_by_topology[] = {
{
SCULPT_FACE_SET_TOPOLOGY_LOOSE_PART,
@@ -96,11 +95,11 @@ static EnumPropertyItem prop_sculpt_face_set_by_topology[] = {
{0, NULL, 0, NULL, NULL},
};
-
-static void sculpt_face_set_by_topology_poly_loop(Object *ob, const int next_face_set_id) {
+static void sculpt_face_set_by_topology_poly_loop(Object *ob, const int next_face_set_id)
+{
SculptSession *ss = ob->sculpt;
BLI_bitmap *poly_loop = sculpt_poly_loop_from_cursor(ob);
- for (int i = 0; i < ss->totfaces; i++) {
+ for (int i = 0; i < ss->totfaces; i++) {
if (BLI_BITMAP_TEST(poly_loop, i)) {
ss->face_sets[i] = next_face_set_id;
}
@@ -134,15 +133,14 @@ static int sculpt_face_set_by_topology_invoke(bContext *C, wmOperator *op, const
SCULPT_undo_push_begin(ob, "face set edit");
SCULPT_undo_push_node(ob, nodes[0], SCULPT_UNDO_FACE_SETS);
-
const int initial_poly = ss->active_face_index;
const int initial_edge = sculpt_poly_loop_initial_edge_from_cursor(ob);
Mesh *mesh = BKE_object_get_original_mesh(ob);
int new_face_set = SCULPT_FACE_SET_NONE;
-
- if (repeat_previous && ss->face_set_last_created != SCULPT_FACE_SET_NONE && initial_poly != ss->face_set_last_poly && initial_edge != ss->face_set_last_edge) {
+ if (repeat_previous && ss->face_set_last_created != SCULPT_FACE_SET_NONE &&
+ initial_poly != ss->face_set_last_poly && initial_edge != ss->face_set_last_edge) {
new_face_set = ss->face_set_last_created;
}
else {
@@ -157,11 +155,9 @@ static int sculpt_face_set_by_topology_invoke(bContext *C, wmOperator *op, const
break;
}
-
- ss->face_set_last_created = new_face_set;
- ss->face_set_last_edge = initial_edge;
- ss->face_set_last_poly = initial_poly;
-
+ ss->face_set_last_created = new_face_set;
+ ss->face_set_last_edge = initial_edge;
+ ss->face_set_last_poly = initial_poly;
/* Sync face sets visibility and vertex visibility as now all Face Sets are visible. */
SCULPT_visibility_sync_all_face_sets_to_vertices(ob);
@@ -197,9 +193,16 @@ void SCULPT_OT_face_set_by_topology(struct wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
- RNA_def_enum(
- ot->srna, "mode", prop_sculpt_face_set_by_topology, SCULPT_FACE_SET_TOPOLOGY_POLY_LOOP, "Mode", "");
-
- RNA_def_boolean(
- ot->srna, "repeat_previous", true, "Repeat previous Face Set", "Repeat the latest created Face Set instead of a new one");
+ RNA_def_enum(ot->srna,
+ "mode",
+ prop_sculpt_face_set_by_topology,
+ SCULPT_FACE_SET_TOPOLOGY_POLY_LOOP,
+ "Mode",
+ "");
+
+ RNA_def_boolean(ot->srna,
+ "repeat_previous",
+ true,
+ "Repeat previous Face Set",
+ "Repeat the latest created Face Set instead of a new one");
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index 492ceeeceb6..4e4da9f0adf 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -1421,11 +1421,9 @@ bool SCULPT_get_redraw_rect(struct ARegion *region,
Object *ob,
rcti *rect);
-
/* Poly Loops. */
int sculpt_poly_loop_initial_edge_from_cursor(Object *ob);
-BLI_bitmap * sculpt_poly_loop_from_cursor(struct Object *ob);
-
+BLI_bitmap *sculpt_poly_loop_from_cursor(struct Object *ob);
/* Operators. */
diff --git a/source/blender/editors/sculpt_paint/sculpt_poly_loop.c b/source/blender/editors/sculpt_paint/sculpt_poly_loop.c
index 9b521ab8504..703f8701468 100644
--- a/source/blender/editors/sculpt_paint/sculpt_poly_loop.c
+++ b/source/blender/editors/sculpt_paint/sculpt_poly_loop.c
@@ -72,7 +72,8 @@
#include <math.h>
#include <stdlib.h>
-static void sculpt_poly_loop_topology_data_ensure(Object *ob) {
+static void sculpt_poly_loop_topology_data_ensure(Object *ob)
+{
SculptSession *ss = ob->sculpt;
Mesh *mesh = BKE_object_get_original_mesh(ob);
@@ -93,44 +94,52 @@ static void sculpt_poly_loop_topology_data_ensure(Object *ob) {
}
#define SCULPT_FACE_SET_LOOP_STEP_NONE -1
-static bool sculpt_poly_loop_step(SculptSession *ss, const int from_poly, const int edge, int *r_next_poly) {
- if (!ss->epmap) {
- return false;
- }
-
- int next_poly = SCULPT_FACE_SET_LOOP_STEP_NONE;
- for (int i = 0; i < ss->epmap[edge].count; i++) {
- if (ss->epmap[edge].indices[i] != from_poly) {
- next_poly = ss->epmap[edge].indices[i];
- }
- }
-
- if (next_poly == SCULPT_FACE_SET_LOOP_STEP_NONE) {
- return false;
- }
-
- *r_next_poly = next_poly;
- return true;
+static bool sculpt_poly_loop_step(SculptSession *ss,
+ const int from_poly,
+ const int edge,
+ int *r_next_poly)
+{
+ if (!ss->epmap) {
+ return false;
+ }
+
+ int next_poly = SCULPT_FACE_SET_LOOP_STEP_NONE;
+ for (int i = 0; i < ss->epmap[edge].count; i++) {
+ if (ss->epmap[edge].indices[i] != from_poly) {
+ next_poly = ss->epmap[edge].indices[i];
+ }
+ }
+
+ if (next_poly == SCULPT_FACE_SET_LOOP_STEP_NONE) {
+ return false;
+ }
+
+ *r_next_poly = next_poly;
+ return true;
}
-static int sculpt_poly_loop_opposite_edge_in_quad(SculptSession *ss, const int poly, const int edge) {
+static int sculpt_poly_loop_opposite_edge_in_quad(SculptSession *ss,
+ const int poly,
+ const int edge)
+{
if (ss->mpoly[poly].totloop != 4) {
return edge;
- }
-
+ }
+
int edge_index_in_poly = 0;
for (int i = 0; i < ss->mpoly[poly].totloop; i++) {
- if (edge == ss->mloop[ss->mpoly[poly].loopstart + i].e) {
- edge_index_in_poly = i;
- break;
- }
+ if (edge == ss->mloop[ss->mpoly[poly].loopstart + i].e) {
+ edge_index_in_poly = i;
+ break;
+ }
}
const int next_edge_index_in_poly = (edge_index_in_poly + 2) % 4;
return ss->mloop[ss->mpoly[poly].loopstart + next_edge_index_in_poly].e;
}
-int sculpt_poly_loop_initial_edge_from_cursor(Object *ob) {
+int sculpt_poly_loop_initial_edge_from_cursor(Object *ob)
+{
SculptSession *ss = ob->sculpt;
Mesh *mesh = BKE_object_get_original_mesh(ob);
@@ -147,17 +156,24 @@ int sculpt_poly_loop_initial_edge_from_cursor(Object *ob) {
int closest_vert = mesh->mloop[initial_poly->loopstart].v;
for (int i = 0; i < initial_poly->totloop; i++) {
- if (len_squared_v3v3(mvert[ss->mloop[initial_poly->loopstart + i].v].co, location) < len_squared_v3v3(mvert[closest_vert].co, location)) {
+ if (len_squared_v3v3(mvert[ss->mloop[initial_poly->loopstart + i].v].co, location) <
+ len_squared_v3v3(mvert[closest_vert].co, location)) {
closest_vert = ss->mloop[initial_poly->loopstart + i].v;
}
}
int initial_edge = ss->vemap[closest_vert].indices[0];
- int closest_vert_on_initial_edge = mesh->medge[initial_edge].v1 == closest_vert ? mesh->medge[initial_edge].v2 : mesh->medge[initial_edge].v1;
+ int closest_vert_on_initial_edge = mesh->medge[initial_edge].v1 == closest_vert ?
+ mesh->medge[initial_edge].v2 :
+ mesh->medge[initial_edge].v1;
for (int i = 0; i < ss->vemap[closest_vert].count; i++) {
const int edge_index = ss->vemap[closest_vert].indices[i];
- const int other_vert = mesh->medge[edge_index].v1 == closest_vert ? mesh->medge[edge_index].v2 : mesh->medge[edge_index].v1;
- if (dist_to_line_segment_v3(location, mvert[closest_vert].co, mvert[other_vert].co) < dist_to_line_segment_v3(location, mvert[closest_vert].co, mvert[closest_vert_on_initial_edge].co)) {
+ const int other_vert = mesh->medge[edge_index].v1 == closest_vert ?
+ mesh->medge[edge_index].v2 :
+ mesh->medge[edge_index].v1;
+ if (dist_to_line_segment_v3(location, mvert[closest_vert].co, mvert[other_vert].co) <
+ dist_to_line_segment_v3(
+ location, mvert[closest_vert].co, mvert[closest_vert_on_initial_edge].co)) {
initial_edge = edge_index;
closest_vert_on_initial_edge = other_vert;
}
@@ -165,7 +181,11 @@ int sculpt_poly_loop_initial_edge_from_cursor(Object *ob) {
return initial_edge;
}
-static void sculpt_poly_loop_iterate_and_fill(SculptSession *ss, const int initial_poly, const int initial_edge, BLI_bitmap *poly_loop) {
+static void sculpt_poly_loop_iterate_and_fill(SculptSession *ss,
+ const int initial_poly,
+ const int initial_edge,
+ BLI_bitmap *poly_loop)
+{
int current_poly = initial_poly;
int current_edge = initial_edge;
int next_poly = SCULPT_FACE_SET_LOOP_STEP_NONE;
@@ -173,7 +193,7 @@ static void sculpt_poly_loop_iterate_and_fill(SculptSession *ss, const int initi
BLI_BITMAP_ENABLE(poly_loop, initial_poly);
- while(max_steps && sculpt_poly_loop_step(ss, current_poly, current_edge, &next_poly)) {
+ while (max_steps && sculpt_poly_loop_step(ss, current_poly, current_edge, &next_poly)) {
if (ss->face_sets[next_poly] == initial_poly) {
break;
}
@@ -191,7 +211,8 @@ static void sculpt_poly_loop_iterate_and_fill(SculptSession *ss, const int initi
}
}
-BLI_bitmap * sculpt_poly_loop_from_cursor(Object *ob) {
+BLI_bitmap *sculpt_poly_loop_from_cursor(Object *ob)
+{
SculptSession *ss = ob->sculpt;
Mesh *mesh = BKE_object_get_original_mesh(ob);
BLI_bitmap *poly_loop = BLI_BITMAP_NEW(mesh->totpoly, "poly loop");
@@ -199,7 +220,8 @@ BLI_bitmap * sculpt_poly_loop_from_cursor(Object *ob) {
sculpt_poly_loop_topology_data_ensure(ob);
const int initial_edge = sculpt_poly_loop_initial_edge_from_cursor(ob);
const int initial_poly = ss->active_face_index;
- const int initial_edge_opposite = sculpt_poly_loop_opposite_edge_in_quad(ss, initial_poly, initial_edge);
+ const int initial_edge_opposite = sculpt_poly_loop_opposite_edge_in_quad(
+ ss, initial_poly, initial_edge);
sculpt_poly_loop_iterate_and_fill(ss, initial_poly, initial_edge, poly_loop);
sculpt_poly_loop_iterate_and_fill(ss, initial_poly, initial_edge_opposite, poly_loop);