[Bf-blender-cvs] [9e9bbed] fracture_modifier: ignore individual mesh island transforms in rigidbody system again and just re-apply them when converting back to objects, it just caused trouble and brought not the expected result
Martin Felke
noreply at git.blender.org
Mon Feb 1 14:02:47 CET 2016
Commit: 9e9bbed144389beab39b1a8b8b091afdd9f0326e
Author: Martin Felke
Date: Mon Feb 1 14:02:30 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB9e9bbed144389beab39b1a8b8b091afdd9f0326e
ignore individual mesh island transforms in rigidbody system again and just re-apply them when converting back to objects, it just caused trouble and brought not the expected result
===================================================================
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/editors/object/object_modifier.c
===================================================================
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 79f747b..83809b1 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -2393,7 +2393,7 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
for (mi = fmd->meshIslands.first; mi; mi = mi->next)
{
MVert *pvert = mi->physics_mesh->getVertArray(mi->physics_mesh);
- //Shard *s = BLI_findlink(&fmd->frac_mesh->shard_map, mi->id);
+ Shard *s = BLI_findlink(&fmd->frac_mesh->shard_map, mi->id);
for (i = 0; i < mi->vertex_count; i++)
{
@@ -2425,21 +2425,18 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
loc_quat_size_to_mat4(mat, loc , mi->rot, size);
invert_m4_m4(imat, mat);
- //pv = pvert + i;
- //add_v3_v3(pv->co, mi->centroid);
- //mul_m4_v3(imat, pv->co);
- //sub_v3_v3(pv->co, mi->centroid);
-#endif
-
- loc_quat_size_to_mat4(mat, loc, mi->rot, size);
- invert_m4_m4(imat, mat);
pv = pvert + i;
mul_m4_v3(imat, pv->co);
+ loc_quat_size_to_mat4(mat, loc , mi->rot, size);
+ invert_m4_m4(imat, mat);
+
sub_v3_v3(v->co, mi->centroid);
- mul_m4_v3(mat, v->co);
+ mul_m4_v3(imat, v->co);
add_v3_v3(v->co, mi->centroid);
+
//printf("%d %d\n", index, dm->getNumVerts(dm));
+#endif
//hrm perhaps we need to update rest coordinates, too...
mi->vertco[3*i] = v->co[0];
@@ -2450,6 +2447,12 @@ int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, Object *ob, bool
mi->vertno[3*i+1] = v->no[1];
mi->vertno[3*i+2] = v->no[2];
+#if 0
+ sub_v3_v3(v->co, mi->centroid);
+ mul_m4_v3(mat, v->co);
+ add_v3_v3(v->co, mi->centroid);
+#endif
+
if (ob && dvert)
{
int l;
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 676c42c..f0c9ae2 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -480,12 +480,6 @@ void BKE_rigidbody_update_cell(struct MeshIsland *mi, Object *ob, float loc[3],
invert_m4_m4(ob->imat, ob->obmat);
mat4_to_size(size, ob->obmat);
- if (rmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
- {
- //take mi->rot into account too
- mul_qt_qtqt(rot, rot, mi->rot);
- }
-
if (rmd->fracture_mode == MOD_FRACTURE_PREFRACTURED && frame > -1) {
/*record only in prefracture case here, when you want to convert to keyframes*/
n = frame - mi->start_frame + 1;
@@ -3598,7 +3592,7 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
handle_regular_breaking(fmd, ob, rbw, rbsc, max_con_mass, rebuild);
}
- if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL && (rbsc->flag & RBC_FLAG_USE_BREAKING) && 0)// /*&& !rebuild*/)
+ if (fmd->fracture_mode == MOD_FRACTURE_EXTERNAL && (rbsc->flag & RBC_FLAG_USE_BREAKING) && !rebuild)
{
handle_plastic_breaking(rbsc, rbw, laststeps, lastscale);
}
@@ -3939,6 +3933,19 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
//frame = (int)BKE_scene_frame_get(md->scene);
//print_v3("RBO POS:", rbo->pos);
+#if 0
+ if (mode)
+ {
+ float rot[4];
+ copy_qt_qt(rot, mi->rot);
+ mul_qt_qtqt(rot, rot, rbo->orn);
+ BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
+ }
+ else
+ {
+ BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
+ }
+#endif
BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, fmd, (int)ctime);
}
@@ -4173,7 +4180,7 @@ static bool restoreKinematic(RigidBodyWorld *rbw)
return did_it;
}
-static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
+static void resetExternal(RigidBodyWorld *rbw)
{
GroupObject *go;
@@ -4187,52 +4194,46 @@ static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
RigidBodyShardCon *rbsc;
MeshIsland *mi;
Scene *scene = fmd->modifier.scene;
+ float frame = BKE_scene_frame_get(scene);
- BKE_object_where_is_calc(scene, ob);
-
- if (do_reset_always)
+ for (mi = fmd->meshIslands.first; mi; mi = mi->next)
{
- for (mi = fmd->meshIslands.first; mi; mi = mi->next)
- {
- float loc[3], rot[4], quat[4];
- mat4_to_quat(quat, ob->obmat);
+ float loc[3], rot[4], quat[4] = {1.0f, 0.0f, 0.0f, 0.0f};
- //mul_v3_m4v3(loc, ob->obmat, mi->centroid);
- //mul_qt_qtqt(rot, quat, mi->rot);
- copy_v3_v3(loc, mi->centroid);
- copy_qt_qt(rot, mi->rot);
+ copy_v3_v3(loc, mi->centroid);
+ copy_qt_qt(rot, mi->rot);
- if (mi->rigidbody)
+ if (mi->rigidbody)
+ {
+ int i;
+ float loc2[3] = {0.0f, 0.0f, 0.0f};
+ float size[3] = {1.0f, 1.0f, 1.0};
+ float mat[4][4], imat[4][4];
+ loc_quat_size_to_mat4(mat, loc2, mi->rot, size);
+ invert_m4_m4(imat, mat);
+
+ copy_v3_v3(mi->rigidbody->pos, loc);
+ copy_qt_qt(mi->rigidbody->orn, rot);
+ BKE_rigidbody_remove_shard(scene, mi);
+ validateShard(rbw, mi, ob, false, false);
+ //BKE_rigidbody_update_cell(mi, ob, mi->centroid, quat, fmd, (int)frame);
+
+ for (i = 0; i < mi->vertex_count; i++)
{
- int i;
- float loc2[3] = {0.0f, 0.0f, 0.0f};
- float size[3] = {1.0f, 1.0f, 1.0};
- float mat[4][4], imat[4][4];
- loc_quat_size_to_mat4(mat, loc2, mi->rot, size);
- invert_m4_m4(imat, mat);
-
- //copy_v3_v3(mi->rigidbody->pos, loc);
- //copy_qt_qt(mi->rigidbody->orn, rot);
- BKE_rigidbody_remove_shard(scene, mi);
- validateShard(rbw, mi, ob, false, false);
-
- for (i = 0; i < mi->vertex_count; i++)
+ MVert *v = mi->vertices_cached[i];
+ if (v)
{
- MVert *v = mi->vertices_cached[i];
- if (v)
- {
- int x;
- //dont change initial meshislands
- sub_v3_v3(v->co, mi->centroid);
- mul_m4_v3(mat, v->co);
- add_v3_v3(v->co, mi->centroid);
- x = 1;
- }
+ //dont change initial meshislands
+ sub_v3_v3(v->co, mi->centroid);
+ mul_m4_v3(imat, v->co);
+ add_v3_v3(v->co, mi->centroid);
}
}
}
}
+ //BKE_object_where_is_calc(scene, ob);
+
for (rbsc = fmd->meshConstraints.first; rbsc; rbsc = rbsc->next)
{
if (rbsc->type == RBC_TYPE_6DOF_SPRING)
@@ -4268,6 +4269,17 @@ static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
}
}
+ }
+}
+
+static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always)
+{
+ GroupObject *go;
+
+ for (go = rbw->group->gobject.first; go; go = go->next)
+ {
+ Object *ob = go->ob;
+ FractureModifierData *fmd = (FractureModifierData*)modifiers_findByType(ob, eModifierType_Fracture);
if (fmd && fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
{
@@ -4395,6 +4407,7 @@ void BKE_rigidbody_rebuild_world(Scene *scene, float ctime)
if (!(cache->flag & PTCACHE_BAKED))
{
resetDynamic(rbw, true);
+ //resetExternal(rbw);
}
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 55743f3..5b682c6 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2764,32 +2764,33 @@ static Object* do_convert_meshisland_to_object(MeshIsland *mi, Scene* scene, Gro
else
{
int i;
- float size[3] = {1.0f, 1.0f, 1.0f}, inv_size[3] = {1.0f, 1.0f, 1.0f};
+ float size[3] = {1.0f, 1.0f, 1.0f};
+ float loc[3] = {0.0f, 0.0f, 0.0f}, mat[4][4], imat[4][4];
+
Shard *s = BLI_findlink(&fmd->frac_mesh->shard_map, mi->id);
if (s)
{
//AGAIN, used raw_centroid FOR NOW XXX TODO
copy_v3_v3(ob_new->size,s->raw_centroid);
- inv_size[0] = 1.0f / s->raw_centroid[0];
- inv_size[1] = 1.0f / s->raw_centroid[1];
- inv_size[2] = 1.0f / s->raw_centroid[2];
}
else
{
copy_v3_v3(ob_new->size, size);
}
- copy_v3_v3(ob_new->loc, mi->rigidbody->pos);
- copy_qt_qt(ob_new->quat, mi->rigidbody->orn);
- //compensate size; loc and rot should be dealt with already in physmesh
+ copy_v3_v3(ob_new->loc, mi->centroid);
+ copy_qt_qt(ob_new->quat, mi->rot);
+ loc_quat_size_to_mat4(ob_new->obmat, ob_new->loc, ob_new->quat, ob_new->size);
+ invert_m4_m4(ob_new->imat, ob_new->obmat);
+
+ loc_quat_size_to_mat4(mat, loc, ob_new->quat, ob_new->size);
+ invert_m4_m4(imat, mat);
+ //compensate for rot, size
for (i = 0; i < me->totvert; i++)
{
- mul_v3_v3(me->mvert[i].co, inv_size);
+ mul_m4_v3(imat, me->mvert[i].co);
}
- //copy_v3_v3(ob_new->loc, mi->centroid);
- //copy_qt_qt(ob_new->quat, mi->rot); // does bullet reset the start orientation ? maybe i do in the code somewhere...
- loc_quat_size_to_mat4(ob_new->obmat, ob_new->loc, ob_new->quat, ob_new->size);
mat4_to_axis_angle(ob_new->rotAxis, &ob_new->rotAngle, ob_new->obmat);
mat4_to_eulO(ob_new->rot, ob_new->rotmode, ob_new->obmat);
}
More information about the Bf-blender-cvs
mailing list