Blender V4.3
transform_mode_vert_slide.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 "BLI_math_matrix.h"
10#include "BLI_string.h"
11
12#include "BKE_unit.hh"
13
14#include "GPU_immediate.hh"
15#include "GPU_matrix.hh"
16
17#include "ED_screen.hh"
18
19#include "WM_api.hh"
20
21#include "RNA_access.hh"
22
23#include "UI_interface.hh"
24#include "UI_view2d.hh"
25
26#include "BLT_translation.hh"
27
28#include "transform.hh"
30#include "transform_convert.hh"
31#include "transform_mode.hh"
32#include "transform_snap.hh"
33
34using namespace blender;
35
36/* -------------------------------------------------------------------- */
44
45 private:
46 float4x4 proj_mat;
47 float2 win_half;
48
49 public:
51 {
52 ARegion *region = t->region;
53
54 if (UNLIKELY(region == nullptr)) {
55 this->win_half = {1.0f, 1.0f};
56 this->proj_mat = float4x4::identity();
57 return;
58 }
59
60 this->win_half = {region->winx / 2.0f, region->winy / 2.0f};
61
62 if (t->spacetype == SPACE_VIEW3D) {
63 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
64 this->proj_mat = ED_view3d_ob_project_mat_get(rv3d, tc->obedit);
65
66 for (int i = 0; i < 4; i++) {
67 this->proj_mat[i][0] *= this->win_half[0];
68 this->proj_mat[i][1] *= this->win_half[1];
69 }
70 }
71 else {
72 const View2D *v2d = static_cast<View2D *>(t->view);
73 UI_view2d_view_to_region_m4(v2d, this->proj_mat.ptr());
74 this->proj_mat.location()[0] -= this->win_half[0];
75 this->proj_mat.location()[1] -= this->win_half[1];
76 }
77 }
78
80 {
81 return math::project_point(this->proj_mat, co).xy() + this->win_half;
82 }
83
87 void update_active_edges(TransInfo *t, const float2 &mval_fl)
88 {
89 /* First get the direction of the original mouse position. */
90 float2 dir = math::normalize(mval_fl - t->mouse.imval);
91
92 for (TransDataVertSlideVert &sv : this->sv) {
93 if (sv.co_link_orig_3d.size() <= 1) {
94 continue;
95 }
96
97 const float3 &v_co_orig = sv.co_orig_3d();
98 float2 loc_src_2d = math::project_point(this->proj_mat, v_co_orig).xy();
99
100 float dir_dot_best = -FLT_MAX;
101 int co_link_curr_best = -1;
102
103 for (int j : sv.co_link_orig_3d.index_range()) {
104 const float3 &loc_dst = sv.co_link_orig_3d[j];
105 float2 loc_dst_2d = math::project_point(this->proj_mat, loc_dst).xy();
106 float2 tdir = math::normalize(loc_dst_2d - loc_src_2d);
107
108 float dir_dot = math::dot(dir, tdir);
109 if (dir_dot > dir_dot_best) {
110 dir_dot_best = dir_dot;
111 co_link_curr_best = j;
112 }
113 }
114
115 if (co_link_curr_best != -1) {
116 sv.co_link_curr = co_link_curr_best;
117 }
118 }
119 }
120
124 void update_active_vert(TransInfo * /*t*/, const float2 &mval_fl)
125 {
126 /* Set the vertex to use as a reference for the mouse direction `curr_sv_index`. */
127 float dist_min_sq = FLT_MAX;
128
129 for (int i : this->sv.index_range()) {
130 TransDataVertSlideVert &sv = this->sv[i];
131 const float2 co_2d = this->project(sv.co_orig_3d());
132 const float dist_sq = len_squared_v2v2(mval_fl, co_2d);
133 if (dist_sq < dist_min_sq) {
134 dist_min_sq = dist_sq;
135 this->curr_sv_index = i;
136 }
137 }
138 }
139};
140
142 float perc;
143
146};
147
149{
150 VertSlideParams *slp = static_cast<VertSlideParams *>(t->custom.mode.data);
151 VertSlideData *sld = static_cast<VertSlideData *>(
152 TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data);
153 TransDataVertSlideVert *sv = &sld->sv[sld->curr_sv_index];
154
155 const float3 &co_orig_3d = sv->co_orig_3d();
156 const float3 &co_dest_3d = sv->co_dest_3d();
157
158 int mval_ofs[2], mval_start[2], mval_end[2];
159
160 const float2 co_orig_2d = sld->project(co_orig_3d);
161 const float2 co_curr_2d = sld->project(co_dest_3d);
162
163 ARRAY_SET_ITEMS(mval_ofs, t->mouse.imval[0] - co_orig_2d[0], t->mouse.imval[1] - co_orig_2d[1]);
164 ARRAY_SET_ITEMS(mval_start, co_orig_2d[0] + mval_ofs[0], co_orig_2d[1] + mval_ofs[1]);
165 ARRAY_SET_ITEMS(mval_end, co_curr_2d[0] + mval_ofs[0], co_curr_2d[1] + mval_ofs[1]);
166
167 if (slp->flipped && slp->use_even) {
168 setCustomPoints(t, &t->mouse, mval_start, mval_end);
169 }
170 else {
171 setCustomPoints(t, &t->mouse, mval_end, mval_start);
172 }
173}
174
176{
178
179 /* #setCustomPoints isn't normally changing as the mouse moves,
180 * in this case apply mouse input immediately so we don't refresh
181 * with the value from the previous points. */
182 applyMouseInput(t, &t->mouse, t->mval, t->values);
183}
184
186{
187 VertSlideData *sld = MEM_new<VertSlideData>(__func__);
190 }
191 else {
193 }
194
195 if (sld->sv.is_empty()) {
196 MEM_delete(sld);
197 return nullptr;
198 }
199
200 sld->curr_sv_index = 0;
201 sld->update_proj_mat(t, tc);
202 return sld;
203}
204
205static void freeVertSlideVerts(TransInfo * /*t*/,
206 TransDataContainer * /*tc*/,
207 TransCustomData *custom_data)
208{
209 VertSlideData *sld = static_cast<VertSlideData *>(custom_data->data);
210
211 if (!sld) {
212 return;
213 }
214
215 MEM_delete(sld);
216 custom_data->data = nullptr;
217}
218
220{
221 VertSlideParams *slp = static_cast<VertSlideParams *>(t->custom.mode.data);
222
223 if (slp) {
224 switch (event->type) {
225 case EVT_EKEY:
226 if (event->val == KM_PRESS) {
227 slp->use_even = !slp->use_even;
228 if (slp->flipped) {
230 }
231 return TREDRAW_HARD;
232 }
233 break;
234 case EVT_FKEY:
235 if (event->val == KM_PRESS) {
236 slp->flipped = !slp->flipped;
238 return TREDRAW_HARD;
239 }
240 break;
241 case EVT_CKEY:
242 /* Use like a modifier key. */
243 if (event->val == KM_PRESS) {
244 t->flag ^= T_ALT_TRANSFORM;
246 return TREDRAW_HARD;
247 }
248 break;
249 case MOUSEMOVE: {
250 /* Don't recalculate the best edge. */
251 const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
252 if (is_clamp) {
254 VertSlideData *sld = static_cast<VertSlideData *>(tc->custom.mode.data);
255 sld->update_active_edges(t, float2(event->mval));
256 }
258 break;
259 }
260 default:
261 break;
262 }
263 }
264 return TREDRAW_NOTHING;
265}
266
268{
270 VertSlideData *sld = static_cast<VertSlideData *>(tc->custom.mode.data);
271 if (sld) {
272 const VertSlideParams *slp = static_cast<const VertSlideParams *>(t->custom.mode.data);
273 const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
274
275 /* Non-Prop mode. */
276 {
277 TransDataVertSlideVert *curr_sv = &sld->sv[sld->curr_sv_index];
278
279 const float3 &co_orig_3d_act = curr_sv->co_orig_3d();
280 const float3 &co_dest_3d_act = curr_sv->co_dest_3d();
281
282 const float ctrl_size = UI_GetThemeValuef(TH_FACEDOT_SIZE) + 1.5f;
283 const float line_size = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 0.5f;
284 const int alpha_shade = -160;
285
287
289
291 if (t->spacetype == SPACE_VIEW3D) {
292 GPU_matrix_mul(tc->obedit->object_to_world().ptr());
293 }
294 else {
295 GPU_matrix_scale_2f(1 / t->aspect[0], 1 / t->aspect[1]);
296 }
297
298 GPU_line_width(line_size);
299
300 const uint shdr_pos = GPU_vertformat_attr_add(
302
305
306 immBegin(GPU_PRIM_LINES, sld->sv.size() * 2);
307 if (is_clamp) {
308 for (TransDataVertSlideVert &sv : sld->sv) {
309 immVertex3fv(shdr_pos, sv.co_orig_3d());
310 immVertex3fv(shdr_pos, sv.co_dest_3d());
311 }
312 }
313 else {
314 for (TransDataVertSlideVert &sv : sld->sv) {
315 const float3 &co_orig_3d = sv.co_orig_3d();
316 const float3 &co_dest_3d = sv.co_dest_3d();
317 float a[3], b[3];
318 sub_v3_v3v3(a, co_dest_3d, co_orig_3d);
319 mul_v3_fl(a, 100.0f);
320 negate_v3_v3(b, a);
321 add_v3_v3(a, co_orig_3d);
322 add_v3_v3(b, co_orig_3d);
323
324 immVertex3fv(shdr_pos, a);
325 immVertex3fv(shdr_pos, b);
326 }
327 }
328 immEnd();
329
330 GPU_point_size(ctrl_size);
331
333 immVertex3fv(shdr_pos, (slp->flipped && slp->use_even) ? co_dest_3d_act : co_orig_3d_act);
334 immEnd();
335
337
339
340 /* Direction from active vertex! */
341 if (!compare_v2v2(t->mval, t->mouse.imval, FLT_EPSILON)) {
342 /* 2D Pixel Space. */
347
348 float3 co_orig_3d_cpy = co_orig_3d_act;
349 if (t->spacetype != SPACE_VIEW3D) {
350 co_orig_3d_cpy[0] /= t->aspect[0];
351 co_orig_3d_cpy[1] /= t->aspect[1];
352 }
353
354 float2 loc_src_act_2d = sld->project(co_orig_3d_cpy);
355 float2 loc_mval_dir = loc_src_act_2d + (t->mval - t->mouse.imval);
356
357 GPU_line_width(1.0f);
358
359 const uint shdr_pos_2d = GPU_vertformat_attr_add(
361
363
364 float viewport_size[4];
365 GPU_viewport_size_get_f(viewport_size);
366 immUniform2f("viewport_size", viewport_size[2], viewport_size[3]);
367
368 immUniform1i("colors_len", 0); /* "simple" mode. */
369 immUniformColor4f(1.0f, 1.0f, 1.0f, 1.0f);
370 immUniform1f("dash_width", 6.0f);
371 immUniform1f("udash_factor", 0.5f);
372
374 immVertex2fv(shdr_pos_2d, loc_src_act_2d);
375 immVertex2fv(shdr_pos_2d, loc_mval_dir);
376 immEnd();
377
379
382 }
383 }
384 }
385}
386
388 const float perc,
389 const bool use_even,
390 const bool use_flip,
391 float r_co[3])
392{
393 const float3 &co_orig_3d = sv.co_orig_3d();
394 const float3 &co_dest_3d = sv.co_dest_3d();
395 if (use_even == false) {
396 interp_v3_v3v3(r_co, co_orig_3d, co_dest_3d, perc);
397 }
398 else {
399 float dir[3];
400 sub_v3_v3v3(dir, co_dest_3d, co_orig_3d);
401 float edge_len = normalize_v3(dir);
402 if (edge_len > FLT_EPSILON) {
403 if (use_flip) {
404 madd_v3_v3v3fl(r_co, co_dest_3d, dir, -perc);
405 }
406 else {
407 madd_v3_v3v3fl(r_co, co_orig_3d, dir, perc);
408 }
409 }
410 else {
411 copy_v3_v3(r_co, co_orig_3d);
412 }
413 }
414}
415
416static void doVertSlide(TransInfo *t, float perc)
417{
418 VertSlideParams *slp = static_cast<VertSlideParams *>(t->custom.mode.data);
419
420 slp->perc = perc;
421
422 const bool use_even = slp->use_even;
423
425 VertSlideData *sld = static_cast<VertSlideData *>(tc->custom.mode.data);
426 if (sld == nullptr) {
427 continue;
428 }
429
430 float tperc = perc;
431 if (use_even) {
432 TransDataVertSlideVert *sv_curr = &sld->sv[sld->curr_sv_index];
433 const float edge_len_curr = len_v3v3(sv_curr->co_orig_3d(), sv_curr->co_dest_3d());
434 tperc *= edge_len_curr;
435 }
436
437 for (TransDataVertSlideVert &sv : sld->sv) {
438 vert_slide_apply_elem(sv, tperc, use_even, slp->flipped, sv.td->loc);
439 }
440 }
441}
442
443static void vert_slide_snap_apply(TransInfo *t, float *value)
444{
446 VertSlideData *sld = static_cast<VertSlideData *>(tc->custom.mode.data);
447 TransDataVertSlideVert *sv = &sld->sv[sld->curr_sv_index];
448 float3 co_orig_3d = sv->co_orig_3d();
449 float3 co_curr_3d = sv->co_dest_3d();
450
451 float snap_point[3], dvec[3];
452 if (tc->use_local_mat) {
453 mul_m4_v3(tc->mat, co_orig_3d);
454 mul_m4_v3(tc->mat, co_curr_3d);
455 }
456
457 getSnapPoint(t, dvec);
458 sub_v3_v3(dvec, t->tsnap.snap_source);
460 float co_dir[3];
461 sub_v3_v3v3(co_dir, co_curr_3d, co_orig_3d);
462 normalize_v3(co_dir);
465 }
466 else {
468 }
469 }
470
471 add_v3_v3v3(snap_point, co_orig_3d, dvec);
472 *value = line_point_factor_v3(snap_point, co_orig_3d, co_curr_3d);
473}
474
476{
477 char str[UI_MAX_DRAW_STR];
478 size_t ofs = 0;
479 float final;
480 VertSlideParams *slp = static_cast<VertSlideParams *>(t->custom.mode.data);
481 const bool flipped = slp->flipped;
482 const bool use_even = slp->use_even;
483 const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
484 const bool is_constrained = !(is_clamp == false || hasNumInput(&t->num));
485
486 final = t->values[0] + t->values_modal_offset[0];
487
489 if (!validSnap(t)) {
490 transform_snap_increment(t, &final);
491 }
492
493 /* Only do this so out of range values are not displayed. */
494 if (is_constrained) {
495 CLAMP(final, 0.0f, 1.0f);
496 }
497
498 applyNumInput(&t->num, &final);
499
500 t->values_final[0] = final;
501
502 /* Header string. */
503 ofs += BLI_strncpy_rlen(str + ofs, IFACE_("Vertex Slide: "), sizeof(str) - ofs);
504 if (hasNumInput(&t->num)) {
505 char c[NUM_STR_REP_LEN];
506 outputNumInput(&(t->num), c, &t->scene->unit);
507 ofs += BLI_strncpy_rlen(str + ofs, &c[0], sizeof(str) - ofs);
508 }
509 else {
510 ofs += BLI_snprintf_rlen(str + ofs, sizeof(str) - ofs, "%.4f ", final);
511 }
512 ofs += BLI_snprintf_rlen(
513 str + ofs, sizeof(str) - ofs, IFACE_("(E)ven: %s, "), WM_bool_as_string(use_even));
514 if (use_even) {
515 ofs += BLI_snprintf_rlen(
516 str + ofs, sizeof(str) - ofs, IFACE_("(F)lipped: %s, "), WM_bool_as_string(flipped));
517 }
518 ofs += BLI_snprintf_rlen(
519 str + ofs, sizeof(str) - ofs, IFACE_("Alt or (C)lamp: %s"), WM_bool_as_string(is_clamp));
520 /* Done with header string. */
521
522 /* Do stuff here. */
523 doVertSlide(t, final);
524
525 recalc_data(t);
526
528}
529
530static void vert_slide_transform_matrix_fn(TransInfo *t, float mat_xform[4][4])
531{
532 float delta[3];
533
534 VertSlideParams *slp = static_cast<VertSlideParams *>(t->custom.mode.data);
536 VertSlideData *sld = static_cast<VertSlideData *>(tc->custom.mode.data);
537 TransDataVertSlideVert &sv_active = sld->sv[sld->curr_sv_index];
538 float3 orig_co = sv_active.co_orig_3d();
539 const float3 &loc_dst_act = sv_active.co_dest_3d();
540
541 float tperc = t->values_final[0];
542 if (slp->use_even) {
543 const float edge_len_curr = len_v3v3(orig_co, loc_dst_act);
544 tperc *= edge_len_curr;
545 }
546
547 float3 final_co;
548 vert_slide_apply_elem(sv_active, tperc, slp->use_even, slp->flipped, final_co);
549
550 if (tc->use_local_mat) {
551 mul_m4_v3(tc->mat, orig_co);
552 mul_m4_v3(tc->mat, final_co);
553 }
554
555 sub_v3_v3v3(delta, final_co, orig_co);
556 add_v3_v3(mat_xform[3], delta);
557}
558
559static void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp)
560{
561
562 t->mode = TFM_VERT_SLIDE;
563
564 {
565 VertSlideParams *slp = static_cast<VertSlideParams *>(MEM_callocN(sizeof(*slp), __func__));
566 slp->use_even = use_even;
567 slp->flipped = flipped;
568 slp->perc = 0.0f;
569
570 if (!use_clamp) {
571 t->flag |= T_ALT_TRANSFORM;
572 }
573
574 t->custom.mode.data = slp;
575 t->custom.mode.use_free = true;
576 }
577
578 bool ok = false;
581 if (sld) {
582 sld->update_active_vert(t, t->mval);
583 sld->update_active_edges(t, t->mval);
584
585 tc->custom.mode.data = sld;
586 tc->custom.mode.free_cb = freeVertSlideVerts;
587 ok = true;
588 }
589 }
590
591 if (ok == false) {
592 t->state = TRANS_CANCEL;
593 return;
594 }
595
596 /* Set custom point first if you want value to be initialized by init. */
599
600 t->idx_max = 0;
601 t->num.idx_max = 0;
602 t->snap[0] = 0.1f;
603 t->snap[1] = t->snap[0] * 0.1f;
604
605 copy_v3_fl(t->num.val_inc, t->snap[0]);
606 t->num.unit_sys = t->scene->unit.system;
607 t->num.unit_type[0] = B_UNIT_NONE;
608}
609
611{
612 bool use_even = false;
613 bool flipped = false;
614 bool use_clamp = true;
615 if (op) {
616 use_even = RNA_boolean_get(op->ptr, "use_even");
617 flipped = RNA_boolean_get(op->ptr, "flipped");
618 use_clamp = RNA_boolean_get(op->ptr, "use_clamp");
619 }
620 initVertSlide_ex(t, use_even, flipped, use_clamp);
621}
622
625/* -------------------------------------------------------------------- */
630{
632 VertSlideData *sld = static_cast<VertSlideData *>(tc->custom.mode.data);
633 if (sld) {
634 sld->update_proj_mat(t, tc);
635 }
636 }
637
639}
640
644 /*flags*/ T_NO_CONSTRAINT,
645 /*init_fn*/ initVertSlide,
646 /*transform_fn*/ applyVertSlide,
647 /*transform_matrix_fn*/ vert_slide_transform_matrix_fn,
648 /*handle_event_fn*/ handleEventVertSlide,
649 /*snap_distance_fn*/ transform_snap_distance_len_squared_fn,
650 /*snap_apply_fn*/ vert_slide_snap_apply,
651 /*draw_fn*/ drawVertSlide,
652};
@ B_UNIT_NONE
Definition BKE_unit.hh:106
float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3])
void mul_m4_v3(const float M[4][4], float r[3])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_squared_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
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 mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
Definition math_vector.c:36
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE bool compare_v2v2(const float v1[2], const float v2[2], float limit) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
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
char char size_t BLI_strncpy_rlen(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
unsigned int uint
#define CLAMP(a, b, c)
#define ARRAY_SET_ITEMS(...)
#define UNLIKELY(x)
#define IFACE_(msgid)
@ SCE_SNAP_TO_EDGE
@ SCE_SNAP_TO_FACE
@ SPACE_VIEW3D
#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_VERT_SLIDE
blender::float4x4 ED_view3d_ob_project_mat_get(const RegionView3D *rv3d, const Object *ob)
void immEnd()
void immUnbindProgram()
void immUniform2f(const char *name, float x, float y)
void immUniformThemeColorShadeAlpha(int color_id, int color_offset, int alpha_offset)
void immUniformColor4f(float r, float g, float b, float a)
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
void immVertex2fv(uint attr_id, const float data[2])
void immUniform1i(const char *name, int x)
void immUniform1f(const char *name, float x)
GPUVertFormat * immVertexFormat()
void immVertex3fv(uint attr_id, const float data[3])
void immBegin(GPUPrimType, uint vertex_len)
void GPU_matrix_identity_set()
void GPU_matrix_scale_2f(float x, float y)
void GPU_matrix_push()
void GPU_matrix_push_projection()
#define GPU_matrix_mul(x)
void GPU_matrix_pop_projection()
void GPU_matrix_pop()
@ GPU_PRIM_LINES
@ GPU_PRIM_POINTS
@ GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR
@ GPU_SHADER_3D_UNIFORM_COLOR
@ GPU_BLEND_ALPHA
Definition GPU_state.hh:87
void GPU_blend(eGPUBlend blend)
Definition gpu_state.cc:42
void GPU_line_width(float width)
Definition gpu_state.cc:161
void GPU_point_size(float size)
Definition gpu_state.cc:167
@ GPU_DEPTH_NONE
Definition GPU_state.hh:108
void GPU_depth_test(eGPUDepthTest test)
Definition gpu_state.cc:68
void GPU_viewport_size_get_f(float coords[4])
Definition gpu_state.cc:262
@ GPU_FETCH_FLOAT
uint GPU_vertformat_attr_add(GPUVertFormat *, const char *name, GPUVertCompType, uint comp_len, GPUVertFetchMode)
@ GPU_COMP_F32
#define UI_MAX_DRAW_STR
@ TH_FACEDOT_SIZE
@ TH_EDGE_SELECT
@ TH_OUTLINE_WIDTH
float UI_GetThemeValuef(int colorid)
void UI_view2d_view_to_region_m4(const View2D *v2d, float matrix[4][4]) ATTR_NONNULL()
Definition view2d.cc:1803
@ KM_PRESS
Definition WM_types.hh:284
int64_t size() const
Definition BLI_array.hh:245
IndexRange index_range() const
Definition BLI_array.hh:349
bool is_empty() const
Definition BLI_array.hh:253
local_group_size(16, 16) .push_constant(Type b
#define str(s)
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
VectorT project_point(const MatT &mat, const VectorT &point)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
VecBase< float, 2 > float2
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
#define FLT_MAX
Definition stdcycles.h:14
blender::float2 imval
Definition transform.hh:383
short idx_max
float val_inc[NUM_MAX_ELEMENTS]
int unit_type[NUM_MAX_ELEMENTS]
struct UnitSettings unit
TransCustomData mode
Definition transform.hh:423
unsigned int use_free
Definition transform.hh:410
TransCustomDataContainer custom
Definition transform.hh:501
float mat[4][4]
Definition transform.hh:462
const blender::float3 & co_dest_3d() const
const float * co_orig_3d() const
eTfmMode mode
Definition transform.hh:517
void * view
Definition transform.hh:647
char spacetype
Definition transform.hh:582
float snap[2]
Definition transform.hh:561
float values[4]
Definition transform.hh:624
TransSnap tsnap
Definition transform.hh:537
short idx_max
Definition transform.hh:559
float values_modal_offset[4]
Definition transform.hh:627
eTState state
Definition transform.hh:527
NumInput num
Definition transform.hh:540
TransCustomDataContainer custom
Definition transform.hh:676
float aspect[3]
Definition transform.hh:553
Scene * scene
Definition transform.hh:654
eTFlag flag
Definition transform.hh:523
ARegion * region
Definition transform.hh:652
MouseInput mouse
Definition transform.hh:543
float values_final[4]
Definition transform.hh:632
blender::float2 mval
Definition transform.hh:663
TransConvertTypeInfo * data_type
Definition transform.hh:513
ScrArea * area
Definition transform.hh:651
float snap_source[3]
Definition transform.hh:325
eSnapMode target_type
Definition transform.hh:321
void update_active_vert(TransInfo *, const float2 &mval_fl)
Vector< float3 > targets_buffer
void update_active_edges(TransInfo *t, const float2 &mval_fl)
void update_proj_mat(TransInfo *t, const TransDataContainer *tc)
Array< TransDataVertSlideVert > sv
float2 project(const float3 &co)
const c_style_mat & ptr() const
VecBase< T, 2 > xy() const
short val
Definition WM_types.hh:724
int mval[2]
Definition WM_types.hh:728
short type
Definition WM_types.hh:722
struct PointerRNA * ptr
@ INPUT_CUSTOM_RATIO
Definition transform.hh:753
void applyMouseInput(TransInfo *t, MouseInput *mi, const blender::float2 &mval, float output[3])
#define TRANS_DATA_CONTAINER_FIRST_OK(t)
Definition transform.hh:849
eRedrawFlag
Definition transform.hh:214
@ TREDRAW_NOTHING
Definition transform.hh:215
@ TREDRAW_HARD
Definition transform.hh:217
@ T_ALT_TRANSFORM
Definition transform.hh:126
@ T_NO_CONSTRAINT
Definition transform.hh:95
@ TRANS_CANCEL
Definition transform.hh:210
void setCustomPoints(TransInfo *t, MouseInput *mi, const int mval_start[2], const int mval_end[2])
void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
#define FOREACH_TRANS_DATA_CONTAINER(t, th)
Definition transform.hh:854
void transform_constraint_snap_axis_to_face(const TransInfo *t, const float axis[3], float r_out[3])
void transform_constraint_snap_axis_to_edge(const TransInfo *t, const float axis[3], float r_out[3])
void recalc_data(TransInfo *t)
conversion and adaptation of different datablocks to a common struct.
blender::Array< TransDataVertSlideVert > transform_mesh_vert_slide_data_create(const TransDataContainer *tc, blender::Vector< blender::float3 > &r_loc_dst_buffer)
blender::Array< TransDataVertSlideVert > transform_mesh_uv_vert_slide_data_create(const TransInfo *t, TransDataContainer *tc, blender::Vector< blender::float3 > &r_loc_dst_buffer)
TransConvertTypeInfo TransConvertType_MeshUV
transform modes used by different operators.
TransModeInfo TransMode_vertslide
static void vert_slide_transform_matrix_fn(TransInfo *t, float mat_xform[4][4])
static void freeVertSlideVerts(TransInfo *, TransDataContainer *, TransCustomData *custom_data)
static eRedrawFlag handleEventVertSlide(TransInfo *t, const wmEvent *event)
static void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp)
static void vert_slide_snap_apply(TransInfo *t, float *value)
static VertSlideData * createVertSlideVerts(TransInfo *t, TransDataContainer *tc)
static void doVertSlide(TransInfo *t, float perc)
static void vert_slide_apply_elem(const TransDataVertSlideVert &sv, const float perc, const bool use_even, const bool use_flip, float r_co[3])
static void initVertSlide(TransInfo *t, wmOperator *op)
static void vert_slide_update_input(TransInfo *t)
void transform_mode_vert_slide_reproject_input(TransInfo *t)
static void applyVertSlide(TransInfo *t)
static void calcVertSlideCustomPoints(TransInfo *t)
static void drawVertSlide(TransInfo *t)
void transform_snap_mixed_apply(TransInfo *t, float *vec)
bool validSnap(const TransInfo *t)
bool transform_snap_increment(const TransInfo *t, float *r_val)
float transform_snap_distance_len_squared_fn(TransInfo *, const float p1[3], const float p2[3])
void getSnapPoint(const TransInfo *t, float vec[3])
@ EVT_EKEY
@ EVT_FKEY
@ EVT_CKEY
@ MOUSEMOVE
const char * WM_bool_as_string(bool test)
void wmOrtho2_region_pixelspace(const ARegion *region)