Blender V5.0
editmesh_set_sharpness_by_angle.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
10#include "BLI_math_vector.hh"
11
12#include "DNA_mesh_types.h"
13
14#include "BKE_context.hh"
15#include "BKE_editmesh.hh"
16#include "BKE_layer.hh"
17#include "BKE_mesh_types.hh"
18
19#include "RNA_access.hh"
20#include "RNA_define.hh"
21
22#include "DEG_depsgraph.hh"
23
24#include "WM_api.hh"
25
26#include "ED_screen.hh"
27
28#include "mesh_intern.hh"
29
30namespace blender::ed::mesh {
31
33{
34 const float angle_limit_cos = std::cos(RNA_float_get(op->ptr, "angle"));
35 const bool extend = RNA_boolean_get(op->ptr, "extend");
38
39 for (Object *object : objects) {
40 Mesh &mesh = *static_cast<Mesh *>(object->data);
41 BMEditMesh *em = mesh.runtime->edit_mesh.get();
42
43 bool changed = false;
44 BMIter iter;
45 BMEdge *e;
46 BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
48 continue;
49 }
50 const bool prev_sharp = !BM_elem_flag_test(e, BM_ELEM_SMOOTH);
51 if (extend && prev_sharp) {
52 continue;
53 }
54 BMLoop *l1, *l2;
55 if (!BM_edge_loop_pair(e, &l1, &l2)) {
56 continue;
57 }
58 const float angle_cos = math::dot(float3(l1->f->no), float3(l2->f->no));
59 const bool sharp = angle_cos <= angle_limit_cos;
61 changed = changed || sharp != prev_sharp;
62 }
63
64 if (changed) {
68 }
69 }
70
71 return OPERATOR_FINISHED;
72}
73
75{
76 ot->name = "Set Sharpness by Angle";
77 ot->description = "Set edge sharpness based on the angle between neighboring faces";
78 ot->idname = "MESH_OT_set_sharpness_by_angle";
79
82
84
86 "angle",
87 0,
88 nullptr,
89 math::AngleRadian::from_degree(0.01f).radian(),
90 math::AngleRadian::from_degree(180.0f).radian(),
91 "Angle",
92 "",
93 math::AngleRadian::from_degree(1.0f).radian(),
94 math::AngleRadian::from_degree(180.0f).radian());
96
97 RNA_def_boolean(ot->srna,
98 "extend",
99 false,
100 "Extend",
101 "Add new sharp edges without clearing existing sharp edges");
102}
103
104} // namespace blender::ed::mesh
Scene * CTX_data_scene(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
void BKE_editmesh_lnorspace_update(BMEditMesh *em)
Definition editmesh.cc:220
blender::Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1074
@ OPERATOR_FINISHED
bool ED_operator_editmesh(bContext *C)
#define C
Definition RandGen.cpp:29
#define NC_GEOM
Definition WM_types.hh:393
#define ND_DATA
Definition WM_types.hh:509
@ OPTYPE_UNDO
Definition WM_types.hh:182
@ OPTYPE_REGISTER
Definition WM_types.hh:180
@ BM_ELEM_SELECT
@ BM_ELEM_SMOOTH
#define BM_elem_flag_set(ele, hflag, val)
#define BM_elem_flag_test(ele, hflag)
#define BM_ITER_MESH(ele, iter, bm, itype)
@ BM_EDGES_OF_MESH
bool BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
static wmOperatorStatus set_sharpness_by_angle_exec(bContext *C, wmOperator *op)
void MESH_OT_set_sharpness_by_angle(wmOperatorType *ot)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
VecBase< float, 3 > float3
float RNA_float_get(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_def_property_float_default(PropertyRNA *prop, float value)
PropertyRNA * RNA_def_float_rotation(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
float no[3]
struct BMFace * f
static AngleRadianBase from_degree(const float &degrees)
struct PointerRNA * ptr
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4237