Commit: dcb0c614955016ae4c77301c87a089d47b3ffd51
Author: Martin Felke
Date:   Sat Nov 15 00:35:18 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rBdcb0c614955016ae4c77301c87a089d47b3ffd51

autohide now automatically removes doubles as well to close small gaps between 
shards due to constraint movement, tweaks to pointcache (no reset of cache) and 
a new bm operator (no normal recalc) were necessary

===================================================================

M       source/blender/blenkernel/intern/pointcache.c
M       source/blender/bmesh/intern/bmesh_opdefines.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/intern/rna_modifier.c
M       source/blender/modifiers/intern/MOD_fracture.c

===================================================================

diff --git a/source/blender/blenkernel/intern/pointcache.c 
b/source/blender/blenkernel/intern/pointcache.c
index 7f93462..5e4330e 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -2934,11 +2934,27 @@ int  BKE_ptcache_object_reset(Scene *scene, Object *ob, 
int mode)
        }
 
        if (scene->rigidbody_world && (ob->rigidbody_object || 
ob->rigidbody_constraint)) {
-               if (ob->rigidbody_object)
-                       ob->rigidbody_object->flag |= RBO_FLAG_NEEDS_RESHAPE;
-               BKE_ptcache_id_from_rigidbody(&pid, ob, scene->rigidbody_world);
-               /* only flag as outdated, resetting should happen on start 
frame */
-               pid.cache->flag |= PTCACHE_OUTDATED;
+               ModifierData *md = modifiers_findByType(ob, 
eModifierType_Fracture);
+               if (md && md->type == eModifierType_Fracture)
+               {
+                       FractureModifierData *fmd = (FractureModifierData*)md;
+                       if (!fmd->refresh_autohide)
+                       {
+                               if (ob->rigidbody_object)
+                                       ob->rigidbody_object->flag |= 
RBO_FLAG_NEEDS_RESHAPE;
+                               BKE_ptcache_id_from_rigidbody(&pid, ob, 
scene->rigidbody_world);
+                               /* only flag as outdated, resetting should 
happen on start frame */
+                               pid.cache->flag |= PTCACHE_OUTDATED;
+                       }
+               }
+               else
+               {
+                       if (ob->rigidbody_object)
+                               ob->rigidbody_object->flag |= 
RBO_FLAG_NEEDS_RESHAPE;
+                       BKE_ptcache_id_from_rigidbody(&pid, ob, 
scene->rigidbody_world);
+                       /* only flag as outdated, resetting should happen on 
start frame */
+                       pid.cache->flag |= PTCACHE_OUTDATED;
+               }
        }
 
        if (ob->type == OB_ARMATURE)
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c 
b/source/blender/bmesh/intern/bmesh_opdefines.c
index 1143588..27f394f 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -350,6 +350,28 @@ static BMOpDefine bmo_automerge_def = {
         BMO_OPTYPE_FLAG_SELECT_VALIDATE),
 };
 
+
+/*
+ * Auto Merge (Keep Normals).
+ *
+ * Finds groups of vertices closer then **dist** and merges them together,
+ * using the weld verts bmop.  The merges must go from a vert not in
+ * **verts** to one in **verts**.
+ */
+static BMOpDefine bmo_automerge_keep_normal_def = {
+       "automerge_keep_normals",
+       /* slots_in */
+       {{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input verts */
+        {"dist",         BMO_OP_SLOT_FLT}, /* minimum distance */
+        {{'\0'}},
+       },
+       {{{'\0'}}},  /* no output */
+       bmo_remove_doubles_exec,
+       (BMO_OPTYPE_FLAG_UNTAN_MULTIRES |
+        BMO_OPTYPE_FLAG_SELECT_FLUSH |
+        BMO_OPTYPE_FLAG_SELECT_VALIDATE),
+};
+
 /*
  * Collapse Connected.
  *
@@ -1941,6 +1963,7 @@ static BMOpDefine bmo_symmetrize_def = {
 
 const BMOpDefine *bmo_opdefines[] = {
        &bmo_automerge_def,
+       &bmo_automerge_keep_normal_def,
        &bmo_average_vert_facedata_def,
        &bmo_beautify_fill_def,
        &bmo_bevel_def,
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index 65fe44e..fca26a4 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1467,6 +1467,7 @@ typedef struct FractureModifierData {
        /* flags */
        int refresh;
        int refresh_constraints;
+       int refresh_autohide;
 
        int use_constraints;
        int use_mass_dependent_thresholds;
@@ -1489,7 +1490,7 @@ typedef struct FractureModifierData {
        /* internal values */
        float max_vol;
 
-       //char pad[4];
+       char pad[4];
 } FractureModifierData;
 
 #endif  /* __DNA_MODIFIER_TYPES_H__ */
diff --git a/source/blender/makesrna/intern/rna_modifier.c 
b/source/blender/makesrna/intern/rna_modifier.c
index 18f99d6..f3cae89 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -724,7 +724,7 @@ static void 
rna_RigidBodyModifier_autohide_dist_set(PointerRNA *ptr, float value
 {
        FractureModifierData *rmd = (FractureModifierData*)ptr->data;
        rmd->autohide_dist = value;
-       rmd->refresh_constraints = true;
+       rmd->refresh_autohide = true;
 }
 
 #else
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 3edd8cf..32b7dac 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -2057,6 +2057,8 @@ static void make_face_pairs(FractureModifierData *fmd, 
DerivedMesh *dm)
        KDTree *tree = BLI_kdtree_new(totpoly);
        int i = 0;
 
+       //printf("Make Face Pairs\n");
+
        for (i = 0, mp = mpoly; i < totpoly; mp++, i++) {
                float co[3];
                DM_face_calc_center_mean(dm, mp, co);
@@ -2143,10 +2145,22 @@ static DerivedMesh *do_autoHide(FractureModifierData 
*fmd, DerivedMesh *dm)
        for (i = 0; i < del_faces; i++) {
                BMFace *f = faces[i];
                if (f->l_first->e != NULL) { /* a lame check.... */
+                       BMIter iter;
+                       BMVert *v;
+                       BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE)
+                       {
+                               BM_elem_flag_enable(v, BM_ELEM_SELECT);
+                       }
+
                        BM_face_kill(bm, f);
                }
        }
 
+       BMO_op_callf(bm, (BMO_FLAG_DEFAULTS & ~BMO_FLAG_RESPECT_HIDE),
+                    "automerge_keep_normals verts=%hv dist=%f", 
BM_ELEM_SELECT, fmd->autohide_dist * 100, false);
+
+       BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_SELECT, false);
+
        result = CDDM_from_bmesh(bm, true);
        BM_mesh_free(bm);
        MEM_freeN(faces);
@@ -2389,16 +2403,7 @@ static DerivedMesh *doSimulate(FractureModifierData 
*fmd, Object *ob, DerivedMes
 
                fmd->refresh = false;
                fmd->refresh_constraints = true;
-
-               /*HERE make a kdtree of the fractured derivedmesh,
-                * store pairs of faces (MPoly) here (will be most likely the 
inner faces) */
-               if (fmd->face_pairs != NULL) {
-                       BLI_ghash_free(fmd->face_pairs, NULL, NULL);
-                       fmd->face_pairs = NULL;
-               }
-
-               fmd->face_pairs = BLI_ghash_int_new("face_pairs");
-               make_face_pairs(fmd, fmd->visible_mesh_cached);
+               fmd->refresh_autohide = true;
 
                if (fmd->execute_threaded) {
                        /* job done */
@@ -2431,6 +2436,33 @@ static DerivedMesh *doSimulate(FractureModifierData 
*fmd, Object *ob, DerivedMes
                printf("Constraints: %d\n", 
BLI_countlist(&fmd->meshConstraints));
        }
 
+       if (fmd->refresh_autohide)
+       {
+               fmd->refresh_autohide = false;
+               /*HERE make a kdtree of the fractured derivedmesh,
+                * store pairs of faces (MPoly) here (will be most likely the 
inner faces) */
+               if (fmd->face_pairs != NULL) {
+                       BLI_ghash_free(fmd->face_pairs, NULL, NULL);
+                       fmd->face_pairs = NULL;
+               }
+
+               fmd->face_pairs = BLI_ghash_int_new("face_pairs");
+
+               if (fmd->dm)
+               {
+                       make_face_pairs(fmd, fmd->dm);
+               }
+               else if (fmd->visible_mesh)
+               {
+                       DerivedMesh *fdm = CDDM_from_bmesh(fmd->visible_mesh, 
true);
+                       make_face_pairs(fmd, fdm);
+
+                       fdm->needsFree = 1;
+                       fdm->release(fdm);
+                       fdm = NULL;
+               }
+       }
+
        /*XXX better rename this, it checks whether we have a valid fractured 
mesh */
        exploOK = !fmd->explo_shared || (fmd->explo_shared && fmd->dm && 
fmd->frac_mesh);
 
@@ -2460,8 +2492,9 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, 
Object *ob, DerivedMes
                DerivedMesh *dm_final;
                /* HERE Hide facepairs closer than dist X*/
 
-               if (fmd->autohide_dist > 0) {
+               if (fmd->autohide_dist > 0 && fmd->face_pairs) {
                        dm_final = do_autoHide(fmd, fmd->visible_mesh_cached);
+                       //printf("Autohide1 \n");
                }
                else {
                        dm_final = CDDM_copy(fmd->visible_mesh_cached);
@@ -2471,7 +2504,8 @@ static DerivedMesh *doSimulate(FractureModifierData *fmd, 
Object *ob, DerivedMes
        else if ((fmd->visible_mesh_cached != NULL) && exploOK) {
                DerivedMesh *dm_final;
 
-               if (fmd->autohide_dist > 0) {
+               if (fmd->autohide_dist > 0 && fmd->face_pairs) {
+                       //printf("Autohide2 \n");
                        dm_final = do_autoHide(fmd, fmd->visible_mesh_cached);
                }
                else {

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

Reply via email to