Blender V4.5
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
207
208
209enum eTSnap {
212 /* Special flag for snap to grid. */
215};
217
218
220 DIR_GLOBAL_X = (1 << 0),
221 DIR_GLOBAL_Y = (1 << 1),
222 DIR_GLOBAL_Z = (1 << 2),
223};
225
226
229 CON_APPLY = 1 << 0,
231 CON_AXIS0 = 1 << 1,
232 CON_AXIS1 = 1 << 2,
233 CON_AXIS2 = 1 << 3,
234 CON_SELECT = 1 << 4,
236 CON_NOFLIP = 1 << 5,
237 CON_USER = 1 << 6,
238};
240
241
248
256
257
269
275
277
278/* -------------------------------------------------------------------- */
283
284enum {
302
303 /* 18 and 19 used by number-input, defined in `ED_numinput.hh`. */
304 // NUM_MODAL_INCREMENT_UP = 18,
305 // NUM_MODAL_INCREMENT_DOWN = 19,
306
311
314
319
322
324
328
331
333
335};
336
338
339/* -------------------------------------------------------------------- */
342
344enum {
345 TD_SELECTED = 1 << 0,
346 TD_USEQUAT = 1 << 1,
347 /* TD_NOTCONNECTED = 1 << 2, */
352 TD_NOCENTER = 1 << 5,
354 TD_NO_EXT = 1 << 6,
356 TD_SKIP = 1 << 7,
361 TD_BEZTRIPLE = 1 << 8,
363 TD_NO_LOC = 1 << 9,
365 TD_NOTIMESNAP = 1 << 10,
370 TD_INTVALUES = 1 << 11,
372 TD_MIRROR_X = 1 << 12,
373 TD_MIRROR_Y = 1 << 13,
374 TD_MIRROR_Z = 1 << 14,
375#define TD_MIRROR_EDGE_AXIS_SHIFT 12
381 TD_MOVEHANDLE1 = 1 << 15,
382 TD_MOVEHANDLE2 = 1 << 16,
390 /* Grease pencil layer frames. */
392};
393
397 void *extra;
399 float *loc;
401 float iloc[3];
403 float center[3];
405 float *val;
407 float ival;
409 int flag;
410};
411
414 float *loc_src;
415};
416
419 float drot[3];
420#if 0 /* TODO: not yet implemented. */
421 /* Initial object `drotAngle`. */
422 float drotAngle;
423 /* Initial object `drotAxis`. */
424 float drotAxis[3];
425#endif
427 float dquat[4];
429 float dscale[3];
431 float *rot;
433 float irot[3];
435 float *quat;
437 float iquat[4];
439 float *rotAngle;
443 float *rotAxis;
445 float irotAxis[4];
450 float *scale;
452 float iscale[3];
454 float obmat[4][4];
456 float axismtx_gimbal[3][3];
459 float l_smtx[3][3];
465 float r_mtx[3][3];
467 float r_smtx[3][3];
471 float oloc[3], orot[3], oquat[4], orotAxis[3], orotAngle;
472};
473
476 float loc[3];
477 union {
479 float *loc2d;
481 };
483 float *h1, *h2;
484 float ih1[2], ih2[2];
485};
486
492 uint8_t ih1, ih2;
493 uint8_t *h1, *h2;
494};
495
518
519/* -------------------------------------------------------------------- */
522
525 float co[3];
526};
527
528struct TransSnap {
529 /* Snapping options stored as flags. */
531 /* Method(s) used for snapping source to target. */
533 /* Part of source to snap to target. */
535 /* Determines which objects are possible target. */
539 /* Snapped Element Type (currently for objects only). */
542 /* For independent snapping in different directions (currently used only by VSE preview). */
545 float snap_source[3];
547 float snap_target[3];
548 float snapNormal[3];
551 double last;
552 void (*snap_target_fn)(TransInfo *, float *);
554
558 union {
561 };
562};
563
564struct TransCon {
566 char text[50];
568 float pmtx[3][3];
571 void (*drawExtra)(TransInfo *t);
572
573 /* NOTE: if 'tc' is NULL, 'td' must also be NULL.
574 * For constraints that needs to draw differently from the other
575 * uses this instead of the generic draw function. */
576
579 void (*applyVec)(const TransInfo *t,
580 const TransDataContainer *tc,
581 const TransData *td,
582 const float in[3],
583 float r_out[3]);
585 void (*applySize)(const TransInfo *t,
586 const TransDataContainer *tc,
587 const TransData *td,
588 float r_smat[3][3]);
590 void (*applyRot)(const TransInfo *t,
591 const TransDataContainer *tc,
592 const TransData *td,
593 float r_axis[3],
594 float *r_angle);
595};
596
598 void (*apply)(TransInfo *t, MouseInput *mi, const double mval[2], float output[3]);
599 void (*post)(TransInfo *t, float values[3]);
600
604 float factor;
607
609 void *data;
610
620 struct {
624};
625
627 void *data;
629 unsigned int use_free : 1;
630};
631
646#define TRANS_CUSTOM_DATA_ELEM_MAX (sizeof(TransCustomDataContainer) / sizeof(TransCustomData))
647
671
678
680
681 float mat[4][4];
682 float imat[4][4];
684 float mat3[3][3];
685 float imat3[3][3];
686
688 float mat3_unit[3][3];
689
692
694 float center_local[3];
695
701
708
710 union {
711 struct {
715 };
716 /* For easy checking. */
718 };
719
721
740
753 bool foreach_index(FunctionRef<bool(int)> fn) const
754 {
755 if (this->sorted_index_map) {
756 for (const int i : Span(this->sorted_index_map, this->data_len)) {
757 if (!fn(i)) {
758 return false;
759 }
760 }
761 }
762 else {
763 for (const int i : IndexRange(this->data_len)) {
764 if (!fn(i)) {
765 return false;
766 }
767 }
768 }
769 return true;
770 }
771
780 void foreach_index_selected(FunctionRef<void(int)> fn) const
781 {
782 this->foreach_index([&](const int i) {
783 const bool is_selected = (this->data[i].flag & TD_SELECTED);
784 if (!is_selected) {
785 /* Selected items are sorted first. Either this is trivially true
786 * (proportional editing off, so the only transformed data is the
787 * selected data) or it's handled by `sorted_index_map`. */
788 return false;
789 }
790 fn(i);
791 return true;
792 });
793 }
794};
795
796struct TransInfo {
799
803
806
811
824
827
830
833
836
840 char proptext[20];
845 float aspect[3];
849 float center2d[2];
851 short idx_max;
853 float snap[2];
855 float snap_spatial[3];
863
865 float viewmat[4][4];
867 float viewinv[4][4];
869 float persmat[4][4];
870 float persinv[4][4];
871 short persp;
872 short around;
877
879 float vec[3];
881 float mat[3][3];
882
884 float spacemtx[3][3];
885 float spacemtx_inv[3][3];
887 char spacename[/*MAX_NAME*/ 64];
888
889 /*************** NEW STUFF *********************/
897
899
900 struct {
901 short type;
902 float matrix[3][3];
903 } orient[3];
904
906
912
914
916 float values[4];
917
920
924 float values_final[4];
925
928
929 /* Axis members for modes that use an axis separate from the orientation (rotate & shear). */
930
935
938
939 void *view;
945 Depsgraph *depsgraph;
957 float zfac;
961
964
966
969
970 /* Needed for sculpt transform. */
971 const char *undo_name;
972};
973
975
976/* -------------------------------------------------------------------- */
979
985bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *event, int mode);
993
995void setTransformViewAspect(TransInfo *t, float r_aspect[3]);
996void convertViewVec(TransInfo *t, float r_vec[3], double dx, double dy);
1000void projectFloatViewCenterFallback(TransInfo *t, float adr[2]);
1001void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], eV3DProjTest flag);
1002void projectIntView(TransInfo *t, const float vec[3], int adr[2]);
1003void projectFloatViewEx(TransInfo *t, const float vec[3], float adr[2], eV3DProjTest flag);
1004void projectFloatView(TransInfo *t, const float vec[3], float adr[2]);
1005
1006void applyAspectRatio(TransInfo *t, float vec[2]);
1007void removeAspectRatio(TransInfo *t, float vec[2]);
1008
1013
1017bool transform_apply_matrix(TransInfo *t, float mat[4][4]);
1018void transform_final_value_get(const TransInfo *t, float *value, int value_num);
1019
1021
1022/* -------------------------------------------------------------------- */
1025
1027void transform_view_vector_calc(const TransInfo *t, const float focus[3], float r_vec[3]);
1028bool transdata_check_local_islands(TransInfo *t, short around);
1029
1031
1032/* -------------------------------------------------------------------- */
1035
1054
1055void initMouseInput(
1056 TransInfo *t, MouseInput *mi, const float2 &center, const float2 &mval, bool precision);
1057void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode);
1058void applyMouseInput(TransInfo *t, MouseInput *mi, const float2 &mval, float output[3]);
1059void transform_input_update(TransInfo *t, const float fac);
1060void transform_input_virtual_mval_reset(TransInfo *t);
1061void transform_input_reset(TransInfo *t, const float2 &mval);
1062
1063void setCustomPoints(TransInfo *t, MouseInput *mi, const int mval_start[2], const int mval_end[2]);
1064void setCustomPointsFromDirection(TransInfo *t, MouseInput *mi, const float2 &dir);
1065void setInputPostFct(MouseInput *mi, void (*post)(TransInfo *t, float values[3]));
1066
1068
1069/* -------------------------------------------------------------------- */
1072
1080void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *event);
1084void freeTransCustomDataForMode(TransInfo *t);
1089void postTrans(bContext *C, TransInfo *t);
1093void resetTransModal(TransInfo *t);
1094void resetTransRestrictions(TransInfo *t);
1095
1096void applyTransObjects(TransInfo *t);
1097void restoreTransObjects(TransInfo *t);
1098
1099void calculateCenter2D(TransInfo *t);
1100void calculateCenterLocal(TransInfo *t, const float center_global[3]);
1101
1102void calculateCenter(TransInfo *t);
1107void transformViewUpdate(TransInfo *t);
1108
1109/* API functions for getting center points. */
1110void calculateCenterBound(TransInfo *t, float r_center[3]);
1111void calculateCenterMedian(TransInfo *t, float r_center[3]);
1112void calculateCenterCursor(TransInfo *t, float r_center[3]);
1113void calculateCenterCursor2D(TransInfo *t, float r_center[2]);
1114void calculateCenterCursorGraph2D(TransInfo *t, float r_center[2]);
1118bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3]);
1119
1120void calculatePropRatio(TransInfo *t);
1121
1127void transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot);
1128
1130
1131void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData *custom_data);
1132
1133/* TODO: move to: `transform_query.c`. */
1134bool checkUseAxisMatrix(TransInfo *t);
1135
1137
1138} // 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 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 transform_data_ext_rotate(TransData *td, float mat[3][3], bool use_drot)
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_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])
void applyTransObjects(TransInfo *t)
bool transdata_check_local_islands(TransInfo *t, short around)
VecBase< double, 2 > double2
VecBase< float, 2 > float2
Definition rand.cc:33
void(* apply)(TransInfo *t, MouseInput *mi, const double mval[2], float output[3])
Definition transform.hh:598
struct blender::ed::transform::MouseInput::@337206153043200335055163143172356162031344127223 virtual_mval
void(* post)(TransInfo *t, float values[3])
Definition transform.hh:599
void(* applyRot)(const TransInfo *t, const TransDataContainer *tc, const TransData *td, float r_axis[3], float *r_angle)
Definition transform.hh:590
void(* applySize)(const TransInfo *t, const TransDataContainer *tc, const TransData *td, float r_smat[3][3])
Definition transform.hh:585
void(* applyVec)(const TransInfo *t, const TransDataContainer *tc, const TransData *td, const float in[3], float r_out[3])
Definition transform.hh:579
void(* drawExtra)(TransInfo *t)
Definition transform.hh:571
void(* free_cb)(TransInfo *, TransDataContainer *tc, TransCustomData *custom_data)
Definition transform.hh:628
bool foreach_index(FunctionRef< bool(int)> fn) const
Definition transform.hh:753
void foreach_index_selected(FunctionRef< void(int)> fn) const
Definition transform.hh:780
TransDataCurveHandleFlags * hdata
Definition transform.hh:514
TransConvertTypeInfo * data_type
Definition transform.hh:805
TransCustomDataContainer custom
Definition transform.hh:968
struct blender::ed::transform::TransInfo::@040124034302070131153200326237043302276016250327 orient[3]
TransDataContainer * data_container
Definition transform.hh:797
SnapObjectContext * object_context
Definition transform.hh:559
void(* snap_source_fn)(TransInfo *)
Definition transform.hh:553
void(* snap_target_fn)(TransInfo *, float *)
Definition transform.hh:552
i
Definition text_draw.cc:230
uint8_t flag
Definition wm_window.cc:139