[Bf-blender-cvs] [c04b4d3] fracture_modifier: fixes: activating clusters via percentage, add meshisland id as name in fracture too, load crash fix
Martin Felke
noreply at git.blender.org
Fri Sep 9 14:12:40 CEST 2016
Commit: c04b4d393b88cc50a478fe20a9266b6f975e8171
Author: Martin Felke
Date: Fri Sep 9 13:33:34 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rBc04b4d393b88cc50a478fe20a9266b6f975e8171
fixes: activating clusters via percentage, add meshisland id as name in fracture too, load crash fix
===================================================================
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/blenloader/intern/readfile.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index ac42878..a4d0f50 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -3199,6 +3199,28 @@ static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int r
mi->rigidbody->flag &= ~(RBO_FLAG_NEEDS_VALIDATE | RBO_FLAG_NEEDS_RESHAPE);
}
+static void activateCluster(MeshIsland *mi, int particle_index, RigidBodyWorld *rbw, Object *ob) {
+ RigidBodyShardCon *con;
+ int i = 0;
+ for (i = 0; i < mi->participating_constraint_count; i++)
+ {
+ con = mi->participating_constraints[i];
+ if (con->physics_constraint && con->mi1->particle_index == particle_index) {
+ if (con->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+ activateRigidbody(con->mi1->rigidbody, rbw, con->mi1, ob);
+ activateCluster(con->mi1, particle_index, rbw, ob);
+ }
+ }
+
+ if (con->physics_constraint && con->mi2->particle_index == particle_index) {
+ if (con->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+ activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
+ activateCluster(con->mi2, particle_index, rbw, ob);
+ }
+ }
+ }
+}
+
static void handle_breaking_percentage(FractureModifierData* fmd, Object *ob, MeshIsland *mi, RigidBodyWorld *rbw, int breaking_percentage)
{
int broken_cons = 0, cons = 0, i = 0, cluster_cons = 0, broken_cluster_cons = 0;
@@ -3239,9 +3261,17 @@ static void handle_breaking_percentage(FractureModifierData* fmd, Object *ob, Me
if (fmd->use_breaking)
{
if (con->physics_constraint) {
+
RB_constraint_set_enabled(con->physics_constraint, false);
- activateRigidbody(con->mi1->rigidbody, rbw, con->mi1, ob);
- activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
+ if (con->mi1->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+ activateRigidbody(con->mi1->rigidbody, rbw, con->mi1, ob);
+ activateCluster(con->mi1, mi->particle_index, rbw, ob);
+ }
+
+ if (con->mi2->rigidbody->flag & RBO_FLAG_KINEMATIC) {
+ activateRigidbody(con->mi2->rigidbody, rbw, con->mi2, ob);
+ activateCluster(con->mi2, mi->particle_index, rbw, ob);
+ }
}
}
}
@@ -4454,9 +4484,11 @@ void BKE_rigidbody_do_simulation(Scene *scene, float ctime)
}
else if (rbw->ltime == startframe)
{
- bool did_it = restoreKinematic(rbw);
- if (did_it)
- rigidbody_update_simulation(scene, rbw, true);
+ /*bool did_it = */restoreKinematic(rbw);
+ //if (did_it)
+
+ //make 1st run like later runs... hack...
+ rigidbody_update_simulation(scene, rbw, true);
}
/* advance simulation, we can only step one frame forward */
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 0ffc34c..430a719 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5287,7 +5287,12 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd)
sh = shards[i]; //skip "empty" shards
while (sh->shard_id < mi->id)
{
- sh = sh->next;
+ if (sh->next) {
+ sh = sh->next;
+ }
+ else {
+ break;
+ }
}
if (sh)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 58ac0d4..1d3987d 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1853,6 +1853,7 @@ static float do_setup_meshisland(FractureModifierData *fmd, Object *ob, int totv
mi->thresh_weight = 0.0f;
mi->ground_weight = 0.0f;
mi->id = id;
+ snprintf(mi->name, 64, "%d", mi->id);
mi->vertices = verts; /*those are temporary only !!! */
mi->vertco = MEM_mallocN(sizeof(float) * 3 * totvert, "mi->vertco");
memcpy(mi->vertco, vertco, 3 * totvert * sizeof(float));
@@ -2240,7 +2241,7 @@ static void halve(FractureModifierData *rmd, Object *ob, int minsize, BMesh **bm
static void mesh_separate_loose(FractureModifierData *rmd, Object *ob, DerivedMesh *dm)
{
- int minsize = 1000;
+ int minsize = 100;
BMesh *bm_work;
BMVert *vert, **orig_start;
BMIter iter;
@@ -2284,6 +2285,9 @@ static void do_constraint(FractureModifierData* fmd, MeshIsland *mi1, MeshIsland
rbsc = BKE_rigidbody_create_shard_constraint(fmd->modifier.scene, con_type, true);
rbsc->mi1 = mi1;
rbsc->mi2 = mi2;
+
+ snprintf(rbsc->name, 64, "%s-%s", rbsc->mi1->name, rbsc->mi2->name);
+
if (thresh == 0 || fmd->use_breaking == false) {
rbsc->flag &= ~RBC_FLAG_USE_BREAKING;
}
@@ -3213,6 +3217,7 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
mat4_to_loc_quat(dummyloc, rot, ob->obmat);
copy_qt_qt(mi->rot, rot);
mi->id = s->shard_id;
+ snprintf(mi->name, 64, "%d", mi->id);
if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
{
More information about the Bf-blender-cvs
mailing list