Blender V4.3
ikplugin_api.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BIK_api.h"
10
11#include "DNA_action_types.h"
12#include "DNA_object_types.h"
13#include "DNA_scene_types.h"
14
15#include "ikplugin_api.h"
16
17#ifdef WITH_IK_SOLVER
18# include "iksolver_plugin.h"
19#endif
20
21#ifdef WITH_IK_ITASC
22# include "itasc_plugin.h"
23#endif
24
26#ifdef WITH_IK_SOLVER
27 /* Legacy IK solver */
28 {
33 nullptr,
34 nullptr,
35 nullptr,
36 },
37#endif
38
39#ifdef WITH_IK_ITASC
40 /* iTaSC IK solver */
41 {
49 },
50#endif
51
52 {nullptr}};
53
54static IKPlugin *get_plugin(const bPose *pose)
55{
56 if (!pose || pose->iksolver < 0 || pose->iksolver >= (ARRAY_SIZE(ikplugin_tab) - 1)) {
57 return nullptr;
58 }
59
60 return &ikplugin_tab[pose->iksolver];
61}
62
63/*----------------------------------------*/
64/* Plugin API */
65
66void BIK_init_tree(Depsgraph *depsgraph, Scene *scene, Object *ob, float ctime)
67{
68 IKPlugin *plugin = get_plugin(ob->pose);
69
70 if (plugin && plugin->initialize_tree_func) {
71 plugin->initialize_tree_func(depsgraph, scene, ob, ctime);
72 }
73}
74
76 Depsgraph *depsgraph, Scene *scene, Object *ob, bPoseChannel *pchan, float ctime)
77{
78 IKPlugin *plugin = get_plugin(ob->pose);
79
80 if (plugin && plugin->execute_tree_func) {
81 plugin->execute_tree_func(depsgraph, scene, ob, pchan, ctime);
82 }
83}
84
85void BIK_release_tree(Scene *scene, Object *ob, float ctime)
86{
87 IKPlugin *plugin = get_plugin(ob->pose);
88
89 if (plugin && plugin->release_tree_func) {
90 plugin->release_tree_func(scene, ob, ctime);
91 }
92}
93
95{
96 IKPlugin *plugin = get_plugin(pose);
97
98 if (plugin && plugin->remove_armature_func) {
99 plugin->remove_armature_func(pose);
100 }
101}
102
104{
105 IKPlugin *plugin = get_plugin(pose);
106
107 if (plugin && plugin->clear_cache) {
108 plugin->clear_cache(pose);
109 }
110}
111
113{
114 IKPlugin *plugin = get_plugin(pose);
115
116 if (plugin && plugin->update_param) {
117 plugin->update_param(pose);
118 }
119}
120
122{
123 IKPlugin *plugin = get_plugin(ob->pose);
124
125 if (plugin && plugin->test_constraint) {
126 plugin->test_constraint(ob, cons);
127 }
128}
#define ARRAY_SIZE(arr)
Object is a sort of wrapper for general info.
const Depsgraph * depsgraph
void BIK_execute_tree(Depsgraph *depsgraph, Scene *scene, Object *ob, bPoseChannel *pchan, float ctime)
void BIK_clear_cache(bPose *pose)
static IKPlugin * get_plugin(const bPose *pose)
void BIK_clear_data(bPose *pose)
void BIK_init_tree(Depsgraph *depsgraph, Scene *scene, Object *ob, float ctime)
void BIK_update_param(bPose *pose)
void BIK_release_tree(Scene *scene, Object *ob, float ctime)
static IKPlugin ikplugin_tab[]
void BIK_test_constraint(Object *ob, bConstraint *cons)
void iksolver_release_tree(Scene *, Object *ob, float)
void iksolver_execute_tree(Depsgraph *depsgraph, Scene *scene, Object *ob, bPoseChannel *pchan_root, float ctime)
void iksolver_clear_data(bPose *pose)
void iksolver_initialize_tree(Depsgraph *, Scene *, Object *ob, float)
void itasc_clear_data(bPose *pose)
void itasc_update_param(bPose *pose)
void itasc_initialize_tree(Depsgraph *depsgraph, Scene *scene, Object *ob, float ctime)
void itasc_clear_cache(bPose *pose)
void itasc_execute_tree(Depsgraph *depsgraph, Scene *scene, Object *ob, bPoseChannel *pchan_root, float ctime)
void itasc_test_constraint(Object *, bConstraint *cons)
void itasc_release_tree(Scene *, Object *, float)
void(* clear_cache)(struct bPose *pose)
void(* remove_armature_func)(struct bPose *pose)
void(* initialize_tree_func)(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, float ctime)
void(* release_tree_func)(struct Scene *scene, struct Object *ob, float ctime)
void(* update_param)(struct bPose *pose)
void(* execute_tree_func)(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime)
void(* test_constraint)(struct Object *ob, struct bConstraint *cons)
struct bPose * pose