32 #include "RNA_prototypes.h"
65 if (rootchan ==
nullptr) {
81 add_relation(pchan_local_key, init_ik_key,
"IK Constraint -> Init IK Tree");
83 add_relation(init_ik_key, solver_key,
"Init IK -> IK Solver");
89 OperationKey target_dependent_key = is_itasc ? init_ik_key : solver_key;
92 if (
data->tar !=
nullptr) {
94 if (
data->tar !=
object) {
117 if (
data->tar ==
object &&
data->subtarget[0]) {
125 if (
data->poletar !=
nullptr) {
127 if (
data->poletar !=
object) {
153 "\nStarting IK Build: pchan = %s, target = (%s, %s), "
156 data->tar ?
data->tar->id.name :
"nullptr",
167 add_relation(parchan_transforms_key, solver_key,
"IK Solver Owner");
170 while (parchan !=
nullptr) {
175 if (parchan != pchan) {
178 add_relation(parent_key, solver_key,
"IK Chain Parent");
181 add_relation(solver_key, bone_done_key,
"IK Chain Result");
186 add_relation(solver_key, final_transforms_key,
"IK Solver Result");
195 if ((segcount ==
data->rootbone) || (segcount > 255)) {
198 parchan = parchan->
parent;
201 add_relation(solver_key, pose_done_key,
"PoseEval Result-Bone Link");
221 add_relation(init_ik_key, solver_key,
"Init IK -> IK Solver");
223 add_relation(solver_key, pose_cleanup_key,
"IK Solver -> Cleanup");
227 if (
data->tar !=
nullptr) {
229 add_relation(target_geometry_key, solver_key,
"Curve.Path -> Spline IK");
231 add_relation(target_transform_key, solver_key,
"Curve.Transform -> Spline IK");
237 add_relation(solver_key, final_transforms_key,
"Spline IK Result");
241 for (
bPoseChannel *parchan = pchan->
parent; parchan !=
nullptr && segcount < data->chainlen;
242 parchan = parchan->
parent, segcount++) {
248 add_relation(parent_key, solver_key,
"Spline IK Solver Update");
251 add_relation(solver_key, bone_done_key,
"Spline IK Solver Result");
253 root_map->
add_bone(parchan->name, rootchan->name);
256 add_relation(solver_key, pose_done_key,
"PoseEval Result-Bone Link");
268 const char *root_name = rootchan->
name;
275 deepest_root = parchan;
277 if (deepest_root ==
nullptr) {
283 add_relation(other_bone_key, solver_key,
"IK Chain Overlap");
298 add_relation(local_transform, pose_init_key,
"Local Transform -> Pose Init");
299 add_relation(pose_init_key, pose_init_ik_key,
"Pose Init -> Pose Init IK");
300 add_relation(pose_init_ik_key, pose_done_key,
"Pose Init IK -> Pose Cleanup");
304 add_relation(armature_key, pose_init_key,
"Data dependency");
306 add_relation(pose_init_key, pose_cleanup_key,
"Init -> Cleanup");
323 bool pose_depends_on_local_transform =
false;
333 pose_depends_on_local_transform =
true;
337 pose_depends_on_local_transform =
true;
346 pose_depends_on_local_transform =
true;
354 if (pose_depends_on_local_transform) {
359 add_relation(local_transform_key, pose_key,
"Local Transforms");
377 add_relation(bone_local_key, bone_pose_key,
"Bone Local - Bone Pose");
379 if (pchan->parent !=
nullptr) {
391 add_relation(parent_key, bone_pose_key,
"Parent Bone -> Child Bone");
394 if (pchan->constraints.first !=
nullptr) {
396 BuilderWalkUserData
data;
404 add_relation(bone_pose_key, constraints_key,
"Pose -> Constraints Stack");
405 add_relation(bone_local_key, constraints_key,
"Local -> Constraints Stack");
409 add_relation(constraints_key, bone_ready_key,
"Constraints -> Ready");
413 add_relation(bone_pose_key, bone_ready_key,
"Pose -> Ready");
419 add_relation(bone_ready_key, bone_done_key,
"Ready -> Done");
425 add_relation(bone_done_key, bone_segments_key,
"Done -> B-Bone Segments");
437 add_relation(prev_key, bone_segments_key,
"Prev Handle -> B-Bone Segments");
441 add_relation(next_key, bone_segments_key,
"Next Handle -> B-Bone Segments");
446 add_relation(bone_segments_key, pose_cleanup_key,
"Cleanup dependency");
451 add_relation(bone_done_key, pose_done_key,
"PoseEval Result-Bone Link");
454 add_relation(bone_done_key, pose_cleanup_key,
"Done -> Cleanup");
456 add_relation(bone_ready_key, pose_cleanup_key,
"Ready -> Cleanup");
459 if (pchan->custom !=
nullptr) {
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
@ BBONE_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.
ScopedEntry trace(const Args &...args)
bool isAnyPropertyAnimated(const PointerRNA *ptr)
DepsgraphBuilderCache * cache_
virtual bool check_pchan_has_bbone_segments(const Object *object, const bPoseChannel *pchan)
virtual bool check_pchan_has_bbone(const 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)
Relation * add_relation(const KeyFrom &key_from, const KeyTo &key_to, const char *description, int flags=0)
void add_visibility_relation(ID *id_from, ID *id_to)
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,...)
@ RELATION_CHECK_BEFORE_ADD
SymEdge< T > * prev(const SymEdge< T > *se)
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
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)