Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/transform/transform_convert_cursor.c
| Show All 27 Lines | |||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| #include "BKE_context.h" | #include "BKE_context.h" | ||||
| #include "BKE_report.h" | #include "BKE_report.h" | ||||
| #include "BKE_scene.h" | #include "BKE_scene.h" | ||||
| #include "transform.h" | #include "transform.h" | ||||
| #include "transform_convert.h" | #include "transform_convert.h" | ||||
| #include "transform_data.h" | |||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Cursor Transform Creation | /** \name Cursor Transform Creation | ||||
| * | * | ||||
| * Instead of transforming the selection, move the 2D/3D cursor. | * Instead of transforming the selection, move the 2D/3D cursor. | ||||
| * | * | ||||
| * \{ */ | * \{ */ | ||||
| void createTransCursor_image(TransInfo *t) | void createTransCursor_image(TransInfo *t) | ||||
| { | { | ||||
| TransData *td; | |||||
| SpaceImage *sima = t->area->spacedata.first; | SpaceImage *sima = t->area->spacedata.first; | ||||
| float *cursor_location = sima->cursor; | float *cursor_location = sima->cursor; | ||||
| { | |||||
| 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; | ||||
| td = tc->data = MEM_callocN(sizeof(TransData), "TransTexspace"); | TransData *td = tc->data = transform_data_alloc(tc->data_len, TD_BASIC_COMP); | ||||
| td->ext = tc->data_ext = MEM_callocN(sizeof(TransDataExtension), "TransTexspace"); | const int tdi = 0; | ||||
| } | |||||
| td->flag = TD_SELECTED; | |||||
| copy_v3_v3(td->center, cursor_location); | |||||
| td->ob = NULL; | |||||
| unit_m3(td->mtx); | |||||
| unit_m3(td->axismtx); | |||||
| pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON); | |||||
| td->loc = cursor_location; | td->basic[tdi].loc = cursor_location; | ||||
| copy_v3_v3(td->iloc, cursor_location); | copy_v3_v3(td->basic[tdi].iloc, cursor_location); | ||||
| copy_v3_v3(td->center[tdi], cursor_location); | |||||
| unit_m3(td->space[tdi].mtx); | |||||
| unit_m3(td->space[tdi].smtx); | |||||
| unit_m3(td->space[tdi].axismtx); | |||||
| td->basic[tdi].flag = TD_SELECTED; | |||||
| } | } | ||||
| void createTransCursor_view3d(TransInfo *t) | void createTransCursor_view3d(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; | ||||
| } | } | ||||
| View3DCursor *cursor = &scene->cursor; | View3DCursor *cursor = &scene->cursor; | ||||
| { | float axismtx[3][3]; | ||||
| BKE_scene_cursor_rot_to_mat3(cursor, axismtx); | |||||
| normalize_m3(axismtx); | |||||
| 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; | ||||
| td = tc->data = MEM_callocN(sizeof(TransData), "TransTexspace"); | TransData *td = tc->data = transform_data_alloc(tc->data_len, TD_ALL_COMP); | ||||
| td->ext = tc->data_ext = MEM_callocN(sizeof(TransDataExtension), "TransTexspace"); | TransDataExtension *ext = &td->ext[0]; | ||||
| } | const int tdi = 0; | ||||
| td->flag = TD_SELECTED; | |||||
| copy_v3_v3(td->center, cursor->location); | |||||
| td->ob = NULL; | |||||
| unit_m3(td->mtx); | |||||
| BKE_scene_cursor_rot_to_mat3(cursor, td->axismtx); | |||||
| normalize_m3(td->axismtx); | |||||
| pseudoinverse_m3_m3(td->smtx, td->mtx, PSEUDOINVERSE_EPSILON); | |||||
| td->loc = cursor->location; | |||||
| copy_v3_v3(td->iloc, cursor->location); | |||||
| if (cursor->rotation_mode > 0) { | if (cursor->rotation_mode > 0) { | ||||
| td->ext->rot = cursor->rotation_euler; | ext->rot = cursor->rotation_euler; | ||||
| td->ext->rotAxis = NULL; | ext->rotAxis = NULL; | ||||
| td->ext->rotAngle = NULL; | ext->rotAngle = NULL; | ||||
| td->ext->quat = NULL; | ext->quat = NULL; | ||||
| copy_v3_v3(td->ext->irot, cursor->rotation_euler); | copy_v3_v3(ext->irot, cursor->rotation_euler); | ||||
| } | } | ||||
| else if (cursor->rotation_mode == ROT_MODE_AXISANGLE) { | else if (cursor->rotation_mode == ROT_MODE_AXISANGLE) { | ||||
| td->ext->rot = NULL; | ext->rot = NULL; | ||||
| td->ext->rotAxis = cursor->rotation_axis; | ext->rotAxis = cursor->rotation_axis; | ||||
| td->ext->rotAngle = &cursor->rotation_angle; | ext->rotAngle = &cursor->rotation_angle; | ||||
| td->ext->quat = NULL; | ext->quat = NULL; | ||||
| td->ext->irotAngle = cursor->rotation_angle; | ext->irotAngle = cursor->rotation_angle; | ||||
| copy_v3_v3(td->ext->irotAxis, cursor->rotation_axis); | copy_v3_v3(ext->irotAxis, cursor->rotation_axis); | ||||
| } | } | ||||
| else { | else { | ||||
| td->ext->rot = NULL; | ext->rot = NULL; | ||||
| td->ext->rotAxis = NULL; | ext->rotAxis = NULL; | ||||
| td->ext->rotAngle = NULL; | ext->rotAngle = NULL; | ||||
| td->ext->quat = cursor->rotation_quaternion; | ext->quat = cursor->rotation_quaternion; | ||||
| copy_qt_qt(td->ext->iquat, cursor->rotation_quaternion); | copy_qt_qt(ext->iquat, cursor->rotation_quaternion); | ||||
| } | } | ||||
| td->ext->rotOrder = cursor->rotation_mode; | ext->rotOrder = cursor->rotation_mode; | ||||
| td->basic[tdi].loc = cursor->location; | |||||
| copy_v3_v3(td->basic[tdi].iloc, cursor->location); | |||||
| copy_v3_v3(td->center[tdi], cursor->location); | |||||
| unit_m3(td->space[tdi].mtx); | |||||
| unit_m3(td->space[tdi].smtx); | |||||
| unit_m3(td->space[tdi].axismtx); | |||||
| td->basic[tdi].flag = TD_SELECTED; | |||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||