Blender V5.0
transform.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BLI_function_ref.hh"
13
14#include "ED_numinput.hh"
15#include "ED_transform.hh"
16#include "ED_view3d.hh"
17
18#include "DNA_listBase.h"
20
21#include "DEG_depsgraph.hh"
22
23/* -------------------------------------------------------------------- */
26
27#define T_ALL_RESTRICTIONS (T_NO_CONSTRAINT | T_NULL_ONE)
28#define T_PROP_EDIT_ALL (T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED)
29
30/* Hard min/max for proportional size. */
31#define T_PROP_SIZE_MIN 1e-6f
32#define T_PROP_SIZE_MAX 1e12f
33
34#define TRANSFORM_SNAP_MAX_PX 100.0f
35#define TRANSFORM_DIST_INVALID -FLT_MAX
36
37#define TRANS_DATA_CONTAINER_FIRST_OK(t) (&(t)->data_container[0])
38/* For cases we _know_ there is only one handle. */
39#define TRANS_DATA_CONTAINER_FIRST_SINGLE(t) \
40 (BLI_assert((t)->data_container_len == 1), (&(t)->data_container[0]))
41
42#define FOREACH_TRANS_DATA_CONTAINER(t, th) \
43 for (TransDataContainer *tc = (t)->data_container, \
44 *tc_end = (t)->data_container + (t)->data_container_len; \
45 th != tc_end; \
46 th++)
47
48#define FOREACH_TRANS_DATA_CONTAINER_INDEX(t, th, i) \
49 for (TransDataContainer *tc = ((i = 0), (t)->data_container), \
50 *tc_end = (t)->data_container + (t)->data_container_len; \
51 th != tc_end; \
52 th++, i++)
53
55
56/* -------------------------------------------------------------------- */
59
60struct ARegion;
61struct bConstraint;
62struct Depsgraph;
63struct NumInput;
64struct Object;
65struct RNG;
66struct ReportList;
67struct Scene;
68struct ScrArea;
69struct ViewLayer;
70struct ViewOpsData;
71struct bContext;
72struct wmEvent;
73struct wmKeyConfig;
74struct wmKeyMap;
75struct wmMsgBus;
76struct wmOperator;
77struct wmTimer;
78
80
81/* -------------------------------------------------------------------- */
84
85namespace blender::ed::transform {
86
87struct TransSnap;
88struct TransConvertTypeInfo;
89struct TransDataContainer;
90struct TransInfo;
91struct TransModeInfo;
92struct TransSeqSnapData;
93struct SnapObjectContext;
94
98
99 /* These are similar to TransInfo::data_type. */
100 CTX_CAMERA = (1 << 0),
101 CTX_CURSOR = (1 << 1),
102 CTX_EDGE_DATA = (1 << 2),
104 CTX_MASK = (1 << 4),
105 CTX_MOVIECLIP = (1 << 5),
106 CTX_OBJECT = (1 << 6),
107 CTX_PAINT_CURVE = (1 << 7),
108 CTX_POSE_BONE = (1 << 8),
111
112 CTX_NO_PET = (1 << 11),
113 CTX_AUTOCONFIRM = (1 << 12),
120};
122
123
124enum eTFlag {
126 T_EDIT = 1 << 0,
128 T_POINTS = 1 << 1,
131 T_NULL_ONE = 1 << 3,
132
133 T_PROP_EDIT = 1 << 4,
136
137 T_V3D_ALIGN = 1 << 7,
139 T_2D_EDIT = 1 << 8,
140 T_CLIP_UV = 1 << 9,
141
143 T_AUTOIK = 1 << 10,
144
146 T_NO_MIRROR = 1 << 11,
147
151
153 T_MODAL = 1 << 13,
154
156 T_NO_PROJECT = 1 << 14,
157
159
162
165
167
169
171 T_AUTOMERGE = 1 << 20,
173 T_AUTOSPLIT = 1 << 21,
174
177
180
182 T_NO_GIZMO = 1 << 24,
183
185
188
190 T_ORIGIN = 1 << 27,
191};
193
208
209
210enum eTSnap {
213 /* Special flag for snap to grid. */
216};
218
219
221 DIR_GLOBAL_X = (1 << 0),
222 DIR_GLOBAL_Y = (1 << 1),
223 DIR_GLOBAL_Z = (1 << 2),
224};
226
227
230 CON_APPLY = 1 << 0,
232 CON_AXIS0 = 1 << 1,
233 CON_AXIS1 = 1 << 2,
234 CON_AXIS2 = 1 << 3,
235 CON_SELECT = 1 << 4,
236 CON_USER = 1 << 5,
237};
239
240
247
255
256
268
274
276
277/* -------------------------------------------------------------------- */
282
283enum {
301
302 /* 18 and 19 used by number-input, defined in `ED_numinput.hh`. */
303 // NUM_MODAL_INCREMENT_UP = 18,
304 // NUM_MODAL_INCREMENT_DOWN = 19,
305
310
313
318
321
323
327
330
332
334
336};
337
339
340/* -------------------------------------------------------------------- */
343
345enum {
346 TD_SELECTED = 1 << 0,
347 TD_USEQUAT = 1 << 1,
348 /* TD_NOTCONNECTED = 1 << 2, */
353 TD_NOCENTER = 1 << 5,
355 TD_NO_EXT = 1 << 6,
357 TD_SKIP = 1 << 7,
362 TD_BEZTRIPLE = 1 << 8,
364 TD_NO_LOC = 1 << 9,
366 TD_NOTIMESNAP = 1 << 10,
371 TD_INTVALUES = 1 << 11,
373 TD_MIRROR_X = 1 << 12,
374 TD_MIRROR_Y = 1 << 13,
375 TD_MIRROR_Z = 1 << 14,
376#define TD_MIRROR_EDGE_AXIS_SHIFT 12
382 TD_MOVEHANDLE1 = 1 << 15,
383 TD_MOVEHANDLE2 = 1 << 16,
391 /* Grease pencil layer frames. */
393};
394
398 void *extra;
400 float *loc;
402 float iloc[3];
404 float center[3];
406 float *val;
408 float ival;
410 int flag;
411};
412
415 float *loc_src;
416};
417
421 float drot[3];
422#if 0 /* TODO: not yet implemented. */
423 /* Initial object `drotAngle`. */
424 float drotAngle;
425 /* Initial object `drotAxis`. */
426 float drotAxis[3];
427#endif
429 float dquat[4];
431 float dscale[3];
433 float *rot;
435 float irot[3];
437 float *quat;
439 float iquat[4];
441 float *rotAngle;
445 float *rotAxis;
447 float irotAxis[4];
452 float *scale;
454 float iscale[3];
456 float obmat[4][4];
458 float axismtx_gimbal[3][3];
461 float l_smtx[3][3];
467 float r_mtx[3][3];
469 float r_smtx[3][3];
473 float oloc[3], orot[3], oquat[4], orotAxis[3], orotAngle;
474
480};
481
484 float loc[3];
485 union {
487 float *loc2d;
489 };
491 float *h1, *h2;
492 float ih1[2], ih2[2];
493};
494
500 uint8_t ih1, ih2;
501 uint8_t *h1, *h2;
502};
503
504struct TransData : public TransDataBasic {
506 float dist;
508 float rdist;
510 float factor;
512 float mtx[3][3];
514 float smtx[3][3];
516 float axismtx[3][3];
523};
524
525/* -------------------------------------------------------------------- */
528
531 float co[3];
532};
533
534struct TransSnap {
535 /* Snapping options stored as flags. */
537 /* Method(s) used for snapping source to target. */
539 /* Part of source to snap to target. */
541 /* Determines which objects are possible target. */
545 /* Snapped Element Type (currently for objects only). */
548 /* For independent snapping in different directions (currently used only by VSE preview). */
551 float snap_source[3];
553 float snap_target[3];
554 float snapNormal[3];
557 double last;
558 void (*snap_target_fn)(TransInfo *, float *);
560
564 union {
567 };
568};
569
570struct TransCon {
572 char text[50];
574 float pmtx[3][3];
577 void (*drawExtra)(TransInfo *t);
578
579 /* NOTE: if 'tc' is NULL, 'td' must also be NULL.
580 * For constraints that needs to draw differently from the other
581 * uses this instead of the generic draw function. */
582
585 void (*applyVec)(const TransInfo *t,
586 const TransDataContainer *tc,
587 const TransData *td,
588 const float in[3],
589 float r_out[3]);
591 void (*applySize)(const TransInfo *t,
592 const TransDataContainer *tc,
593 const TransData *td,
594 float r_smat[3][3]);
596 void (*applyRot)(const TransInfo *t,
597 const TransDataContainer *tc,
598 const TransData *td,
599 float r_axis[3]);
600};
601
603 void (*apply)(TransInfo *t, MouseInput *mi, const double mval[2], float output[3]);
604 void (*post)(TransInfo *t, float values[3]);
605
609 float factor;
612
614 void *data;
615
625 struct {
629};
630
632 void *data;
634 unsigned int use_free : 1;
635};
636
651#define TRANS_CUSTOM_DATA_ELEM_MAX (sizeof(TransCustomDataContainer) / sizeof(TransCustomData))
652
676
683
685
686 float mat[4][4];
687 float imat[4][4];
689 float mat3[3][3];
690 float imat3[3][3];
691
693 float mat3_unit[3][3];
694
697
699 float center_local[3];
700
706
713
715 union {
716 struct {
720 };
721 /* For easy checking. */
723 };
724
726
745
758 bool foreach_index(FunctionRef<bool(int)> fn) const
759 {
760 if (this->sorted_index_map) {
761 for (const int i : Span(this->sorted_index_map, this->data_len)) {
762 if (!fn(i)) {
763 return false;
764 }
765 }
766 }
767 else {
768 for (const int i : IndexRange(this->data_len)) {
769 if (!fn(i)) {
770 return false;
771 }
772 }
773 }
774 return true;
775 }
776
785 void foreach_index_selected(FunctionRef<void(int)> fn) const
786 {
787 this->foreach_index([&](const int i) {
788 const bool is_selected = (this->data[i].flag & TD_SELECTED);
789 if (!is_selected) {
790 /* Selected items are sorted first. Either this is trivially true
791 * (proportional editing off, so the only transformed data is the
792 * selected data) or it's handled by `sorted_index_map`. */
793 return false;
794 }
795 fn(i);
796 return true;
797 });
798 }
799};
800
801struct TransInfo {
804
808
811
816
829
832
835
838
841
845 char proptext[20];
850 float aspect[3];
854 float center2d[2];
856 short idx_max;
861 float snap_spatial[3];
869
871 float viewmat[4][4];
873 float viewinv[4][4];
875 float persmat[4][4];
876 float persinv[4][4];
877 short persp;
878 short around;
883
885 float vec[3];
887 float mat[3][3];
888
890 float spacemtx[3][3];
891 float spacemtx_inv[3][3];
893 char spacename[/*MAX_NAME*/ 64];
894
895 /*************** NEW STUFF *********************/
903
905
906 struct {
907 short type;
908 float matrix[3][3];
909 } orient[3];
910
912
918
920
922 float values[4];
923
926
930 float values_final[4];
931
934
935 /* Axis members for modes that use an axis separate from the orientation (rotate & shear). */
936
941
944
945 void *view;
951 Depsgraph *depsgraph;
963 float zfac;
967
970
972
975
976 /* Needed for sculpt transform. */
977 const char *undo_name;
978};
979
981
982/* -------------------------------------------------------------------- */
985
991bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *event, int mode);
999
1001void setTransformViewAspect(TransInfo *t, float r_aspect[3]);
1002void convertViewVec(TransInfo *t, float r_vec[3], double dx, double dy);
1006void projectFloatViewCenterFallback(TransInfo *t, float adr[2]);
1007void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], eV3DProjTest flag);
1008void projectIntView(TransInfo *t, const float vec[3], int adr[2]);
1009void projectFloatViewEx(TransInfo *t, const float vec[3], float adr[2], eV3DProjTest flag);
1010void projectFloatView(TransInfo *t, const float vec[3], float adr[2]);
1011
1012void applyAspectRatio(TransInfo *t, float vec[2]);
1013void removeAspectRatio(TransInfo *t, float vec[2]);
1014
1019
1023bool transform_apply_matrix(TransInfo *t, float mat[4][4]);
1024void transform_final_value_get(const TransInfo *t, float *value, int value_num);
1025void view_vector_calc(const TransInfo *t, const float focus[3], float r_vec[3]);
1026
1028
1029/* -------------------------------------------------------------------- */
1032
1034void transform_view_vector_calc(const TransInfo *t, const float focus[3], float r_vec[3]);
1035bool transdata_check_local_islands(TransInfo *t, short around);
1036
1038
1039/* -------------------------------------------------------------------- */
1042
1061
1062void initMouseInput(
1063 TransInfo *t, MouseInput *mi, const float2 &center, const float2 &mval, bool precision);
1064void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode);
1065void applyMouseInput(TransInfo *t, MouseInput *mi, const float2 &mval, float output[3]);
1066void transform_input_update(TransInfo *t, const float fac);
1067void transform_input_virtual_mval_reset(TransInfo *t);
1068void transform_input_reset(TransInfo *t, const float2 &mval);
1069
1070void setCustomPoints(TransInfo *t, MouseInput *mi, const int mval_start[2], const int mval_end[2]);
1071void setCustomPointsFromDirection(TransInfo *t, MouseInput *mi, const float2 &dir);
1072void setInputPostFct(MouseInput *mi, void (*post)(TransInfo *t, float values[3]));
1073
1075
1076/* -------------------------------------------------------------------- */
1079
1087void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *event);
1091void freeTransCustomDataForMode(TransInfo *t);
1096void postTrans(bContext *C, TransInfo *t);
1100void resetTransModal(TransInfo *t);
1101void resetTransRestrictions(TransInfo *t);
1102
1103void restoreTransObjects(TransInfo *t);
1104
1105void calculateCenter2D(TransInfo *t);
1106void calculateCenterLocal(TransInfo *t, const float center_global[3]);
1107
1108void calculateCenter(TransInfo *t);
1113void transformViewUpdate(TransInfo *t);
1114
1115/* API functions for getting center points. */
1116void calculateCenterBound(TransInfo *t, float r_center[3]);
1117void calculateCenterMedian(TransInfo *t, float r_center[3]);
1118void calculateCenterCursor(TransInfo *t, float r_center[3]);
1119void calculateCenterCursor2D(TransInfo *t, float r_center[2]);
1120void calculateCenterCursorGraph2D(TransInfo *t, float r_center[2]);
1124bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3]);
1125
1126void calculatePropRatio(TransInfo *t);
1127
1133void transform_data_ext_rotate(TransData *td,
1134 TransDataExtension *td_ext,
1135 float mat[3][3],
1136 bool use_drot);
1137
1139
1140void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData *custom_data);
1141
1142/* TODO: move to: `transform_query.c`. */
1143bool checkUseAxisMatrix(TransInfo *t);
1144
1146
1147} // namespace blender::ed::transform
unsigned int uint
#define ENUM_OPERATORS(_type, _max)
These structs are the foundation for all linked lists in the library system.
eSnapSourceOP
eSnapTargetOP
eV3DProjTest
Definition ED_view3d.hh:278
#define C
Definition RandGen.cpp:29
#define in
#define output
void calculateCenter(TransInfo *t)
void calculateCenterLocal(TransInfo *t, const float center_global[3])
void transformApply(bContext *C, TransInfo *t)
void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
void setTransformViewMatrices(TransInfo *t)
void resetTransRestrictions(TransInfo *t)
wmKeyMap * transform_modal_keymap(wmKeyConfig *keyconf)
void calculateCenterMedian(TransInfo *t, float r_center[3])
bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3])
void calculateCenter2D(TransInfo *t)
void transform_input_virtual_mval_reset(TransInfo *t)
void setCustomPointsFromDirection(TransInfo *t, MouseInput *mi, const float2 &dir)
void projectFloatView(TransInfo *t, const float vec[3], float adr[2])
void calculateCenterBound(TransInfo *t, float r_center[3])
void view_vector_calc(const TransInfo *t, const float focus[3], float r_vec[3])
void transform_input_reset(TransInfo *t, const float2 &mval)
void initMouseInput(TransInfo *t, MouseInput *mi, const float2 &center, const float2 &mval, bool precision)
void convertViewVec(TransInfo *t, float r_vec[3], double dx, double dy)
void setCustomPoints(TransInfo *t, MouseInput *mi, const int mval_start[2], const int mval_end[2])
void restoreTransObjects(TransInfo *t)
void setInputPostFct(MouseInput *mi, void(*post)(TransInfo *t, float values[3]))
void freeTransCustomDataForMode(TransInfo *t)
Object * transform_object_deform_pose_armature_get(const TransInfo *t, Object *ob)
void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData *custom_data)
void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
void resetTransModal(TransInfo *t)
void transform_view_vector_calc(const TransInfo *t, const float focus[3], float r_vec[3])
void projectFloatViewEx(TransInfo *t, const float vec[3], float adr[2], const eV3DProjTest flag)
void applyMouseInput(TransInfo *t, MouseInput *mi, const float2 &mval, float output[3])
void projectIntView(TransInfo *t, const float vec[3], int adr[2])
void setTransformViewAspect(TransInfo *t, float r_aspect[3])
void projectFloatViewCenterFallback(TransInfo *t, float adr[2])
void transformViewUpdate(TransInfo *t)
void calculateCenterCursor2D(TransInfo *t, float r_center[2])
wmOperatorStatus transformEvent(TransInfo *t, wmOperator *op, const wmEvent *event)
void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *event)
void removeAspectRatio(TransInfo *t, float vec[2])
void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const eV3DProjTest flag)
void calculateCenterCursorGraph2D(TransInfo *t, float r_center[2])
void transform_input_update(TransInfo *t, const float fac)
void transform_data_ext_rotate(TransData *td, TransDataExtension *td_ext, float mat[3][3], bool use_drot)
void transform_final_value_get(const TransInfo *t, float *value, const int value_num)
wmOperatorStatus transformEnd(bContext *C, TransInfo *t)
void calculateCenterCursor(TransInfo *t, float r_center[3])
void calculatePropRatio(TransInfo *t)
bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *event, int mode)
void postTrans(bContext *C, TransInfo *t)
bool transform_apply_matrix(TransInfo *t, float mat[4][4])
void applyAspectRatio(TransInfo *t, float vec[2])
bool transdata_check_local_islands(TransInfo *t, short around)
VecBase< double, 2 > double2
VecBase< float, 2 > float2
VecBase< float, 3 > float3
Definition rand.cc:33
struct blender::ed::transform::MouseInput::@171313233360161344014275033122255027030213271133 virtual_mval
void(* apply)(TransInfo *t, MouseInput *mi, const double mval[2], float output[3])
Definition transform.hh:603
void(* post)(TransInfo *t, float values[3])
Definition transform.hh:604
void(* applyRot)(const TransInfo *t, const TransDataContainer *tc, const TransData *td, float r_axis[3])
Definition transform.hh:596
void(* applySize)(const TransInfo *t, const TransDataContainer *tc, const TransData *td, float r_smat[3][3])
Definition transform.hh:591
void(* applyVec)(const TransInfo *t, const TransDataContainer *tc, const TransData *td, const float in[3], float r_out[3])
Definition transform.hh:585
void(* drawExtra)(TransInfo *t)
Definition transform.hh:577
void(* free_cb)(TransInfo *, TransDataContainer *tc, TransCustomData *custom_data)
Definition transform.hh:633
bool foreach_index(FunctionRef< bool(int)> fn) const
Definition transform.hh:758
void foreach_index_selected(FunctionRef< void(int)> fn) const
Definition transform.hh:785
TransDataCurveHandleFlags * hdata
Definition transform.hh:520
TransConvertTypeInfo * data_type
Definition transform.hh:810
TransCustomDataContainer custom
Definition transform.hh:974
struct blender::ed::transform::TransInfo::@342160341045112220003361360177273117120157367076 orient[3]
TransDataContainer * data_container
Definition transform.hh:802
SnapObjectContext * object_context
Definition transform.hh:565
void(* snap_source_fn)(TransInfo *)
Definition transform.hh:559
void(* snap_target_fn)(TransInfo *, float *)
Definition transform.hh:558
i
Definition text_draw.cc:230
uint8_t flag
Definition wm_window.cc:145