Commit: 8a2ee5573c1703ed2da0735a34e203537d575cc6
Author: Martin Felke
Date:   Thu Nov 22 14:20:51 2018 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rB8a2ee5573c1703ed2da0735a34e203537d575cc6

added constraint search size, made mixed/none constraint setting in dynamic work

plus fix attempts for dynamic cache logic

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

M       release/scripts/startup/bl_ui/properties_physics_fracture.py
M       source/blender/blenkernel/BKE_fracture.h
M       source/blender/blenkernel/BKE_rigidbody.h
M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/fracture_constraints.c
M       source/blender/blenkernel/intern/fracture_dynamic.c
M       source/blender/blenkernel/intern/fracture_prefractured.c
M       source/blender/blenkernel/intern/fracture_rigidbody.c
M       source/blender/blenkernel/intern/pointcache.c
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/intern/rna_fracture.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py 
b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index 64fb42321ef..4ee94a798c2 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -229,6 +229,7 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, 
Panel):
         col = layout.column(align=True)
         col.prop(md, "constraint_limit")
         col.prop(md, "contact_dist")
+        col.prop(md, "contact_size")
 
         layout.label(text="Constraint Cluster Settings")
         layout.prop(md, "cluster_count")
diff --git a/source/blender/blenkernel/BKE_fracture.h 
b/source/blender/blenkernel/BKE_fracture.h
index e6c933c0f09..0c359cb98e1 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -173,4 +173,6 @@ void BKE_fracture_meshisland_normals_fix(struct 
FractureModifierData *fmd, struc
 void BKE_fracture_copy_customdata(struct CustomData* src, struct CustomData* 
dst, CustomDataMask mask, int src_ofs, int dst_ofs,
                               int copyelem, int totelem);
 
+bool BKE_fracture_check_valid_shard(struct FractureModifierData *fmd, struct 
MeshIsland *mi, struct Scene *scene);
+
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/BKE_rigidbody.h 
b/source/blender/blenkernel/BKE_rigidbody.h
index 3497f44c049..29a567625cc 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -93,7 +93,7 @@ void BKE_rigidbody_validate_sim_shard(struct RigidBodyWorld 
*rbw, struct MeshIsl
 
 void BKE_rigidbody_validate_sim_shard_shape(struct MeshIsland *mi, struct 
Object *ob, short rebuild);
 
-bool BKE_check_island_size(struct FractureModifierData *fmd, struct MeshIsland 
*mi, bool check_min);
+bool BKE_rigidbody_check_island_size(struct FractureModifierData *fmd, struct 
MeshIsland *mi, float check_size);
 bool BKE_rigidbody_activate_by_size_check(struct Object *ob, struct MeshIsland 
*mi);
 
 void BKE_rigidbody_calc_center_of_mass(struct Object *ob, float r_center[3]);
diff --git a/source/blender/blenkernel/intern/fracture.c 
b/source/blender/blenkernel/intern/fracture.c
index 004ec90c457..d030d4a3764 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -279,6 +279,14 @@ static float get_random(FractureModifierData *fmd)
        return BLI_rng_get_float(fmd->shared->rng);
 }
 
+static void seed_random(FractureModifierData *fmd, unsigned int seed) {
+       if(!fmd->shared->rng) {
+               init_random(fmd);
+       }
+
+       BLI_rng_seed(fmd->shared->rng, seed);
+}
+
 static void calculate_fast_bisect(FractureModifierData *fmd, Mesh* me, 
BisectContext *ctx)
 {
        float factor = 1 - fmd->orthogonality_factor;
@@ -604,6 +612,7 @@ static void process_cells(FractureModifierData* fmd, 
MeshIsland* mi, Main* bmain
                int k = 0;
                for (k = 0; k < fmd->shared->last_expected_islands; k++)
                {
+                       BLI_remlink(&fmd->shared->mesh_islands, 
fmd->shared->last_islands[k]);
                        
BKE_fracture_mesh_island_free(fmd->shared->last_islands[k], scene);
                }
 
@@ -1294,8 +1303,7 @@ void BKE_fracture_clear_cache(FractureModifierData* fmd, 
Object* ob, Scene *scen
 
        mi = fmd->shared->mesh_islands.first;
        while (mi) {
-               if ((!fmd->use_dynamic && mi->id == 0) ||
-                       (fmd->use_dynamic && mi->id > 0))
+               if ((fmd->shared->refresh && fmd->use_dynamic && mi->startframe 
> startframe) || (!fmd->use_dynamic && mi->id == 0))
                {
                        next = mi->next;
                        BLI_remlink(&fmd->shared->mesh_islands, mi);
@@ -1331,14 +1339,6 @@ void BKE_fracture_clear_cache(FractureModifierData* fmd, 
Object* ob, Scene *scen
                }
        }
 
-#if 0
-       while (fmd->shared->fracture_ids.first) {
-               FractureID* fid = fmd->shared->fracture_ids.first;
-               BLI_remlink(&fmd->shared->fracture_ids, fid);
-               MEM_freeN(fid);
-       }
-#endif
-
        fmd->shared->last_cache_end = endframe;
        fmd->shared->last_cache_start = startframe;
 }
@@ -1981,6 +1981,7 @@ void BKE_fracture_modifier_free(FractureModifierData 
*fmd, Scene *scene)
                int j;
                for (j = 0; j < fmd->shared->last_expected_islands; j++)
                {
+                       BLI_remlink(&fmd->shared->mesh_islands, 
fmd->shared->last_islands[j]);
                        
BKE_fracture_mesh_island_free(fmd->shared->last_islands[j], scene);
                }
 
@@ -2220,41 +2221,42 @@ FracPointCloud BKE_fracture_points_get(Depsgraph 
*depsgraph, FractureModifierDat
        points.points = MEM_mallocN(sizeof(FracPoint), "points");
        points.totpoints = 0;
 
-       if (emd->point_source & (MOD_FRACTURE_EXTRA_PARTICLES | 
MOD_FRACTURE_EXTRA_VERTS)) {
-               if (((emd->point_source & MOD_FRACTURE_OWN_PARTICLES) && 
(emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
-                       ((emd->point_source & MOD_FRACTURE_OWN_VERTS) && 
(emd->point_source & MOD_FRACTURE_EXTRA_VERTS)) ||
-                       ((emd->point_source & MOD_FRACTURE_CUSTOM) && 
(emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
-                       ((emd->point_source & MOD_FRACTURE_CUSTOM) && 
(emd->point_source & MOD_FRACTURE_EXTRA_VERTS)))
-               {
-                       go = MEM_reallocN(go, sizeof(Object *) * (totgroup + 
1));
-                       go[totgroup] = ob;
-                       totgroup++;
-               }
+       if (!emd->use_dynamic) {
+               if (emd->point_source & (MOD_FRACTURE_EXTRA_PARTICLES | 
MOD_FRACTURE_EXTRA_VERTS)) {
+                       if (((emd->point_source & MOD_FRACTURE_OWN_PARTICLES) 
&& (emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
+                               ((emd->point_source & MOD_FRACTURE_OWN_VERTS) 
&& (emd->point_source & MOD_FRACTURE_EXTRA_VERTS)) ||
+                               ((emd->point_source & MOD_FRACTURE_CUSTOM) && 
(emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
+                               ((emd->point_source & MOD_FRACTURE_CUSTOM) && 
(emd->point_source & MOD_FRACTURE_EXTRA_VERTS)))
+                       {
+                               go = MEM_reallocN(go, sizeof(Object *) * 
(totgroup + 1));
+                               go[totgroup] = ob;
+                               totgroup++;
+                       }
 
-               totgroup = getGroupObjects(emd->extra_group, &go, totgroup);
-       }
-       else {
-               totgroup = 1;
-               go[0] = ob;
-       }
+                       totgroup = getGroupObjects(emd->extra_group, &go, 
totgroup);
+               }
+               else {
+                       totgroup = 1;
+                       go[0] = ob;
+               }
 
-       if (emd->point_source & (MOD_FRACTURE_OWN_PARTICLES | 
MOD_FRACTURE_EXTRA_PARTICLES)) {
-               points_from_particles(go, totgroup, scene, &points, ob->obmat, 
thresh, emd, mi);
-       }
+               if (emd->point_source & (MOD_FRACTURE_OWN_PARTICLES | 
MOD_FRACTURE_EXTRA_PARTICLES)) {
+                       points_from_particles(go, totgroup, scene, &points, 
ob->obmat, thresh, emd, mi);
+               }
 
-       if (emd->point_source & (MOD_FRACTURE_OWN_VERTS | 
MOD_FRACTURE_EXTRA_VERTS)) {
-               points_from_verts(go, totgroup, &points, ob->obmat, thresh, 
emd, ob, mi);
-       }
+               if (emd->point_source & (MOD_FRACTURE_OWN_VERTS | 
MOD_FRACTURE_EXTRA_VERTS)) {
+                       points_from_verts(go, totgroup, &points, ob->obmat, 
thresh, emd, ob, mi);
+               }
 
-#if 0
-       if (emd->point_source & MOD_FRACTURE_GREASEPENCIL && 
!emd->use_greasepencil_edges) {
-               points_from_greasepencil(go, totgroup, &points, ob->obmat, 
thresh);
+       #if 0
+               if (emd->point_source & MOD_FRACTURE_GREASEPENCIL && 
!emd->use_greasepencil_edges) {
+                       points_from_greasepencil(go, totgroup, &points, 
ob->obmat, thresh);
+               }
+       #endif
        }
-#endif
-
 
        /* local settings, apply per shard!!! Or globally too first. */
-       if (emd->point_source & MOD_FRACTURE_UNIFORM)
+       if ((emd->point_source & MOD_FRACTURE_UNIFORM) || (emd->use_dynamic))
        {
                float cent[3], bmin[3], bmax[3];
                int count = emd->shard_count;
@@ -2342,16 +2344,14 @@ FracPointCloud BKE_fracture_points_get(Depsgraph 
*depsgraph, FractureModifierDat
                        }
                }
 
-#if 0
                //omg, vary the seed here
                if (emd->split_islands) {
-                       BLI_thread_srandom(0, mi->id);
+                       seed_random(emd, (unsigned int)mi->id);
                }
-               else
-               {
-                       BLI_thread_srandom(0, emd->use_dynamic ? mi->id : 
emd->point_seed);
+               else {
+                       seed_random(emd, emd->use_dynamic ? (unsigned 
int)mi->id : (unsigned int)emd->point_seed);
                }
-#endif
+
                for (i = 0; i < count; ++i) {
                        if (get_random(emd) < thresh) {
                                float co[3];
@@ -2380,7 +2380,7 @@ FracPointCloud BKE_fracture_points_get(Depsgraph 
*depsgraph, FractureModifierDat
                }
        }
 
-       if (emd->point_source & MOD_FRACTURE_GRID)
+       if ((emd->point_source & MOD_FRACTURE_GRID) && (!emd->use_dynamic))
        {
                float cent[3], bmin[3], bmax[3];
                int x, y, z, k = 0;
diff --git a/source/blender/blenkernel/intern/fracture_constraints.c 
b/source/blender/blenkernel/intern/fracture_constraints.c
index 79d95eb040c..4827c0ef251 100644
--- a/source/blender/blenkernel/intern/fracture_constraints.c
+++ b/source/blender/blenkernel/intern/fracture_constraints.c
@@ -32,6 +32,7 @@
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
 #include "BKE_object.h"
+#include "BKE_pointcache.h"
 #include "BKE_rigidbody.h"
 
 #include "BLI_kdtree.h"
@@ -65,10 +66,10 @@ static int get_object_index(Scene *scene, Object *ob) {
        int i = 0;
        if (rbw && rbw->group) {
 
-               obb = DEG_get_original_id(ob);
+               obb = DEG_get_original_object(ob);
                FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(rbw->group, obj)
                {
-                       obbj = DEG_get_original_id(obj);
+                       obbj = DEG_get_original_object(obj);
                        if (obb == obbj) {
                                return i;
                        }
@@ -80,6 +81,28 @@ static int get_object_index(Scene *scene, Object *ob) {
        return -1;
 }
 
+bool BKE_fracture_check_valid_shard(FractureModifierData *fmd, MeshIsland *mi, 
Scene *scene)
+{
+       //why for gods sake is the correct frame only in the original scene ?
+       Scene* sc = (Scene*)DEG_get_original_id(&scene->id);
+       int frame = BKE_scene_frame_get(sc);
+
+       return !BKE_fracture_meshisland_check_frame(fmd, mi, frame);
+}
+
+static int count_valid_shards(FractureModifierData *fmd, Scene *scene) {
+       int count = 0;
+       MeshIsland *mi;
+
+       for (mi = fmd->shared->mesh_islands.first; mi; mi = mi->next) {
+               if (BKE_fracture_check_valid_shard(fmd, mi, scene)) {
+                       count++;
+               }
+       }
+
+       return count;
+}
+
 static int prepareConstraintSearch(FractureModifierData *rmd, MeshIsland 
***mesh_islands, KDTree **combined_tree, Object *obj,
                                                                   MVert** 
mverts, Scene *scene)
 {
@@ -97,7 +120,7 @@ static int prepareConstraintSearch(FractureModifierData 
*rmd, MeshIsland ***mesh
                        {
                                FractureModifierData *fmdi = 
(FractureModifierData *)modifiers_findByType(ob, eModifierType_Fracture);
                                if (fmdi) {
-                                       islands += 
BLI_listbase_count(&fmdi->shared->mesh_islands);
+                                       islands += count_valid_shards(fmdi,

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to