Blender  V2.93
MOD_bevel.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2005 by the Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include "MEM_guardedalloc.h"
25 
26 #include "BLI_utildefines.h"
27 
28 #include "BLI_math.h"
29 
30 #include "BLT_translation.h"
31 
32 #include "DNA_curveprofile_types.h"
33 #include "DNA_defaults.h"
34 #include "DNA_mesh_types.h"
35 #include "DNA_meshdata_types.h"
36 #include "DNA_object_types.h"
37 #include "DNA_scene_types.h"
38 #include "DNA_screen_types.h"
39 
40 #include "BKE_context.h"
41 #include "BKE_curveprofile.h"
42 #include "BKE_deform.h"
43 #include "BKE_mesh.h"
44 #include "BKE_modifier.h"
45 #include "BKE_screen.h"
46 
47 #include "UI_interface.h"
48 #include "UI_resources.h"
49 
50 #include "RNA_access.h"
51 
52 #include "MOD_ui_common.h"
53 #include "MOD_util.h"
54 
55 #include "BLO_read_write.h"
56 
57 #include "BKE_curveprofile.h"
58 #include "bmesh.h"
59 #include "bmesh_tools.h"
60 
61 #include "DEG_depsgraph_query.h"
62 
63 static void initData(ModifierData *md)
64 {
66 
68 
70 
72 }
73 
74 static void copyData(const ModifierData *md_src, ModifierData *md_dst, const int flag)
75 {
76  const BevelModifierData *bmd_src = (const BevelModifierData *)md_src;
77  BevelModifierData *bmd_dst = (BevelModifierData *)md_dst;
78 
79  BKE_modifier_copydata_generic(md_src, md_dst, flag);
81 }
82 
83 static void requiredDataMask(Object *UNUSED(ob),
84  ModifierData *md,
85  CustomData_MeshMasks *r_cddata_masks)
86 {
88 
89  /* ask for vertexgroups if we need them */
90  if (bmd->defgrp_name[0] != '\0') {
91  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
92  }
93 }
94 
95 /*
96  * This calls the new bevel code (added since 2.64)
97  */
99 {
100  Mesh *result;
101  BMesh *bm;
102  BMIter iter;
103  BMEdge *e;
104  BMVert *v;
105  float weight, weight2;
106  int vgroup = -1;
107  MDeformVert *dvert = NULL;
109  const float threshold = cosf(bmd->bevel_angle + 0.000000175f);
110  const bool do_clamp = !(bmd->flags & MOD_BEVEL_OVERLAP_OK);
111  const int offset_type = bmd->val_flags;
112  const int profile_type = bmd->profile_type;
113  const float value = bmd->value;
114  const int mat = CLAMPIS(bmd->mat, -1, ctx->object->totcol - 1);
115  const bool loop_slide = (bmd->flags & MOD_BEVEL_EVEN_WIDTHS) == 0;
116  const bool mark_seam = (bmd->edge_flags & MOD_BEVEL_MARK_SEAM);
117  const bool mark_sharp = (bmd->edge_flags & MOD_BEVEL_MARK_SHARP);
118  bool harden_normals = (bmd->flags & MOD_BEVEL_HARDEN_NORMALS);
119  const int face_strength_mode = bmd->face_str_mode;
120  const int miter_outer = bmd->miter_outer;
121  const int miter_inner = bmd->miter_inner;
122  const float spread = bmd->spread;
123  const bool invert_vgroup = (bmd->flags & MOD_BEVEL_INVERT_VGROUP) != 0;
124 
126  &(struct BMeshCreateParams){0},
127  &(struct BMeshFromMeshParams){
128  .calc_face_normal = true,
129  .add_key_index = false,
130  .use_shapekey = false,
131  .active_shapekey = 0,
132  /* XXX We probably can use CD_MASK_BAREMESH_ORIGDINDEX here instead
133  * (also for other modifiers cases)? */
134  .cd_mask_extra = {.vmask = CD_MASK_ORIGINDEX,
135  .emask = CD_MASK_ORIGINDEX,
136  .pmask = CD_MASK_ORIGINDEX},
137  });
138 
139  if ((bmd->lim_flags & MOD_BEVEL_VGROUP) && bmd->defgrp_name[0]) {
140  MOD_get_vgroup(ctx->object, mesh, bmd->defgrp_name, &dvert, &vgroup);
141  }
142 
144  BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
145  if (bmd->lim_flags & MOD_BEVEL_WEIGHT) {
147  if (weight == 0.0f) {
148  continue;
149  }
150  }
151  else if (vgroup != -1) {
152  weight = invert_vgroup ?
153  1.0f -
156  /* Check is against 0.5 rather than != 0.0 because cascaded bevel modifiers will
157  * interpolate weights for newly created vertices, and may cause unexpected "selection" */
158  if (weight < 0.5f) {
159  continue;
160  }
161  }
163  }
164  }
165  else if (bmd->lim_flags & MOD_BEVEL_ANGLE) {
166  BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
167  /* check for 1 edge having 2 face users */
168  BMLoop *l_a, *l_b;
169  if (BM_edge_loop_pair(e, &l_a, &l_b)) {
170  if (dot_v3v3(l_a->f->no, l_b->f->no) < threshold) {
174  }
175  }
176  }
177  }
178  else {
179  /* crummy, is there a way just to operator on all? - campbell */
180  BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
181  if (BM_edge_is_manifold(e)) {
182  if (bmd->lim_flags & MOD_BEVEL_WEIGHT) {
184  if (weight == 0.0f) {
185  continue;
186  }
187  }
188  else if (vgroup != -1) {
189  weight = invert_vgroup ?
191  dvert, BM_elem_index_get(e->v1), vgroup) :
193  weight2 = invert_vgroup ? 1.0f - BKE_defvert_array_find_weight_safe(
194  dvert, BM_elem_index_get(e->v2), vgroup) :
196  dvert, BM_elem_index_get(e->v2), vgroup);
197  if (weight < 0.5f || weight2 < 0.5f) {
198  continue;
199  }
200  }
204  }
205  }
206  }
207 
208  Object *ob = ctx->object;
209 
210  if (harden_normals && (ob->type == OB_MESH) && !(((Mesh *)ob->data)->flag & ME_AUTOSMOOTH)) {
211  BKE_modifier_set_error(ob, md, "Enable 'Auto Smooth' in Object Data Properties");
212  harden_normals = false;
213  }
214 
216  value,
217  offset_type,
218  profile_type,
219  bmd->res,
220  bmd->profile,
221  bmd->affect_type,
223  do_clamp,
224  dvert,
225  vgroup,
226  mat,
227  loop_slide,
228  mark_seam,
229  mark_sharp,
230  harden_normals,
231  face_strength_mode,
232  miter_outer,
233  miter_inner,
234  spread,
235  mesh->smoothresh,
236  bmd->custom_profile,
237  bmd->vmesh_method);
238 
240 
241  /* Make sure we never alloc'd these. */
243 
244  BM_mesh_free(bm);
245 
246  result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
247 
248  return result;
249 }
250 
252 {
253  return true;
254 }
255 
256 static void freeData(ModifierData *md)
257 {
260 }
261 
262 static bool isDisabled(const Scene *UNUSED(scene), ModifierData *md, bool UNUSED(userRenderParams))
263 {
265  return (bmd->value == 0.0f);
266 }
267 
268 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
269 {
270  uiLayout *col, *sub;
271  uiLayout *layout = panel->layout;
272 
273  PointerRNA ob_ptr;
275 
276  bool edge_bevel = RNA_enum_get(ptr, "affect") != MOD_BEVEL_AFFECT_VERTICES;
277 
278  uiItemR(layout, ptr, "affect", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
279 
280  uiLayoutSetPropSep(layout, true);
281 
282  col = uiLayoutColumn(layout, false);
283  uiItemR(col, ptr, "offset_type", 0, NULL, ICON_NONE);
284  if (RNA_enum_get(ptr, "offset_type") == BEVEL_AMT_PERCENT) {
285  uiItemR(col, ptr, "width_pct", 0, NULL, ICON_NONE);
286  }
287  else {
288  uiItemR(col, ptr, "width", 0, IFACE_("Amount"), ICON_NONE);
289  }
290 
291  uiItemR(layout, ptr, "segments", 0, NULL, ICON_NONE);
292 
293  uiItemS(layout);
294 
295  col = uiLayoutColumn(layout, false);
296  uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NONE);
297  int limit_method = RNA_enum_get(ptr, "limit_method");
298  if (limit_method == MOD_BEVEL_ANGLE) {
299  sub = uiLayoutColumn(col, false);
300  uiLayoutSetActive(sub, edge_bevel);
301  uiItemR(col, ptr, "angle_limit", 0, NULL, ICON_NONE);
302  }
303  else if (limit_method == MOD_BEVEL_VGROUP) {
304  modifier_vgroup_ui(col, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
305  }
306 
307  modifier_panel_end(layout, ptr);
308 }
309 
310 static void profile_panel_draw(const bContext *UNUSED(C), Panel *panel)
311 {
312  uiLayout *row;
313  uiLayout *layout = panel->layout;
314 
316 
317  int profile_type = RNA_enum_get(ptr, "profile_type");
318  int miter_inner = RNA_enum_get(ptr, "miter_inner");
319  int miter_outer = RNA_enum_get(ptr, "miter_outer");
320  bool edge_bevel = RNA_enum_get(ptr, "affect") != MOD_BEVEL_AFFECT_VERTICES;
321 
322  uiItemR(layout, ptr, "profile_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
323 
324  uiLayoutSetPropSep(layout, true);
325 
327  row = uiLayoutRow(layout, false);
329  row,
330  profile_type == MOD_BEVEL_PROFILE_SUPERELLIPSE ||
331  (profile_type == MOD_BEVEL_PROFILE_CUSTOM && edge_bevel &&
332  !((miter_inner == MOD_BEVEL_MITER_SHARP) && (miter_outer == MOD_BEVEL_MITER_SHARP))));
333  uiItemR(row,
334  ptr,
335  "profile",
337  (profile_type == MOD_BEVEL_PROFILE_SUPERELLIPSE) ? IFACE_("Shape") :
338  IFACE_("Miter Shape"),
339  ICON_NONE);
340 
341  if (profile_type == MOD_BEVEL_PROFILE_CUSTOM) {
342  uiLayout *sub = uiLayoutColumn(layout, false);
343  uiLayoutSetPropDecorate(sub, false);
344  uiTemplateCurveProfile(sub, ptr, "custom_profile");
345  }
346  }
347 }
348 
349 static void geometry_panel_draw(const bContext *UNUSED(C), Panel *panel)
350 {
351  uiLayout *row;
352  uiLayout *layout = panel->layout;
353 
355 
356  bool edge_bevel = RNA_enum_get(ptr, "affect") != MOD_BEVEL_AFFECT_VERTICES;
357 
358  uiLayoutSetPropSep(layout, true);
359 
360  row = uiLayoutRow(layout, false);
361  uiLayoutSetActive(row, edge_bevel);
362  uiItemR(row, ptr, "miter_outer", 0, IFACE_("Miter Outer"), ICON_NONE);
363  row = uiLayoutRow(layout, false);
364  uiLayoutSetActive(row, edge_bevel);
365  uiItemR(row, ptr, "miter_inner", 0, IFACE_("Inner"), ICON_NONE);
366  if (RNA_enum_get(ptr, "miter_inner") == BEVEL_MITER_ARC) {
367  row = uiLayoutRow(layout, false);
368  uiLayoutSetActive(row, edge_bevel);
369  uiItemR(row, ptr, "spread", 0, NULL, ICON_NONE);
370  }
371  uiItemS(layout);
372 
373  row = uiLayoutRow(layout, false);
374  uiLayoutSetActive(row, edge_bevel);
375  uiItemR(row, ptr, "vmesh_method", 0, IFACE_("Intersections"), ICON_NONE);
376  uiItemR(layout, ptr, "use_clamp_overlap", 0, NULL, ICON_NONE);
377  row = uiLayoutRow(layout, false);
378  uiLayoutSetActive(row, edge_bevel);
379  uiItemR(row, ptr, "loop_slide", 0, NULL, ICON_NONE);
380 }
381 
382 static void shading_panel_draw(const bContext *UNUSED(C), Panel *panel)
383 {
384  uiLayout *col;
385  uiLayout *layout = panel->layout;
386 
388 
389  bool edge_bevel = RNA_enum_get(ptr, "affect") != MOD_BEVEL_AFFECT_VERTICES;
390 
391  uiLayoutSetPropSep(layout, true);
392 
393  uiItemR(layout, ptr, "harden_normals", 0, NULL, ICON_NONE);
394 
395  col = uiLayoutColumnWithHeading(layout, true, IFACE_("Mark"));
396  uiLayoutSetActive(col, edge_bevel);
397  uiItemR(col, ptr, "mark_seam", 0, IFACE_("Seam"), ICON_NONE);
398  uiItemR(col, ptr, "mark_sharp", 0, IFACE_("Sharp"), ICON_NONE);
399 
400  uiItemR(layout, ptr, "material", 0, NULL, ICON_NONE);
401  uiItemR(layout, ptr, "face_strength_mode", 0, NULL, ICON_NONE);
402 }
403 
404 static void panelRegister(ARegionType *region_type)
405 {
408  region_type, "profile", "Profile", NULL, profile_panel_draw, panel_type);
410  region_type, "geometry", "Geometry", NULL, geometry_panel_draw, panel_type);
412  region_type, "shading", "Shading", NULL, shading_panel_draw, panel_type);
413 }
414 
415 static void blendWrite(BlendWriter *writer, const ModifierData *md)
416 {
417  const BevelModifierData *bmd = (const BevelModifierData *)md;
418 
419  if (bmd->custom_profile) {
421  }
422 }
423 
424 static void blendRead(BlendDataReader *reader, ModifierData *md)
425 {
427 
428  BLO_read_data_address(reader, &bmd->custom_profile);
429  if (bmd->custom_profile) {
431  }
432 }
433 
435  /* name */ "Bevel",
436  /* structName */ "BevelModifierData",
437  /* structSize */ sizeof(BevelModifierData),
438  /* srna */ &RNA_BevelModifier,
442  /* icon */ ICON_MOD_BEVEL,
443  /* copyData */ copyData,
444  /* deformVerts */ NULL,
445  /* deformMatrices */ NULL,
446  /* deformVertsEM */ NULL,
447  /* deformMatricesEM */ NULL,
448  /* modifyMesh */ modifyMesh,
449  /* modifyHair */ NULL,
450  /* modifyGeometrySet */ NULL,
451  /* modifyVolume */ NULL,
452  /* initData */ initData,
453  /* requiredDataMask */ requiredDataMask,
454  /* freeData */ freeData,
455  /* isDisabled */ isDisabled,
456  /* updateDepsgraph */ NULL,
457  /* dependsOnTime */ NULL,
458  /* dependsOnNormals */ dependsOnNormals,
459  /* foreachIDLink */ NULL,
460  /* foreachTexLink */ NULL,
461  /* freeRuntimeData */ NULL,
462  /* uiPanel */ panelRegister,
463  /* blendWrite */ blendWrite,
464  /* blendRead */ blendRead,
465 };
void BKE_curveprofile_blend_read(struct BlendDataReader *reader, struct CurveProfile *profile)
struct CurveProfile * BKE_curveprofile_copy(const struct CurveProfile *profile)
void BKE_curveprofile_blend_write(struct BlendWriter *writer, const struct CurveProfile *profile)
struct CurveProfile * BKE_curveprofile_add(eCurveProfilePresets preset)
Definition: curveprofile.c:887
void BKE_curveprofile_free(struct CurveProfile *profile)
Definition: curveprofile.c:53
support for deformation groups and hooks.
float BKE_defvert_array_find_weight_safe(const struct MDeformVert *dvert, const int index, const int defgroup)
Definition: deform.c:645
struct BMesh * BKE_mesh_to_bmesh_ex(const struct Mesh *me, const struct BMeshCreateParams *create_params, const struct BMeshFromMeshParams *convert_params)
struct Mesh * BKE_mesh_from_bmesh_for_eval_nomain(struct BMesh *bm, const struct CustomData_MeshMasks *cd_mask_extra, const struct Mesh *me_settings)
@ eModifierTypeFlag_AcceptsCVs
Definition: BKE_modifier.h:81
@ eModifierTypeFlag_EnableInEditmode
Definition: BKE_modifier.h:92
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:83
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:80
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:61
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
#define BLI_assert(a)
Definition: BLI_assert.h:58
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
#define CLAMPIS(a, b, c)
#define UNUSED(x)
#define ELEM(...)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define BLO_read_data_address(reader, ptr_p)
#define IFACE_(msgid)
@ PROF_PRESET_LINE
#define CD_MASK_NORMAL
#define CD_MASK_ORIGINDEX
#define CD_MASK_MDEFORMVERT
@ CD_BWEIGHT
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:44
@ ME_AUTOSMOOTH
@ MOD_BEVEL_PROFILE_CUSTOM
@ MOD_BEVEL_PROFILE_SUPERELLIPSE
@ MOD_BEVEL_HARDEN_NORMALS
@ MOD_BEVEL_INVERT_VGROUP
@ MOD_BEVEL_WEIGHT
@ MOD_BEVEL_OVERLAP_OK
@ MOD_BEVEL_VGROUP
@ MOD_BEVEL_EVEN_WIDTHS
@ MOD_BEVEL_ANGLE
struct BevelModifierData BevelModifierData
@ MOD_BEVEL_MITER_SHARP
@ eModifierType_Bevel
@ MOD_BEVEL_MARK_SHARP
@ MOD_BEVEL_MARK_SEAM
@ MOD_BEVEL_AFFECT_VERTICES
Object is a sort of wrapper for general info.
@ OB_MESH
Read Guarded memory(de)allocation.
static void geometry_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_bevel.c:349
static void copyData(const ModifierData *md_src, ModifierData *md_dst, const int flag)
Definition: MOD_bevel.c:74
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition: MOD_bevel.c:98
static bool isDisabled(const Scene *UNUSED(scene), ModifierData *md, bool UNUSED(userRenderParams))
Definition: MOD_bevel.c:262
static void shading_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_bevel.c:382
static void blendWrite(BlendWriter *writer, const ModifierData *md)
Definition: MOD_bevel.c:415
static void blendRead(BlendDataReader *reader, ModifierData *md)
Definition: MOD_bevel.c:424
static void profile_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_bevel.c:310
static bool dependsOnNormals(ModifierData *UNUSED(md))
Definition: MOD_bevel.c:251
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_bevel.c:268
ModifierTypeInfo modifierType_Bevel
Definition: MOD_bevel.c:434
static void initData(ModifierData *md)
Definition: MOD_bevel.c:63
static void panelRegister(ARegionType *region_type)
Definition: MOD_bevel.c:404
static void freeData(ModifierData *md)
Definition: MOD_bevel.c:256
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_bevel.c:83
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
void MOD_get_vgroup(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index)
Definition: MOD_util.c:254
StructRNA RNA_BevelModifier
#define C
Definition: RandGen.cpp:39
void uiLayoutSetActive(uiLayout *layout, bool active)
@ UI_ITEM_R_EXPAND
@ UI_ITEM_R_SLIDER
uiLayout * uiLayoutColumnWithHeading(uiLayout *layout, bool align, const char *heading)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiTemplateCurveProfile(uiLayout *layout, struct PointerRNA *ptr, const char *propname)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void BM_mesh_bevel(BMesh *bm, const float offset, const int offset_type, const int profile_type, const int segments, const float profile, const bool affect_type, const bool use_weights, const bool limit_offset, const struct MDeformVert *dvert, const int vertex_group, const int mat, const bool loop_slide, const bool mark_seam, const bool mark_sharp, const bool harden_normals, const int face_strength_mode, const int miter_outer, const int miter_inner, const float spread, const float smoothresh, const struct CurveProfile *custom_profile, const int vmesh_method)
Definition: bmesh_bevel.c:7454
@ BM_ELEM_TAG
Definition: bmesh_class.h:484
#define BM_elem_index_get(ele)
Definition: bmesh_inline.h:124
#define BM_elem_flag_enable(ele, hflag)
Definition: bmesh_inline.h:28
float BM_elem_float_data_get(CustomData *cd, void *element, int type)
#define BM_ITER_MESH(ele, iter, bm, itype)
@ BM_EDGES_OF_MESH
@ BM_VERTS_OF_MESH
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_free(BMesh *bm)
BMesh Free Mesh.
Definition: bmesh_mesh.c:307
@ BEVEL_AMT_PERCENT
@ BEVEL_MITER_ARC
bool BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb)
Definition: bmesh_query.c:753
BLI_INLINE bool BM_edge_is_manifold(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMLoop * l_b
ATTR_WARN_UNUSED_RESULT const BMVert * v
Scene scene
uint col
#define cosf(x)
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6402
float no[3]
Definition: bmesh_class.h:280
struct BMFace * f
Definition: bmesh_class.h:183
CustomData vdata
Definition: bmesh_class.h:337
struct BLI_mempool * vtoolflagpool
Definition: bmesh_class.h:331
CustomData edata
Definition: bmesh_class.h:337
struct BLI_mempool * etoolflagpool
Definition: bmesh_class.h:331
struct BLI_mempool * ftoolflagpool
Definition: bmesh_class.h:331
struct CurveProfile * custom_profile
float smoothresh
struct Object * object
Definition: BKE_modifier.h:154
void * data
struct uiLayout * layout
PointerRNA * ptr
Definition: wm_files.c:3157