diff options
author | Sybren A. Stüvel <sybren@blender.org> | 2020-06-23 18:03:18 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2020-07-02 09:52:14 +0300 |
commit | bb4f8b76ec5eee803c98098ae04d34dba9f62148 (patch) | |
tree | d6ad94f3e5594e6b3b15d68c4d8084158b4b3a70 | |
parent | 089ff4a1ddedae0974f8deec49dad436bb1523d9 (diff) |
Fix T77712: Crash on proxied rig, custom bone shape, driver targeting rig
It turns out that
`DepsgraphNodeBuilder::build_object_data_geometry(Object *object, bool
is_object_visible)` was called for the custom shape with
`is_object_visible=false` when there are drivers, and
`is_object_visible=true` when there aren't any.
3 files changed, 8 insertions, 3 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 6f4333ee81d..32fddd3164c 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -744,7 +744,7 @@ void DepsgraphNodeBuilder::build_object_data(Object *object, bool is_object_visi break; case OB_ARMATURE: if (ID_IS_LINKED(object) && object->proxy_from != nullptr) { - build_proxy_rig(object); + build_proxy_rig(object, is_object_visible); } else { build_rig(object, is_object_visible); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index 16beedabc2a..bac3751cc31 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -200,7 +200,7 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { virtual void build_ik_pose(Object *object, bPoseChannel *pchan, bConstraint *con); virtual void build_splineik_pose(Object *object, bPoseChannel *pchan, bConstraint *con); virtual void build_rig(Object *object, bool is_object_visible); - virtual void build_proxy_rig(Object *object); + virtual void build_proxy_rig(Object *object, bool is_object_visible); virtual void build_armature(bArmature *armature); virtual void build_armature_bones(ListBase *bones); virtual void build_shapekeys(Key *key); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc index 7a05ae36ea4..166b766223b 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc @@ -286,7 +286,7 @@ void DepsgraphNodeBuilder::build_rig(Object *object, bool is_object_visible) } } -void DepsgraphNodeBuilder::build_proxy_rig(Object *object) +void DepsgraphNodeBuilder::build_proxy_rig(Object *object, bool is_object_visible) { bArmature *armature = (bArmature *)object->data; OperationNode *op_node; @@ -329,6 +329,11 @@ void DepsgraphNodeBuilder::build_proxy_rig(Object *object) &object->id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EVAL, nullptr, pchan->name); } + /* Custom shape. */ + if (pchan->custom != nullptr) { + build_object(-1, pchan->custom, DEG_ID_LINKED_INDIRECTLY, is_object_visible); + } + pchan_index++; } op_node = add_operation_node(&object->id, |