forked from bartvdbraak/blender
Fix T80121: Forcefield F-curve modifier changes don't reset cache
Add a dependency graph relation Force Object Animation → Scene Rigid Body World Rebuild. This ensures that the rigid body world is rebuilt when a force object is re-tagged for animation updates. The extra relation doesn't add any new calculations when the animation is running, as the Time Source node already had a relation to the scene's `RIGIDBODY_REBUILD` node. The relation is created directly to the `RIGIDBODY_REBUILD` Operation. I would have liked to target the containing Component instead. However, that has the `RIGIDBODY_SIM` operation as entry node, which isn't enough to actually fix T80121. Reviewers: Sergey Differential Revision: https://developer.blender.org/T80121
This commit is contained in:
parent
ddba5e0be3
commit
48a0c931ee
@ -1252,6 +1252,7 @@ void DepsgraphRelationBuilder::build_animdata(ID *id)
|
||||
ComponentKey animation_key(id, NodeType::ANIMATION);
|
||||
ComponentKey parameters_key(id, NodeType::PARAMETERS);
|
||||
add_relation(animation_key, parameters_key, "Animation -> Parameters");
|
||||
build_animdata_force(id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1396,6 +1397,24 @@ void DepsgraphRelationBuilder::build_animation_images(ID *id)
|
||||
}
|
||||
}
|
||||
|
||||
void DepsgraphRelationBuilder::build_animdata_force(ID *id)
|
||||
{
|
||||
if (GS(id->name) != ID_OB) {
|
||||
return;
|
||||
}
|
||||
|
||||
const Object *object = (Object *)id;
|
||||
if (object->pd == nullptr || object->pd->forcefield == PFIELD_NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Updates to animation data (in the UI, for example by altering FCurve Modifier parameters
|
||||
* animating force field strength) may need to rebuild the rigid body world. */
|
||||
ComponentKey animation_key(id, NodeType::ANIMATION);
|
||||
OperationKey rigidbody_key(&scene_->id, NodeType::TRANSFORM, OperationCode::RIGIDBODY_REBUILD);
|
||||
add_relation(animation_key, rigidbody_key, "Animation -> Rigid Body");
|
||||
}
|
||||
|
||||
void DepsgraphRelationBuilder::build_action(bAction *action)
|
||||
{
|
||||
if (built_map_.checkIsBuiltAndTag(action)) {
|
||||
|
@ -241,6 +241,7 @@ class DepsgraphRelationBuilder : public DepsgraphBuilder {
|
||||
OperationNode *operation_from,
|
||||
ListBase *strips);
|
||||
virtual void build_animdata_drivers(ID *id);
|
||||
virtual void build_animdata_force(ID *id);
|
||||
virtual void build_animation_images(ID *id);
|
||||
virtual void build_action(bAction *action);
|
||||
virtual void build_driver(ID *id, FCurve *fcurve);
|
||||
|
Loading…
Reference in New Issue
Block a user