[Bf-blender-cvs] [f5ef3a7d816] fracture_modifier: animation bind rotation fix, some dynamic mode fixes
Martin Felke
noreply at git.blender.org
Mon Jan 29 20:51:52 CET 2018
Commit: f5ef3a7d816efa816266e8f02b4bf9c9b8cdeace
Author: Martin Felke
Date: Mon Jan 29 20:51:25 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rBf5ef3a7d816efa816266e8f02b4bf9c9b8cdeace
animation bind rotation fix, some dynamic mode fixes
===================================================================
M source/blender/blenkernel/BKE_rigidbody.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/blenkernel/intern/scene.c
M source/blender/editors/object/object_modifier.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/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index b8ce039011b..d0548cfc1d6 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -124,7 +124,7 @@ void BKE_rigidbody_aftertrans_update(struct Object *ob, float loc[3], float rot[
void BKE_rigidbody_sync_transforms(struct RigidBodyWorld *rbw, 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_rebuild_world(struct Scene *scene, float ctime);
+void BKE_rigidbody_rebuild_world(struct Scene *scene, float ctime, bool do_resetDynamic);
void BKE_rigidbody_do_simulation(struct Scene *scene, float ctime);
/* -------------------- */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 1be1f54dedf..c69208c27cf 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -3882,11 +3882,13 @@ void BKE_read_animated_loc_rot(FractureModifierData *fmd, Object *ob, bool do_bi
//rotation is optional, remesher + particlesystem can provide it
float *quatX, *quatY, *quatZ, *quatW;
MVert *mvert = NULL;
+ MLoopTri *mlooptri = NULL;
+ MLoop *mloop = NULL;
MeshIsland *mi;
DerivedMesh *dm = NULL;
- int totvert, count = 0, i = 0, *orig_index = NULL;
+ int totvert, count = 0, i = 0, *orig_index = NULL, tottri, items;
KDTree *tree = NULL;
- float obquat[4], imat[4][4];
+ float anim_quat[4], anim_imat[4][4], imat[4][4];
if (!fmd->anim_mesh_ob)
return;
@@ -3900,19 +3902,22 @@ void BKE_read_animated_loc_rot(FractureModifierData *fmd, Object *ob, bool do_bi
return;
totvert = dm->getNumVerts(dm);
- invert_m4_m4(imat, fmd->anim_mesh_ob->obmat);
+ tottri = dm->getNumLoopTri(dm);
+
+ invert_m4_m4(anim_imat, fmd->anim_mesh_ob->obmat);
+ invert_m4_m4(imat, ob->obmat);
if (totvert == 0) {
dm->release(dm);
return;
}
- mat4_to_quat(obquat, ob->obmat);
-
if (do_bind) {
+ items = tottri > 0 ? tottri : totvert;
+
count = BLI_listbase_count(&fmd->meshIslands);
- tree = BLI_kdtree_new(totvert);
+ tree = BLI_kdtree_new(items);
fmd->anim_bind_len = count;
if (fmd->anim_bind) {
MEM_freeN(fmd->anim_bind);
@@ -3933,13 +3938,31 @@ void BKE_read_animated_loc_rot(FractureModifierData *fmd, Object *ob, bool do_bi
i = 0;
mvert = dm->getVertArray(dm);
+ mlooptri = dm->getLoopTriArray(dm);
+ mloop = dm->getLoopArray(dm);
if (do_bind)
{
- for (i = 0; i < totvert; i++)
+ if (tottri > 0)
{
- float co[3];
- copy_v3_v3(co, mvert[i].co);
- BLI_kdtree_insert(tree, i, co);
+ //looptri based bind
+ for (i = 0; i < tottri; i++)
+ {
+ float co[3];
+ copy_v3_v3(co, mvert[mloop[mlooptri[i].tri[0]].v].co);
+ //copy_v3_v3(co[1], mvert[mloop[mlooptri[i].tri[1]].v].co);
+ //copy_v3_v3(co[2], mvert[mloop[mlooptri[i].tri[2]].v].co);
+ BLI_kdtree_insert(tree, i, co);
+ }
+ }
+ else
+ {
+ //no faces -> vertex based bind
+ for (i = 0; i < totvert; i++)
+ {
+ float co[3];
+ copy_v3_v3(co, mvert[i].co);
+ BLI_kdtree_insert(tree, i, co);
+ }
}
BLI_kdtree_balance(tree);
@@ -3962,30 +3985,42 @@ void BKE_read_animated_loc_rot(FractureModifierData *fmd, Object *ob, bool do_bi
i = 0;
for (mi = fmd->meshIslands.first; mi; mi = mi->next)
{
- KDTreeNearest n[3];
+ KDTreeNearest n;
float co[3], diff[3] = {0, 0, 0};
- int x = 0;
copy_v3_v3(co, mi->rigidbody->pos);
- mul_m4_v3(imat, co);
- x = BLI_kdtree_find_nearest_n(tree, co, n, 3);
+ mul_m4_v3(anim_imat, co);
+ BLI_kdtree_find_nearest(tree, co, &n);
- if (n[0].dist <= fmd->anim_bind_limit || fmd->anim_bind_limit == 0)
+ if (n.dist <= fmd->anim_bind_limit || fmd->anim_bind_limit == 0)
{
- fmd->anim_bind[i].v = n[0].index;
- fmd->anim_bind[i].v1 = n[1].index;
- fmd->anim_bind[i].v2 = n[2].index;
+ if (tottri > 0)
+ {
+ fmd->anim_bind[i].v = mloop[mlooptri[n.index].tri[0]].v;
+ fmd->anim_bind[i].v1 = mloop[mlooptri[n.index].tri[1]].v;
+ fmd->anim_bind[i].v2 = mloop[mlooptri[n.index].tri[2]].v;
+ }
+ else {
+ fmd->anim_bind[i].v = n.index;
+ fmd->anim_bind[i].v1 = -1;
+ fmd->anim_bind[i].v2 = -1;
+ }
fmd->anim_bind[i].mi = i;
- sub_v3_v3v3(diff, n[0].co, co);
+ sub_v3_v3v3(diff, n.co, co);
+ //mul_m4_v3(imat, diff);
+
copy_v3_v3(fmd->anim_bind[i].offset, diff);
- if (x < 3 || n[1].index == -1 || n[2].index == -1) {
+
+ if (fmd->anim_bind[i].v1 == -1 || fmd->anim_bind[i].v2 == -1) {
//fallback if not enough verts around
- normal_short_to_float_v3(fmd->anim_bind[i].no, mvert[n[0].index].no);
- fmd->anim_bind[i].v1 = -1;
- fmd->anim_bind[i].v2 = -1;
+ normal_short_to_float_v3(fmd->anim_bind[i].no, mvert[n.index].no);
+ normalize_v3(fmd->anim_bind[i].no);
}
else {
- normal_tri_v3(fmd->anim_bind[i].no, mvert[n[0].index].co, mvert[n[1].index].co, mvert[n[2].index].co);
+ tri_to_quat(fmd->anim_bind[i].quat,
+ mvert[fmd->anim_bind[i].v].co,
+ mvert[fmd->anim_bind[i].v1].co,
+ mvert[fmd->anim_bind[i].v2].co);
}
}
else
@@ -4024,9 +4059,9 @@ void BKE_read_animated_loc_rot(FractureModifierData *fmd, Object *ob, bool do_bi
continue;
}
- if (orig_index)
+ if (orig_index && (fmd->anim_bind[i].v1 == -1 || fmd->anim_bind[i].v2 == -1))
{
- if (orig_index[v] != v && orig_index[v] != -1)
+ //in particle (no faces) case, dont allow jump around of shards, instead activate them
{
if (mi->rigidbody->physics_object && mi->rigidbody->type == RBO_TYPE_ACTIVE)
{
@@ -4036,48 +4071,56 @@ void BKE_read_animated_loc_rot(FractureModifierData *fmd, Object *ob, bool do_bi
}
}
+ copy_v3_v3(co, mvert[v].co);
+ copy_v3_v3(off, fmd->anim_bind[i].offset);
+
if (fmd->anim_mesh_rot)
{
- copy_v3_v3(vec, fmd->anim_bind[i].no);
- if (fmd->anim_bind[i].v1 == -1 || fmd->anim_bind[i].v2 == -1) {
- //fallback if not enough verts around
- normal_short_to_float_v3(no, mvert[v].no);
+ //float ob_quat[4];
+ //mat4_to_quat(ob_quat, ob->obmat);
+ //invert_qt(ob_quat);
+
+ if (quats)
+ {
+ quat[0] = quatX[v];
+ quat[1] = quatY[v];
+ quat[2] = quatZ[v];
+ quat[3] = quatW[v];
}
else
{
- normal_tri_v3(no, mvert[fmd->anim_bind[i].v].co,
- mvert[fmd->anim_bind[i].v1].co,
- mvert[fmd->anim_bind[i].v2].co);
+ copy_v3_v3(vec, fmd->anim_bind[i].no);
+ if (fmd->anim_bind[i].v1 == -1 || fmd->anim_bind[i].v2 == -1) {
+ //fallback if not enough verts around;
+ normal_short_to_float_v3(no, mvert[v].no);
+ normalize_v3(no);
+ rotation_between_vecs_to_quat(quat, vec, no);
+ }
+ else {
+ float rot[4], iquat[4];
+ tri_to_quat(rot, mvert[fmd->anim_bind[i].v].co,
+ mvert[fmd->anim_bind[i].v1].co,
+ mvert[fmd->anim_bind[i].v2].co);
+ invert_qt_qt(iquat, fmd->anim_bind[i].quat);
+ mul_qt_qtqt(quat, rot, iquat);
+ }
}
- rotation_between_vecs_to_quat(quat, vec, no);
+ //mul_qt_qtqt(quat, quat, ob_quat);
}
- copy_v3_v3(co, mvert[v].co);
- copy_v3_v3(off, fmd->anim_bind[i].offset);
mul_qt_v3(quat, off);
+ //mul_m4_v3(ob->obmat, off);
sub_v3_v3(co, off);
mul_m4_v3(fmd->anim_mesh_ob->obmat, co);
copy_v3_v3(mi->rigidbody->pos, co);
- if (quats)
+ if (fmd->anim_mesh_rot)
{
- quat[0] = quatX[v];
- quat[1] = quatY[v];
- quat[2] = quatZ[v];
- quat[3] = quatW[v];
-
- if (fmd->anim_mesh_rot) {
- mul_qt_qtqt(quat, obquat, quat);
- copy_qt_qt(mi->rigidbody->orn, quat);
- }
- }
- else {
- if (fmd->anim_mesh_rot) {
- mul_qt_qtqt(quat, obquat, quat);
- copy_qt_qt(mi->rigidbody->orn, quat);
- }
+ mat4_to_quat(anim_quat, fmd->anim_mesh_ob->obmat);
+ mul_qt_qtqt(quat, anim_quat, quat);
+ copy_qt_qt(mi->rigidbody->orn, quat);
}
mi->rigidbody->flag |= RBO_FLAG_NEEDS_VALIDATE;
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index f994247e264..53329e1c1c1 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -84,7 +84,7 @@
/* Fracture Modifier related prototypes */
-static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always);
+static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always, bool override_bind);
static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int rebuild, int transfer_speed, float size[3]);
static void rigidbody_passive_fake_parenting(FractureModifierData *fmd, Object *ob, RigidBodyOb *rbo, float imat[4][4]);
static void rigidbody_passive_hook(FractureModifierData *fmd, MeshIsland *mi, Object* ob);
@@ -2251,7 +2251,7 @@ void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
rbw->pointcache->flag |= PTCACHE_OUTDATED;
//restoreKinematic(rbw);
//if (!(rbw->pointcache->flag & PTCACHE_BAKED))
- resetDynamic(rbw, true);
+ resetDynamic(rbw, false, false);
//resetPrefractured(rbw);
}
}
@@ -2260,7 +2260,7 @@ void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
/* Rebuild rigid body world */
/* NOTE: this needs to be called before frame update to work correctly */
-void BKE_rigidbody_rebuild_world(Scene *scene, float ctime)
+void BKE_rigidbody_rebuild_world(Scene *scene, float ctime, bool do_resetDynamic)
{
RigidBodyWorld *rbw = scene->rigidbody_world;
PointCache *cache;
@@ -2294,7 +2294,7 @@ void BKE_rigidbody_rebuild_world(Scene *scene, float ctime)
//if we destroy the cache, also reset dynamic data (if not baked)
if (!(cache->flag & PTCACHE_BAKED))
{
- resetDynamic(rbw, true);
+ resetDynamic(rbw, true, do_resetDynamic);
//resetExternal(rbw);
//resetPrefractured(rbw);
}
@@ -2449,7 +2449,7 @@ void BKE_rigidbody_sync_transforms(RigidBodyWorld *rbw, Object *ob, float ctime)
void BKE_rigidbody_aftertrans_update(Objec
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list