forked from bartvdbraak/blender
Object Apply Transform: option to apply properties
In some cases users may want to disable this option to avoid changing other properties besides vertex locations.
This commit is contained in:
parent
31be0a6e52
commit
30e83d58ff
@ -93,8 +93,8 @@ void BKE_curve_texspace_get(struct Curve *cu, float r_loc[3], float r_rot[3], fl
|
||||
bool BKE_curve_minmax(struct Curve *cu, bool use_radius, float min[3], float max[3]);
|
||||
bool BKE_curve_center_median(struct Curve *cu, float cent[3]);
|
||||
bool BKE_curve_center_bounds(struct Curve *cu, float cent[3]);
|
||||
void BKE_curve_transform_ex(struct Curve *cu, float mat[4][4], const bool do_keys, const float unit_scale);
|
||||
void BKE_curve_transform(struct Curve *cu, float mat[4][4], const bool do_keys);
|
||||
void BKE_curve_transform_ex(struct Curve *cu, float mat[4][4], const bool do_keys, const bool do_props, const float unit_scale);
|
||||
void BKE_curve_transform(struct Curve *cu, float mat[4][4], const bool do_keys, const bool do_props);
|
||||
void BKE_curve_translate(struct Curve *cu, float offset[3], const bool do_keys);
|
||||
void BKE_curve_material_index_remove(struct Curve *cu, int index);
|
||||
void BKE_curve_material_index_clear(struct Curve *cu);
|
||||
|
@ -60,7 +60,7 @@ bool BKE_mball_minmax_ex(struct MetaBall *mb, float min[3], float max[3],
|
||||
float obmat[4][4], const short flag);
|
||||
bool BKE_mball_center_median(struct MetaBall *mb, float r_cent[3]);
|
||||
bool BKE_mball_center_bounds(struct MetaBall *mb, float r_cent[3]);
|
||||
void BKE_mball_transform(struct MetaBall *mb, float mat[4][4]);
|
||||
void BKE_mball_transform(struct MetaBall *mb, float mat[4][4], const bool do_props);
|
||||
void BKE_mball_translate(struct MetaBall *mb, const float offset[3]);
|
||||
|
||||
struct MetaElem *BKE_mball_element_add(struct MetaBall *mb, const int type);
|
||||
|
@ -4442,7 +4442,9 @@ bool BKE_curve_center_bounds(Curve *cu, float cent[3])
|
||||
}
|
||||
|
||||
|
||||
void BKE_curve_transform_ex(Curve *cu, float mat[4][4], const bool do_keys, const float unit_scale)
|
||||
void BKE_curve_transform_ex(
|
||||
Curve *cu, float mat[4][4],
|
||||
const bool do_keys, const bool do_props, const float unit_scale)
|
||||
{
|
||||
Nurb *nu;
|
||||
BPoint *bp;
|
||||
@ -4456,7 +4458,9 @@ void BKE_curve_transform_ex(Curve *cu, float mat[4][4], const bool do_keys, cons
|
||||
mul_m4_v3(mat, bezt->vec[0]);
|
||||
mul_m4_v3(mat, bezt->vec[1]);
|
||||
mul_m4_v3(mat, bezt->vec[2]);
|
||||
bezt->radius *= unit_scale;
|
||||
if (do_props) {
|
||||
bezt->radius *= unit_scale;
|
||||
}
|
||||
}
|
||||
BKE_nurb_handles_calc(nu);
|
||||
}
|
||||
@ -4464,7 +4468,9 @@ void BKE_curve_transform_ex(Curve *cu, float mat[4][4], const bool do_keys, cons
|
||||
i = nu->pntsu * nu->pntsv;
|
||||
for (bp = nu->bp; i--; bp++) {
|
||||
mul_m4_v3(mat, bp->vec);
|
||||
bp->radius *= unit_scale;
|
||||
if (do_props) {
|
||||
bp->radius *= unit_scale;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4480,10 +4486,12 @@ void BKE_curve_transform_ex(Curve *cu, float mat[4][4], const bool do_keys, cons
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_curve_transform(Curve *cu, float mat[4][4], const bool do_keys)
|
||||
void BKE_curve_transform(
|
||||
Curve *cu, float mat[4][4],
|
||||
const bool do_keys, const bool do_props)
|
||||
{
|
||||
float unit_scale = mat4_to_scale(mat);
|
||||
BKE_curve_transform_ex(cu, mat, do_keys, unit_scale);
|
||||
BKE_curve_transform_ex(cu, mat, do_keys, do_props, unit_scale);
|
||||
}
|
||||
|
||||
void BKE_curve_translate(Curve *cu, float offset[3], const bool do_keys)
|
||||
|
@ -473,7 +473,7 @@ bool BKE_mball_center_bounds(MetaBall *mb, float r_cent[3])
|
||||
return false;
|
||||
}
|
||||
|
||||
void BKE_mball_transform(MetaBall *mb, float mat[4][4])
|
||||
void BKE_mball_transform(MetaBall *mb, float mat[4][4], const bool do_props)
|
||||
{
|
||||
MetaElem *me;
|
||||
float quat[4];
|
||||
@ -485,14 +485,17 @@ void BKE_mball_transform(MetaBall *mb, float mat[4][4])
|
||||
for (me = mb->elems.first; me; me = me->next) {
|
||||
mul_m4_v3(mat, &me->x);
|
||||
mul_qt_qtqt(me->quat, quat, me->quat);
|
||||
me->rad *= scale;
|
||||
/* hrmf, probably elems shouldn't be
|
||||
* treating scale differently - campbell */
|
||||
if (!MB_TYPE_SIZE_SQUARED(me->type)) {
|
||||
mul_v3_fl(&me->expx, scale);
|
||||
}
|
||||
else {
|
||||
mul_v3_fl(&me->expx, scale_sqrt);
|
||||
|
||||
if (do_props) {
|
||||
me->rad *= scale;
|
||||
/* hrmf, probably elems shouldn't be
|
||||
* treating scale differently - campbell */
|
||||
if (!MB_TYPE_SIZE_SQUARED(me->type)) {
|
||||
mul_v3_fl(&me->expx, scale);
|
||||
}
|
||||
else {
|
||||
mul_v3_fl(&me->expx, scale_sqrt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -66,7 +66,7 @@
|
||||
/* ************************** Object Tools Exports ******************************* */
|
||||
/* NOTE: these functions are exported to the Object module to be called from the tools there */
|
||||
|
||||
void ED_armature_apply_transform(Object *ob, float mat[4][4])
|
||||
void ED_armature_apply_transform(Object *ob, float mat[4][4], const bool do_props)
|
||||
{
|
||||
bArmature *arm = ob->data;
|
||||
|
||||
@ -74,14 +74,14 @@ void ED_armature_apply_transform(Object *ob, float mat[4][4])
|
||||
ED_armature_to_edit(arm);
|
||||
|
||||
/* Transform the bones */
|
||||
ED_armature_transform_bones(arm, mat);
|
||||
ED_armature_transform_bones(arm, mat, do_props);
|
||||
|
||||
/* Turn the list into an armature */
|
||||
ED_armature_from_edit(arm);
|
||||
ED_armature_edit_free(arm);
|
||||
}
|
||||
|
||||
void ED_armature_transform_bones(struct bArmature *arm, float mat[4][4])
|
||||
void ED_armature_transform_bones(struct bArmature *arm, float mat[4][4], const bool do_props)
|
||||
{
|
||||
EditBone *ebone;
|
||||
float scale = mat4_to_scale(mat); /* store the scale of the matrix here to use on envelopes */
|
||||
@ -106,27 +106,29 @@ void ED_armature_transform_bones(struct bArmature *arm, float mat[4][4])
|
||||
/* apply the transformed roll back */
|
||||
mat3_to_vec_roll(tmat, NULL, &ebone->roll);
|
||||
|
||||
ebone->rad_head *= scale;
|
||||
ebone->rad_tail *= scale;
|
||||
ebone->dist *= scale;
|
||||
|
||||
/* we could be smarter and scale by the matrix along the x & z axis */
|
||||
ebone->xwidth *= scale;
|
||||
ebone->zwidth *= scale;
|
||||
if (do_props) {
|
||||
ebone->rad_head *= scale;
|
||||
ebone->rad_tail *= scale;
|
||||
ebone->dist *= scale;
|
||||
|
||||
/* we could be smarter and scale by the matrix along the x & z axis */
|
||||
ebone->xwidth *= scale;
|
||||
ebone->zwidth *= scale;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ED_armature_transform(struct bArmature *arm, float mat[4][4])
|
||||
void ED_armature_transform(struct bArmature *arm, float mat[4][4], const bool do_props)
|
||||
{
|
||||
if (arm->edbo) {
|
||||
ED_armature_transform_bones(arm, mat);
|
||||
ED_armature_transform_bones(arm, mat, do_props);
|
||||
}
|
||||
else {
|
||||
/* Put the armature into editmode */
|
||||
ED_armature_to_edit(arm);
|
||||
|
||||
/* Transform the bones */
|
||||
ED_armature_transform_bones(arm, mat);
|
||||
ED_armature_transform_bones(arm, mat, do_props);
|
||||
|
||||
/* Go back to object mode*/
|
||||
ED_armature_from_edit(arm);
|
||||
|
@ -158,9 +158,9 @@ void ED_armature_ebone_from_mat4(EditBone *ebone, float mat[4][4]);
|
||||
void transform_armature_mirror_update(struct Object *obedit);
|
||||
void ED_armature_origin_set(struct Scene *scene, struct Object *ob, float cursor[3], int centermode, int around);
|
||||
|
||||
void ED_armature_transform_bones(struct bArmature *arm, float mat[4][4]);
|
||||
void ED_armature_apply_transform(struct Object *ob, float mat[4][4]);
|
||||
void ED_armature_transform(struct bArmature *arm, float mat[4][4]);
|
||||
void ED_armature_transform_bones(struct bArmature *arm, float mat[4][4], const bool do_props);
|
||||
void ED_armature_apply_transform(struct Object *ob, float mat[4][4], const bool do_props);
|
||||
void ED_armature_transform(struct bArmature *arm, float mat[4][4], const bool do_props);
|
||||
|
||||
#define ARM_GROUPS_NAME 1
|
||||
#define ARM_GROUPS_ENVELOPE 2
|
||||
|
@ -414,7 +414,10 @@ static void ignore_parent_tx(Main *bmain, Scene *scene, Object *ob)
|
||||
}
|
||||
}
|
||||
|
||||
static int apply_objects_internal(bContext *C, ReportList *reports, bool apply_loc, bool apply_rot, bool apply_scale)
|
||||
static int apply_objects_internal(
|
||||
bContext *C, ReportList *reports,
|
||||
bool apply_loc, bool apply_rot, bool apply_scale,
|
||||
bool do_props)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
@ -531,7 +534,7 @@ static int apply_objects_internal(bContext *C, ReportList *reports, bool apply_l
|
||||
BKE_mesh_calc_normals(me);
|
||||
}
|
||||
else if (ob->type == OB_ARMATURE) {
|
||||
ED_armature_apply_transform(ob, mat);
|
||||
ED_armature_apply_transform(ob, mat, do_props);
|
||||
}
|
||||
else if (ob->type == OB_LATTICE) {
|
||||
Lattice *lt = ob->data;
|
||||
@ -540,12 +543,12 @@ static int apply_objects_internal(bContext *C, ReportList *reports, bool apply_l
|
||||
}
|
||||
else if (ob->type == OB_MBALL) {
|
||||
MetaBall *mb = ob->data;
|
||||
BKE_mball_transform(mb, mat);
|
||||
BKE_mball_transform(mb, mat, do_props);
|
||||
}
|
||||
else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
|
||||
Curve *cu = ob->data;
|
||||
scale = mat3_to_scale(rsmat);
|
||||
BKE_curve_transform_ex(cu, mat, true, scale);
|
||||
BKE_curve_transform_ex(cu, mat, true, do_props, scale);
|
||||
}
|
||||
else if (ob->type == OB_FONT) {
|
||||
Curve *cu = ob->data;
|
||||
@ -561,7 +564,9 @@ static int apply_objects_internal(bContext *C, ReportList *reports, bool apply_l
|
||||
tb->h *= scale;
|
||||
}
|
||||
|
||||
cu->fsize *= scale;
|
||||
if (do_props) {
|
||||
cu->fsize *= scale;
|
||||
}
|
||||
}
|
||||
else if (ob->type == OB_CAMERA) {
|
||||
MovieClip *clip = BKE_object_movieclip_get(scene, ob, false);
|
||||
@ -677,9 +682,10 @@ static int object_transform_apply_exec(bContext *C, wmOperator *op)
|
||||
const bool loc = RNA_boolean_get(op->ptr, "location");
|
||||
const bool rot = RNA_boolean_get(op->ptr, "rotation");
|
||||
const bool sca = RNA_boolean_get(op->ptr, "scale");
|
||||
const bool do_props = RNA_boolean_get(op->ptr, "properties");
|
||||
|
||||
if (loc || rot || sca) {
|
||||
return apply_objects_internal(C, op->reports, loc, rot, sca);
|
||||
return apply_objects_internal(C, op->reports, loc, rot, sca, do_props);
|
||||
}
|
||||
else {
|
||||
/* allow for redo */
|
||||
@ -704,6 +710,8 @@ void OBJECT_OT_transform_apply(wmOperatorType *ot)
|
||||
RNA_def_boolean(ot->srna, "location", 0, "Location", "");
|
||||
RNA_def_boolean(ot->srna, "rotation", 0, "Rotation", "");
|
||||
RNA_def_boolean(ot->srna, "scale", 0, "Scale", "");
|
||||
RNA_def_boolean(ot->srna, "properties", true, "Apply Properties",
|
||||
"Modify properties such as curve vertex radius, font size and bone envelope");
|
||||
}
|
||||
|
||||
/********************* Set Object Center ************************/
|
||||
|
@ -480,7 +480,7 @@ static int rna_Armature_is_editmode_get(PointerRNA *ptr)
|
||||
|
||||
static void rna_Armature_transform(struct bArmature *arm, float *mat)
|
||||
{
|
||||
ED_armature_transform(arm, (float (*)[4])mat);
|
||||
ED_armature_transform(arm, (float (*)[4])mat, true);
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -45,7 +45,7 @@
|
||||
#ifdef RNA_RUNTIME
|
||||
static void rna_Curve_transform(Curve *cu, float *mat, int shape_keys)
|
||||
{
|
||||
BKE_curve_transform(cu, (float (*)[4])mat, shape_keys);
|
||||
BKE_curve_transform(cu, (float (*)[4])mat, shape_keys, true);
|
||||
|
||||
DAG_id_tag_update(&cu->id, 0);
|
||||
}
|
||||
|
@ -45,7 +45,7 @@
|
||||
#ifdef RNA_RUNTIME
|
||||
static void rna_Meta_transform(struct MetaBall *mb, float *mat)
|
||||
{
|
||||
BKE_mball_transform(mb, (float (*)[4])mat);
|
||||
BKE_mball_transform(mb, (float (*)[4])mat, true);
|
||||
|
||||
DAG_id_tag_update(&mb->id, 0);
|
||||
}
|
||||
|
@ -355,7 +355,7 @@ int WM_enum_search_invoke(struct bContext *C, struct wmOperator *op, const struc
|
||||
void WM_event_add_notifier(const struct bContext *C, unsigned int type, void *reference) RET_NONE
|
||||
void WM_main_add_notifier(unsigned int type, void *reference) RET_NONE
|
||||
void ED_armature_bone_rename(struct bArmature *arm, const char *oldnamep, const char *newnamep) RET_NONE
|
||||
void ED_armature_transform(struct bArmature *arm, float mat[4][4]) RET_NONE
|
||||
void ED_armature_transform(struct bArmature *arm, float mat[4][4], const bool do_props) RET_NONE
|
||||
struct wmEventHandler *WM_event_add_modal_handler(struct bContext *C, struct wmOperator *op) RET_NULL
|
||||
struct wmTimer *WM_event_add_timer(struct wmWindowManager *wm, struct wmWindow *win, int event_type, double timestep) RET_NULL
|
||||
void WM_event_remove_timer(struct wmWindowManager *wm, struct wmWindow *win, struct wmTimer *timer) RET_NONE
|
||||
|
Loading…
Reference in New Issue
Block a user