Blender V4.3
transform_mode_edge_rotate_normal.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
15#include "BKE_editmesh.hh"
16#include "BKE_mesh.hh"
17#include "BKE_unit.hh"
18
19#include "ED_screen.hh"
20
21#include "UI_interface.hh"
22
23#include "transform.hh"
24#include "transform_convert.hh"
25#include "transform_snap.hh"
26
27#include "transform_mode.hh"
28/* -------------------------------------------------------------------- */
33{
35 // BMLoopNorEditData *lnor_ed = lnors_ed_arr->lnor_editdata;
36
37 tc->custom.mode.data = lnors_ed_arr;
39}
40
42{
43 BMLoopNorEditDataArray *lnors_ed_arr = static_cast<BMLoopNorEditDataArray *>(custom_data->data);
44
45 if (t->state == TRANS_CANCEL) {
46 BMLoopNorEditData *lnor_ed = lnors_ed_arr->lnor_editdata;
48 BMesh *bm = em->bm;
49
50 /* Restore custom loop normal on cancel. */
51 for (int i = 0; i < lnors_ed_arr->totloop; i++, lnor_ed++) {
53 bm->lnor_spacearr->lspacearr[lnor_ed->loop_index], lnor_ed->niloc, lnor_ed->clnors_data);
54 }
55 }
56
58
59 tc->custom.mode.data = nullptr;
60 tc->custom.mode.free_cb = nullptr;
61}
62
63/* Works by getting custom normal from clnor_data, transform, then store. */
65{
66 char str[UI_MAX_DRAW_STR];
67
68 float axis_final[3];
69 /* Use the negative axis to match the default Z axis of the view matrix. */
70 negate_v3_v3(axis_final, t->spacemtx[t->orient_axis]);
71
72 if ((t->con.mode & CON_APPLY) && t->con.applyRot) {
73 t->con.applyRot(t, nullptr, nullptr, axis_final, nullptr);
74 }
75
77 BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
78 BMesh *bm = em->bm;
79
80 BMLoopNorEditDataArray *lnors_ed_arr = static_cast<BMLoopNorEditDataArray *>(
81 tc->custom.mode.data);
82 BMLoopNorEditData *lnor_ed = lnors_ed_arr->lnor_editdata;
83
84 float axis[3];
85 float mat[3][3];
86 float angle = t->values[0] + t->values_modal_offset[0];
87 copy_v3_v3(axis, axis_final);
88
89 transform_snap_increment(t, &angle);
90
92
93 applyNumInput(&t->num, &angle);
94
95 headerRotation(t, str, sizeof(str), angle);
96
97 axis_angle_normalized_to_mat3(mat, axis, angle);
98
99 for (int i = 0; i < lnors_ed_arr->totloop; i++, lnor_ed++) {
100 mul_v3_m3v3(lnor_ed->nloc, mat, lnor_ed->niloc);
101
103 bm->lnor_spacearr->lspacearr[lnor_ed->loop_index], lnor_ed->nloc, lnor_ed->clnors_data);
104 }
105
106 t->values_final[0] = angle;
107 }
108
109 recalc_data(t);
110
112}
113
140
144 /*flags*/ 0,
145 /*init_fn*/ initNormalRotation,
146 /*transform_fn*/ applyNormalRotation,
147 /*transform_matrix_fn*/ nullptr,
148 /*handle_event_fn*/ nullptr,
149 /*snap_distance_fn*/ nullptr,
150 /*snap_apply_fn*/ nullptr,
151 /*draw_fn*/ nullptr,
152};
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
Definition editmesh.cc:63
void BKE_editmesh_lnorspace_update(BMEditMesh *em)
Definition editmesh.cc:208
void BKE_lnor_space_custom_normal_to_data(const MLoopNorSpace *lnor_space, const float custom_lnor[3], short r_clnor_data[2])
@ B_UNIT_ROTATION
Definition BKE_unit.hh:111
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void axis_angle_normalized_to_mat3(float R[3][3], const float axis[3], float angle)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_fl(float r[3], float f)
@ USER_UNIT_ROT_RADIANS
@ V3D_ORIENT_VIEW
bool applyNumInput(NumInput *n, float *vec)
Definition numinput.cc:190
void ED_area_status_text(ScrArea *area, const char *str)
Definition area.cc:803
@ TFM_NORMAL_ROTATION
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:125
#define UI_MAX_DRAW_STR
ATTR_WARN_UNUSED_RESULT BMesh * bm
BMLoopNorEditDataArray * BM_loop_normal_editdata_array_init(BMesh *bm, const bool do_all_loops_of_vert)
void BM_loop_normal_editdata_array_free(BMLoopNorEditDataArray *lnors_ed_arr)
#define str(s)
BMLoopNorEditData * lnor_editdata
struct MLoopNorSpaceArray * lnor_spacearr
MLoopNorSpace ** lspacearr
Definition BKE_mesh.h:265
short idx_max
float val_inc[NUM_MAX_ELEMENTS]
int unit_type[NUM_MAX_ELEMENTS]
bool unit_use_radians
struct UnitSettings unit
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
TransCustomData mode
Definition transform.hh:423
void(* free_cb)(TransInfo *, TransDataContainer *tc, TransCustomData *custom_data)
Definition transform.hh:409
TransCustomDataContainer custom
Definition transform.hh:501
eTfmMode mode
Definition transform.hh:517
int orient_axis
Definition transform.hh:640
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
eTState state
Definition transform.hh:527
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
float spacemtx[3][3]
Definition transform.hh:592
ScrArea * area
Definition transform.hh:651
@ INPUT_ANGLE
Definition transform.hh:746
@ CON_APPLY
Definition transform.hh:193
@ TRANS_CANCEL
Definition transform.hh:210
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.
void transform_mode_default_modal_orientation_set(TransInfo *t, int type)
void headerRotation(TransInfo *t, char *str, const int str_size, float final)
transform modes used by different operators.
void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData *custom_data)
static void initNormalRotation(TransInfo *t, wmOperator *)
static void storeCustomLNorValue(TransDataContainer *tc, BMesh *bm)
TransModeInfo TransMode_rotatenormal
static void applyNormalRotation(TransInfo *t)
void transform_snap_mixed_apply(TransInfo *t, float *vec)
bool transform_snap_increment(const TransInfo *t, float *r_val)
void initSnapAngleIncrements(TransInfo *t)