[Bf-blender-cvs] [fdb5188e60d] temp-fracture-modifier-2.8: attempt for proper reset of new cache together with pointcache
Martin Felke
noreply at git.blender.org
Wed Aug 22 12:07:23 CEST 2018
Commit: fdb5188e60daf55dac06e70a12ad258f61bd668e
Author: Martin Felke
Date: Wed Aug 22 12:06:51 2018 +0200
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBfdb5188e60daf55dac06e70a12ad258f61bd668e
attempt for proper reset of new cache together with pointcache
===================================================================
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_dynamic.c
M source/blender/blenkernel/intern/fracture_prefractured.c
M source/blender/blenkernel/intern/fracture_rigidbody.c
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/editors/object/object_modifier.c
M source/blender/makesrna/intern/rna_fracture.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 950616e8d57..8b100895f26 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -159,4 +159,6 @@ bool BKE_fracture_meshisland_check_frame(struct FractureModifierData *fmd, struc
void BKE_fracture_dynamic_do(struct FractureModifierData *fmd, struct Object* ob, struct Scene* scene,
struct Depsgraph* depsgraph, struct Main* bmain);
+void BKE_fracture_clear_cache(struct FractureModifierData* fmd, struct Object *ob, struct Scene *scene);
+
#endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 03e4ecc5520..82a59924fd9 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -131,7 +131,7 @@ void BKE_rigidbody_aftertrans_update(struct Object *ob, float loc[3], float rot[
float quat[4], float rotAxis[3], float rotAngle, struct Depsgraph *depsgraph);
void BKE_rigidbody_sync_transforms(struct Scene* scene, struct Object *ob, float ctime);
bool BKE_rigidbody_check_sim_running(struct RigidBodyWorld *rbw, float ctime);
-void BKE_rigidbody_cache_reset(struct RigidBodyWorld *rbw);
+void BKE_rigidbody_cache_reset(struct Scene *scene);
void BKE_rigidbody_rebuild_world(struct Depsgraph *depsgraph, struct Scene *scene, float ctime);
void BKE_rigidbody_do_simulation(struct Depsgraph *depsgraph, struct Scene *scene, float ctime);
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 539afde9a98..ca96229da5f 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -461,7 +461,7 @@ static Mesh* get_mesh(Mesh** meshes, int index, Mesh* mesh)
static void process_cells(FractureModifierData* fmd, MeshIsland* mi, Main* bmain, Object* ob, Scene* scene, cell *c, int count)
{
- int i, j = 0;
+ int i, j = 1;
BisectContext bictx = {};
BooleanContext boctx = {};
MeshIsland** islands = NULL;
@@ -479,6 +479,11 @@ static void process_cells(FractureModifierData* fmd, MeshIsland* mi, Main* bmain
mi->endframe = frame;
+ mi->locs = MEM_reallocN(mi->locs, sizeof(float) * 3 * (mi->endframe - mi->startframe + 1));
+ mi->rots = MEM_reallocN(mi->rots, sizeof(float) * 4 * (mi->endframe - mi->startframe + 1));
+ mi->vels = MEM_reallocN(mi->vels, sizeof(float) * 3 * (mi->endframe - mi->startframe + 1));
+ mi->aves = MEM_reallocN(mi->aves, sizeof(float) * 3 * (mi->endframe - mi->startframe + 1));
+
/*for each cell...*/
//#pragma omp parallel for
for (i = 0; i < count; i++)
@@ -1339,6 +1344,62 @@ void fracture_copy_customdata(CustomData* src, CustomData* dst,CustomDataMask ma
}
}
+void BKE_fracture_clear_cache(FractureModifierData* fmd, Object* ob, Scene *scene)
+{
+ RigidBodyWorld *rbw = scene->rigidbody_world;
+ int startframe = rbw->shared->pointcache->startframe;
+ int endframe = rbw->shared->pointcache->endframe;
+ int frame = 0;
+ MeshIsland *mi, *next;
+
+ mi = fmd->shared->mesh_islands.first;
+ while (mi) {
+ if (mi->startframe > startframe || (!fmd->use_dynamic && mi->id == 0)) {
+ next = mi->next;
+ BLI_remlink(&fmd->shared->mesh_islands, mi);
+ BKE_fracture_mesh_island_free(mi, scene);
+ mi = next;
+ }
+ else {
+ mi->endframe = endframe;
+ MEM_freeN(mi->locs);
+ MEM_freeN(mi->rots);
+ MEM_freeN(mi->vels);
+ MEM_freeN(mi->aves);
+
+ frame = mi->endframe - mi->startframe + 1;
+ mi->locs = MEM_callocN(sizeof (float) * 3 *frame, "mi->locs");
+ mi->rots = MEM_callocN(sizeof (float) * 4 *frame, "mi->rots");
+ mi->vels = MEM_callocN(sizeof (float) * 3 *frame, "mi->vels");
+ mi->aves = MEM_callocN(sizeof (float) * 3 *frame, "mi->aves");
+ mi->fractured = false;
+
+ if (!mi->rigidbody->shared->physics_object)
+ {
+ float size[3];
+ mat4_to_size(size, ob->obmat);
+ int frame = (int)BKE_scene_frame_get(scene);
+
+ //mi->rigidbody->flag |= (RBO_FLAG_NEEDS_VALIDATE | RBO_FLAG_NEEDS_RESHAPE);
+ BKE_rigidbody_validate_sim_shard(rbw, ob, mi, fmd, true, true, size, frame);
+ }
+
+ mi = mi->next;
+ }
+ }
+
+#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;
+}
+
Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Scene *scene, Object* ob, float ctime)
{
@@ -1360,9 +1421,9 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Scene *
RigidBodyOb *rbo = mi->rigidbody;
if (BKE_fracture_meshisland_check_frame(fmd, mi, (int)ctime)) {
- if (scene && fmd->use_dynamic) {
- /* remove rigidbody physics handles here too */
+ if (scene && mi->rigidbody->shared->physics_object) {
BKE_rigidbody_remove_shard(scene, mi);
+ mi->rigidbody->shared->physics_object = NULL;
}
continue;
}
@@ -1636,6 +1697,9 @@ void BKE_update_velocity_layer(FractureModifierData *fmd, Mesh *dm)
{
mi = BLI_ghash_lookup(fmd->shared->vertex_island_map, SET_INT_IN_POINTER(i));
rbo = mi->rigidbody;
+ if (!rbo) {
+ continue;
+ }
velX[i] = rbo->lin_vel[0] + rbo->ang_vel[0];
velY[i] = rbo->lin_vel[1] + rbo->ang_vel[1];
diff --git a/source/blender/blenkernel/intern/fracture_dynamic.c b/source/blender/blenkernel/intern/fracture_dynamic.c
index 6097f281735..31dc9d4eab8 100644
--- a/source/blender/blenkernel/intern/fracture_dynamic.c
+++ b/source/blender/blenkernel/intern/fracture_dynamic.c
@@ -97,6 +97,9 @@ void BKE_fracture_dynamic_do(FractureModifierData *fmd, Object* ob, Scene* scene
fid = (FractureID*)fmd->shared->fracture_ids.first;
}
+ fmd->shared->fracture_ids.first = NULL;
+ fmd->shared->fracture_ids.last = NULL;
+
#if 0
if (count > 0)
{
diff --git a/source/blender/blenkernel/intern/fracture_prefractured.c b/source/blender/blenkernel/intern/fracture_prefractured.c
index eac66dfe7c4..af1d1ae6d5b 100644
--- a/source/blender/blenkernel/intern/fracture_prefractured.c
+++ b/source/blender/blenkernel/intern/fracture_prefractured.c
@@ -144,13 +144,15 @@ Mesh* BKE_fracture_apply(FractureModifierData *fmd, Object *ob, Mesh *me_orig, D
/*free old stuff here */
BKE_fracture_constraints_free(fmd, scene);
- BKE_fracture_meshislands_free(fmd, scene);
+ BKE_fracture_meshislands_free(fmd, fmd->use_dynamic ? NULL : scene);
+#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
me_tmp = BKE_fracture_mesh_copy(me, ob);
diff --git a/source/blender/blenkernel/intern/fracture_rigidbody.c b/source/blender/blenkernel/intern/fracture_rigidbody.c
index 6c666fc6ff0..091e6c04537 100644
--- a/source/blender/blenkernel/intern/fracture_rigidbody.c
+++ b/source/blender/blenkernel/intern/fracture_rigidbody.c
@@ -2651,7 +2651,7 @@ bool BKE_rigidbody_modifier_sync(ModifierData *md, Object *ob, Scene *scene, flo
RigidBodyShardCon *con;
//rbw->flag |= RBW_FLAG_OBJECT_CHANGED;
- BKE_rigidbody_cache_reset(rbw);
+ BKE_rigidbody_cache_reset(scene);
/* re-enable all constraints as well */
for (con = fmd->shared->mesh_constraints.first; con; con = con->next) {
//con->flag |= RBC_FLAG_ENABLED;
@@ -2912,7 +2912,7 @@ RigidBodyShardCon *BKE_rigidbody_create_shard_constraint(Scene *scene, short typ
/* flag cache as outdated */
if (reset)
- BKE_rigidbody_cache_reset(rbw);
+ BKE_rigidbody_cache_reset(scene);
/* return this object */
return rbc;
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 085fe782f09..b8d37b41513 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1214,7 +1214,7 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type, M
}
/* flag cache as outdated */
- BKE_rigidbody_cache_reset(rbw);
+ BKE_rigidbody_cache_reset(scene);
/* return this object */
return rbo;
@@ -1321,7 +1321,7 @@ RigidBodyCon *BKE_rigidbody_create_constraint(Scene *scene, Object *ob, short ty
}
/* flag cache as outdated */
- BKE_rigidbody_cache_reset(rbw);
+ BKE_rigidbody_cache_reset(scene);
/* return this object */
return rbc;
@@ -1386,7 +1386,7 @@ void BKE_rigidbody_remove_object(Main *bmain, Scene *scene, Object *ob)
BKE_rigidbody_free_object(ob, rbw);
/* flag cache as outdated */
- BKE_rigidbody_cache_reset(rbw);
+ BKE_rigidbody_cache_reset(scene);
//BKE_rigidbody_update_ob_array(rbw, true);
}
@@ -1405,7 +1405,7 @@ void BKE_rigidbody_remove_constraint(Scene *scene, Object *ob)
BKE_rigidbody_free_constraint(ob);
/* flag cache as outdated */
- BKE_rigidbody_cache_reset(rbw);
+ BKE_rigidbody_cache_reset(scene);
}
/* ************************************** */
@@ -2018,10 +2018,29 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], flo
}
}
-void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
+void BKE_rigidbody_cache_reset(Scene* scene)
{
- if (rbw) {
- rbw->shared->pointcache->flag |= PTCACHE_OUTDATED;
+ if (scene) {
+ RigidBodyWorld *rbw = scene->rigidbody_world;
+
+ FractureModifierData *fmd;
+ Object *ob;
+ int i = 0;
+
+ if (rbw) {
+ rbw->shared->pointcache->flag |= PTCACHE_OUTDATED;
+ if (rbw->objects) {
+ for (i = 0; i < rbw->numbodies; i++) {
+ ob = rbw->objects[i];
+ if (ob) {
+ fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
+ if (fmd) {
+ BKE_fracture_clear_cache(fmd, ob, scene);
+ }
+ }
+ }
+ }
+ }
}
}
@@ -2130,7 +2149,7 @@ void BKE_rigidbody_do_simulation(Depsgraph *depsgraph, Scene *scene, float ctime
{
if (!was_changed)
{
- BKE_rigidbody_cache_reset(rbw);
+ BKE_rigidbody_cache_reset(scene);
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
}
@@ -2161,8 +2180,8 @@ voi
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list