Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/transform/transform_convert_sculpt.c
| Show All 25 Lines | |||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| #include "BKE_context.h" | #include "BKE_context.h" | ||||
| #include "BKE_paint.h" | #include "BKE_paint.h" | ||||
| #include "BKE_report.h" | #include "BKE_report.h" | ||||
| #include "transform.h" | #include "transform.h" | ||||
| #include "transform_convert.h" | #include "transform_convert.h" | ||||
| #include "transform_data.h" | |||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Sculpt Transform Creation | /** \name Sculpt Transform Creation | ||||
| * | * | ||||
| * \{ */ | * \{ */ | ||||
| void createTransSculpt(TransInfo *t) | void createTransSculpt(TransInfo *t) | ||||
| { | { | ||||
| TransData *td; | |||||
| Scene *scene = t->scene; | Scene *scene = t->scene; | ||||
| if (ID_IS_LINKED(scene)) { | if (ID_IS_LINKED(scene)) { | ||||
| BKE_report(t->reports, RPT_ERROR, "Linked data can't text-space transform"); | BKE_report(t->reports, RPT_ERROR, "Linked data can't text-space transform"); | ||||
| return; | return; | ||||
| } | } | ||||
| Object *ob = CTX_data_active_object(t->context); | Object *ob = CTX_data_active_object(t->context); | ||||
| SculptSession *ss = ob->sculpt; | SculptSession *ss = ob->sculpt; | ||||
| float center[3]; | |||||
| copy_v3_v3(center, ss->pivot_pos); | |||||
| mul_m4_v3(ob->obmat, center); | |||||
| if (is_zero_v4(ss->pivot_rot)) { | |||||
| ss->pivot_rot[3] = 1.0f; | |||||
| } | |||||
| { | |||||
| BLI_assert(t->data_container_len == 1); | BLI_assert(t->data_container_len == 1); | ||||
| TransDataContainer *tc = t->data_container; | TransDataContainer *tc = t->data_container; | ||||
| tc->data_len = 1; | tc->data_len = 1; | ||||
| tc->is_active = 1; | tc->is_active = 1; | ||||
| td = tc->data = MEM_callocN(sizeof(TransData), "TransSculpt"); | TransData *td = tc->data = transform_data_alloc(tc->data_len, TD_ALL_COMP); | ||||
| td->ext = tc->data_ext = MEM_callocN(sizeof(TransDataExtension), "TransSculpt"); | TransDataExtension *ext = &td->ext[0]; | ||||
| } | const int tdi = 0; | ||||
| td->flag = TD_SELECTED; | |||||
| copy_v3_v3(td->center, ss->pivot_pos); | |||||
| mul_m4_v3(ob->obmat, td->center); | |||||
| td->ob = ob; | |||||
| td->loc = ss->pivot_pos; | |||||
| copy_v3_v3(td->iloc, ss->pivot_pos); | |||||
| if (is_zero_v4(ss->pivot_rot)) { | |||||
| ss->pivot_rot[3] = 1.0f; | |||||
| } | |||||
| float obmat_inv[3][3]; | float obmat_inv[3][3]; | ||||
| copy_m3_m4(obmat_inv, ob->obmat); | copy_m3_m4(obmat_inv, ob->obmat); | ||||
| invert_m3(obmat_inv); | invert_m3(obmat_inv); | ||||
| td->ext->rot = NULL; | ext->rot = NULL; | ||||
| td->ext->rotAxis = NULL; | ext->rotAxis = NULL; | ||||
| td->ext->rotAngle = NULL; | ext->rotAngle = NULL; | ||||
| td->ext->quat = ss->pivot_rot; | ext->quat = ss->pivot_rot; | ||||
| copy_m4_m4(td->ext->obmat, ob->obmat); | copy_m4_m4(ext->obmat, ob->obmat); | ||||
| copy_m3_m3(td->ext->l_smtx, obmat_inv); | copy_m3_m3(ext->l_smtx, obmat_inv); | ||||
| copy_m3_m4(td->ext->r_mtx, ob->obmat); | copy_m3_m4(ext->r_mtx, ob->obmat); | ||||
| copy_m3_m3(td->ext->r_smtx, obmat_inv); | copy_m3_m3(ext->r_smtx, obmat_inv); | ||||
| copy_qt_qt(td->ext->iquat, ss->pivot_rot); | copy_qt_qt(ext->iquat, ss->pivot_rot); | ||||
| td->ext->rotOrder = ROT_MODE_QUAT; | ext->rotOrder = ROT_MODE_QUAT; | ||||
| ss->pivot_scale[0] = 1.0f; | ss->pivot_scale[0] = 1.0f; | ||||
| ss->pivot_scale[1] = 1.0f; | ss->pivot_scale[1] = 1.0f; | ||||
| ss->pivot_scale[2] = 1.0f; | ss->pivot_scale[2] = 1.0f; | ||||
| td->ext->size = ss->pivot_scale; | ext->size = ss->pivot_scale; | ||||
| copy_v3_v3(ss->init_pivot_scale, ss->pivot_scale); | copy_v3_v3(ss->init_pivot_scale, ss->pivot_scale); | ||||
| copy_v3_v3(td->ext->isize, ss->init_pivot_scale); | copy_v3_v3(ext->isize, ss->init_pivot_scale); | ||||
| copy_m3_m3(td->smtx, obmat_inv); | float mtx[3][3], axismtx[3][3]; | ||||
| copy_m3_m4(td->mtx, ob->obmat); | copy_m3_m4(mtx, ob->obmat); | ||||
| copy_m3_m4(td->axismtx, ob->obmat); | copy_m3_m4(axismtx, ob->obmat); | ||||
| normalize_m3(axismtx); | |||||
| td->object[tdi].ob = ob; | |||||
| td->basic[tdi].loc = ss->pivot_pos; | |||||
| copy_v3_v3(td->basic[tdi].iloc, ss->pivot_pos); | |||||
| copy_v3_v3(td->center[tdi], center); | |||||
| copy_m3_m3(td->space[tdi].mtx, mtx); | |||||
| copy_m3_m3(td->space[tdi].smtx, obmat_inv); | |||||
| copy_m3_m3(td->space[tdi].axismtx, axismtx); | |||||
| td->basic[tdi].flag = TD_SELECTED; | |||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||