Limit Rotation: add an Euler Order option.

Since Limit Rotation is based on Euler decomposition, it should allow
specifying the order to use for the same reasons as Copy Rotation does,
namely, if the bone uses Quaternion rotation for its animation channels,
there is no way to choose the order for the constraint.

Ref D9626
This commit is contained in:
Alexander Gavrilov 2020-11-22 14:17:21 +03:00
parent 2cd1bc3aa7
commit d2dc452333
4 changed files with 19 additions and 2 deletions

View File

@ -245,6 +245,7 @@ class ConstraintButtonsPanel:
sub.prop(con, "max_z", text="Max")
row.label(icon='BLANK1')
layout.prop(con, "euler_order", text="Order")
layout.prop(con, "use_transform_limit")
self.space_template(layout, con, target=False, owner=True)

View File

@ -1635,10 +1635,18 @@ static void rotlimit_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *UN
float eul[3];
float size[3];
/* Select the Euler rotation order, defaulting to the owner value. */
short rot_order = cob->rotOrder;
if (data->euler_order != CONSTRAINT_EULER_AUTO) {
rot_order = data->euler_order;
}
/* Decompose the matrix using the specified order. */
copy_v3_v3(loc, cob->matrix[3]);
mat4_to_size(size, cob->matrix);
mat4_to_eulO(eul, cob->rotOrder, cob->matrix);
mat4_to_eulO(eul, rot_order, cob->matrix);
/* constraint data uses radians internally */
@ -1671,7 +1679,7 @@ static void rotlimit_evaluate(bConstraint *con, bConstraintOb *cob, ListBase *UN
}
}
loc_eulO_size_to_mat4(cob->matrix, loc, eul, size, cob->rotOrder);
loc_eulO_size_to_mat4(cob->matrix, loc, eul, size, rot_order);
}
static bConstraintTypeInfo CTI_ROTLIMIT = {

View File

@ -534,6 +534,8 @@ typedef struct bRotLimitConstraint {
float zmin, zmax;
short flag;
short flag2;
char euler_order;
char _pad[3];
} bRotLimitConstraint;
/* Limit Scale Constraint */

View File

@ -2598,6 +2598,12 @@ static void rna_def_constraint_rotation_limit(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Maximum Z", "Highest Z value to allow");
RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
prop = RNA_def_property(srna, "euler_order", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "euler_order");
RNA_def_property_enum_items(prop, euler_order_items);
RNA_def_property_ui_text(prop, "Euler Order", "Explicitly specify the euler rotation order");
RNA_def_property_update(prop, NC_OBJECT | ND_CONSTRAINT, "rna_Constraint_update");
prop = RNA_def_property(srna, "use_transform_limit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag2", LIMIT_TRANSFORM);
RNA_def_property_ui_text(