[Bf-blender-cvs] [ce058207fc3] fracture_modifier: acceleration maps are kinda hard to get right... another attempt
Martin Felke
noreply at git.blender.org
Sat Dec 30 11:37:52 CET 2017
Commit: ce058207fc33565101c497954176c296f7afa55f
Author: Martin Felke
Date: Sat Dec 30 11:37:31 2017 +0100
Branches: fracture_modifier
https://developer.blender.org/rBce058207fc33565101c497954176c296f7afa55f
acceleration maps are kinda hard to get right... another attempt
===================================================================
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/pointcache.c
M source/blender/blenkernel/intern/rigidbody.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index a1f0b009b9e..d62e6f46f6d 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -37,6 +37,7 @@
struct FracMesh;
struct Shard;
+struct RigidBodyWorld;
struct FractureModifierData;
struct FractureSetting;
struct DerivedMesh;
@@ -126,6 +127,6 @@ short BKE_fracture_collect_materials(struct Object* o, struct Object* ob, int ma
void BKE_bm_mesh_hflag_flush_vert(struct BMesh *bm, const char hflag);
void BKE_meshisland_constraint_create(struct FractureModifierData* fmd, struct MeshIsland *mi1, struct MeshIsland *mi2, int con_type, float thresh);
-void BKE_update_acceleration_map(struct FractureModifierData *fmd, struct MeshIsland* mi, struct Object* ob, int ctime, float acc);
+void BKE_update_acceleration_map(struct FractureModifierData *fmd, struct MeshIsland* mi, struct Object* ob, int ctime, float acc, struct RigidBodyWorld *rbw);
#endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 6092c396212..a48a1f90953 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -3648,7 +3648,7 @@ void BKE_meshisland_constraint_create(FractureModifierData* fmd, MeshIsland *mi1
mi2->participating_constraint_count++;
}
-void BKE_update_acceleration_map(FractureModifierData *fmd, MeshIsland* mi, Object* ob, int ctime, float acc)
+void BKE_update_acceleration_map(FractureModifierData *fmd, MeshIsland* mi, Object* ob, int ctime, float acc, RigidBodyWorld *rbw)
{
const int acc_defgrp_index = defgroup_name_index(ob, fmd->acceleration_defgrp_name);
DerivedMesh *dm = fmd->visible_mesh_cached;
@@ -3692,8 +3692,12 @@ void BKE_update_acceleration_map(FractureModifierData *fmd, MeshIsland* mi, Obje
if (weight >= 0.0f && weight <= 1.0f) {
dw->weight = weight;
}
+ else if (ctime == rbw->pointcache->startframe) {
+ dw->weight = 0.0f;
+ }
- dw->weight *= fmd->acceleration_fade;
+ if (ctime == rbw->ltime + 1)
+ dw->weight *= fmd->acceleration_fade;
}
}
}
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index f29cde5f626..c548b00c6b0 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1344,21 +1344,13 @@ static int ptcache_rigidbody_write(int index, void *rb_v, void **data, int cfra
vel = len_v3(linvel) + len_v3(angvel);
}
- if (cfra >= mi->start_frame + 1)
+ if (cfra >= mi->start_frame + 1 && cfra == rbw->ltime + 1)
{
lastvel = mi->acc_sequence[cfra - mi->start_frame - 1];
acc = fabsf(vel - lastvel);
- BKE_update_acceleration_map(fmd, mi, ob, cfra, acc);
+ BKE_update_acceleration_map(fmd, mi, ob, cfra, acc, rbw);
+ mi->acc_sequence[cfra - mi->start_frame] = vel;
}
- else {
- BKE_update_acceleration_map(fmd, mi, ob, cfra, 0.0f);
-
- }
-
- mi->acc_sequence[cfra - mi->start_frame] = vel;
- }
- else {
- BKE_update_acceleration_map(fmd, mi, ob, cfra, 0.0f);
}
}
@@ -1460,14 +1452,8 @@ static void ptcache_rigidbody_read(int index, void *rb_v, void **data, float cfr
{
lastvel = mi->acc_sequence[frame - mi->start_frame - 1];
acc = fabsf(vel - lastvel);
- BKE_update_acceleration_map(fmd, mi, ob, frame, acc);
+ BKE_update_acceleration_map(fmd, mi, ob, frame, acc, rbw);
}
- else {
- BKE_update_acceleration_map(fmd, mi, ob, frame, 0.0f);
- }
- }
- else {
- BKE_update_acceleration_map(fmd, mi, ob, frame, 0.0f);
}
}
}
@@ -1537,6 +1523,19 @@ static void ptcache_rigidbody_interpolate(int index, void *rb_v, void **data, fl
memcpy(keys[2].rot, data + 3, 4 * sizeof(float));
}
else {
+ if (fmd)
+ {
+ MeshIsland *mi = find_meshisland(fmd, rbo->meshisland_index);
+ float acc = mi->acc_sequence[((int)cfra)-mi->start_frame];
+ /*float acc1 = mi->acc_sequence[((int)cfra1)-mi->start_frame];
+ float acc2 = mi->acc_sequence[((int)cfra2)-mi->start_frame];
+ float t = (cfra - cfra1) / (cfra2 - cfra1);
+ const float s = 1.0f - t;
+ float acc = s * acc1 + t * acc2;*/
+
+ BKE_update_acceleration_map(fmd, mi, ob, (int)cfra, acc, rbw);
+ }
+
BKE_ptcache_make_particle_key(keys+2, 0, data, cfra2);
}
}
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 1662b906f3d..1f871caaa27 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -105,7 +105,6 @@ static bool restoreKinematic(RigidBodyWorld *rbw);
static void DM_mesh_boundbox(DerivedMesh *bm, float r_loc[3], float r_size[3]);
static void test_deactivate_rigidbody(RigidBodyOb *rbo);
static float box_volume(float size[3]);
-static void updateAccelerationMap(FractureModifierData *fmd, MeshIsland* mi, Object*ob, int ctime, float acc);
#endif
@@ -5376,6 +5375,9 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
{
mul_qt_qtqt(rbo->orn, rbo->orn, mi->rot);
}
+
+ //reset at start, there no cache read seems to happen
+ BKE_update_acceleration_map(fmd, mi, ob, (int)ctime, 0.0f, rbw);
}
if ((ob->rigidbody_object->type == RBO_TYPE_ACTIVE) && (rbo->type == RBO_TYPE_ACTIVE || rbo->flag & RBO_FLAG_KINEMATIC)) {
More information about the Bf-blender-cvs
mailing list