[Bf-blender-cvs] [b463ffc] fracture_modifier: small improvement for autohide, removing inner edges now as well
Martin Felke
noreply at git.blender.org
Mon Nov 17 15:49:37 CET 2014
Commit: b463ffc52cf7b63670240510e23a72fa25e93c1e
Author: Martin Felke
Date: Mon Nov 17 15:48:58 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rBb463ffc52cf7b63670240510e23a72fa25e93c1e
small improvement for autohide, removing inner edges now as well
===================================================================
M source/blender/bmesh/intern/bmesh_opdefines.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c
index 27f394f..ded9fa5 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -1065,6 +1065,27 @@ static BMOpDefine bmo_dissolve_edges_def = {
};
/*
+ * Dissolve Edges (Keep Normals).
+ */
+static BMOpDefine bmo_dissolve_edges_keep_normal_def = {
+ "dissolve_edges_keep_normals",
+ /* slots_in */
+ {{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
+ {"use_verts", BMO_OP_SLOT_BOOL}, /* dissolve verts left between only 2 edges. */
+ {"use_face_split", BMO_OP_SLOT_BOOL},
+ {{'\0'}},
+ },
+ /* slots_out */
+ {{"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
+ {{'\0'}},
+ },
+ bmo_dissolve_edges_exec,
+ (BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
+ BMO_OPTYPE_FLAG_SELECT_FLUSH |
+ BMO_OPTYPE_FLAG_SELECT_VALIDATE),
+};
+
+/*
* Dissolve Faces.
*/
static BMOpDefine bmo_dissolve_faces_def = {
@@ -1287,6 +1308,24 @@ static BMOpDefine bmo_delete_def = {
};
/*
+ * Delete Geometry (Keep Normals).
+ *
+ * Utility operator to delete geometry.
+ */
+static BMOpDefine bmo_delete_keep_normal_def = {
+ "delete_keep_normals",
+ /* slots_in */
+ {{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},
+ {"context", BMO_OP_SLOT_INT}, /* enum DEL_VERTS ... */
+ {{'\0'}},
+ },
+ {{{'\0'}}}, /* no output */
+ bmo_delete_exec,
+ (BMO_OPTYPE_FLAG_SELECT_FLUSH |
+ BMO_OPTYPE_FLAG_SELECT_VALIDATE),
+};
+
+/*
* Duplicate Geometry.
*
* Utility operator to duplicate geometry,
@@ -1988,7 +2027,9 @@ const BMOpDefine *bmo_opdefines[] = {
&bmo_create_uvsphere_def,
&bmo_create_vert_def,
&bmo_delete_def,
+ &bmo_delete_keep_normal_def,
&bmo_dissolve_edges_def,
+ &bmo_dissolve_edges_keep_normal_def,
&bmo_dissolve_faces_def,
&bmo_dissolve_verts_def,
&bmo_dissolve_limit_def,
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 2d94c18..c4f2d05 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2053,6 +2053,8 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
/* make kdtree of all faces of dm, then find closest face for each face*/
MPoly *mp = NULL;
MPoly *mpoly = dm->getPolyArray(dm);
+// MLoop* mloop = dm->getLoopArray(dm);
+// MVert* mvert = dm->getVertArray(dm);
int totpoly = dm->getNumPolys(dm);
KDTree *tree = BLI_kdtree_new(totpoly);
int i = 0;
@@ -2062,7 +2064,10 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
for (i = 0, mp = mpoly; i < totpoly; mp++, i++) {
float co[3];
DM_face_calc_center_mean(dm, mp, co);
- BLI_kdtree_insert(tree, i, co);
+ //if (mp->mat_nr == 1)
+ {
+ BLI_kdtree_insert(tree, i, co);
+ }
}
BLI_kdtree_balance(tree);
@@ -2071,28 +2076,62 @@ static void make_face_pairs(FractureModifierData *fmd, DerivedMesh *dm)
for (i = 0, mp = mpoly; i < totpoly; mp++, i++)
{
- int index = -1, j = 0, r = 0;
- KDTreeNearest *n;
- float co[3];
+ //if (mp->mat_nr == 1)
+ {
+ int index = -1, j = 0, r = 0;
+ KDTreeNearest *n;
+ float co[3];
+
+ DM_face_calc_center_mean(dm, mp, co);
+ r = BLI_kdtree_range_search(tree, co, &n, fmd->autohide_dist * 4);
+ /*2nd nearest means not ourselves...*/
+ if (r == 0)
+ continue;
+
+ index = n[0].index;
+ while ((j < r) && i == index) {
+ index = n[j].index;
+ j++;
+ }
- DM_face_calc_center_mean(dm, mp, co);
- r = BLI_kdtree_range_search(tree, co, &n, fmd->autohide_dist * 4);
- /*2nd nearest means not ourselves...*/
- if (r == 0)
- continue;
+ if (!BLI_ghash_haskey(fmd->face_pairs, SET_INT_IN_POINTER(index))) {
- index = n[0].index;
- while ((j < r) && i == index) {
- index = n[j].index;
- j++;
- }
+ //int j = 0;
- if (!BLI_ghash_haskey(fmd->face_pairs, SET_INT_IN_POINTER(index))) {
- BLI_ghash_insert(fmd->face_pairs, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(index));
- }
+ BLI_ghash_insert(fmd->face_pairs, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(index));
+#if 0
+ /*match normals...*/
+ if (fmd->fix_normals)
+ {
+ MLoop ml, ml2;
+ MVert *v, *v2;
+ short sno[3];
+ float fno[3], fno2[3];
+ if (mp->totloop == (mpoly+index)->totloop)
+ {
+ for (j = 0; j < mp->totloop; j++)
+ {
+ ml = mloop[mp->loopstart + j];
+ ml2 = mloop[(mpoly+index)->loopstart + j];
+ v = mvert + ml.v;
+ v2 = mvert + ml2.v;
+
+ normal_short_to_float_v3(fno, v->no);
+ normal_short_to_float_v3(fno2, v2->no);
+ add_v3_v3(fno, fno2);
+ mul_v3_fl(fno, 0.5f);
+ normal_float_to_short_v3(sno, fno);
+ copy_v3_v3_short(v->no, sno);
+ copy_v3_v3_short(v2->no, sno);
+ }
+ }
+ }
+#endif
+ }
- if (n != NULL) {
- MEM_freeN(n);
+ if (n != NULL) {
+ MEM_freeN(n);
+ }
}
}
@@ -2114,6 +2153,11 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm)
BM_mesh_elem_table_ensure(bm, BM_FACE);
BM_mesh_elem_toolflags_ensure(bm);
+ BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE | BM_VERT , BM_ELEM_SELECT, false);
+
+ //BM_mesh_elem_hflag_enable_all(bm, BM_EDGE, BM_ELEM_SELECT, false);
+ //BM_mesh_elem_hflag_disable_test(bm, BM_EDGE, BM_ELEM_SELECT, false, false, BM_ELEM_SMOOTH);
+
for (i = 0; i < totpoly; i++) {
BMFace *f1, *f2;
other = GET_INT_FROM_POINTER(BLI_ghash_lookup(fmd->face_pairs, SET_INT_IN_POINTER(i)));
@@ -2155,13 +2199,21 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm)
BM_elem_flag_enable(v, BM_ELEM_SELECT);
}
- BM_face_kill(bm, f);
+ //BM_face_kill(bm, f);
+ BM_elem_flag_enable(f, BM_ELEM_SELECT);
}
}
+ BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), "delete_keep_normals geom=%hf context=%i", BM_ELEM_SELECT, DEL_FACES);
BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
"automerge_keep_normals verts=%hv dist=%f", BM_ELEM_SELECT, fmd->autohide_dist * 10, false);
+#if 0
+ //dissolve sharp edges
+ BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE), "dissolve_edges_keep_normals edges=%he use_verts=%b use_face_split=%b",
+ BM_ELEM_SELECT, true, false);
+#endif
+
BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_SELECT, false);
result = CDDM_from_bmesh(bm, true);
@@ -2175,7 +2227,7 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm)
static DerivedMesh *doSimulate(FractureModifierData *fmd, Object *ob, DerivedMesh *dm, DerivedMesh *orig_dm)
{
bool exploOK = false; /* doFracture */
- double start;
+ double start = 0.0;
if ((fmd->refresh) || (fmd->refresh_constraints && !fmd->execute_threaded) ||
(fmd->refresh_constraints && fmd->execute_threaded && fmd->frac_mesh && fmd->frac_mesh->running == 0))
More information about the Bf-blender-cvs
mailing list