2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2009-01-07 04:06:52 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2009-01-07 04:06:52 +00:00
|
|
|
*/
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup RNA
|
2011-02-27 20:20:01 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
2009-01-07 04:06:52 +00:00
|
|
|
#include <stdlib.h>
|
2009-09-24 21:22:24 +00:00
|
|
|
#include <string.h>
|
2009-01-07 04:06:52 +00:00
|
|
|
|
|
|
|
#include "RNA_define.h"
|
2009-11-13 16:08:03 +00:00
|
|
|
#include "RNA_enum_types.h"
|
2009-01-07 04:06:52 +00:00
|
|
|
|
|
|
|
#include "rna_internal.h"
|
|
|
|
|
|
|
|
#include "DNA_action_types.h"
|
|
|
|
#include "DNA_armature_types.h"
|
|
|
|
#include "DNA_constraint_types.h"
|
2009-01-16 18:04:01 +00:00
|
|
|
#include "DNA_object_types.h"
|
2009-01-07 04:06:52 +00:00
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
|
2010-01-25 18:38:09 +00:00
|
|
|
#include "BLI_math.h"
|
|
|
|
|
2015-08-16 17:32:01 +10:00
|
|
|
#include "BLT_translation.h"
|
2013-03-25 08:29:06 +00:00
|
|
|
|
2016-05-19 03:25:00 +12:00
|
|
|
#include "UI_resources.h"
|
|
|
|
|
2009-03-02 01:22:02 +00:00
|
|
|
#include "WM_types.h"
|
|
|
|
|
2012-05-24 01:25:31 +00:00
|
|
|
/* Bone and Group Color Sets */
|
2017-10-18 15:07:26 +11:00
|
|
|
const EnumPropertyItem rna_enum_color_sets_items[] = {
|
2012-05-24 01:25:31 +00:00
|
|
|
{0, "DEFAULT", 0, "Default Colors", ""},
|
2018-09-20 18:07:58 +02:00
|
|
|
{1, "THEME01", ICON_COLORSET_01_VEC, "01 - Theme Color Set", ""},
|
|
|
|
{2, "THEME02", ICON_COLORSET_02_VEC, "02 - Theme Color Set", ""},
|
|
|
|
{3, "THEME03", ICON_COLORSET_03_VEC, "03 - Theme Color Set", ""},
|
|
|
|
{4, "THEME04", ICON_COLORSET_04_VEC, "04 - Theme Color Set", ""},
|
|
|
|
{5, "THEME05", ICON_COLORSET_05_VEC, "05 - Theme Color Set", ""},
|
|
|
|
{6, "THEME06", ICON_COLORSET_06_VEC, "06 - Theme Color Set", ""},
|
|
|
|
{7, "THEME07", ICON_COLORSET_07_VEC, "07 - Theme Color Set", ""},
|
|
|
|
{8, "THEME08", ICON_COLORSET_08_VEC, "08 - Theme Color Set", ""},
|
|
|
|
{9, "THEME09", ICON_COLORSET_09_VEC, "09 - Theme Color Set", ""},
|
|
|
|
{10, "THEME10", ICON_COLORSET_10_VEC, "10 - Theme Color Set", ""},
|
|
|
|
{11, "THEME11", ICON_COLORSET_11_VEC, "11 - Theme Color Set", ""},
|
|
|
|
{12, "THEME12", ICON_COLORSET_12_VEC, "12 - Theme Color Set", ""},
|
|
|
|
{13, "THEME13", ICON_COLORSET_13_VEC, "13 - Theme Color Set", ""},
|
|
|
|
{14, "THEME14", ICON_COLORSET_14_VEC, "14 - Theme Color Set", ""},
|
|
|
|
{15, "THEME15", ICON_COLORSET_15_VEC, "15 - Theme Color Set", ""},
|
|
|
|
{16, "THEME16", ICON_COLORSET_16_VEC, "16 - Theme Color Set", ""},
|
|
|
|
{17, "THEME17", ICON_COLORSET_17_VEC, "17 - Theme Color Set", ""},
|
|
|
|
{18, "THEME18", ICON_COLORSET_18_VEC, "18 - Theme Color Set", ""},
|
|
|
|
{19, "THEME19", ICON_COLORSET_19_VEC, "19 - Theme Color Set", ""},
|
|
|
|
{20, "THEME20", ICON_COLORSET_20_VEC, "20 - Theme Color Set", ""},
|
2012-05-24 01:25:31 +00:00
|
|
|
{-1, "CUSTOM", 0, "Custom Color Set", ""},
|
2019-02-03 14:01:45 +11:00
|
|
|
{0, NULL, 0, NULL, NULL},
|
2012-05-24 01:25:31 +00:00
|
|
|
};
|
|
|
|
|
2009-01-07 04:06:52 +00:00
|
|
|
#ifdef RNA_RUNTIME
|
|
|
|
|
2019-01-26 20:41:52 +11:00
|
|
|
#include "BLI_ghash.h"
|
|
|
|
#include "BLI_string_utils.h"
|
|
|
|
|
2009-09-24 21:22:24 +00:00
|
|
|
#include "BIK_api.h"
|
|
|
|
#include "BKE_action.h"
|
2009-09-28 12:20:56 +00:00
|
|
|
#include "BKE_armature.h"
|
2009-07-14 17:59:26 +00:00
|
|
|
|
2009-07-21 12:38:01 +00:00
|
|
|
#include "DNA_userdef_types.h"
|
|
|
|
|
2010-08-16 05:46:10 +00:00
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
2009-03-02 01:22:02 +00:00
|
|
|
#include "BKE_context.h"
|
2009-11-13 16:08:03 +00:00
|
|
|
#include "BKE_constraint.h"
|
2018-06-07 12:47:00 +02:00
|
|
|
#include "BKE_global.h"
|
2009-05-20 09:52:02 +00:00
|
|
|
#include "BKE_idprop.h"
|
2009-03-02 01:22:02 +00:00
|
|
|
|
2017-06-08 10:14:53 +02:00
|
|
|
#include "DEG_depsgraph.h"
|
|
|
|
#include "DEG_depsgraph_build.h"
|
|
|
|
|
2009-09-24 21:22:24 +00:00
|
|
|
#include "ED_object.h"
|
2009-07-14 17:59:26 +00:00
|
|
|
#include "ED_armature.h"
|
|
|
|
|
2010-08-24 06:40:28 +00:00
|
|
|
#include "WM_api.h"
|
|
|
|
|
2009-12-29 15:40:26 +00:00
|
|
|
#include "RNA_access.h"
|
|
|
|
|
2011-05-31 02:14:25 +00:00
|
|
|
static void rna_Pose_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
|
2009-03-02 01:22:02 +00:00
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
/* XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK); */
|
2009-07-14 17:59:26 +00:00
|
|
|
|
2018-12-06 17:52:37 +01:00
|
|
|
DEG_id_tag_update(ptr->id.data, ID_RECALC_GEOMETRY);
|
2018-04-23 13:01:11 +02:00
|
|
|
WM_main_add_notifier(NC_OBJECT | ND_POSE, ptr->id.data);
|
2009-03-02 01:22:02 +00:00
|
|
|
}
|
|
|
|
|
2018-08-09 17:17:40 +03:00
|
|
|
static void rna_Pose_dependency_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
|
|
|
|
{
|
|
|
|
DEG_relations_tag_update(bmain);
|
|
|
|
|
2018-12-06 17:52:37 +01:00
|
|
|
DEG_id_tag_update(ptr->id.data, ID_RECALC_GEOMETRY);
|
2018-08-09 17:17:40 +03:00
|
|
|
WM_main_add_notifier(NC_OBJECT | ND_POSE, ptr->id.data);
|
|
|
|
}
|
|
|
|
|
2011-05-31 02:14:25 +00:00
|
|
|
static void rna_Pose_IK_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
|
2009-09-24 21:22:24 +00:00
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
/* XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK); */
|
|
|
|
Object *ob = ptr->id.data;
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2018-12-06 17:52:37 +01:00
|
|
|
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
|
2018-05-04 17:30:49 +02:00
|
|
|
WM_main_add_notifier(NC_OBJECT | ND_POSE, ptr->id.data);
|
|
|
|
|
2009-09-24 21:22:24 +00:00
|
|
|
BIK_clear_data(ob->pose);
|
2009-03-02 01:22:02 +00:00
|
|
|
}
|
|
|
|
|
2009-11-18 11:40:55 +00:00
|
|
|
static char *rna_PoseBone_path(PointerRNA *ptr)
|
2009-08-02 12:52:02 +00:00
|
|
|
{
|
2013-04-23 20:10:22 +00:00
|
|
|
bPoseChannel *pchan = ptr->data;
|
|
|
|
char name_esc[sizeof(pchan->name) * 2];
|
|
|
|
|
|
|
|
BLI_strescape(name_esc, pchan->name, sizeof(name_esc));
|
|
|
|
return BLI_sprintfN("pose.bones[\"%s\"]", name_esc);
|
2009-08-02 12:52:02 +00:00
|
|
|
}
|
|
|
|
|
2014-07-09 10:27:31 +02:00
|
|
|
/* Bone groups only. */
|
|
|
|
|
|
|
|
static bActionGroup *rna_bone_group_new(ID *id, bPose *pose, const char *name)
|
|
|
|
{
|
|
|
|
bActionGroup *grp = BKE_pose_add_group(pose, name);
|
|
|
|
WM_main_add_notifier(NC_OBJECT | ND_POSE | NA_ADDED, id);
|
|
|
|
return grp;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_bone_group_remove(ID *id, bPose *pose, ReportList *reports, PointerRNA *grp_ptr)
|
|
|
|
{
|
|
|
|
bActionGroup *grp = grp_ptr->data;
|
|
|
|
const int grp_idx = BLI_findindex(&pose->agroups, grp);
|
|
|
|
|
|
|
|
if (grp_idx == -1) {
|
|
|
|
BKE_reportf(reports, RPT_ERROR, "Bone group '%s' not found in this object", grp->name);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
BKE_pose_remove_group(pose, grp, grp_idx + 1);
|
|
|
|
WM_main_add_notifier(NC_OBJECT | ND_POSE | NA_REMOVED, id);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-05-24 01:25:31 +00:00
|
|
|
/* shared for actions groups and bone groups */
|
2014-07-09 10:27:31 +02:00
|
|
|
|
2012-05-24 01:25:31 +00:00
|
|
|
void rna_ActionGroup_colorset_set(PointerRNA *ptr, int value)
|
2009-07-21 12:38:01 +00:00
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
bActionGroup *grp = ptr->data;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-06-01 13:54:44 +00:00
|
|
|
/* ensure only valid values get set */
|
|
|
|
if ((value >= -1) && (value < 21)) {
|
2012-03-05 23:30:41 +00:00
|
|
|
grp->customCol = value;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-06-01 13:54:44 +00:00
|
|
|
/* sync colors stored with theme colors based on the index specified */
|
2012-07-03 01:15:03 +00:00
|
|
|
action_group_colors_sync(grp, NULL);
|
2009-07-21 12:38:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-05 22:25:34 +02:00
|
|
|
bool rna_ActionGroup_is_custom_colorset_get(PointerRNA *ptr)
|
2014-10-15 13:52:43 +02:00
|
|
|
{
|
|
|
|
bActionGroup *grp = ptr->data;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2015-02-20 19:54:28 +11:00
|
|
|
return (grp->customCol < 0);
|
2014-10-15 13:52:43 +02:00
|
|
|
}
|
|
|
|
|
2012-09-22 14:07:55 +00:00
|
|
|
static void rna_BoneGroup_name_set(PointerRNA *ptr, const char *value)
|
2011-10-15 11:07:18 +00:00
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
Object *ob = ptr->id.data;
|
|
|
|
bActionGroup *agrp = ptr->data;
|
2011-10-15 11:07:18 +00:00
|
|
|
|
|
|
|
/* copy the new name into the name slot */
|
|
|
|
BLI_strncpy_utf8(agrp->name, value, sizeof(agrp->name));
|
|
|
|
|
2015-08-16 17:32:01 +10:00
|
|
|
BLI_uniquename(&ob->pose->agroups, agrp, CTX_DATA_(BLT_I18NCONTEXT_ID_ARMATURE, "Group"), '.',
|
2013-03-25 08:29:06 +00:00
|
|
|
offsetof(bActionGroup, name), sizeof(agrp->name));
|
2011-10-15 11:07:18 +00:00
|
|
|
}
|
|
|
|
|
2013-03-07 02:44:55 +00:00
|
|
|
static IDProperty *rna_PoseBone_idprops(PointerRNA *ptr, bool create)
|
2009-05-20 09:52:02 +00:00
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
bPoseChannel *pchan = ptr->data;
|
2009-05-20 09:52:02 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
if (create && !pchan->prop) {
|
2009-05-20 09:52:02 +00:00
|
|
|
IDPropertyTemplate val = {0};
|
2012-03-05 23:30:41 +00:00
|
|
|
pchan->prop = IDP_New(IDP_GROUP, &val, "RNA_PoseBone group");
|
2009-05-20 09:52:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return pchan->prop;
|
|
|
|
}
|
|
|
|
|
2009-09-24 21:22:24 +00:00
|
|
|
static void rna_Pose_ik_solver_set(struct PointerRNA *ptr, int value)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
2009-09-24 21:22:24 +00:00
|
|
|
|
|
|
|
if (pose->iksolver != value) {
|
2012-03-05 23:30:41 +00:00
|
|
|
/* the solver has changed, must clean any temporary structures */
|
2009-09-24 21:22:24 +00:00
|
|
|
BIK_clear_data(pose);
|
|
|
|
if (pose->ikparam) {
|
|
|
|
MEM_freeN(pose->ikparam);
|
|
|
|
pose->ikparam = NULL;
|
|
|
|
}
|
|
|
|
pose->iksolver = value;
|
2012-05-05 16:03:57 +00:00
|
|
|
BKE_pose_ikparam_init(pose);
|
2009-09-24 21:22:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-21 19:33:04 +00:00
|
|
|
static void rna_Pose_ik_solver_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
|
2009-09-24 21:22:24 +00:00
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
Object *ob = ptr->id.data;
|
2009-09-24 21:22:24 +00:00
|
|
|
bPose *pose = ptr->data;
|
|
|
|
|
2015-05-12 13:13:36 +05:00
|
|
|
BKE_pose_tag_recalc(bmain, pose); /* checks & sorts pose channels */
|
2017-06-08 10:14:53 +02:00
|
|
|
DEG_relations_tag_update(bmain);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-05-05 16:03:57 +00:00
|
|
|
BKE_pose_update_constraint_flags(pose);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2018-05-31 12:27:47 +02:00
|
|
|
object_test_constraints(bmain, ob);
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2018-12-06 17:52:37 +01:00
|
|
|
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY | ID_RECALC_TRANSFORM);
|
2009-09-24 21:22:24 +00:00
|
|
|
}
|
|
|
|
|
2009-10-08 00:57:00 +00:00
|
|
|
/* rotation - axis-angle */
|
|
|
|
static void rna_PoseChannel_rotation_axis_angle_get(PointerRNA *ptr, float *value)
|
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
bPoseChannel *pchan = ptr->data;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-10-08 00:57:00 +00:00
|
|
|
/* for now, assume that rotation mode is axis-angle */
|
2012-03-05 23:30:41 +00:00
|
|
|
value[0] = pchan->rotAngle;
|
2009-11-10 20:43:45 +00:00
|
|
|
copy_v3_v3(&value[1], pchan->rotAxis);
|
2009-10-08 00:57:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* rotation - axis-angle */
|
|
|
|
static void rna_PoseChannel_rotation_axis_angle_set(PointerRNA *ptr, const float *value)
|
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
bPoseChannel *pchan = ptr->data;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-10-08 00:57:00 +00:00
|
|
|
/* for now, assume that rotation mode is axis-angle */
|
2012-03-05 23:30:41 +00:00
|
|
|
pchan->rotAngle = value[0];
|
2015-01-01 23:26:03 +11:00
|
|
|
copy_v3_v3(pchan->rotAxis, &value[1]);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
/* TODO: validate axis? */
|
2009-10-08 00:57:00 +00:00
|
|
|
}
|
|
|
|
|
2009-09-06 23:15:43 +00:00
|
|
|
static void rna_PoseChannel_rotation_mode_set(PointerRNA *ptr, int value)
|
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
bPoseChannel *pchan = ptr->data;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-09-28 10:19:20 +00:00
|
|
|
/* use API Method for conversions... */
|
2012-03-18 09:27:36 +00:00
|
|
|
BKE_rotMode_change_values(pchan->quat, pchan->eul, pchan->rotAxis, &pchan->rotAngle,
|
|
|
|
pchan->rotmode, (short)value);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-09-06 23:15:43 +00:00
|
|
|
/* finally, set the new rotation type */
|
2012-03-05 23:30:41 +00:00
|
|
|
pchan->rotmode = value;
|
2009-09-06 23:15:43 +00:00
|
|
|
}
|
|
|
|
|
2009-07-14 17:59:26 +00:00
|
|
|
static void rna_PoseChannel_name_set(PointerRNA *ptr, const char *value)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
Object *ob = (Object *)ptr->id.data;
|
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2010-04-04 14:33:41 +00:00
|
|
|
char oldname[sizeof(pchan->name)], newname[sizeof(pchan->name)];
|
|
|
|
|
2009-07-14 17:59:26 +00:00
|
|
|
/* need to be on the stack */
|
2011-09-15 12:26:48 +00:00
|
|
|
BLI_strncpy_utf8(newname, value, sizeof(pchan->name));
|
2010-04-04 14:33:41 +00:00
|
|
|
BLI_strncpy(oldname, pchan->name, sizeof(pchan->name));
|
|
|
|
|
2018-11-09 10:44:02 -02:00
|
|
|
BLI_assert(BKE_id_is_in_global_main(&ob->id));
|
|
|
|
BLI_assert(BKE_id_is_in_global_main(ob->data));
|
2018-06-22 12:35:41 +02:00
|
|
|
ED_armature_bone_rename(G_MAIN, ob->data, oldname, newname);
|
2009-07-14 17:59:26 +00:00
|
|
|
}
|
|
|
|
|
2018-07-05 22:25:34 +02:00
|
|
|
static bool rna_PoseChannel_has_ik_get(PointerRNA *ptr)
|
2009-07-14 22:11:25 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
Object *ob = (Object *)ptr->id.data;
|
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2009-07-14 22:11:25 +00:00
|
|
|
|
2013-09-13 03:03:46 +00:00
|
|
|
return BKE_pose_channel_in_IK_chain(ob, pchan);
|
2009-07-14 22:11:25 +00:00
|
|
|
}
|
|
|
|
|
2012-09-22 14:07:55 +00:00
|
|
|
static StructRNA *rna_IKParam_refine(PointerRNA *ptr)
|
2009-09-24 21:22:24 +00:00
|
|
|
{
|
|
|
|
bIKParam *param = (bIKParam *)ptr->data;
|
|
|
|
|
|
|
|
switch (param->iksolver) {
|
2012-05-12 11:01:29 +00:00
|
|
|
case IKSOLVER_ITASC:
|
|
|
|
return &RNA_Itasc;
|
|
|
|
default:
|
|
|
|
return &RNA_IKParam;
|
2009-09-24 21:22:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-22 14:07:55 +00:00
|
|
|
static PointerRNA rna_Pose_ikparam_get(struct PointerRNA *ptr)
|
2009-09-24 21:22:24 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
2009-09-24 21:22:24 +00:00
|
|
|
return rna_pointer_inherit_refine(ptr, &RNA_IKParam, pose->ikparam);
|
|
|
|
}
|
|
|
|
|
|
|
|
static StructRNA *rna_Pose_ikparam_typef(PointerRNA *ptr)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
2009-09-24 21:22:24 +00:00
|
|
|
|
|
|
|
switch (pose->iksolver) {
|
2012-05-12 11:01:29 +00:00
|
|
|
case IKSOLVER_ITASC:
|
|
|
|
return &RNA_Itasc;
|
|
|
|
default:
|
|
|
|
return &RNA_IKParam;
|
2009-09-24 21:22:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-31 02:14:25 +00:00
|
|
|
static void rna_Itasc_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
|
2009-09-24 21:22:24 +00:00
|
|
|
{
|
|
|
|
Object *ob = ptr->id.data;
|
|
|
|
bItasc *itasc = ptr->data;
|
|
|
|
|
|
|
|
/* verify values */
|
|
|
|
if (itasc->precision < 0.0001f)
|
|
|
|
itasc->precision = 0.0001f;
|
|
|
|
if (itasc->minstep < 0.001f)
|
|
|
|
itasc->minstep = 0.001f;
|
|
|
|
if (itasc->maxstep < itasc->minstep)
|
|
|
|
itasc->maxstep = itasc->minstep;
|
|
|
|
if (itasc->feedback < 0.01f)
|
|
|
|
itasc->feedback = 0.01f;
|
|
|
|
if (itasc->feedback > 100.f)
|
|
|
|
itasc->feedback = 100.f;
|
|
|
|
if (itasc->maxvel < 0.01f)
|
|
|
|
itasc->maxvel = 0.01f;
|
|
|
|
if (itasc->maxvel > 100.f)
|
|
|
|
itasc->maxvel = 100.f;
|
|
|
|
BIK_update_param(ob->pose);
|
|
|
|
|
2018-12-06 17:52:37 +01:00
|
|
|
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
|
2009-09-24 21:22:24 +00:00
|
|
|
}
|
|
|
|
|
2009-12-08 17:23:48 +00:00
|
|
|
static void rna_Itasc_update_rebuild(Main *bmain, Scene *scene, PointerRNA *ptr)
|
2009-09-24 21:22:24 +00:00
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
Object *ob = ptr->id.data;
|
2009-09-24 21:22:24 +00:00
|
|
|
bPose *pose = ob->pose;
|
|
|
|
|
2015-05-12 13:13:36 +05:00
|
|
|
BKE_pose_tag_recalc(bmain, pose); /* checks & sorts pose channels */
|
2009-12-08 17:23:48 +00:00
|
|
|
rna_Itasc_update(bmain, scene, ptr);
|
2009-09-24 21:22:24 +00:00
|
|
|
}
|
|
|
|
|
2010-12-22 16:33:13 +00:00
|
|
|
static void rna_PoseChannel_bone_custom_set(PointerRNA *ptr, PointerRNA value)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2010-12-22 16:33:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
if (pchan->custom) {
|
|
|
|
id_us_min(&pchan->custom->id);
|
|
|
|
pchan->custom = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pchan->custom = value.data;
|
|
|
|
|
|
|
|
id_us_plus(&pchan->custom->id);
|
|
|
|
}
|
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
static PointerRNA rna_PoseChannel_bone_group_get(PointerRNA *ptr)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
Object *ob = (Object *)ptr->id.data;
|
2012-03-05 23:30:41 +00:00
|
|
|
bPose *pose = (ob) ? ob->pose : NULL;
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2009-08-23 12:53:55 +00:00
|
|
|
bActionGroup *grp;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
if (pose)
|
2012-05-12 11:01:29 +00:00
|
|
|
grp = BLI_findlink(&pose->agroups, pchan->agrp_index - 1);
|
2009-08-23 12:53:55 +00:00
|
|
|
else
|
2012-03-05 23:30:41 +00:00
|
|
|
grp = NULL;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
return rna_pointer_inherit_refine(ptr, &RNA_BoneGroup, grp);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_PoseChannel_bone_group_set(PointerRNA *ptr, PointerRNA value)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
Object *ob = (Object *)ptr->id.data;
|
2012-03-05 23:30:41 +00:00
|
|
|
bPose *pose = (ob) ? ob->pose : NULL;
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
if (pose)
|
2012-03-05 23:30:41 +00:00
|
|
|
pchan->agrp_index = BLI_findindex(&pose->agroups, value.data) + 1;
|
2009-08-23 12:53:55 +00:00
|
|
|
else
|
2012-03-05 23:30:41 +00:00
|
|
|
pchan->agrp_index = 0;
|
2009-08-23 12:53:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int rna_PoseChannel_bone_group_index_get(PointerRNA *ptr)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
|
|
|
return MAX2(pchan->agrp_index - 1, 0);
|
2009-08-23 12:53:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_PoseChannel_bone_group_index_set(PointerRNA *ptr, int value)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
|
|
|
pchan->agrp_index = value + 1;
|
2009-08-23 12:53:55 +00:00
|
|
|
}
|
|
|
|
|
2013-09-20 06:35:28 +00:00
|
|
|
static void rna_PoseChannel_bone_group_index_range(PointerRNA *ptr, int *min, int *max,
|
|
|
|
int *UNUSED(softmin), int *UNUSED(softmax))
|
2009-08-23 12:53:55 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
Object *ob = (Object *)ptr->id.data;
|
2012-03-05 23:30:41 +00:00
|
|
|
bPose *pose = (ob) ? ob->pose : NULL;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
*min = 0;
|
2014-11-16 13:57:58 +01:00
|
|
|
*max = pose ? max_ii(0, BLI_listbase_count(&pose->agroups) - 1) : 0;
|
2009-08-23 12:53:55 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 10:18:08 +00:00
|
|
|
static PointerRNA rna_Pose_active_bone_group_get(PointerRNA *ptr)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
|
|
|
return rna_pointer_inherit_refine(ptr, &RNA_BoneGroup, BLI_findlink(&pose->agroups, pose->active_group - 1));
|
2009-07-21 10:18:08 +00:00
|
|
|
}
|
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
static void rna_Pose_active_bone_group_set(PointerRNA *ptr, PointerRNA value)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
2012-03-05 23:30:41 +00:00
|
|
|
pose->active_group = BLI_findindex(&pose->agroups, value.data) + 1;
|
2009-08-23 12:53:55 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 10:18:08 +00:00
|
|
|
static int rna_Pose_active_bone_group_index_get(PointerRNA *ptr)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
|
|
|
return MAX2(pose->active_group - 1, 0);
|
2009-07-21 10:18:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_Pose_active_bone_group_index_set(PointerRNA *ptr, int value)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
|
|
|
pose->active_group = value + 1;
|
2009-07-21 10:18:08 +00:00
|
|
|
}
|
|
|
|
|
2013-09-20 06:35:28 +00:00
|
|
|
static void rna_Pose_active_bone_group_index_range(PointerRNA *ptr, int *min, int *max,
|
|
|
|
int *UNUSED(softmin), int *UNUSED(softmax))
|
2009-07-21 10:18:08 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
2009-07-21 10:18:08 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
*min = 0;
|
2014-11-16 13:57:58 +01:00
|
|
|
*max = max_ii(0, BLI_listbase_count(&pose->agroups) - 1);
|
2009-07-21 10:18:08 +00:00
|
|
|
}
|
|
|
|
|
2009-09-17 14:46:22 +00:00
|
|
|
#if 0
|
2009-09-14 16:52:06 +00:00
|
|
|
static void rna_pose_bgroup_name_index_get(PointerRNA *ptr, char *value, int index)
|
2009-07-21 10:18:08 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
2009-07-21 10:18:08 +00:00
|
|
|
bActionGroup *grp;
|
|
|
|
|
2012-05-12 11:01:29 +00:00
|
|
|
grp = BLI_findlink(&pose->agroups, index - 1);
|
2009-07-21 10:18:08 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
if (grp) BLI_strncpy(value, grp->name, sizeof(grp->name));
|
|
|
|
else value[0] = '\0';
|
2009-07-21 10:18:08 +00:00
|
|
|
}
|
|
|
|
|
2009-09-14 16:52:06 +00:00
|
|
|
static int rna_pose_bgroup_name_index_length(PointerRNA *ptr, int index)
|
2009-07-21 10:18:08 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
2009-07-21 10:18:08 +00:00
|
|
|
bActionGroup *grp;
|
|
|
|
|
2012-05-12 11:01:29 +00:00
|
|
|
grp = BLI_findlink(&pose->agroups, index - 1);
|
|
|
|
return (grp) ? strlen(grp->name) : 0;
|
2009-07-21 10:18:08 +00:00
|
|
|
}
|
|
|
|
|
2009-09-14 16:52:06 +00:00
|
|
|
static void rna_pose_bgroup_name_index_set(PointerRNA *ptr, const char *value, short *index)
|
2009-07-21 10:18:08 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
2009-07-21 10:18:08 +00:00
|
|
|
bActionGroup *grp;
|
|
|
|
int a;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
for (a = 1, grp = pose->agroups.first; grp; grp = grp->next, a++) {
|
2013-03-10 06:18:03 +00:00
|
|
|
if (STREQ(grp->name, value)) {
|
2012-03-05 23:30:41 +00:00
|
|
|
*index = a;
|
2009-07-21 10:18:08 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
*index = 0;
|
2009-07-21 10:18:08 +00:00
|
|
|
}
|
|
|
|
|
2009-09-14 16:52:06 +00:00
|
|
|
static void rna_pose_pgroup_name_set(PointerRNA *ptr, const char *value, char *result, int maxlen)
|
2009-07-21 10:18:08 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
2009-07-21 10:18:08 +00:00
|
|
|
bActionGroup *grp;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
for (grp = pose->agroups.first; grp; grp = grp->next) {
|
2013-03-10 06:18:03 +00:00
|
|
|
if (STREQ(grp->name, value)) {
|
2009-07-21 10:18:08 +00:00
|
|
|
BLI_strncpy(result, value, maxlen);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
result[0] = '\0';
|
2009-07-21 10:18:08 +00:00
|
|
|
}
|
2009-09-17 14:46:22 +00:00
|
|
|
#endif
|
2009-07-21 10:18:08 +00:00
|
|
|
|
2009-11-11 19:58:30 +00:00
|
|
|
static PointerRNA rna_PoseChannel_active_constraint_get(PointerRNA *ptr)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2014-04-11 11:47:07 +10:00
|
|
|
bConstraint *con = BKE_constraints_active_get(&pchan->constraints);
|
2009-11-11 19:58:30 +00:00
|
|
|
return rna_pointer_inherit_refine(ptr, &RNA_Constraint, con);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_PoseChannel_active_constraint_set(PointerRNA *ptr, PointerRNA value)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2014-04-11 11:47:07 +10:00
|
|
|
BKE_constraints_active_set(&pchan->constraints, (bConstraint *)value.data);
|
2009-11-11 19:58:30 +00:00
|
|
|
}
|
|
|
|
|
2017-02-25 11:27:11 +01:00
|
|
|
static bConstraint *rna_PoseChannel_constraints_new(ID *id, bPoseChannel *pchan, Main *main, int type)
|
2009-11-13 16:08:03 +00:00
|
|
|
{
|
2017-02-25 11:27:11 +01:00
|
|
|
Object *ob = (Object *)id;
|
|
|
|
bConstraint *new_con = BKE_constraint_add_for_pose(ob, pchan, NULL, type);
|
|
|
|
|
|
|
|
ED_object_constraint_dependency_tag_update(main, ob, new_con);
|
|
|
|
WM_main_add_notifier(NC_OBJECT | ND_CONSTRAINT | NA_ADDED, id);
|
|
|
|
|
|
|
|
return new_con;
|
2009-11-13 16:08:03 +00:00
|
|
|
}
|
|
|
|
|
2018-05-31 12:27:47 +02:00
|
|
|
static void rna_PoseChannel_constraints_remove(
|
|
|
|
ID *id, bPoseChannel *pchan, Main *bmain, ReportList *reports, PointerRNA *con_ptr)
|
2009-11-13 16:08:03 +00:00
|
|
|
{
|
2012-11-02 09:41:26 +00:00
|
|
|
bConstraint *con = con_ptr->data;
|
2016-04-12 11:26:06 +10:00
|
|
|
const bool is_ik = ELEM(con->type, CONSTRAINT_TYPE_KINEMATIC, CONSTRAINT_TYPE_SPLINEIK);
|
2012-11-02 09:41:26 +00:00
|
|
|
Object *ob = (Object *)id;
|
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
if (BLI_findindex(&pchan->constraints, con) == -1) {
|
2011-09-19 13:23:58 +00:00
|
|
|
BKE_reportf(reports, RPT_ERROR, "Constraint '%s' not found in pose bone '%s'", con->name, pchan->name);
|
2010-08-24 06:40:28 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-04-11 11:47:07 +10:00
|
|
|
BKE_constraint_remove(&pchan->constraints, con);
|
2012-11-02 09:41:26 +00:00
|
|
|
RNA_POINTER_INVALIDATE(con_ptr);
|
2011-05-04 05:52:14 +00:00
|
|
|
|
2018-05-31 12:27:47 +02:00
|
|
|
ED_object_constraint_update(bmain, ob);
|
2012-11-02 09:41:26 +00:00
|
|
|
|
2014-04-11 11:47:07 +10:00
|
|
|
BKE_constraints_active_set(&pchan->constraints, NULL); /* XXX, is this really needed? - Campbell */
|
2012-11-02 09:41:26 +00:00
|
|
|
|
|
|
|
WM_main_add_notifier(NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, id);
|
|
|
|
|
|
|
|
if (is_ik) {
|
|
|
|
BIK_clear_data(ob->pose);
|
2011-05-04 05:52:14 +00:00
|
|
|
}
|
2009-11-13 16:08:03 +00:00
|
|
|
}
|
|
|
|
|
2018-05-02 18:13:15 +02:00
|
|
|
bool rna_PoseChannel_constraints_override_apply(
|
2018-06-29 12:46:54 +02:00
|
|
|
Main *UNUSED(bmain),
|
2018-05-02 18:13:15 +02:00
|
|
|
PointerRNA *ptr_dst, PointerRNA *ptr_src, PointerRNA *UNUSED(ptr_storage),
|
|
|
|
PropertyRNA *UNUSED(prop_dst), PropertyRNA *UNUSED(prop_src), PropertyRNA *UNUSED(prop_storage),
|
|
|
|
const int UNUSED(len_dst), const int UNUSED(len_src), const int UNUSED(len_storage),
|
2018-06-28 14:23:00 +02:00
|
|
|
PointerRNA *UNUSED(ptr_item_dst), PointerRNA *UNUSED(ptr_item_src), PointerRNA *UNUSED(ptr_item_storage),
|
2018-05-02 18:13:15 +02:00
|
|
|
IDOverrideStaticPropertyOperation *opop)
|
|
|
|
{
|
|
|
|
BLI_assert(opop->operation == IDOVERRIDESTATIC_OP_INSERT_AFTER &&
|
|
|
|
"Unsupported RNA override operation on constraints collection");
|
|
|
|
|
|
|
|
bPoseChannel *pchan_dst = (bPoseChannel *)ptr_dst->data;
|
|
|
|
bPoseChannel *pchan_src = (bPoseChannel *)ptr_src->data;
|
|
|
|
|
|
|
|
/* Remember that insertion operations are defined and stored in correct order, which means that
|
|
|
|
* even if we insert several items in a row, we alays insert first one, then second one, etc.
|
|
|
|
* So we should always find 'anchor' constraint in both _src *and* _dst> */
|
|
|
|
bConstraint *con_anchor = NULL;
|
|
|
|
if (opop->subitem_local_name && opop->subitem_local_name[0]) {
|
|
|
|
con_anchor = BLI_findstring(&pchan_dst->constraints, opop->subitem_local_name, offsetof(bConstraint, name));
|
|
|
|
}
|
|
|
|
if (con_anchor == NULL && opop->subitem_local_index >= 0) {
|
|
|
|
con_anchor = BLI_findlink(&pchan_dst->constraints, opop->subitem_local_index);
|
|
|
|
}
|
|
|
|
/* Otherwise we just insert in first position. */
|
|
|
|
|
|
|
|
bConstraint *con_src = NULL;
|
|
|
|
if (opop->subitem_local_name && opop->subitem_local_name[0]) {
|
|
|
|
con_src = BLI_findstring(&pchan_src->constraints, opop->subitem_local_name, offsetof(bConstraint, name));
|
|
|
|
}
|
|
|
|
if (con_src == NULL && opop->subitem_local_index >= 0) {
|
|
|
|
con_src = BLI_findlink(&pchan_src->constraints, opop->subitem_local_index);
|
|
|
|
}
|
|
|
|
con_src = con_src ? con_src->next : pchan_src->constraints.first;
|
|
|
|
|
|
|
|
BLI_assert(con_src != NULL);
|
|
|
|
|
|
|
|
bConstraint *con_dst = BKE_constraint_duplicate_ex(con_src, 0, true);
|
|
|
|
|
|
|
|
/* This handles NULL anchor as expected by adding at head of list. */
|
|
|
|
BLI_insertlinkafter(&pchan_dst->constraints, con_anchor, con_dst);
|
|
|
|
|
|
|
|
/* This should actually *not* be needed in typical cases. However, if overridden source was edited,
|
|
|
|
* we *may* have some new conflicting names. */
|
|
|
|
BKE_constraint_unique_name(con_dst, &pchan_dst->constraints);
|
|
|
|
|
|
|
|
// printf("%s: We inserted a constraint...\n", __func__);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-09-22 00:10:53 +02:00
|
|
|
static int rna_PoseChannel_proxy_editable(PointerRNA *ptr, const char **r_info)
|
2009-11-25 12:00:31 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
Object *ob = (Object *)ptr->id.data;
|
2012-03-05 23:30:41 +00:00
|
|
|
bArmature *arm = ob->data;
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2016-09-22 00:10:53 +02:00
|
|
|
if (ob->proxy && pchan->bone && (pchan->bone->layer & arm->layer_protected)) {
|
|
|
|
*r_info = "Can't edit property of a proxy on a protected layer";
|
|
|
|
return 0;
|
|
|
|
}
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2016-09-22 00:10:53 +02:00
|
|
|
return PROP_EDITABLE;
|
2010-01-12 17:08:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int rna_PoseChannel_location_editable(PointerRNA *ptr, int index)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2010-01-12 17:08:28 +00:00
|
|
|
|
2009-11-25 12:00:31 +00:00
|
|
|
/* only if the axis in question is locked, not editable... */
|
|
|
|
if ((index == 0) && (pchan->protectflag & OB_LOCK_LOCX))
|
|
|
|
return 0;
|
|
|
|
else if ((index == 1) && (pchan->protectflag & OB_LOCK_LOCY))
|
|
|
|
return 0;
|
|
|
|
else if ((index == 2) && (pchan->protectflag & OB_LOCK_LOCZ))
|
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return PROP_EDITABLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int rna_PoseChannel_scale_editable(PointerRNA *ptr, int index)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-11-25 12:00:31 +00:00
|
|
|
/* only if the axis in question is locked, not editable... */
|
|
|
|
if ((index == 0) && (pchan->protectflag & OB_LOCK_SCALEX))
|
|
|
|
return 0;
|
|
|
|
else if ((index == 1) && (pchan->protectflag & OB_LOCK_SCALEY))
|
|
|
|
return 0;
|
|
|
|
else if ((index == 2) && (pchan->protectflag & OB_LOCK_SCALEZ))
|
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return PROP_EDITABLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int rna_PoseChannel_rotation_euler_editable(PointerRNA *ptr, int index)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-11-25 12:00:31 +00:00
|
|
|
/* only if the axis in question is locked, not editable... */
|
|
|
|
if ((index == 0) && (pchan->protectflag & OB_LOCK_ROTX))
|
|
|
|
return 0;
|
|
|
|
else if ((index == 1) && (pchan->protectflag & OB_LOCK_ROTY))
|
|
|
|
return 0;
|
|
|
|
else if ((index == 2) && (pchan->protectflag & OB_LOCK_ROTZ))
|
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return PROP_EDITABLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int rna_PoseChannel_rotation_4d_editable(PointerRNA *ptr, int index)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-11-25 12:00:31 +00:00
|
|
|
/* only consider locks if locking components individually... */
|
|
|
|
if (pchan->protectflag & OB_LOCK_ROT4D) {
|
|
|
|
/* only if the axis in question is locked, not editable... */
|
|
|
|
if ((index == 0) && (pchan->protectflag & OB_LOCK_ROTW))
|
|
|
|
return 0;
|
|
|
|
else if ((index == 1) && (pchan->protectflag & OB_LOCK_ROTX))
|
|
|
|
return 0;
|
|
|
|
else if ((index == 2) && (pchan->protectflag & OB_LOCK_ROTY))
|
|
|
|
return 0;
|
|
|
|
else if ((index == 3) && (pchan->protectflag & OB_LOCK_ROTZ))
|
|
|
|
return 0;
|
|
|
|
}
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-11-25 12:00:31 +00:00
|
|
|
return PROP_EDITABLE;
|
|
|
|
}
|
|
|
|
|
2009-12-29 15:40:26 +00:00
|
|
|
/* not essential, but much faster then the default lookup function */
|
2012-09-22 14:07:55 +00:00
|
|
|
static int rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
|
2009-12-29 15:40:26 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPose *pose = (bPose *)ptr->data;
|
2012-05-05 16:03:57 +00:00
|
|
|
bPoseChannel *pchan = BKE_pose_channel_find_name(pose, key);
|
2012-03-05 23:30:41 +00:00
|
|
|
if (pchan) {
|
2011-01-05 14:49:08 +00:00
|
|
|
RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, r_ptr);
|
2014-04-01 11:34:00 +11:00
|
|
|
return true;
|
2011-01-05 14:49:08 +00:00
|
|
|
}
|
|
|
|
else {
|
2014-04-01 11:34:00 +11:00
|
|
|
return false;
|
2011-01-05 14:49:08 +00:00
|
|
|
}
|
2009-12-29 15:40:26 +00:00
|
|
|
}
|
|
|
|
|
2010-11-15 06:38:07 +00:00
|
|
|
static void rna_PoseChannel_matrix_basis_get(PointerRNA *ptr, float *values)
|
2010-03-31 20:39:08 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2012-05-05 16:03:57 +00:00
|
|
|
BKE_pchan_to_mat4(pchan, (float (*)[4])values);
|
2010-03-31 20:39:08 +00:00
|
|
|
}
|
|
|
|
|
2010-11-15 06:38:07 +00:00
|
|
|
static void rna_PoseChannel_matrix_basis_set(PointerRNA *ptr, const float *values)
|
2010-03-31 20:39:08 +00:00
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
2014-04-01 11:34:00 +11:00
|
|
|
BKE_pchan_apply_mat4(pchan, (float (*)[4])values, false); /* no compat for predictable result */
|
2010-03-31 20:39:08 +00:00
|
|
|
}
|
|
|
|
|
2011-07-07 16:09:57 +00:00
|
|
|
static void rna_PoseChannel_matrix_set(PointerRNA *ptr, const float *values)
|
|
|
|
{
|
2012-05-12 11:01:29 +00:00
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
|
|
|
Object *ob = (Object *)ptr->id.data;
|
2011-07-07 16:09:57 +00:00
|
|
|
float tmat[4][4];
|
|
|
|
|
2017-07-21 11:53:13 +02:00
|
|
|
BKE_armature_mat_pose_to_bone_ex(NULL, ob, pchan, (float (*)[4])values, tmat);
|
2011-07-07 16:09:57 +00:00
|
|
|
|
2014-04-01 11:34:00 +11:00
|
|
|
BKE_pchan_apply_mat4(pchan, tmat, false); /* no compat for predictable result */
|
2011-07-07 16:09:57 +00:00
|
|
|
}
|
|
|
|
|
2018-10-05 19:46:51 +02:00
|
|
|
static bPoseChannel *rna_PoseChannel_ensure_own_pchan(Object *ob, Object *ref_ob, bPoseChannel *ref_pchan)
|
|
|
|
{
|
|
|
|
if (ref_ob != ob) {
|
|
|
|
/* We are trying to set a pchan from another object! Forbidden, try to find by name, or abort. */
|
|
|
|
if (ref_pchan != NULL) {
|
|
|
|
ref_pchan = BKE_pose_channel_find_name(ob->pose, ref_pchan->name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ref_pchan;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_PoseChannel_custom_shape_transform_set(PointerRNA *ptr, PointerRNA value)
|
|
|
|
{
|
|
|
|
bPoseChannel *pchan = (bPoseChannel *)ptr->data;
|
|
|
|
Object *ob = (Object *)ptr->id.data;
|
|
|
|
|
|
|
|
pchan->custom_tx = rna_PoseChannel_ensure_own_pchan(ob, value.id.data, value.data);
|
|
|
|
}
|
|
|
|
|
2009-01-07 04:06:52 +00:00
|
|
|
#else
|
|
|
|
|
2012-05-24 01:25:31 +00:00
|
|
|
/* common properties for Action/Bone Groups - related to color */
|
|
|
|
void rna_def_actionbone_group_common(StructRNA *srna, int update_flag, const char *update_cb)
|
2009-07-21 10:18:08 +00:00
|
|
|
{
|
2012-05-24 01:25:31 +00:00
|
|
|
PropertyRNA *prop;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-05-24 01:25:31 +00:00
|
|
|
/* color set + colors */
|
|
|
|
prop = RNA_def_property(srna, "color_set", PROP_ENUM, PROP_NONE);
|
|
|
|
RNA_def_property_enum_sdna(prop, NULL, "customCol");
|
2015-11-23 13:49:52 +11:00
|
|
|
RNA_def_property_enum_items(prop, rna_enum_color_sets_items);
|
2012-05-24 01:25:31 +00:00
|
|
|
RNA_def_property_enum_funcs(prop, NULL, "rna_ActionGroup_colorset_set", NULL);
|
|
|
|
RNA_def_property_ui_text(prop, "Color Set", "Custom color set to use");
|
|
|
|
RNA_def_property_update(prop, update_flag, update_cb);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2014-10-15 13:52:43 +02:00
|
|
|
prop = RNA_def_property(srna, "is_custom_color_set", PROP_BOOLEAN, PROP_NONE);
|
|
|
|
RNA_def_property_boolean_funcs(prop, "rna_ActionGroup_is_custom_colorset_get", NULL);
|
|
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
|
|
|
RNA_def_property_ui_text(prop, "Custom Color Set", "Color set is user-defined instead of a fixed theme color set");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-05-24 01:25:31 +00:00
|
|
|
/* TODO: editing the colors for this should result in changes to the color type... */
|
|
|
|
prop = RNA_def_property(srna, "colors", PROP_POINTER, PROP_NONE);
|
|
|
|
RNA_def_property_flag(prop, PROP_NEVER_NULL);
|
|
|
|
RNA_def_property_struct_type(prop, "ThemeBoneColorSet");
|
|
|
|
/* NOTE: the DNA data is not really a pointer, but this code works :) */
|
|
|
|
RNA_def_property_pointer_sdna(prop, NULL, "cs");
|
|
|
|
RNA_def_property_ui_text(prop, "Colors", "Copy of the colors associated with the group's color set");
|
|
|
|
RNA_def_property_update(prop, update_flag, update_cb);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_def_bone_group(BlenderRNA *brna)
|
|
|
|
{
|
2009-07-21 10:18:08 +00:00
|
|
|
StructRNA *srna;
|
|
|
|
PropertyRNA *prop;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-07-21 12:38:01 +00:00
|
|
|
/* struct */
|
2012-03-05 23:30:41 +00:00
|
|
|
srna = RNA_def_struct(brna, "BoneGroup", NULL);
|
2009-07-21 10:18:08 +00:00
|
|
|
RNA_def_struct_sdna(srna, "bActionGroup");
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_struct_ui_text(srna, "Bone Group", "Groups of Pose Channels (Bones)");
|
2009-09-09 11:05:10 +00:00
|
|
|
RNA_def_struct_ui_icon(srna, ICON_GROUP_BONE);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-07-21 12:38:01 +00:00
|
|
|
/* name */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
|
2009-07-21 10:18:08 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Name", "");
|
2011-10-15 11:07:18 +00:00
|
|
|
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_BoneGroup_name_set");
|
2009-07-21 10:18:08 +00:00
|
|
|
RNA_def_struct_name_property(srna, prop);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
/* TODO: add some runtime-collections stuff to access grouped bones */
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-05-24 01:25:31 +00:00
|
|
|
/* color set */
|
|
|
|
rna_def_actionbone_group_common(srna, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2009-07-21 10:18:08 +00:00
|
|
|
}
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2017-10-18 15:07:26 +11:00
|
|
|
static const EnumPropertyItem prop_iksolver_items[] = {
|
2012-11-24 00:18:34 +00:00
|
|
|
{IKSOLVER_STANDARD, "LEGACY", 0, "Standard", "Original IK solver"},
|
2010-02-11 01:11:52 +00:00
|
|
|
{IKSOLVER_ITASC, "ITASC", 0, "iTaSC", "Multi constraint, stateful IK solver"},
|
2019-02-03 14:01:45 +11:00
|
|
|
{0, NULL, 0, NULL, NULL},
|
2012-05-12 11:01:29 +00:00
|
|
|
};
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2017-10-18 15:07:26 +11:00
|
|
|
static const EnumPropertyItem prop_solver_items[] = {
|
2009-09-24 21:22:24 +00:00
|
|
|
{ITASC_SOLVER_SDLS, "SDLS", 0, "SDLS", "Selective Damped Least Square"},
|
|
|
|
{ITASC_SOLVER_DLS, "DLS", 0, "DLS", "Damped Least Square with Numerical Filtering"},
|
2019-02-03 14:01:45 +11:00
|
|
|
{0, NULL, 0, NULL, NULL},
|
2012-05-12 11:01:29 +00:00
|
|
|
};
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2009-11-13 16:08:03 +00:00
|
|
|
|
|
|
|
static void rna_def_pose_channel_constraints(BlenderRNA *brna, PropertyRNA *cprop)
|
|
|
|
{
|
|
|
|
StructRNA *srna;
|
|
|
|
PropertyRNA *prop;
|
|
|
|
|
|
|
|
FunctionRNA *func;
|
|
|
|
PropertyRNA *parm;
|
|
|
|
|
2009-11-23 14:08:04 +00:00
|
|
|
RNA_def_property_srna(cprop, "PoseBoneConstraints");
|
2012-03-05 23:30:41 +00:00
|
|
|
srna = RNA_def_struct(brna, "PoseBoneConstraints", NULL);
|
2009-11-13 16:08:03 +00:00
|
|
|
RNA_def_struct_sdna(srna, "bPoseChannel");
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_struct_ui_text(srna, "PoseBone Constraints", "Collection of pose bone constraints");
|
2009-11-13 16:08:03 +00:00
|
|
|
|
|
|
|
/* Collection active property */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
|
2009-11-13 16:08:03 +00:00
|
|
|
RNA_def_property_struct_type(prop, "Constraint");
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_active_constraint_get",
|
|
|
|
"rna_PoseChannel_active_constraint_set", NULL, NULL);
|
2009-11-13 16:08:03 +00:00
|
|
|
RNA_def_property_flag(prop, PROP_EDITABLE);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Active Constraint", "Active PoseChannel constraint");
|
2009-11-13 16:08:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* Constraint collection */
|
2012-03-05 23:30:41 +00:00
|
|
|
func = RNA_def_function(srna, "new", "rna_PoseChannel_constraints_new");
|
2009-11-13 16:08:03 +00:00
|
|
|
RNA_def_function_ui_description(func, "Add a constraint to this object");
|
2017-02-25 11:27:11 +01:00
|
|
|
RNA_def_function_flag(func, FUNC_USE_MAIN | FUNC_USE_SELF_ID); /* ID and Main needed for refresh */
|
2009-11-13 16:08:03 +00:00
|
|
|
/* return type */
|
2012-03-05 23:30:41 +00:00
|
|
|
parm = RNA_def_pointer(func, "constraint", "Constraint", "", "New constraint");
|
2009-11-13 16:08:03 +00:00
|
|
|
RNA_def_function_return(func, parm);
|
2009-11-28 13:33:56 +00:00
|
|
|
/* constraint to add */
|
2015-11-23 13:49:52 +11:00
|
|
|
parm = RNA_def_enum(func, "type", rna_enum_constraint_type_items, 1, "", "Constraint type to add");
|
Refactor RNA property: split flags in property flags, parameter flags, and internal flags.
This gives us 9 flags available again for properties (we had none anymore),
and also makes things slightly cleaner.
To simplify (and make more clear the differences between mere properties
and function parameters), also added RNA_def_parameter_flags function (and
its clear counterpart), to be used instead of RNA_def_property_flag for
function parameters.
This patch is also a big cleanup (some RNA function definitions were
still using 'prop' PropertyRNA pointer, etc.).
And yes, am aware this will be annoying for all branches, but we really need
to get new flags available for properties (will need at least one for override, etc.).
Reviewers: sergey, Severin
Subscribers: dfelinto, brecht
Differential Revision: https://developer.blender.org/D2400
2016-12-12 15:23:55 +01:00
|
|
|
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
2009-11-13 16:08:03 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
func = RNA_def_function(srna, "remove", "rna_PoseChannel_constraints_remove");
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_function_ui_description(func, "Remove a constraint from this object");
|
2018-05-31 12:27:47 +02:00
|
|
|
RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN | FUNC_USE_REPORTS ); /* ID needed for refresh */
|
2010-08-24 06:40:28 +00:00
|
|
|
/* constraint to remove */
|
2012-03-05 23:30:41 +00:00
|
|
|
parm = RNA_def_pointer(func, "constraint", "Constraint", "", "Removed constraint");
|
Refactor RNA property: split flags in property flags, parameter flags, and internal flags.
This gives us 9 flags available again for properties (we had none anymore),
and also makes things slightly cleaner.
To simplify (and make more clear the differences between mere properties
and function parameters), also added RNA_def_parameter_flags function (and
its clear counterpart), to be used instead of RNA_def_property_flag for
function parameters.
This patch is also a big cleanup (some RNA function definitions were
still using 'prop' PropertyRNA pointer, etc.).
And yes, am aware this will be annoying for all branches, but we really need
to get new flags available for properties (will need at least one for override, etc.).
Reviewers: sergey, Severin
Subscribers: dfelinto, brecht
Differential Revision: https://developer.blender.org/D2400
2016-12-12 15:23:55 +01:00
|
|
|
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
|
|
|
|
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
|
2009-11-13 16:08:03 +00:00
|
|
|
}
|
|
|
|
|
2009-01-07 04:06:52 +00:00
|
|
|
static void rna_def_pose_channel(BlenderRNA *brna)
|
2012-03-05 23:30:41 +00:00
|
|
|
{
|
2009-01-07 04:06:52 +00:00
|
|
|
StructRNA *srna;
|
|
|
|
PropertyRNA *prop;
|
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
srna = RNA_def_struct(brna, "PoseBone", NULL);
|
2009-01-07 04:06:52 +00:00
|
|
|
RNA_def_struct_sdna(srna, "bPoseChannel");
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_struct_ui_text(srna, "Pose Bone", "Channel defining pose data for a bone in a Pose");
|
2009-11-18 11:40:55 +00:00
|
|
|
RNA_def_struct_path_func(srna, "rna_PoseBone_path");
|
2010-08-19 10:16:30 +00:00
|
|
|
RNA_def_struct_idprops_func(srna, "rna_PoseBone_idprops");
|
2012-06-11 11:11:11 +00:00
|
|
|
RNA_def_struct_ui_icon(srna, ICON_BONE_DATA);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
/* Bone Constraints */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
|
2009-01-07 04:06:52 +00:00
|
|
|
RNA_def_property_struct_type(prop, "Constraint");
|
2018-06-05 11:10:05 +02:00
|
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC | PROPOVERRIDE_STATIC_INSERTION);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Constraints", "Constraints that act on this PoseChannel");
|
2018-05-02 18:13:15 +02:00
|
|
|
RNA_def_property_override_funcs(prop, NULL, NULL, "rna_PoseChannel_constraints_override_apply");
|
2009-11-13 16:08:03 +00:00
|
|
|
|
|
|
|
rna_def_pose_channel_constraints(brna, prop);
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
/* Name + Selection Status */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
|
2009-07-14 17:59:26 +00:00
|
|
|
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_PoseChannel_name_set");
|
2009-01-07 04:06:52 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Name", "");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2009-01-07 04:06:52 +00:00
|
|
|
RNA_def_struct_name_property(srna, prop);
|
|
|
|
|
2009-12-28 03:45:24 +00:00
|
|
|
/* Baked Bone Path cache data */
|
2010-01-07 22:54:05 +00:00
|
|
|
rna_def_motionpath_common(srna);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
/* Relationships to other bones */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "bone", PROP_POINTER, PROP_NONE);
|
2009-09-16 18:04:01 +00:00
|
|
|
RNA_def_property_flag(prop, PROP_NEVER_NULL);
|
2009-01-07 04:06:52 +00:00
|
|
|
RNA_def_property_struct_type(prop, "Bone");
|
2017-12-18 10:08:22 +01:00
|
|
|
RNA_def_property_flag(prop, PROP_PTR_NO_OWNERSHIP);
|
2009-03-23 13:24:48 +00:00
|
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Bone", "Bone associated with this PoseBone");
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
|
2009-11-18 11:40:55 +00:00
|
|
|
RNA_def_property_struct_type(prop, "PoseBone");
|
2017-12-18 10:08:22 +01:00
|
|
|
RNA_def_property_flag(prop, PROP_PTR_NO_OWNERSHIP);
|
2009-03-23 13:24:48 +00:00
|
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Parent", "Parent of this pose bone");
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "child", PROP_POINTER, PROP_NONE);
|
2009-11-18 11:40:55 +00:00
|
|
|
RNA_def_property_struct_type(prop, "PoseBone");
|
2017-12-18 10:08:22 +01:00
|
|
|
RNA_def_property_flag(prop, PROP_PTR_NO_OWNERSHIP);
|
2009-03-23 13:24:48 +00:00
|
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Child", "Child of this pose bone");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
/* Transformation settings */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
|
2009-01-16 18:04:01 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "loc");
|
2018-06-05 11:10:05 +02:00
|
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
|
2009-11-25 12:00:31 +00:00
|
|
|
RNA_def_property_editable_array_func(prop, "rna_PoseChannel_location_editable");
|
2009-01-16 18:04:01 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Location", "");
|
2012-04-10 08:33:30 +00:00
|
|
|
RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
|
2012-12-29 19:43:08 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-01-16 18:04:01 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
|
2009-01-16 18:04:01 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "size");
|
2018-06-05 11:10:05 +02:00
|
|
|
RNA_def_property_flag(prop, PROP_PROPORTIONAL);
|
|
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
|
2009-11-25 12:00:31 +00:00
|
|
|
RNA_def_property_editable_array_func(prop, "rna_PoseChannel_scale_editable");
|
2019-03-01 13:21:08 +11:00
|
|
|
RNA_def_property_float_array_default(prop, rna_default_scale_3d);
|
2009-01-16 18:04:01 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Scale", "");
|
2012-12-29 19:43:08 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-01-16 18:04:01 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "rotation_quaternion", PROP_FLOAT, PROP_QUATERNION);
|
2009-01-16 18:04:01 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "quat");
|
2018-06-05 11:10:05 +02:00
|
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
|
2009-11-25 12:00:31 +00:00
|
|
|
RNA_def_property_editable_array_func(prop, "rna_PoseChannel_rotation_4d_editable");
|
2019-03-01 13:21:08 +11:00
|
|
|
RNA_def_property_float_array_default(prop, rna_default_quaternion);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Quaternion Rotation", "Rotation in Quaternions");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-05-12 11:01:29 +00:00
|
|
|
/* XXX: for axis-angle, it would have been nice to have 2 separate fields for UI purposes, but
|
|
|
|
* having a single one is better for Keyframing and other property-management situations...
|
|
|
|
*/
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "rotation_axis_angle", PROP_FLOAT, PROP_AXISANGLE);
|
2018-06-05 11:10:05 +02:00
|
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
|
2011-07-09 01:14:07 +00:00
|
|
|
RNA_def_property_array(prop, 4);
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_float_funcs(prop, "rna_PoseChannel_rotation_axis_angle_get",
|
|
|
|
"rna_PoseChannel_rotation_axis_angle_set", NULL);
|
2009-11-25 12:00:31 +00:00
|
|
|
RNA_def_property_editable_array_func(prop, "rna_PoseChannel_rotation_4d_editable");
|
2019-03-01 13:21:08 +11:00
|
|
|
RNA_def_property_float_array_default(prop, rna_default_axis_angle);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Axis-Angle Rotation", "Angle of Rotation for Axis-Angle rotation representation");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "rotation_euler", PROP_FLOAT, PROP_EULER);
|
2009-02-02 11:51:10 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "eul");
|
2018-06-05 11:10:05 +02:00
|
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
|
2009-11-25 12:00:31 +00:00
|
|
|
RNA_def_property_editable_array_func(prop, "rna_PoseChannel_rotation_euler_editable");
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Euler Rotation", "Rotation in Eulers");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE);
|
2009-02-02 11:51:10 +00:00
|
|
|
RNA_def_property_enum_sdna(prop, NULL, "rotmode");
|
2019-01-16 11:16:15 +11:00
|
|
|
RNA_def_property_enum_items(prop, rna_enum_object_rotation_mode_items);
|
2009-09-06 23:15:43 +00:00
|
|
|
RNA_def_property_enum_funcs(prop, NULL, "rna_PoseChannel_rotation_mode_set", NULL);
|
2012-05-12 11:01:29 +00:00
|
|
|
/* XXX... disabled, since proxy-locked layers are currently used for ensuring proxy-syncing too */
|
2012-03-18 09:27:36 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2009-02-02 11:51:10 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Rotation Mode", "");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2016-05-18 03:19:06 +12:00
|
|
|
/* Curved bones settings - Applied on top of restpose values */
|
|
|
|
rna_def_bone_curved_common(srna, true);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2016-05-18 03:19:06 +12:00
|
|
|
/* Custom BBone next/prev sources */
|
|
|
|
prop = RNA_def_property(srna, "bbone_custom_handle_start", PROP_POINTER, PROP_NONE);
|
|
|
|
RNA_def_property_pointer_sdna(prop, NULL, "bbone_prev");
|
|
|
|
RNA_def_property_struct_type(prop, "PoseBone");
|
2018-08-05 18:48:05 +03:00
|
|
|
RNA_def_property_flag(prop, PROP_PTR_NO_OWNERSHIP);
|
2018-10-05 19:46:51 +02:00
|
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_NO_COMPARISON);
|
2016-05-18 03:19:06 +12:00
|
|
|
RNA_def_property_ui_text(prop, "B-Bone Start Handle",
|
|
|
|
"Bone that serves as the start handle for the B-Bone curve");
|
2018-08-09 17:17:40 +03:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_dependency_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2016-05-18 03:19:06 +12:00
|
|
|
prop = RNA_def_property(srna, "bbone_custom_handle_end", PROP_POINTER, PROP_NONE);
|
|
|
|
RNA_def_property_pointer_sdna(prop, NULL, "bbone_next");
|
|
|
|
RNA_def_property_struct_type(prop, "PoseBone");
|
2018-08-05 18:48:05 +03:00
|
|
|
RNA_def_property_flag(prop, PROP_PTR_NO_OWNERSHIP);
|
2018-10-05 19:46:51 +02:00
|
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_NO_COMPARISON);
|
2016-05-18 03:19:06 +12:00
|
|
|
RNA_def_property_ui_text(prop, "B-Bone End Handle",
|
|
|
|
"Bone that serves as the end handle for the B-Bone curve");
|
2018-08-09 17:17:40 +03:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_dependency_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-10-08 05:02:04 +00:00
|
|
|
/* transform matrices - should be read-only since these are set directly by AnimSys evaluation */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "matrix_channel", PROP_FLOAT, PROP_MATRIX);
|
2009-07-24 14:26:47 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "chan_mat");
|
2013-10-10 20:14:04 +00:00
|
|
|
RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
|
2009-03-23 13:24:48 +00:00
|
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Channel Matrix", "4x4 matrix, before constraints");
|
2010-03-31 20:39:08 +00:00
|
|
|
|
2010-11-15 06:38:07 +00:00
|
|
|
/* writable because it touches loc/scale/rot directly */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "matrix_basis", PROP_FLOAT, PROP_MATRIX);
|
2013-10-10 20:14:04 +00:00
|
|
|
RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Basis Matrix",
|
2011-10-20 07:56:04 +00:00
|
|
|
"Alternative access to location/scale/rotation relative to the parent and own rest bone");
|
2010-11-15 06:38:07 +00:00
|
|
|
RNA_def_property_float_funcs(prop, "rna_PoseChannel_matrix_basis_get", "rna_PoseChannel_matrix_basis_set", NULL);
|
2010-11-30 20:22:26 +00:00
|
|
|
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2010-03-31 20:39:08 +00:00
|
|
|
|
2010-11-15 06:38:07 +00:00
|
|
|
/* final matrix */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
|
2009-07-16 08:20:15 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "pose_mat");
|
2013-10-10 20:14:04 +00:00
|
|
|
RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
|
2011-07-07 16:09:57 +00:00
|
|
|
RNA_def_property_float_funcs(prop, NULL, "rna_PoseChannel_matrix_set", NULL);
|
2012-03-18 09:27:36 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Pose Matrix",
|
|
|
|
"Final 4x4 matrix after constraints and drivers are applied (object space)");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
/* Head/Tail Coordinates (in Pose Space) - Automatically calculated... */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
|
2009-11-24 11:58:49 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "pose_head");
|
2009-03-23 13:24:48 +00:00
|
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Pose Head Position", "Location of head of the channel's bone");
|
2012-04-10 08:33:30 +00:00
|
|
|
RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "tail", PROP_FLOAT, PROP_TRANSLATION);
|
2009-11-24 11:58:49 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "pose_tail");
|
2009-03-23 13:24:48 +00:00
|
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Pose Tail Position", "Location of tail of the channel's bone");
|
2012-04-10 08:33:30 +00:00
|
|
|
RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
/* IK Settings */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "is_in_ik_chain", PROP_BOOLEAN, PROP_NONE);
|
2009-08-23 12:53:55 +00:00
|
|
|
RNA_def_property_boolean_funcs(prop, "rna_PoseChannel_has_ik_get", NULL);
|
|
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Has IK", "Is part of an IK chain");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "lock_ik_x", PROP_BOOLEAN, PROP_NONE);
|
2010-08-20 02:08:43 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_XDOF);
|
2014-01-30 16:24:51 +11:00
|
|
|
RNA_def_property_ui_icon(prop, ICON_UNLOCKED, true);
|
2010-08-20 02:08:43 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK X Lock", "Disallow movement around the X axis");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-08-23 12:53:55 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "lock_ik_y", PROP_BOOLEAN, PROP_NONE);
|
2010-08-20 02:08:43 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_YDOF);
|
2014-01-30 16:24:51 +11:00
|
|
|
RNA_def_property_ui_icon(prop, ICON_UNLOCKED, true);
|
2010-08-20 02:08:43 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Y Lock", "Disallow movement around the Y axis");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-08-23 12:53:55 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "lock_ik_z", PROP_BOOLEAN, PROP_NONE);
|
2010-08-20 02:08:43 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_ZDOF);
|
2014-01-30 16:24:51 +11:00
|
|
|
RNA_def_property_ui_icon(prop, ICON_UNLOCKED, true);
|
2010-08-20 02:08:43 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Z Lock", "Disallow movement around the Z axis");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-08-23 12:53:55 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "use_ik_limit_x", PROP_BOOLEAN, PROP_NONE);
|
2009-08-23 12:53:55 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_XLIMIT);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK X Limit", "Limit movement around the X axis");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-08-23 12:53:55 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "use_ik_limit_y", PROP_BOOLEAN, PROP_NONE);
|
2009-08-23 12:53:55 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_YLIMIT);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Y Limit", "Limit movement around the Y axis");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-08-23 12:53:55 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "use_ik_limit_z", PROP_BOOLEAN, PROP_NONE);
|
2009-08-23 12:53:55 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ZLIMIT);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Z Limit", "Limit movement around the Z axis");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "use_ik_rotation_control", PROP_BOOLEAN, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ROTCTL);
|
|
|
|
RNA_def_property_ui_text(prop, "IK rot control", "Apply channel rotation as IK constraint");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "use_ik_linear_control", PROP_BOOLEAN, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_LINCTL);
|
|
|
|
RNA_def_property_ui_text(prop, "IK rot control", "Apply channel size as IK constraint if stretching is enabled");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_min_x", PROP_FLOAT, PROP_ANGLE);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "limitmin[0]");
|
2010-01-25 18:38:09 +00:00
|
|
|
RNA_def_property_range(prop, -M_PI, 0.0f);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK X Minimum", "Minimum angles for IK Limit");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-07-14 22:11:25 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_max_x", PROP_FLOAT, PROP_ANGLE);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "limitmax[0]");
|
2010-01-25 18:38:09 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, M_PI);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK X Maximum", "Maximum angles for IK Limit");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-07-14 22:11:25 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_min_y", PROP_FLOAT, PROP_ANGLE);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "limitmin[1]");
|
2010-01-25 18:38:09 +00:00
|
|
|
RNA_def_property_range(prop, -M_PI, 0.0f);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Y Minimum", "Minimum angles for IK Limit");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_max_y", PROP_FLOAT, PROP_ANGLE);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "limitmax[1]");
|
2010-01-25 18:38:09 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, M_PI);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Y Maximum", "Maximum angles for IK Limit");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_min_z", PROP_FLOAT, PROP_ANGLE);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "limitmin[2]");
|
2010-01-25 18:38:09 +00:00
|
|
|
RNA_def_property_range(prop, -M_PI, 0.0f);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Z Minimum", "Minimum angles for IK Limit");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-07-14 22:11:25 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_max_z", PROP_FLOAT, PROP_ANGLE);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "limitmax[2]");
|
2010-01-25 18:38:09 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, M_PI);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Z Maximum", "Maximum angles for IK Limit");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-07-14 22:11:25 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_stiffness_x", PROP_FLOAT, PROP_NONE);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "stiffness[0]");
|
|
|
|
RNA_def_property_range(prop, 0.0f, 0.99f);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK X Stiffness", "IK stiffness around the X axis");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-07-14 22:11:25 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_stiffness_y", PROP_FLOAT, PROP_NONE);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "stiffness[1]");
|
|
|
|
RNA_def_property_range(prop, 0.0f, 0.99f);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Y Stiffness", "IK stiffness around the Y axis");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-07-14 22:11:25 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_stiffness_z", PROP_FLOAT, PROP_NONE);
|
2009-07-14 22:11:25 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "stiffness[2]");
|
|
|
|
RNA_def_property_range(prop, 0.0f, 0.99f);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Z Stiffness", "IK stiffness around the Z axis");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2019-02-20 10:15:27 +11:00
|
|
|
prop = RNA_def_property(srna, "ik_stretch", PROP_FLOAT, PROP_FACTOR);
|
2009-01-07 04:06:52 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "ikstretch");
|
2012-04-29 15:47:02 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, 1.0f);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Stretch", "Allow scaling of the bone for IK");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_IK_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2019-02-20 10:15:27 +11:00
|
|
|
prop = RNA_def_property(srna, "ik_rotation_weight", PROP_FLOAT, PROP_FACTOR);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "ikrotweight");
|
2012-04-29 15:47:02 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, 1.0f);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Rot Weight", "Weight of rotation constraint for IK");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2019-02-20 10:15:27 +11:00
|
|
|
prop = RNA_def_property(srna, "ik_linear_weight", PROP_FLOAT, PROP_FACTOR);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "iklinweight");
|
2012-04-29 15:47:02 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, 1.0f);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Lin Weight", "Weight of scale constraint for IK");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
/* custom bone shapes */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "custom_shape", PROP_POINTER, PROP_NONE);
|
2009-08-23 12:53:55 +00:00
|
|
|
RNA_def_property_pointer_sdna(prop, NULL, "custom");
|
|
|
|
RNA_def_property_struct_type(prop, "Object");
|
|
|
|
RNA_def_property_flag(prop, PROP_EDITABLE);
|
2010-12-22 16:33:13 +00:00
|
|
|
RNA_def_property_pointer_funcs(prop, NULL, "rna_PoseChannel_bone_custom_set", NULL, NULL);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Custom Object", "Object that defines custom draw type for this bone");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2015-09-21 23:49:58 +10:00
|
|
|
prop = RNA_def_property(srna, "custom_shape_scale", PROP_FLOAT, PROP_NONE);
|
|
|
|
RNA_def_property_float_sdna(prop, NULL, "custom_scale");
|
|
|
|
RNA_def_property_range(prop, 0.0f, 1000.0f);
|
|
|
|
RNA_def_property_ui_text(prop, "Custom Shape Scale", "Adjust the size of the custom shape");
|
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
|
|
|
|
|
|
|
prop = RNA_def_property(srna, "use_custom_shape_bone_size", PROP_BOOLEAN, PROP_NONE);
|
|
|
|
RNA_def_property_boolean_negative_sdna(prop, NULL, "drawflag", PCHAN_DRAW_NO_CUSTOM_BONE_SIZE);
|
|
|
|
RNA_def_property_ui_text(prop, "Use Bone Size", "Scale the custom object by the bone length");
|
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "custom_shape_transform", PROP_POINTER, PROP_NONE);
|
2010-01-05 11:47:43 +00:00
|
|
|
RNA_def_property_pointer_sdna(prop, NULL, "custom_tx");
|
|
|
|
RNA_def_property_struct_type(prop, "PoseBone");
|
2018-10-05 19:46:51 +02:00
|
|
|
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_PTR_NO_OWNERSHIP);
|
|
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
|
2012-03-18 09:27:36 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Custom Shape Transform",
|
|
|
|
"Bone that defines the display transform of this custom shape");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2018-10-05 19:46:51 +02:00
|
|
|
RNA_def_property_pointer_funcs(prop, NULL, "rna_PoseChannel_custom_shape_transform_set", NULL, NULL);
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
/* bone groups */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "bone_group_index", PROP_INT, PROP_NONE);
|
2009-08-23 12:53:55 +00:00
|
|
|
RNA_def_property_int_sdna(prop, NULL, "agrp_index");
|
|
|
|
RNA_def_property_flag(prop, PROP_EDITABLE);
|
2010-11-30 20:22:26 +00:00
|
|
|
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_int_funcs(prop, "rna_PoseChannel_bone_group_index_get", "rna_PoseChannel_bone_group_index_set",
|
|
|
|
"rna_PoseChannel_bone_group_index_range");
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Bone Group Index", "Bone Group this pose channel belongs to (0=no group)");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "bone_group", PROP_POINTER, PROP_NONE);
|
2009-08-23 12:53:55 +00:00
|
|
|
RNA_def_property_struct_type(prop, "BoneGroup");
|
|
|
|
RNA_def_property_flag(prop, PROP_EDITABLE);
|
2012-03-18 09:27:36 +00:00
|
|
|
RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_bone_group_get",
|
|
|
|
"rna_PoseChannel_bone_group_set", NULL, NULL);
|
2009-08-23 12:53:55 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Bone Group", "Bone Group this pose channel belongs to");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-08-23 12:53:55 +00:00
|
|
|
/* transform locks */
|
2012-04-10 08:33:30 +00:00
|
|
|
prop = RNA_def_property(srna, "lock_location", PROP_BOOLEAN, PROP_NONE);
|
2009-01-16 18:04:01 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_LOCX);
|
|
|
|
RNA_def_property_array(prop, 3);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Lock Location", "Lock editing of location in the interface");
|
2010-07-13 15:20:35 +00:00
|
|
|
RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1);
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2009-01-16 18:04:01 +00:00
|
|
|
|
2012-04-10 08:33:30 +00:00
|
|
|
prop = RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_NONE);
|
2009-01-16 18:04:01 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTX);
|
|
|
|
RNA_def_property_array(prop, 3);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Lock Rotation", "Lock editing of rotation in the interface");
|
2010-07-13 15:20:35 +00:00
|
|
|
RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1);
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-05-12 11:01:29 +00:00
|
|
|
/* XXX this is sub-optimal - it really should be included above, but due to technical reasons
|
|
|
|
* we can't do this! */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "lock_rotation_w", PROP_BOOLEAN, PROP_NONE);
|
2009-09-12 12:30:23 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTW);
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Lock Rotation (4D Angle)",
|
|
|
|
"Lock editing of 'angle' component of four-component rotations in the interface");
|
2010-07-13 15:20:35 +00:00
|
|
|
RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1);
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2010-01-12 17:08:28 +00:00
|
|
|
|
2012-05-12 11:01:29 +00:00
|
|
|
/* XXX this needs a better name */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "lock_rotations_4d", PROP_BOOLEAN, PROP_NONE);
|
2009-09-12 12:30:23 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROT4D);
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Lock Rotations (4D)",
|
|
|
|
"Lock editing of four component rotations by components (instead of as Eulers)");
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2009-01-16 18:04:01 +00:00
|
|
|
|
2012-04-10 08:33:30 +00:00
|
|
|
prop = RNA_def_property(srna, "lock_scale", PROP_BOOLEAN, PROP_NONE);
|
2009-01-16 18:04:01 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_SCALEX);
|
|
|
|
RNA_def_property_array(prop, 3);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Lock Scale", "Lock editing of scale in the interface");
|
2010-07-13 15:20:35 +00:00
|
|
|
RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1);
|
2010-01-12 17:08:28 +00:00
|
|
|
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2009-11-11 19:58:30 +00:00
|
|
|
|
|
|
|
RNA_api_pose_channel(srna);
|
2009-01-07 04:06:52 +00:00
|
|
|
}
|
|
|
|
|
2009-09-24 21:22:24 +00:00
|
|
|
static void rna_def_pose_itasc(BlenderRNA *brna)
|
2009-01-07 04:06:52 +00:00
|
|
|
{
|
2012-03-05 23:30:41 +00:00
|
|
|
static const EnumPropertyItem prop_itasc_mode_items[] = {
|
2011-10-20 07:56:04 +00:00
|
|
|
{0, "ANIMATION", 0, "Animation",
|
|
|
|
"Stateless solver computing pose starting from current action and non-IK constraints"},
|
|
|
|
{ITASC_SIMULATION, "SIMULATION", 0, "Simulation",
|
2012-08-27 20:58:43 +00:00
|
|
|
"State-full solver running in real-time context and ignoring actions "
|
2012-03-18 09:27:36 +00:00
|
|
|
"and non-IK constraints"},
|
2019-02-03 14:01:45 +11:00
|
|
|
{0, NULL, 0, NULL, NULL},
|
2012-05-12 11:01:29 +00:00
|
|
|
};
|
2012-03-05 23:30:41 +00:00
|
|
|
static const EnumPropertyItem prop_itasc_reiteration_items[] = {
|
2010-02-11 01:11:52 +00:00
|
|
|
{0, "NEVER", 0, "Never", "The solver does not reiterate, not even on first frame (starts from rest pose)"},
|
2011-10-20 07:56:04 +00:00
|
|
|
{ITASC_INITIAL_REITERATION, "INITIAL", 0, "Initial",
|
2012-03-18 09:27:36 +00:00
|
|
|
"The solver reiterates (converges) on the first frame but not on "
|
|
|
|
"subsequent frame"},
|
2012-06-27 18:29:47 +00:00
|
|
|
{ITASC_INITIAL_REITERATION | ITASC_REITERATION, "ALWAYS", 0, "Always",
|
|
|
|
"The solver reiterates (converges) on all frames"},
|
2019-02-03 14:01:45 +11:00
|
|
|
{0, NULL, 0, NULL, NULL},
|
2012-05-12 11:01:29 +00:00
|
|
|
};
|
2009-10-02 07:20:07 +00:00
|
|
|
|
2009-01-07 04:06:52 +00:00
|
|
|
StructRNA *srna;
|
|
|
|
PropertyRNA *prop;
|
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
srna = RNA_def_struct(brna, "Itasc", "IKParam");
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_struct_sdna(srna, "bItasc");
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_struct_ui_text(srna, "bItasc", "Parameters for the iTaSC IK solver");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "precision", PROP_FLOAT, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "precision");
|
2012-04-29 15:47:02 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, 0.1f);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Precision", "Precision of convergence in case of reiteration");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "iterations", PROP_INT, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_int_sdna(prop, NULL, "numiter");
|
2012-11-24 00:18:34 +00:00
|
|
|
RNA_def_property_range(prop, 0, 1000);
|
2012-03-18 09:27:36 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Iterations",
|
|
|
|
"Maximum number of iterations for convergence in case of reiteration");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "step_count", PROP_INT, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_int_sdna(prop, NULL, "numstep");
|
|
|
|
RNA_def_property_range(prop, 1.f, 50.f);
|
2011-11-26 12:30:01 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Num steps", "Divide the frame interval into this many steps");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
|
2009-10-02 07:20:07 +00:00
|
|
|
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
|
|
|
|
RNA_def_property_enum_items(prop, prop_itasc_mode_items);
|
|
|
|
RNA_def_property_ui_text(prop, "Mode", NULL);
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update_rebuild");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "reiteration_method", PROP_ENUM, PROP_NONE);
|
2009-10-02 07:20:07 +00:00
|
|
|
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
|
|
|
|
RNA_def_property_enum_items(prop, prop_itasc_reiteration_items);
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Reiteration",
|
2011-11-26 12:30:01 +00:00
|
|
|
"Defines if the solver is allowed to reiterate (converge until "
|
2011-10-20 07:56:04 +00:00
|
|
|
"precision is met) on none, first or all frames");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "use_auto_step", PROP_BOOLEAN, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_boolean_sdna(prop, NULL, "flag", ITASC_AUTO_STEP);
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Auto step",
|
2012-03-18 09:27:36 +00:00
|
|
|
"Automatically determine the optimal number of steps for best "
|
|
|
|
"performance/accuracy trade off");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2019-02-20 10:15:27 +11:00
|
|
|
prop = RNA_def_property(srna, "step_min", PROP_FLOAT, PROP_FACTOR);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "minstep");
|
2012-04-29 15:47:02 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, 0.1f);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Min step", "Lower bound for timestep in second in case of automatic substeps");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2019-02-20 10:15:27 +11:00
|
|
|
prop = RNA_def_property(srna, "step_max", PROP_FLOAT, PROP_FACTOR);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "maxstep");
|
2012-04-29 15:47:02 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, 1.0f);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Max step", "Higher bound for timestep in second in case of automatic substeps");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "feedback", PROP_FLOAT, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "feedback");
|
2012-04-29 15:47:02 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, 100.0f);
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Feedback",
|
2012-03-18 09:27:36 +00:00
|
|
|
"Feedback coefficient for error correction, average response time is 1/feedback "
|
|
|
|
"(default=20)");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "velocity_max", PROP_FLOAT, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "maxvel");
|
2012-04-29 15:47:02 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, 100.0f);
|
2011-11-26 12:30:01 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Max Velocity", "Maximum joint velocity in rad/s (default=50)");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "solver", PROP_ENUM, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_enum_sdna(prop, NULL, "solver");
|
|
|
|
RNA_def_property_enum_items(prop, prop_solver_items);
|
2011-11-26 12:30:01 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Solver", "Solving method selection: automatic damping or manual damping");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update_rebuild");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2019-02-20 10:15:27 +11:00
|
|
|
prop = RNA_def_property(srna, "damping_max", PROP_FLOAT, PROP_FACTOR);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "dampmax");
|
2012-04-29 15:47:02 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, 1.0f);
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Damp",
|
|
|
|
"Maximum damping coefficient when singular value is nearly 0 "
|
|
|
|
"(higher values=more stability, less reactivity - default=0.5)");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2019-02-20 10:15:27 +11:00
|
|
|
prop = RNA_def_property(srna, "damping_epsilon", PROP_FLOAT, PROP_FACTOR);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_float_sdna(prop, NULL, "dampeps");
|
2012-04-29 15:47:02 +00:00
|
|
|
RNA_def_property_range(prop, 0.0f, 1.0f);
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Epsilon",
|
|
|
|
"Singular value under which damping is progressively applied "
|
|
|
|
"(higher values=more stability, less reactivity - default=0.1)");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Itasc_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_def_pose_ikparam(BlenderRNA *brna)
|
|
|
|
{
|
|
|
|
StructRNA *srna;
|
|
|
|
PropertyRNA *prop;
|
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
srna = RNA_def_struct(brna, "IKParam", NULL);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_struct_sdna(srna, "bIKParam");
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_struct_ui_text(srna, "IKParam", "Base type for IK solver parameters");
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_struct_refine_func(srna, "rna_IKParam_refine");
|
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_solver", PROP_ENUM, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_enum_sdna(prop, NULL, "iksolver");
|
|
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
|
|
|
RNA_def_property_enum_items(prop, prop_iksolver_items);
|
2012-11-24 00:18:34 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Solver", "IK solver for which these parameters are defined");
|
2009-09-24 21:22:24 +00:00
|
|
|
}
|
|
|
|
|
2010-08-23 22:16:45 +00:00
|
|
|
/* pose.bone_groups */
|
|
|
|
static void rna_def_bone_groups(BlenderRNA *brna, PropertyRNA *cprop)
|
|
|
|
{
|
|
|
|
StructRNA *srna;
|
|
|
|
PropertyRNA *prop;
|
|
|
|
|
2014-07-09 10:27:31 +02:00
|
|
|
FunctionRNA *func;
|
|
|
|
PropertyRNA *parm;
|
2010-08-23 22:16:45 +00:00
|
|
|
|
|
|
|
RNA_def_property_srna(cprop, "BoneGroups");
|
2012-03-05 23:30:41 +00:00
|
|
|
srna = RNA_def_struct(brna, "BoneGroups", NULL);
|
2010-08-23 22:16:45 +00:00
|
|
|
RNA_def_struct_sdna(srna, "bPose");
|
|
|
|
RNA_def_struct_ui_text(srna, "Bone Groups", "Collection of bone groups");
|
2014-07-09 10:27:31 +02:00
|
|
|
|
|
|
|
func = RNA_def_function(srna, "new", "rna_bone_group_new");
|
|
|
|
RNA_def_function_ui_description(func, "Add a new bone group to the object");
|
|
|
|
RNA_def_function_flag(func, FUNC_USE_SELF_ID); /* ID needed for refresh */
|
|
|
|
RNA_def_string(func, "name", "Group", MAX_NAME, "", "Name of the new group");
|
|
|
|
/* return type */
|
|
|
|
parm = RNA_def_pointer(func, "group", "BoneGroup", "", "New bone group");
|
|
|
|
RNA_def_function_return(func, parm);
|
|
|
|
|
|
|
|
func = RNA_def_function(srna, "remove", "rna_bone_group_remove");
|
|
|
|
RNA_def_function_ui_description(func, "Remove a bone group from this object");
|
|
|
|
RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* ID needed for refresh */
|
|
|
|
/* bone group to remove */
|
|
|
|
parm = RNA_def_pointer(func, "group", "BoneGroup", "", "Removed bone group");
|
Refactor RNA property: split flags in property flags, parameter flags, and internal flags.
This gives us 9 flags available again for properties (we had none anymore),
and also makes things slightly cleaner.
To simplify (and make more clear the differences between mere properties
and function parameters), also added RNA_def_parameter_flags function (and
its clear counterpart), to be used instead of RNA_def_property_flag for
function parameters.
This patch is also a big cleanup (some RNA function definitions were
still using 'prop' PropertyRNA pointer, etc.).
And yes, am aware this will be annoying for all branches, but we really need
to get new flags available for properties (will need at least one for override, etc.).
Reviewers: sergey, Severin
Subscribers: dfelinto, brecht
Differential Revision: https://developer.blender.org/D2400
2016-12-12 15:23:55 +01:00
|
|
|
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
|
|
|
|
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
|
2010-08-23 22:16:45 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
|
2010-08-23 22:16:45 +00:00
|
|
|
RNA_def_property_struct_type(prop, "BoneGroup");
|
|
|
|
RNA_def_property_flag(prop, PROP_EDITABLE);
|
2012-03-18 09:27:36 +00:00
|
|
|
RNA_def_property_pointer_funcs(prop, "rna_Pose_active_bone_group_get",
|
|
|
|
"rna_Pose_active_bone_group_set", NULL, NULL);
|
2010-08-23 22:16:45 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Active Bone Group", "Active bone group for this pose");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-12-11 14:11:46 +00:00
|
|
|
prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
|
2010-08-24 04:02:50 +00:00
|
|
|
RNA_def_property_int_sdna(prop, NULL, "active_group");
|
2011-10-20 07:56:04 +00:00
|
|
|
RNA_def_property_int_funcs(prop, "rna_Pose_active_bone_group_index_get", "rna_Pose_active_bone_group_index_set",
|
|
|
|
"rna_Pose_active_bone_group_index_range");
|
2010-08-24 04:02:50 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Active Bone Group Index", "Active index in bone groups array");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update");
|
2010-08-23 22:16:45 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 10:18:08 +00:00
|
|
|
static void rna_def_pose(BlenderRNA *brna)
|
2009-01-07 04:06:52 +00:00
|
|
|
{
|
|
|
|
StructRNA *srna;
|
|
|
|
PropertyRNA *prop;
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2009-07-21 10:18:08 +00:00
|
|
|
/* struct definition */
|
2012-03-05 23:30:41 +00:00
|
|
|
srna = RNA_def_struct(brna, "Pose", NULL);
|
2009-01-07 04:06:52 +00:00
|
|
|
RNA_def_struct_sdna(srna, "bPose");
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_struct_ui_text(srna, "Pose", "A collection of pose channels, including settings for animating bones");
|
2009-01-07 04:06:52 +00:00
|
|
|
|
2009-07-21 10:18:08 +00:00
|
|
|
/* pose channels */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "bones", PROP_COLLECTION, PROP_NONE);
|
2009-01-07 04:06:52 +00:00
|
|
|
RNA_def_property_collection_sdna(prop, NULL, "chanbase", NULL);
|
2009-11-18 11:40:55 +00:00
|
|
|
RNA_def_property_struct_type(prop, "PoseBone");
|
2018-06-05 11:10:05 +02:00
|
|
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Pose Bones", "Individual pose bones for the armature");
|
2012-05-12 11:01:29 +00:00
|
|
|
/* can be removed, only for fast lookup */
|
2012-03-18 09:27:36 +00:00
|
|
|
RNA_def_property_collection_funcs(prop, NULL, NULL, NULL, NULL, NULL, NULL, "rna_PoseBones_lookup_string", NULL);
|
|
|
|
|
2009-07-21 10:18:08 +00:00
|
|
|
/* bone groups */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "bone_groups", PROP_COLLECTION, PROP_NONE);
|
2009-01-07 04:06:52 +00:00
|
|
|
RNA_def_property_collection_sdna(prop, NULL, "agroups", NULL);
|
2009-07-21 10:18:08 +00:00
|
|
|
RNA_def_property_struct_type(prop, "BoneGroup");
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Bone Groups", "Groups of the bones");
|
2010-08-23 22:16:45 +00:00
|
|
|
rna_def_bone_groups(brna, prop);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2010-01-07 22:54:05 +00:00
|
|
|
/* ik solvers */
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_solver", PROP_ENUM, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_enum_sdna(prop, NULL, "iksolver");
|
|
|
|
RNA_def_property_enum_funcs(prop, NULL, "rna_Pose_ik_solver_set", NULL);
|
|
|
|
RNA_def_property_enum_items(prop, prop_iksolver_items);
|
2012-11-24 00:18:34 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Solver", "Selection of IK solver for IK chain");
|
2012-05-12 11:01:29 +00:00
|
|
|
RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_ik_solver_update");
|
2009-09-24 21:22:24 +00:00
|
|
|
|
2012-03-05 23:30:41 +00:00
|
|
|
prop = RNA_def_property(srna, "ik_param", PROP_POINTER, PROP_NONE);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_struct_type(prop, "IKParam");
|
2010-08-03 05:14:59 +00:00
|
|
|
RNA_def_property_pointer_funcs(prop, "rna_Pose_ikparam_get", NULL, "rna_Pose_ikparam_typef", NULL);
|
2009-09-24 21:22:24 +00:00
|
|
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_property_ui_text(prop, "IK Param", "Parameters for IK solver");
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2010-01-07 22:54:05 +00:00
|
|
|
/* animviz */
|
|
|
|
rna_def_animviz_common(srna);
|
2018-06-09 14:40:09 +02:00
|
|
|
|
2012-09-24 22:39:45 +00:00
|
|
|
RNA_api_pose(srna);
|
2009-07-21 10:18:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void RNA_def_pose(BlenderRNA *brna)
|
|
|
|
{
|
|
|
|
rna_def_pose(brna);
|
|
|
|
rna_def_pose_channel(brna);
|
2009-09-24 21:22:24 +00:00
|
|
|
rna_def_pose_ikparam(brna);
|
|
|
|
rna_def_pose_itasc(brna);
|
2009-07-21 10:18:08 +00:00
|
|
|
rna_def_bone_group(brna);
|
2009-01-07 04:06:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|