78 if (rootchan ==
nullptr) {
87 add_relation(pchan_local_key, init_ik_key,
"IK Constraint -> Init IK Tree");
88 add_relation(init_ik_key, solver_key,
"Init IK -> IK Solver");
95 OperationKey target_dependent_key = is_itasc ? init_ik_key : solver_key;
98 if (
data->tar !=
nullptr) {
100 if (
data->tar !=
object) {
119 if (
data->tar ==
object &&
data->subtarget[0]) {
127 if (
data->poletar !=
nullptr) {
129 if (
data->poletar !=
object) {
151 "\nStarting IK Build: pchan = %s, target = (%s, %s), "
154 data->tar ?
data->tar->id.name :
"nullptr",
165 add_relation(parchan_transforms_key, solver_key,
"IK Solver Owner");
168 while (parchan !=
nullptr) {
173 if (parchan != pchan) {
176 add_relation(parent_key, solver_key,
"IK Chain Parent");
179 add_relation(solver_key, bone_done_key,
"IK Chain Result");
184 add_relation(solver_key, final_transforms_key,
"IK Solver Result");
193 if ((segcount ==
data->rootbone) || (segcount > 255)) {
196 parchan = parchan->
parent;
199 add_relation(solver_key, pose_done_key,
"PoseEval Result-Bone Link");
219 add_relation(init_ik_key, solver_key,
"Init IK -> IK Solver");
221 add_relation(solver_key, pose_cleanup_key,
"IK Solver -> Cleanup");
225 if (
data->tar !=
nullptr) {
227 add_relation(target_geometry_key, solver_key,
"Curve.Path -> Spline IK");
229 add_relation(target_transform_key, solver_key,
"Curve.Transform -> Spline IK");
235 add_relation(solver_key, final_transforms_key,
"Spline IK Result");
239 for (
bPoseChannel *parchan = pchan->
parent; parchan !=
nullptr && segcount < data->chainlen;
240 parchan = parchan->
parent, segcount++) {
246 add_relation(parent_key, solver_key,
"Spline IK Solver Update");
249 add_relation(solver_key, bone_done_key,
"Spline IK Solver Result");
251 root_map->
add_bone(parchan->name, rootchan->name);
254 add_relation(solver_key, pose_done_key,
"PoseEval Result-Bone Link");
266 const char *root_name = rootchan->
name;
273 deepest_root = parchan;
275 if (deepest_root ==
nullptr) {
281 add_relation(other_bone_key, solver_key,
"IK Chain Overlap");
296 add_relation(local_transform, pose_init_key,
"Local Transform -> Pose Init");
297 add_relation(pose_init_key, pose_init_ik_key,
"Pose Init -> Pose Init IK");
298 add_relation(pose_init_ik_key, pose_done_key,
"Pose Init IK -> Pose Cleanup");
302 add_relation(armature_key, pose_init_key,
"Data dependency");
304 add_relation(pose_init_key, pose_cleanup_key,
"Init -> Cleanup");
321 bool pose_depends_on_local_transform =
false;
327 pose_depends_on_local_transform =
true;
331 pose_depends_on_local_transform =
true;
340 pose_depends_on_local_transform =
true;
348 if (pose_depends_on_local_transform) {
353 add_relation(local_transform_key, pose_key,
"Local Transforms");
369 add_relation(bone_local_key, bone_pose_key,
"Bone Local - Bone Pose");
371 if (pchan->parent !=
nullptr) {
383 add_relation(parent_key, bone_pose_key,
"Parent Bone -> Child Bone");
386 if (pchan->constraints.first !=
nullptr) {
388 BuilderWalkUserData
data;
396 add_relation(bone_pose_key, constraints_key,
"Pose -> Constraints Stack");
397 add_relation(bone_local_key, constraints_key,
"Local -> Constraints Stack");
401 add_relation(constraints_key, bone_ready_key,
"Constraints -> Ready");
405 add_relation(bone_pose_key, bone_ready_key,
"Pose -> Ready");
411 add_relation(bone_ready_key, bone_done_key,
"Ready -> Done");
417 add_relation(bone_done_key, bone_segments_key,
"Done -> B-Bone Segments");
429 add_relation(prev_key, bone_segments_key,
"Prev Handle -> B-Bone Segments");
433 add_relation(next_key, bone_segments_key,
"Next Handle -> B-Bone Segments");
438 add_relation(bone_segments_key, pose_cleanup_key,
"Cleanup dependency");
443 add_relation(bone_done_key, pose_done_key,
"PoseEval Result-Bone Link");
446 add_relation(bone_done_key, pose_cleanup_key,
"Done -> Cleanup");
448 add_relation(bone_ready_key, pose_cleanup_key,
"Ready -> Cleanup");
451 if (pchan->custom !=
nullptr) {
474 add_relation(pose_init_key, bone_local_key,
"Pose Init -> Bone Local");
475 add_relation(bone_local_key, bone_ready_key,
"Local -> Ready");
476 add_relation(bone_ready_key, bone_done_key,
"Ready -> Done");
477 add_relation(bone_done_key, pose_cleanup_key,
"Bone Done -> Pose Cleanup");
485 "Bone Segments -> Bone Done",
489 add_relation(from_bone_done_key, bone_done_key,
"Bone Done -> Bone Done");
496 if (pchan->parent !=
nullptr) {
499 add_relation(parent_key, bone_done_key,
"Parent Bone -> Child Bone");
502 if (pchan->prop !=
nullptr) {
507 add_relation(from_bone_parameters, bone_parameters,
"Proxy Bone Parameters");
Blender kernel action and pose functionality.
void BKE_pchan_bbone_handles_get(struct bPoseChannel *pchan, struct bPoseChannel **r_prev, struct bPoseChannel **r_next)
struct bPoseChannel * BKE_armature_ik_solver_find_root(struct bPoseChannel *pchan, struct bKinematicConstraint *data)
struct bPoseChannel * BKE_armature_splineik_solver_find_root(struct bPoseChannel *pchan, struct bSplineIKConstraint *data)
void BKE_constraints_id_loop(struct ListBase *list, ConstraintIDFunc func, void *userdata)
#define LISTBASE_FOREACH(type, var, list)
@ DAG_EVAL_NEED_CURVE_PATH
@ BONE_ADD_PARENT_END_ROLL
@ CONSTRAINT_TYPE_LOCLIKE
@ CONSTRAINT_TYPE_ROTLIKE
@ CONSTRAINT_TYPE_SPLINEIK
@ CONSTRAINT_TYPE_KINEMATIC
@ CONSTRAINT_TYPE_TRANSLIKE
@ CONSTRAINT_TYPE_SIZELIKE
#define CD_MASK_MDEFORMVERT
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
virtual bool check_pchan_has_bbone(Object *object, const bPoseChannel *pchan)
virtual bool check_pchan_has_bbone_segments(Object *object, const bPoseChannel *pchan)
virtual void build_ik_pose(Object *object, bPoseChannel *pchan, bConstraint *con, RootPChanMap *root_map)
virtual void build_armature(bArmature *armature)
virtual void build_constraints(ID *id, NodeType component_type, const char *component_subdata, ListBase *constraints, RootPChanMap *root_map)
void add_customdata_mask(Object *object, const DEGCustomDataMeshMasks &customdata_masks)
void add_special_eval_flag(ID *id, uint32_t flag)
virtual void build_object(Object *object)
virtual void build_proxy_rig(Object *object)
Relation * add_relation(const KeyFrom &key_from, const KeyTo &key_to, const char *description, int flags=0)
virtual void build_splineik_pose(Object *object, bPoseChannel *pchan, bConstraint *con, RootPChanMap *root_map)
virtual void build_inter_ik_chains(Object *object, const OperationKey &solver_key, const bPoseChannel *rootchan, const RootPChanMap *root_map)
virtual void build_rig(Object *object)
virtual void build_idproperties(IDProperty *id_property)
#define DEG_DEBUG_PRINTF(depsgraph, type,...)
struct Object * proxy_from
struct bPoseChannel * parent
static DEGCustomDataMeshMasks MaskVert(const uint64_t vert_mask)
bool has_common_root(const char *bone1, const char *bone2) const
void add_bone(const char *bone, const char *root)