Blender V4.3
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
10#include "BLI_math_vector.hh"
11
12#include "DNA_mesh_types.h"
13#include "DNA_scene_types.h"
14
15#include "BKE_context.hh"
16#include "BKE_editmesh.hh"
17#include "BKE_layer.hh"
18#include "BKE_mesh_types.hh"
19
20#include "RNA_access.hh"
21#include "RNA_define.hh"
22
23#include "DEG_depsgraph.hh"
24
25#include "WM_api.hh"
26
27#include "ED_screen.hh"
28
29#include "mesh_intern.hh"
30
31namespace blender::ed::mesh {
32
34{
35 const float angle_limit_cos = std::cos(RNA_float_get(op->ptr, "angle"));
36 const bool extend = RNA_boolean_get(op->ptr, "extend");
39
40 for (Object *object : objects) {
41 Mesh &mesh = *static_cast<Mesh *>(object->data);
42 BMEditMesh *em = mesh.runtime->edit_mesh.get();
43
44 bool changed = false;
45 BMIter iter;
46 BMEdge *e;
47 BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
49 continue;
50 }
51 const bool prev_sharp = !BM_elem_flag_test(e, BM_ELEM_SMOOTH);
52 if (extend && prev_sharp) {
53 continue;
54 }
55 BMLoop *l1, *l2;
56 if (!BM_edge_loop_pair(e, &l1, &l2)) {
57 continue;
58 }
59 const float angle_cos = math::dot(float3(l1->f->no), float3(l2->f->no));
60 const bool sharp = angle_cos <= angle_limit_cos;
62 changed = changed || sharp != prev_sharp;
63 }
64
65 if (changed) {
69 }
70 }
71
72 return OPERATOR_FINISHED;
73}
74
76{
77 ot->name = "Set Sharpness by Angle";
78 ot->description = "Set edge sharpness based on the angle between neighboring faces";
79 ot->idname = "MESH_OT_set_sharpness_by_angle";
80
83
85
87 "angle",
88 0,
89 nullptr,
92 "Angle",
93 "",
97
99 "extend",
100 false,
101 "Extend",
102 "Add new sharp edges without clearing existing sharp edges");
103}
104
105} // 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:208
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:1041
bool ED_operator_editmesh(bContext *C)
@ OPTYPE_UNDO
Definition WM_types.hh:162
@ OPTYPE_REGISTER
Definition WM_types.hh:160
#define NC_GEOM
Definition WM_types.hh:360
#define ND_DATA
Definition WM_types.hh:475
@ 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 int 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 T &degrees)
const char * name
Definition WM_types.hh:990
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1042
const char * idname
Definition WM_types.hh:992
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1006
const char * description
Definition WM_types.hh:996
StructRNA * srna
Definition WM_types.hh:1080
struct PointerRNA * ptr
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4125