Blender V5.0
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_types.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 float3 axis_final;
73
74 float angle;
75 if (applyNumInput(&t->num, &angle)) {
76 /* Pass. */
77 }
78 else {
79 angle = t->values[0] + t->values_modal_offset[0];
80 if (!(t->flag & T_INPUT_IS_VALUES_FINAL) &&
82 {
83 /* Flip rotation direction if axis is pointing to screen. */
84 angle = -angle;
85 }
87 if (!(transform_snap_is_active(t) && validSnap(t))) {
89 }
90 }
91
92 float mat[3][3];
93 axis_angle_normalized_to_mat3(mat, axis_final, angle);
94
95 t->values_final[0] = angle;
96
98 BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
99 BMesh *bm = em->bm;
100
101 BMLoopNorEditDataArray *lnors_ed_arr = static_cast<BMLoopNorEditDataArray *>(
102 tc->custom.mode.data);
103 BMLoopNorEditData *lnor_ed = lnors_ed_arr->lnor_editdata;
104
105 headerRotation(t, str, sizeof(str), angle);
106
107 for (int i = 0; i < lnors_ed_arr->totloop; i++, lnor_ed++) {
108 mul_v3_m3v3(lnor_ed->nloc, mat, lnor_ed->niloc);
109
111 bm->lnor_spacearr->lspacearr[lnor_ed->loop_index], lnor_ed->nloc, lnor_ed->clnors_data);
112 }
113 }
114
115 recalc_data(t);
116
118}
119
146
148
150 /*flags*/ 0,
151 /*init_fn*/ initNormalRotation,
152 /*transform_fn*/ applyNormalRotation,
153 /*transform_matrix_fn*/ nullptr,
154 /*handle_event_fn*/ nullptr,
155 /*snap_distance_fn*/ nullptr,
156 /*snap_apply_fn*/ nullptr,
157 /*draw_fn*/ nullptr,
158};
159
160} // 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:141
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_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:851
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)
bool transform_mode_is_axis_pointing_to_screen(const TransInfo *t, const float3 &axis)
void transform_snap_mixed_apply(TransInfo *t, float *vec)
bool validSnap(const TransInfo *t)
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)
bool transform_snap_is_active(const TransInfo *t)
void initSnapAngleIncrements(TransInfo *t)
static void initNormalRotation(TransInfo *t, wmOperator *)
void transform_mode_rotation_axis_get(const TransInfo *t, float3 &r_axis)
VecBase< float, 3 > float3
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(* free_cb)(TransInfo *, TransDataContainer *tc, TransCustomData *custom_data)
Definition transform.hh:633
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.