Blender V4.3
transform_mode_trackball.cc
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
9#include <cstdlib>
10
11#include "BLI_math_matrix.h"
12#include "BLI_math_rotation.h"
13#include "BLI_math_vector.h"
14#include "BLI_string.h"
15#include "BLI_task.h"
16
17#include "BKE_unit.hh"
18
19#include "ED_screen.hh"
20
21#include "UI_interface.hh"
22
23#include "BLT_translation.hh"
24
25#include "transform.hh"
26#include "transform_convert.hh"
27#include "transform_snap.hh"
28
29#include "transform_mode.hh"
30
31/* -------------------------------------------------------------------- */
39 const TransInfo *t;
41 float axis[3];
42 float angle;
43 float mat_final[3][3];
44};
45
47 const TransDataContainer *tc,
48 TransData *td,
49 const float axis[3],
50 const float angle,
51 const float mat_final[3][3])
52{
53 float mat_buf[3][3];
54 const float(*mat)[3] = mat_final;
55 if (t->flag & T_PROP_EDIT) {
56 axis_angle_normalized_to_mat3(mat_buf, axis, td->factor * angle);
57 mat = mat_buf;
58 }
59 ElementRotation(t, tc, td, mat, t->around);
60}
61
62static void transdata_elem_trackball_fn(void *__restrict iter_data_v,
63 const int iter,
64 const TaskParallelTLS *__restrict /*tls*/)
65{
66 TransDataArgs_Trackball *data = static_cast<TransDataArgs_Trackball *>(iter_data_v);
67 TransData *td = &data->tc->data[iter];
68 if (td->flag & TD_SKIP) {
69 return;
70 }
71 transdata_elem_trackball(data->t, data->tc, td, data->axis, data->angle, data->mat_final);
72}
73
76/* -------------------------------------------------------------------- */
81 const float phi[2],
82 float r_axis[3],
83 float *r_angle)
84{
85 float axis1[3], axis2[3];
86 normalize_v3_v3(axis1, t->persinv[0]);
87 normalize_v3_v3(axis2, t->persinv[1]);
88
89 mul_v3_v3fl(r_axis, axis1, phi[0]);
90 madd_v3_v3fl(r_axis, axis2, phi[1]);
91 *r_angle = normalize_v3(r_axis);
92}
93
94static void applyTrackballValue(TransInfo *t, const float axis[3], const float angle)
95{
96 float mat_final[3][3];
97 int i;
98
99 axis_angle_normalized_to_mat3(mat_final, axis, angle);
100
102 if (tc->data_len < TRANSDATA_THREAD_LIMIT) {
103 TransData *td = tc->data;
104 for (i = 0; i < tc->data_len; i++, td++) {
105 if (td->flag & TD_SKIP) {
106 continue;
107 }
108 transdata_elem_trackball(t, tc, td, axis, angle, mat_final);
109 }
110 }
111 else {
113 data.t = t;
114 data.tc = tc;
115 copy_v3_v3(data.axis, axis);
116 data.angle = angle;
117 copy_m3_m3(data.mat_final, mat_final);
118
119 TaskParallelSettings settings;
121 BLI_task_parallel_range(0, tc->data_len, &data, transdata_elem_trackball_fn, &settings);
122 }
123 }
124}
125
127{
128 char str[UI_MAX_DRAW_STR];
129 size_t ofs = 0;
130 float phi[2];
131
132 copy_v2_v2(phi, t->values);
133
135
136 applyNumInput(&t->num, phi);
137
138 copy_v2_v2(t->values_final, phi);
139
140 if (hasNumInput(&t->num)) {
141 char c[NUM_STR_REP_LEN * 2];
142
143 outputNumInput(&(t->num), c, &t->scene->unit);
144
145 ofs += BLI_snprintf_rlen(str + ofs,
146 sizeof(str) - ofs,
147 IFACE_("Trackball: %s %s %s"),
148 &c[0],
149 &c[NUM_STR_REP_LEN],
150 t->proptext);
151 }
152 else {
153 ofs += BLI_snprintf_rlen(str + ofs,
154 sizeof(str) - ofs,
155 IFACE_("Trackball: %.2f %.2f %s"),
156 RAD2DEGF(phi[0]),
157 RAD2DEGF(phi[1]),
158 t->proptext);
159 }
160
161 if (t->flag & T_PROP_EDIT_ALL) {
162 ofs += BLI_snprintf_rlen(
163 str + ofs, sizeof(str) - ofs, IFACE_(" Proportional size: %.2f"), t->prop_size);
164 }
165
166 float axis_final[3], angle_final;
167 applyTrackballValue_calc_axis_angle(t, phi, axis_final, &angle_final);
168 applyTrackballValue(t, axis_final, angle_final);
169
170 recalc_data(t);
171
173}
174
175static void applyTrackballMatrix(TransInfo *t, float mat_xform[4][4])
176{
177 const float phi[2] = {UNPACK2(t->values_final)};
178
179 float axis_final[3], angle_final;
180 applyTrackballValue_calc_axis_angle(t, phi, axis_final, &angle_final);
181
182 float mat3[3][3], mat4[4][4];
183 axis_angle_normalized_to_mat3(mat3, axis_final, angle_final);
184
185 copy_m4_m3(mat4, mat3);
187 mul_m4_m4m4(mat_xform, mat4, mat_xform);
188}
189
190static void initTrackball(TransInfo *t, wmOperator * /*op*/)
191{
192 t->mode = TFM_TRACKBALL;
193
195
196 t->idx_max = 1;
197 t->num.idx_max = 1;
198 t->snap[0] = DEG2RAD(5.0);
199 t->snap[1] = DEG2RAD(1.0);
200
201 copy_v3_fl(t->num.val_inc, t->snap[1]);
202 t->num.unit_sys = t->scene->unit.system;
206}
207
211 /*flags*/ T_NO_CONSTRAINT,
212 /*init_fn*/ initTrackball,
213 /*transform_fn*/ applyTrackball,
214 /*transform_matrix_fn*/ applyTrackballMatrix,
215 /*handle_event_fn*/ nullptr,
216 /*snap_distance_fn*/ nullptr,
217 /*snap_apply_fn*/ nullptr,
218 /*draw_fn*/ nullptr,
219};
@ B_UNIT_ROTATION
Definition BKE_unit.hh:111
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m3_m3(float m1[3][3], const float m2[3][3])
void copy_m4_m3(float m1[4][4], const float m2[3][3])
void transform_pivot_set_m4(float mat[4][4], const float pivot[3])
#define DEG2RAD(_deg)
void axis_angle_normalized_to_mat3(float R[3][3], const float axis[3], float angle)
#define RAD2DEGF(_rad)
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE float normalize_v3(float n[3])
size_t BLI_snprintf_rlen(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
Definition task_range.cc:99
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
Definition BLI_task.h:230
#define UNPACK2(a)
#define IFACE_(msgid)
@ USER_UNIT_ROT_RADIANS
#define NUM_STR_REP_LEN
void outputNumInput(NumInput *n, char *str, const UnitSettings *unit_settings)
Definition numinput.cc:88
bool applyNumInput(NumInput *n, float *vec)
Definition numinput.cc:190
bool hasNumInput(const NumInput *n)
Definition numinput.cc:171
void ED_area_status_text(ScrArea *area, const char *str)
Definition area.cc:803
@ TFM_TRACKBALL
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:125
#define UI_MAX_DRAW_STR
draw_view in_light_buf[] float
#define str(s)
short idx_max
float val_inc[NUM_MAX_ELEMENTS]
int unit_type[NUM_MAX_ELEMENTS]
bool unit_use_radians
struct UnitSettings unit
const TransDataContainer * tc
eTfmMode mode
Definition transform.hh:517
short around
Definition transform.hh:580
float snap[2]
Definition transform.hh:561
float prop_size
Definition transform.hh:546
float values[4]
Definition transform.hh:624
char proptext[20]
Definition transform.hh:548
short idx_max
Definition transform.hh:559
NumInput num
Definition transform.hh:540
Scene * scene
Definition transform.hh:654
eTFlag flag
Definition transform.hh:523
MouseInput mouse
Definition transform.hh:543
float values_final[4]
Definition transform.hh:632
float center_global[3]
Definition transform.hh:555
float persinv[4][4]
Definition transform.hh:578
ScrArea * area
Definition transform.hh:651
@ INPUT_TRACKBALL
Definition transform.hh:748
@ T_PROP_EDIT
Definition transform.hh:98
@ T_NO_CONSTRAINT
Definition transform.hh:95
#define T_PROP_EDIT_ALL
Definition transform.hh:157
void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
#define FOREACH_TRANS_DATA_CONTAINER(t, th)
Definition transform.hh:854
void recalc_data(TransInfo *t)
conversion and adaptation of different datablocks to a common struct.
@ TD_SKIP
#define TRANSDATA_THREAD_LIMIT
void ElementRotation(const TransInfo *t, const TransDataContainer *tc, TransData *td, const float mat[3][3], const short around)
transform modes used by different operators.
static void applyTrackballValue(TransInfo *t, const float axis[3], const float angle)
static void transdata_elem_trackball_fn(void *__restrict iter_data_v, const int iter, const TaskParallelTLS *__restrict)
static void applyTrackballMatrix(TransInfo *t, float mat_xform[4][4])
static void transdata_elem_trackball(const TransInfo *t, const TransDataContainer *tc, TransData *td, const float axis[3], const float angle, const float mat_final[3][3])
static void applyTrackball(TransInfo *t)
static void applyTrackballValue_calc_axis_angle(const TransInfo *t, const float phi[2], float r_axis[3], float *r_angle)
TransModeInfo TransMode_trackball
static void initTrackball(TransInfo *t, wmOperator *)
bool transform_snap_increment(const TransInfo *t, float *r_val)