Blender V4.5
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
8
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
29namespace blender::ed::transform {
30
31/* -------------------------------------------------------------------- */
34
36{
38 // BMLoopNorEditData *lnor_ed = lnors_ed_arr->lnor_editdata;
39
40 tc->custom.mode.data = lnors_ed_arr;
42}
43
45{
46 BMLoopNorEditDataArray *lnors_ed_arr = static_cast<BMLoopNorEditDataArray *>(custom_data->data);
47
48 if (t->state == TRANS_CANCEL) {
49 BMLoopNorEditData *lnor_ed = lnors_ed_arr->lnor_editdata;
51 BMesh *bm = em->bm;
52
53 /* Restore custom loop normal on cancel. */
54 for (int i = 0; i < lnors_ed_arr->totloop; i++, lnor_ed++) {
56 bm->lnor_spacearr->lspacearr[lnor_ed->loop_index], lnor_ed->niloc, lnor_ed->clnors_data);
57 }
58 }
59
61
62 tc->custom.mode.data = nullptr;
63 tc->custom.mode.free_cb = nullptr;
64}
65
66/* Works by getting custom normal from clnor_data, transform, then store. */
68{
69 char str[UI_MAX_DRAW_STR];
70
71 float axis_final[3];
72 /* Use the negative axis to match the default Z axis of the view matrix. */
73 negate_v3_v3(axis_final, t->spacemtx[t->orient_axis]);
74
75 if ((t->con.mode & CON_APPLY) && t->con.applyRot) {
76 t->con.applyRot(t, nullptr, nullptr, axis_final, nullptr);
77 }
78
80 BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
81 BMesh *bm = em->bm;
82
83 BMLoopNorEditDataArray *lnors_ed_arr = static_cast<BMLoopNorEditDataArray *>(
84 tc->custom.mode.data);
85 BMLoopNorEditData *lnor_ed = lnors_ed_arr->lnor_editdata;
86
87 float axis[3];
88 float mat[3][3];
89 float angle = t->values[0] + t->values_modal_offset[0];
90 copy_v3_v3(axis, axis_final);
91
93
95
96 applyNumInput(&t->num, &angle);
97
98 headerRotation(t, str, sizeof(str), angle);
99
101
102 for (int i = 0; i < lnors_ed_arr->totloop; i++, lnor_ed++) {
103 mul_v3_m3v3(lnor_ed->nloc, mat, lnor_ed->niloc);
104
106 bm->lnor_spacearr->lspacearr[lnor_ed->loop_index], lnor_ed->nloc, lnor_ed->clnors_data);
107 }
108
109 t->values_final[0] = angle;
110 }
111
112 recalc_data(t);
113
115}
116
143
145
147 /*flags*/ 0,
148 /*init_fn*/ initNormalRotation,
149 /*transform_fn*/ applyNormalRotation,
150 /*transform_matrix_fn*/ nullptr,
151 /*handle_event_fn*/ nullptr,
152 /*snap_distance_fn*/ nullptr,
153 /*snap_apply_fn*/ nullptr,
154 /*draw_fn*/ nullptr,
155};
156
157} // namespace blender::ed::transform
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
Definition editmesh.cc:61
void BKE_editmesh_lnorspace_update(BMEditMesh *em)
Definition editmesh.cc:220
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:128
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:189
void ED_area_status_text(ScrArea *area, const char *str)
Definition area.cc:872
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:117
#define UI_MAX_DRAW_STR
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)
static void storeCustomLNorValue(TransDataContainer *tc, BMesh *bm)
void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
void recalc_data(TransInfo *t)
void headerRotation(TransInfo *t, char *str, const int str_size, float final)
bool transform_snap_increment(const TransInfo *t, float *r_val)
void transform_snap_mixed_apply(TransInfo *t, float *vec)
void freeCustomNormalArray(TransInfo *t, TransDataContainer *tc, TransCustomData *custom_data)
void transform_mode_default_modal_orientation_set(TransInfo *t, int type)
static void applyNormalRotation(TransInfo *t)
void initSnapAngleIncrements(TransInfo *t)
static void initNormalRotation(TransInfo *t, wmOperator *)
BMLoopNorEditData * lnor_editdata
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:590
void(* free_cb)(TransInfo *, TransDataContainer *tc, TransCustomData *custom_data)
Definition transform.hh:628
i
Definition text_draw.cc:230
#define FOREACH_TRANS_DATA_CONTAINER(t, th)
Definition transform.hh:42
conversion and adaptation of different datablocks to a common struct.
transform modes used by different operators.