[Bf-blender-cvs] [a3ca50c7b3e] newboolean: Boolean coplanar cone-on-cube works.
Howard Trickey
noreply at git.blender.org
Mon Dec 2 15:05:49 CET 2019
Commit: a3ca50c7b3ee9246eb18c38dae53a7bdb8f98a39
Author: Howard Trickey
Date: Tue Nov 12 09:25:51 2019 -0500
Branches: newboolean
https://developer.blender.org/rBa3ca50c7b3ee9246eb18c38dae53a7bdb8f98a39
Boolean coplanar cone-on-cube works.
Needed some work on coplanar faces that may have
reversed normals from projection.
===================================================================
M source/blender/bmesh/tools/bmesh_boolean.c
===================================================================
diff --git a/source/blender/bmesh/tools/bmesh_boolean.c b/source/blender/bmesh/tools/bmesh_boolean.c
index 2e8bc79f068..7c27effc2f0 100644
--- a/source/blender/bmesh/tools/bmesh_boolean.c
+++ b/source/blender/bmesh/tools/bmesh_boolean.c
@@ -2428,10 +2428,12 @@ static PartPartIntersect *self_intersect_part_and_ppis(BoolState *bs,
tot_ne = edges_needed.size;
for (i = 0; i < faces_needed.size; i++) {
f = indexedintset_get_value_by_index(&faces_needed, i);
+ imeshplus_get_face_no(&imp, f, fno);
+ reverse_face = (dot_v3v3_db(part->plane, fno) < 0.0);
face_len = imesh_facelen(im, f);
for (j = 0; j < face_len; j++) {
- v1 = imesh_face_vert(im, f, j);
- v2 = imesh_face_vert(im, f, (j + 1) % face_len);
+ v1 = imesh_face_vert(im, f, reverse_face ? (face_len - j - 1) % face_len : j);
+ v2 = imesh_face_vert(im, f, reverse_face ? (2 * face_len - j - 2) % face_len : (j + 1) % face_len);
e = imesh_find_edge(im, v1, v2);
BLI_assert(e != -1);
add_to_intintmap(bs, &in_to_emap, j + tot_ne, e);
@@ -2683,6 +2685,7 @@ static PartPartIntersect *self_intersect_part_and_ppis(BoolState *bs,
in_f = -1;
f_eg = -1;
f_other_egs = NULL;
+ reverse_face = false;
if (out->faces_orig_len_table[out_f] > 0) {
start = out->faces_orig_start_table[out_f];
eg_len = out->faces_orig_len_table[out_f];
@@ -2717,6 +2720,8 @@ static PartPartIntersect *self_intersect_part_and_ppis(BoolState *bs,
meshdelete_add_face(meshdelete, f);
}
}
+ imeshplus_get_face_no(&imp, f_eg, fno);
+ reverse_face = (dot_v3v3_db(part->plane, fno) < 0.0);
}
}
/* Even if f is same as an existing face, we make a new one, to simplify "what to delete"
@@ -2726,11 +2731,17 @@ static PartPartIntersect *self_intersect_part_and_ppis(BoolState *bs,
new_face_data = (IntPair *)BLI_memarena_alloc(arena,
(size_t)face_len * sizeof(new_face_data[0]));
for (i = 0; i < face_len; i++) {
- out_v = out->faces[start + i];
+ if (reverse_face) {
+ out_v = out->faces[start + ((- i + face_len) % face_len)];
+ out_v2 = out->faces[start + ((-i - 1 + face_len) % face_len)];
+ }
+ else {
+ out_v = out->faces[start + i];
+ out_v2 = out->faces[start + ((i + 1) % face_len)];
+ }
v = imp_v[out_v];
- new_face_data[i].first = v;
- out_v2 = out->faces[start + ((i + 1) % face_len)];
v2 = imp_v[out_v2];
+ new_face_data[i].first = v;
/* Edge (v, v2) should be an edge already added to ppi_out. Also e is either in im or
* meshadd. */
e = find_edge_by_verts_in_meshadd(meshadd, v, v2);
@@ -3294,7 +3305,7 @@ static void intersect_partset_pair(BoolState *bs,
printf("Part a%d intersects part b%d\n", a_index, b_index);
dump_partpartintersect(isect, "");
printf("\n");
- dump_meshadd(&meshchange->add, "incremental");
+ dump_meshchange(meshchange, "incremental");
}
#endif
BLI_linklist_append_arena(&a_isects[a_index], isect, arena);
@@ -3378,7 +3389,7 @@ bool BM_mesh_boolean(BMesh *bm,
MeshChange meshchange;
IntSet both_side_faces;
#ifdef BOOLDEBUG
- int dbg_level = 1;
+ int dbg_level = 0;
#endif
init_imesh_from_bmesh(&bs.im, bm);
@@ -3592,7 +3603,7 @@ static void do_boolean_op(BoolState *bs, const int boolean_mode, IntSet *both_si
bool do_remove, do_flip, inside, both_sides, opp_normals;
MeshChange meshchange;
# ifdef BOOLDEBUG
- bool dbg_level = 1;
+ bool dbg_level = 0;
if (dbg_level > 0) {
printf("\nDO_BOOLEAN_OP, boolean_mode=%d\n\n", boolean_mode);
More information about the Bf-blender-cvs
mailing list