Blender V4.3
transform_mode_push_pull.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_vector.h"
13#include "BLI_string.h"
14#include "BLI_task.h"
15
16#include "BKE_unit.hh"
17
18#include "ED_screen.hh"
19
20#include "UI_interface.hh"
21
22#include "BLT_translation.hh"
23
24#include "transform.hh"
26#include "transform_convert.hh"
27#include "transform_snap.hh"
28
29#include "transform_mode.hh"
30
31/* -------------------------------------------------------------------- */
47
49 const TransDataContainer *tc,
50 TransData *td,
51 const float distance,
52 const float axis_global[3],
53 const bool is_lock_constraint,
54 const bool is_data_space)
55{
56 float vec[3];
57 sub_v3_v3v3(vec, tc->center_local, td->center);
58 if (t->con.applyRot && t->con.mode & CON_APPLY) {
59 float axis[3];
60 copy_v3_v3(axis, axis_global);
61 t->con.applyRot(t, tc, td, axis, nullptr);
62
63 mul_m3_v3(td->smtx, axis);
64 if (is_lock_constraint) {
65 float dvec[3];
66 project_v3_v3v3(dvec, vec, axis);
67 sub_v3_v3(vec, dvec);
68 }
69 else {
70 project_v3_v3v3(vec, vec, axis);
71 }
72 }
73 normalize_v3_length(vec, distance * td->factor);
74 if (is_data_space) {
75 mul_m3_v3(td->smtx, vec);
76 }
77
78 add_v3_v3v3(td->loc, td->iloc, vec);
79}
80
81static void transdata_elem_push_pull_fn(void *__restrict iter_data_v,
82 const int iter,
83 const TaskParallelTLS *__restrict /*tls*/)
84{
85 TransDataArgs_PushPull *data = static_cast<TransDataArgs_PushPull *>(iter_data_v);
86 TransData *td = &data->tc->data[iter];
87 if (td->flag & TD_SKIP) {
88 return;
89 }
91 data->tc,
92 td,
93 data->distance,
94 data->axis_global,
95 data->is_lock_constraint,
96 data->is_data_space);
97}
98
101/* -------------------------------------------------------------------- */
106{
107 float axis_global[3];
108 float distance;
109 int i;
110 char str[UI_MAX_DRAW_STR];
111
112 distance = t->values[0] + t->values_modal_offset[0];
113
114 transform_snap_increment(t, &distance);
115
116 applyNumInput(&t->num, &distance);
117
118 t->values_final[0] = distance;
119
120 /* Header print for NumInput. */
121 if (hasNumInput(&t->num)) {
122 char c[NUM_STR_REP_LEN];
123
124 outputNumInput(&(t->num), c, &t->scene->unit);
125
126 SNPRINTF(str, IFACE_("Push/Pull: %s%s %s"), c, t->con.text, t->proptext);
127 }
128 else {
129 /* Default header print. */
130 SNPRINTF(str, IFACE_("Push/Pull: %.4f%s %s"), distance, t->con.text, t->proptext);
131 }
132
133 if (t->con.applyRot && t->con.mode & CON_APPLY) {
134 t->con.applyRot(t, nullptr, nullptr, axis_global, nullptr);
135 }
136
137 const bool is_lock_constraint = isLockConstraint(t);
138 const bool is_data_space = (t->options & CTX_POSE_BONE) != 0;
139
141 if (tc->data_len < TRANSDATA_THREAD_LIMIT) {
142 TransData *td = tc->data;
143 for (i = 0; i < tc->data_len; i++, td++) {
144 if (td->flag & TD_SKIP) {
145 continue;
146 }
148 t, tc, td, distance, axis_global, is_lock_constraint, is_data_space);
149 }
150 }
151 else {
153 data.t = t;
154 data.tc = tc;
155 data.distance = distance;
156 copy_v3_v3(data.axis_global, axis_global);
157 data.is_lock_constraint = is_lock_constraint;
158 data.is_data_space = is_data_space;
159 TaskParallelSettings settings;
161 BLI_task_parallel_range(0, tc->data_len, &data, transdata_elem_push_pull_fn, &settings);
162 }
163 }
164
165 recalc_data(t);
166
168}
169
170static void initPushPull(TransInfo *t, wmOperator * /*op*/)
171{
172 t->mode = TFM_PUSHPULL;
173
175
176 t->idx_max = 0;
177 t->num.idx_max = 0;
178 t->snap[0] = 1.0f;
179 t->snap[1] = t->snap[0] * 0.1f;
180
181 copy_v3_fl(t->num.val_inc, t->snap[0]);
182 t->num.unit_sys = t->scene->unit.system;
184}
185
189 /*flags*/ 0,
190 /*init_fn*/ initPushPull,
191 /*transform_fn*/ applyPushPull,
192 /*transform_matrix_fn*/ nullptr,
193 /*handle_event_fn*/ nullptr,
194 /*snap_distance_fn*/ nullptr,
195 /*snap_apply_fn*/ nullptr,
196 /*draw_fn*/ nullptr,
197};
@ B_UNIT_LENGTH
Definition BKE_unit.hh:107
void mul_m3_v3(const float M[3][3], float r[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void project_v3_v3v3(float out[3], const float p[3], const float v_proj[3])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE float normalize_v3_length(float n[3], float unit_length)
#define SNPRINTF(dst, format,...)
Definition BLI_string.h:597
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 IFACE_(msgid)
#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_PUSHPULL
#define UI_MAX_DRAW_STR
#define str(s)
float distance(float a, float b)
short idx_max
float val_inc[NUM_MAX_ELEMENTS]
int unit_type[NUM_MAX_ELEMENTS]
struct UnitSettings unit
char text[50]
Definition transform.hh:347
void(* applyRot)(const TransInfo *t, const TransDataContainer *tc, const TransData *td, float r_axis[3], float *r_angle)
Definition transform.hh:371
eTConstraint mode
Definition transform.hh:351
const TransDataContainer * tc
float center_local[3]
Definition transform.hh:475
float smtx[3][3]
eTfmMode mode
Definition transform.hh:517
float snap[2]
Definition transform.hh:561
float values[4]
Definition transform.hh:624
char proptext[20]
Definition transform.hh:548
short idx_max
Definition transform.hh:559
float values_modal_offset[4]
Definition transform.hh:627
NumInput num
Definition transform.hh:540
Scene * scene
Definition transform.hh:654
MouseInput mouse
Definition transform.hh:543
float values_final[4]
Definition transform.hh:632
TransCon con
Definition transform.hh:534
eTContext options
Definition transform.hh:521
ScrArea * area
Definition transform.hh:651
@ INPUT_VERTICAL_ABSOLUTE
Definition transform.hh:752
@ CON_APPLY
Definition transform.hh:193
@ CTX_POSE_BONE
Definition transform.hh:73
void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
#define FOREACH_TRANS_DATA_CONTAINER(t, th)
Definition transform.hh:854
bool isLockConstraint(const TransInfo *t)
void recalc_data(TransInfo *t)
conversion and adaptation of different datablocks to a common struct.
@ TD_SKIP
#define TRANSDATA_THREAD_LIMIT
transform modes used by different operators.
static void initPushPull(TransInfo *t, wmOperator *)
static void transdata_elem_push_pull_fn(void *__restrict iter_data_v, const int iter, const TaskParallelTLS *__restrict)
static void transdata_elem_push_pull(const TransInfo *t, const TransDataContainer *tc, TransData *td, const float distance, const float axis_global[3], const bool is_lock_constraint, const bool is_data_space)
static void applyPushPull(TransInfo *t)
TransModeInfo TransMode_pushpull
bool transform_snap_increment(const TransInfo *t, float *r_val)