Commit: d5d33dbd40eba13043b95c6cfb31b04dda32ded7
Author: Martin Felke
Date: Wed Jan 27 21:19:05 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBd5d33dbd40eba13043b95c6cfb31b04dda32ded7
fix: fake parenting in testfile didnt work anymore after fake hook was added to
code, now both should work depending on whether the kinematic flag is set
(=parenting) or not (=hook, if vertexgroup and hookmodifiers are used)
===================================================================
M source/blender/blenkernel/intern/rigidbody.c
===================================================================
diff --git a/source/blender/blenkernel/intern/rigidbody.c
b/source/blender/blenkernel/intern/rigidbody.c
index 73d095a..7896b72 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -78,7 +78,7 @@
static void resetDynamic(RigidBodyWorld *rbw);
static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int
rebuild, int transfer_speed);
static void rigidbody_passive_fake_parenting(FractureModifierData *fmd, Object
*ob, RigidBodyOb *rbo);
-static void handle_passive_transform(FractureModifierData *fmd, MeshIsland
*mi, Object* ob);
+static void rigidbody_passive_hook(FractureModifierData *fmd, MeshIsland *mi,
Object* ob);
static void activateRigidbody(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw),
MeshIsland *UNUSED(mi), Object *UNUSED(ob))
@@ -2923,7 +2923,7 @@ static void rigidbody_update_sim_world(Scene *scene,
RigidBodyWorld *rbw)
}
}
-static void rigidbody_passive_fake_hook(MeshIsland *mi, float co[3],
FractureModifierData *fmd, Object *ob)
+static void rigidbody_passive_fake_hook(MeshIsland *mi, float co[3])
{
//no reshape necessary as vertcount didnt change, but update rbo->pos /
orn ? according to change of 1st vertex
//fake hook system
@@ -3457,7 +3457,7 @@ static bool do_update_modifier(Scene* scene, Object* ob,
RigidBodyWorld *rbw, bo
zero_v3(mi->rigidbody->ang_vel);
}
- handle_passive_transform(fmd, mi, ob);
+ rigidbody_passive_hook(fmd, mi, ob);
if (fmd->use_breaking)
{
@@ -3754,55 +3754,48 @@ bool BKE_rigidbody_check_sim_running(RigidBodyWorld
*rbw, float ctime)
return (rbw && (rbw->flag & RBW_FLAG_MUTED) == 0 && ctime >
rbw->pointcache->startframe);
}
-static void handle_passive_transform(FractureModifierData *fmd, MeshIsland
*mi, Object* ob)
+static void rigidbody_passive_hook(FractureModifierData *fmd, MeshIsland *mi,
Object* ob)
{
RigidBodyOb *rbo = mi->rigidbody;
- if (rbo->type == RBO_TYPE_PASSIVE)
+ if (rbo->type == RBO_TYPE_PASSIVE && !(rbo->flag & RBO_FLAG_KINEMATIC))
{
- if (rbo->flag & RBO_FLAG_KINEMATIC)
- {
- rigidbody_passive_fake_parenting(fmd, ob, rbo);
- }
- else
+ DerivedMesh *dm = fmd->visible_mesh_cached;
+ ModifierData *md;
+ bool found = false;
+
+ if (dm)
{
- DerivedMesh *dm = fmd->visible_mesh_cached;
- ModifierData *md;
- bool found = false;
+ int totvert = dm->getNumVerts(dm);
- if (dm)
+ for (md = ob->modifiers.first; md; md = md->next)
{
- int totvert = dm->getNumVerts(dm);
-
- for (md = ob->modifiers.first; md; md =
md->next)
+ if (md->type == eModifierType_Fracture)
{
- if (md->type == eModifierType_Fracture)
+ if ((FractureModifierData*)md == fmd)
{
- if ((FractureModifierData*)md
== fmd)
- {
- found = true;
- }
+ found = true;
}
+ }
- //only eval following hookmodifiers,
based on our derivedmesh
- if (md->type == eModifierType_Hook &&
found)
- {
- float (*vertexCos)[3];
- const ModifierTypeInfo *mti =
modifierType_getInfo(md->type);
- HookModifierData *hmd =
(HookModifierData*)md;
+ //only eval following hookmodifiers, based on
our derivedmesh
+ if (md->type == eModifierType_Hook && found)
+ {
+ float (*vertexCos)[3];
+ const ModifierTypeInfo *mti =
modifierType_getInfo(md->type);
+ HookModifierData *hmd =
(HookModifierData*)md;
- //skip hook modifiers which
were just added and arent valid yet
- if (!hmd->object)
- continue;
+ //skip hook modifiers which were just
added and arent valid yet
+ if (!hmd->object)
+ continue;
- vertexCos =
MEM_callocN(sizeof(float) * 3 * totvert, "Vertex Cos");
- dm->getVertCos(dm, vertexCos);
+ vertexCos = MEM_callocN(sizeof(float) *
3 * totvert, "Vertex Cos");
+ dm->getVertCos(dm, vertexCos);
- mti->deformVerts(md, ob, dm,
vertexCos, totvert, 0);
- rigidbody_passive_fake_hook(mi,
vertexCos[mi->vertex_indices[0]], fmd, ob);
+ mti->deformVerts(md, ob, dm, vertexCos,
totvert, 0);
+ rigidbody_passive_fake_hook(mi,
vertexCos[mi->vertex_indices[0]]);
- MEM_freeN(vertexCos);
- }
+ MEM_freeN(vertexCos);
}
}
}
@@ -3846,7 +3839,7 @@ static bool do_sync_modifier(ModifierData *md, Object
*ob, RigidBodyWorld *rbw,
continue;
}
- //handle_passive_transform(fmd, mi, ob);
+ rigidbody_passive_fake_parenting(fmd, ob, rbo);
/* use rigid body transform after cache start
frame if objects is not being transformed */
if (BKE_rigidbody_check_sim_running(rbw, ctime)
&& !(ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ)) {
@@ -4029,7 +4022,14 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float
loc[3], float rot[3], flo
{
rbo = mi->rigidbody;
do_reset_rigidbody(rbo, ob, mi, loc, rot, quat,
rotAxis, rotAngle);
- handle_passive_transform(rmd, mi, ob);
+ if (rbo->flag & RBO_FLAG_KINEMATIC)
+ {
+ rigidbody_passive_fake_parenting(rmd, ob, rbo);
+ }
+ else
+ {
+ rigidbody_passive_hook(rmd, mi, ob);
+ }
}
//then update origmat
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs