[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