Blender V4.3
transform_mode_skin_resize.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_task.h"
14
15#include "BKE_unit.hh"
16
17#include "ED_screen.hh"
18
19#include "UI_interface.hh"
20
21#include "transform.hh"
23#include "transform_convert.hh"
24#include "transform_snap.hh"
25
26#include "transform_mode.hh"
27
28/* -------------------------------------------------------------------- */
40
42 const TransDataContainer * /*tc*/,
43 TransData *td,
44 const float mat[3][3])
45{
46 float tmat[3][3], smat[3][3];
47 float fsize[3];
48
49 if (t->flag & T_EDIT) {
50 mul_m3_m3m3(smat, mat, td->mtx);
51 mul_m3_m3m3(tmat, td->smtx, smat);
52 }
53 else {
54 copy_m3_m3(tmat, mat);
55 }
56
57 if (t->con.applySize) {
58 t->con.applySize(t, nullptr, nullptr, tmat);
59 }
60
61 mat3_to_size(fsize, tmat);
62 td->loc[0] = td->iloc[0] * (1 + (fsize[0] - 1) * td->factor);
63 td->loc[1] = td->iloc[1] * (1 + (fsize[1] - 1) * td->factor);
64}
65
66static void transdata_elem_skin_resize_fn(void *__restrict iter_data_v,
67 const int iter,
68 const TaskParallelTLS *__restrict /*tls*/)
69{
70 TransDataArgs_SkinResize *data = static_cast<TransDataArgs_SkinResize *>(iter_data_v);
71 TransData *td = &data->tc->data[iter];
72 if (td->flag & TD_SKIP) {
73 return;
74 }
75 transdata_elem_skin_resize(data->t, data->tc, td, data->mat_final);
76}
77
80/* -------------------------------------------------------------------- */
85{
86 float mat_final[3][3];
87 int i;
88 char str[UI_MAX_DRAW_STR];
89
92 }
93 else {
96
98
99 if (applyNumInput(&t->num, t->values_final)) {
101 }
102
104 }
105
106 size_to_mat3(mat_final, t->values_final);
107
108 headerResize(t, t->values_final, str, sizeof(str));
109
111 if (tc->data_len < TRANSDATA_THREAD_LIMIT) {
112 TransData *td = tc->data;
113 for (i = 0; i < tc->data_len; i++, td++) {
114 if (td->flag & TD_SKIP) {
115 continue;
116 }
117 transdata_elem_skin_resize(t, tc, td, mat_final);
118 }
119 }
120 else {
122 data.t = t;
123 data.tc = tc;
124 copy_m3_m3(data.mat_final, mat_final);
125 TaskParallelSettings settings;
127 BLI_task_parallel_range(0, tc->data_len, &data, transdata_elem_skin_resize_fn, &settings);
128 }
129 }
130
131 recalc_data(t);
132
134}
135
136static void initSkinResize(TransInfo *t, wmOperator * /*op*/)
137{
139
141
142 t->flag |= T_NULL_ONE;
143 t->num.val_flag[0] |= NUM_NULL_ONE;
144 t->num.val_flag[1] |= NUM_NULL_ONE;
145 t->num.val_flag[2] |= NUM_NULL_ONE;
146 t->num.flag |= NUM_AFFECT_ALL;
147 if ((t->flag & T_EDIT) == 0) {
148#ifdef USE_NUM_NO_ZERO
149 t->num.val_flag[0] |= NUM_NO_ZERO;
150 t->num.val_flag[1] |= NUM_NO_ZERO;
151 t->num.val_flag[2] |= NUM_NO_ZERO;
152#endif
153 }
154
155 t->idx_max = 2;
156 t->num.idx_max = 2;
157 t->snap[0] = 0.1f;
158 t->snap[1] = t->snap[0] * 0.1f;
159
160 copy_v3_fl(t->num.val_inc, t->snap[0]);
161 t->num.unit_sys = t->scene->unit.system;
162 t->num.unit_type[0] = B_UNIT_NONE;
163 t->num.unit_type[1] = B_UNIT_NONE;
164 t->num.unit_type[2] = B_UNIT_NONE;
165}
166
170 /*flags*/ 0,
171 /*init_fn*/ initSkinResize,
172 /*transform_fn*/ applySkinResize,
173 /*transform_matrix_fn*/ nullptr,
174 /*handle_event_fn*/ nullptr,
175 /*snap_distance_fn*/ nullptr,
176 /*snap_apply_fn*/ nullptr,
177 /*draw_fn*/ nullptr,
178};
@ B_UNIT_NONE
Definition BKE_unit.hh:106
void size_to_mat3(float R[3][3], const float size[3])
void copy_m3_m3(float m1[3][3], const float m2[3][3])
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void mat3_to_size(float size[3], const float M[3][3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
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
@ NUM_AFFECT_ALL
bool applyNumInput(NumInput *n, float *vec)
Definition numinput.cc:190
@ NUM_NULL_ONE
@ NUM_NO_ZERO
void ED_area_status_text(ScrArea *area, const char *str)
Definition area.cc:803
@ TFM_SKIN_RESIZE
#define UI_MAX_DRAW_STR
#define str(s)
short idx_max
short val_flag[NUM_MAX_ELEMENTS]
float val_inc[NUM_MAX_ELEMENTS]
int unit_type[NUM_MAX_ELEMENTS]
short flag
struct UnitSettings unit
void(* applySize)(const TransInfo *t, const TransDataContainer *tc, const TransData *td, float r_smat[3][3])
Definition transform.hh:366
const TransDataContainer * tc
float smtx[3][3]
float mtx[3][3]
eTfmMode mode
Definition transform.hh:517
float snap[2]
Definition transform.hh:561
float values[4]
Definition transform.hh:624
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
eTFlag flag
Definition transform.hh:523
MouseInput mouse
Definition transform.hh:543
float values_final[4]
Definition transform.hh:632
TransCon con
Definition transform.hh:534
ScrArea * area
Definition transform.hh:651
@ INPUT_SPRING_FLIP
Definition transform.hh:744
@ T_INPUT_IS_VALUES_FINAL
Definition transform.hh:115
@ T_NULL_ONE
Definition transform.hh:96
@ T_EDIT
Definition transform.hh:91
void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
#define FOREACH_TRANS_DATA_CONTAINER(t, th)
Definition transform.hh:854
void constraintNumInput(TransInfo *t, float vec[3])
void recalc_data(TransInfo *t)
conversion and adaptation of different datablocks to a common struct.
@ TD_SKIP
#define TRANSDATA_THREAD_LIMIT
void headerResize(TransInfo *t, const float vec[3], char *str, const int str_size)
transform modes used by different operators.
TransModeInfo TransMode_skinresize
static void applySkinResize(TransInfo *t)
static void transdata_elem_skin_resize(const TransInfo *t, const TransDataContainer *, TransData *td, const float mat[3][3])
static void transdata_elem_skin_resize_fn(void *__restrict iter_data_v, const int iter, const TaskParallelTLS *__restrict)
static void initSkinResize(TransInfo *t, wmOperator *)
void transform_snap_mixed_apply(TransInfo *t, float *vec)
bool transform_snap_increment(const TransInfo *t, float *r_val)