[Bf-blender-cvs] [b365fe24611] newboolean: A coplanar intersect case works.
Howard Trickey
noreply at git.blender.org
Thu Aug 15 19:09:01 CEST 2019
Commit: b365fe24611af59e3acc9451c8bbbbc126a3d0e7
Author: Howard Trickey
Date: Thu Aug 15 13:05:56 2019 -0400
Branches: newboolean
https://developer.blender.org/rBb365fe24611af59e3acc9451c8bbbbc126a3d0e7
A coplanar intersect case works.
===================================================================
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 9286184360f..203a1d10cca 100644
--- a/source/blender/bmesh/tools/bmesh_boolean.c
+++ b/source/blender/bmesh/tools/bmesh_boolean.c
@@ -33,13 +33,13 @@
#include "MEM_guardedalloc.h"
-#include "BLI_math.h"
+#include "BLI_alloca.h"
#include "BLI_delaunay_2d.h"
-#include "BLI_utildefines.h"
+#include "BLI_linklist.h"
+#include "BLI_math.h"
#include "BLI_memarena.h"
-#include "BLI_alloca.h"
+#include "BLI_utildefines.h"
-#include "BLI_linklist.h"
#include "bmesh.h"
#include "intern/bmesh_private.h"
@@ -86,6 +86,19 @@ static void dump_cluster(Cluster *cl, const char *label);
static void dump_clusterset(ClusterSet *clset, const char *label);
#endif
+/**
+ * Make ngon from verts alone.
+ * Use facerep as example for attributes of new face.
+ * TODO: make this an similar bev_create_ngon in bmesh_bevel.c into a BMesh utility.
+ */
+static BMFace *bool_create_ngon(BMesh *bm, BMVert **vert_arr, const int vert_len, BMFace *facerep)
+{
+ BMFace *f;
+
+ f = BM_face_create_verts(bm, vert_arr, vert_len, facerep, BM_CREATE_NOP, true);
+ return f;
+}
+
/* Make clusterset by empty. */
static void init_clusterset(ClusterSet *clusterset)
{
@@ -207,8 +220,13 @@ static void intersect_planar_geometry(BoolState *bs,
BMVert *v;
BMIter iter;
float mat_2d[3][3];
- float xy[2];
+ float mat_2d_inv[3][3];
+ float xyz[3], save_z, p[3];
int i, faces_index, vert_coords_index, faces_table_index, v_index;
+ int j, start, len;
+ bool ok;
+ BMVert **face_v;
+ BMVert **all_v;
nverts = 0;
nfaceverts = 0;
@@ -234,11 +252,16 @@ static void intersect_planar_geometry(BoolState *bs,
in.epsilon = bs->eps;
axis_dominant_v3_to_m3(mat_2d, plane);
+ ok = invert_m3_m3(mat_2d_inv, mat_2d);
+ BLI_assert(ok);
vert_coords_index = 0;
for (ln = vertlist; ln; ln = ln->next) {
v = (BMVert *)ln->link;
- mul_v2_m3v3(xy, mat_2d, v->co);
- copy_v2_v2(in.vert_coords[vert_coords_index], xy);
+ mul_v3_m3v3(xyz, mat_2d, v->co);
+ copy_v2_v2(in.vert_coords[vert_coords_index], xyz);
+ if (vert_coords_index == 0) {
+ save_z = xyz[2];
+ }
vert_coords_index++;
}
@@ -258,32 +281,53 @@ static void intersect_planar_geometry(BoolState *bs,
faces_table_index++;
}
- printf("cdt input:\n");
- printf("verts_len=%d, edges_len=%d, faces_len=%d\n", in.verts_len, in.edges_len, in.faces_len);
- printf("vert_coord: ");
- for (i = 0; i < in.verts_len; i++) {
- printf("(%.3f,%.3f) ", F2(in.vert_coords[i]));
- }
- printf("\nfaces: ");
- for (i = 0; i < in.faces_start_table[in.faces_len - 1] + in.faces_len_table[in.faces_len -1]; i++) {
- printf("%d ", in.faces[i]);
- }
- printf("\nfaces_start_table: ");
- for (i = 0; i < in.faces_len; i++) {
- printf("%d ", in.faces_start_table[i]);
- }
- printf("\nfaces_len_table: ");
- for (i = 0; i < in.faces_len; i++) {
- printf("%d ", in.faces_len_table[i]);
+ out = BLI_delaunay_2d_cdt_calc(&in, CDT_CONSTRAINTS_VALID_BMESH);
+
+ /* Gather BMVerts corresponding to output vertices into all_v. */
+ all_v = BLI_array_alloca(face_v, (size_t)out->verts_len);
+ for (i = 0; i < out->verts_len; i++) {
+ if (out->verts_orig_len_table[i] > 0) {
+ /* choose first input vert in orig list as representative */
+ v_index = out->verts_orig[out->verts_orig_start_table[i]];
+ ln = BLI_linklist_find(vertlist, v_index);
+ BLI_assert(ln != NULL);
+ v = (BMVert *)ln->link;
+ all_v[i] = v;
+ }
+ else {
+ copy_v2_v2(xyz, out->vert_coords[i]);
+ xyz[2] = save_z;
+ mul_v3_m3v3(p, mat_2d_inv, xyz);
+ /* TODO: figure out example vert to copy attributes from */
+ v = BM_vert_create(bs->bm, p, NULL, BM_CREATE_NOP);
+ all_v[i] = v;
+ }
}
- printf("\n");
- out = BLI_delaunay_2d_cdt_calc(&in, CDT_CONSTRAINTS_VALID_BMESH);
+ /* Make the new faces. out-verts_len is upper bound on max face length. */
+ face_v = BLI_array_alloca(face_v, (size_t)out->verts_len);
+ for (faces_index = 0; faces_index < out->faces_len; faces_index++) {
+ start = out->faces_start_table[faces_index];
+ len = out->faces_len_table[faces_index];
+ if (len >= 3) {
+ for (j = 0; j < len; j++) {
+ v_index = out->faces[start + j];
+ BLI_assert(v_index >= 0 && v_index < out->verts_len);
+ v = all_v[v_index];
+ BLI_assert(j < out->verts_len);
+ face_v[j] = v;
+ }
+ /* TODO: figure out example face for this face */
+ bool_create_ngon(bs->bm, face_v, len, NULL);
+ }
+ }
- printf("out stats: verts_len=%d, edges_len=%d, faces_len=%d\n",
- out->verts_len,
- out->edges_len,
- out->faces_len);
+ /* Delete the original faces */
+ for (faces_index = 0; faces_index < faces_len; faces_index++) {
+ BM_face_kill(bs->bm, faces[faces_index]);
+ }
+
+ BLI_delaunay_2d_cdt_free(out);
}
static void intersect_clusters(BoolState *bs, Cluster *cla, Cluster *clb)
More information about the Bf-blender-cvs
mailing list