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))

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to