Blender  V3.3
MOD_bevel.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2005 Blender Foundation. All rights reserved. */
3 
8 #include "MEM_guardedalloc.h"
9 
10 #include "BLI_utildefines.h"
11 
12 #include "BLI_math.h"
13 
14 #include "BLT_translation.h"
15 
16 #include "DNA_curveprofile_types.h"
17 #include "DNA_defaults.h"
18 #include "DNA_mesh_types.h"
19 #include "DNA_meshdata_types.h"
20 #include "DNA_object_types.h"
21 #include "DNA_scene_types.h"
22 #include "DNA_screen_types.h"
23 
24 #include "BKE_context.h"
25 #include "BKE_curveprofile.h"
26 #include "BKE_deform.h"
27 #include "BKE_mesh.h"
28 #include "BKE_modifier.h"
29 #include "BKE_screen.h"
30 
31 #include "UI_interface.h"
32 #include "UI_resources.h"
33 
34 #include "RNA_access.h"
35 #include "RNA_prototypes.h"
36 
37 #include "MOD_ui_common.h"
38 #include "MOD_util.h"
39 
40 #include "BLO_read_write.h"
41 
42 #include "bmesh.h"
43 #include "bmesh_tools.h"
44 
45 #include "DEG_depsgraph_query.h"
46 
47 static void initData(ModifierData *md)
48 {
50 
52 
54 
56 }
57 
58 static void copyData(const ModifierData *md_src, ModifierData *md_dst, const int flag)
59 {
60  const BevelModifierData *bmd_src = (const BevelModifierData *)md_src;
61  BevelModifierData *bmd_dst = (BevelModifierData *)md_dst;
62 
63  BKE_modifier_copydata_generic(md_src, md_dst, flag);
65 }
66 
67 static void requiredDataMask(Object *UNUSED(ob),
68  ModifierData *md,
69  CustomData_MeshMasks *r_cddata_masks)
70 {
72 
73  /* ask for vertexgroups if we need them */
74  if (bmd->defgrp_name[0] != '\0') {
75  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
76  }
77 }
78 
79 /*
80  * This calls the new bevel code (added since 2.64)
81  */
83 {
84  Mesh *result;
85  BMesh *bm;
86  BMIter iter;
87  BMEdge *e;
88  BMVert *v;
89  float weight, weight2;
90  int vgroup = -1;
91  MDeformVert *dvert = NULL;
93  const float threshold = cosf(bmd->bevel_angle + 0.000000175f);
94  const bool do_clamp = !(bmd->flags & MOD_BEVEL_OVERLAP_OK);
95  const int offset_type = bmd->val_flags;
96  const int profile_type = bmd->profile_type;
97  const float value = bmd->value;
98  const int mat = CLAMPIS(bmd->mat, -1, ctx->object->totcol - 1);
99  const bool loop_slide = (bmd->flags & MOD_BEVEL_EVEN_WIDTHS) == 0;
100  const bool mark_seam = (bmd->edge_flags & MOD_BEVEL_MARK_SEAM);
101  const bool mark_sharp = (bmd->edge_flags & MOD_BEVEL_MARK_SHARP);
102  bool harden_normals = (bmd->flags & MOD_BEVEL_HARDEN_NORMALS);
103  const int face_strength_mode = bmd->face_str_mode;
104  const int miter_outer = bmd->miter_outer;
105  const int miter_inner = bmd->miter_inner;
106  const float spread = bmd->spread;
107  const bool invert_vgroup = (bmd->flags & MOD_BEVEL_INVERT_VGROUP) != 0;
108 
110  &(struct BMeshCreateParams){0},
111  &(struct BMeshFromMeshParams){
112  .calc_face_normal = true,
113  .calc_vert_normal = true,
114  .add_key_index = false,
115  .use_shapekey = false,
116  .active_shapekey = 0,
117  /* XXX We probably can use CD_MASK_BAREMESH_ORIGDINDEX here instead
118  * (also for other modifiers cases)? */
119  .cd_mask_extra = {.vmask = CD_MASK_ORIGINDEX,
120  .emask = CD_MASK_ORIGINDEX,
121  .pmask = CD_MASK_ORIGINDEX},
122  });
123 
124  if ((bmd->lim_flags & MOD_BEVEL_VGROUP) && bmd->defgrp_name[0]) {
125  MOD_get_vgroup(ctx->object, mesh, bmd->defgrp_name, &dvert, &vgroup);
126  }
127 
129  BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
130  if (bmd->lim_flags & MOD_BEVEL_WEIGHT) {
132  if (weight == 0.0f) {
133  continue;
134  }
135  }
136  else if (vgroup != -1) {
137  weight = invert_vgroup ?
138  1.0f -
141  /* Check is against 0.5 rather than != 0.0 because cascaded bevel modifiers will
142  * interpolate weights for newly created vertices, and may cause unexpected "selection" */
143  if (weight < 0.5f) {
144  continue;
145  }
146  }
148  }
149  }
150  else if (bmd->lim_flags & MOD_BEVEL_ANGLE) {
151  BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
152  /* check for 1 edge having 2 face users */
153  BMLoop *l_a, *l_b;
154  if (BM_edge_loop_pair(e, &l_a, &l_b)) {
155  if (dot_v3v3(l_a->f->no, l_b->f->no) < threshold) {
159  }
160  }
161  }
162  }
163  else {
164  /* crummy, is there a way just to operator on all? - campbell */
165  BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
166  if (BM_edge_is_manifold(e)) {
167  if (bmd->lim_flags & MOD_BEVEL_WEIGHT) {
169  if (weight == 0.0f) {
170  continue;
171  }
172  }
173  else if (vgroup != -1) {
174  weight = invert_vgroup ?
176  dvert, BM_elem_index_get(e->v1), vgroup) :
178  weight2 = invert_vgroup ? 1.0f - BKE_defvert_array_find_weight_safe(
179  dvert, BM_elem_index_get(e->v2), vgroup) :
181  dvert, BM_elem_index_get(e->v2), vgroup);
182  if (weight < 0.5f || weight2 < 0.5f) {
183  continue;
184  }
185  }
189  }
190  }
191  }
192 
193  Object *ob = ctx->object;
194 
195  if (harden_normals && (ob->type == OB_MESH) && !(((Mesh *)ob->data)->flag & ME_AUTOSMOOTH)) {
196  BKE_modifier_set_error(ob, md, "Enable 'Auto Smooth' in Object Data Properties");
197  harden_normals = false;
198  }
199 
201  value,
202  offset_type,
203  profile_type,
204  bmd->res,
205  bmd->profile,
206  bmd->affect_type,
208  do_clamp,
209  dvert,
210  vgroup,
211  mat,
212  loop_slide,
213  mark_seam,
214  mark_sharp,
215  harden_normals,
216  face_strength_mode,
217  miter_outer,
218  miter_inner,
219  spread,
220  mesh->smoothresh,
221  bmd->custom_profile,
222  bmd->vmesh_method);
223 
225 
226  /* Make sure we never alloc'd these. */
228 
229  BM_mesh_free(bm);
230 
231  return result;
232 }
233 
235 {
236  return true;
237 }
238 
239 static void freeData(ModifierData *md)
240 {
243 }
244 
245 static bool isDisabled(const Scene *UNUSED(scene), ModifierData *md, bool UNUSED(userRenderParams))
246 {
248  return (bmd->value == 0.0f);
249 }
250 
251 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
252 {
253  uiLayout *col, *sub;
254  uiLayout *layout = panel->layout;
255 
256  PointerRNA ob_ptr;
258 
259  bool edge_bevel = RNA_enum_get(ptr, "affect") != MOD_BEVEL_AFFECT_VERTICES;
260 
261  uiItemR(layout, ptr, "affect", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
262 
263  uiLayoutSetPropSep(layout, true);
264 
265  col = uiLayoutColumn(layout, false);
266  uiItemR(col, ptr, "offset_type", 0, NULL, ICON_NONE);
267  if (RNA_enum_get(ptr, "offset_type") == BEVEL_AMT_PERCENT) {
268  uiItemR(col, ptr, "width_pct", 0, NULL, ICON_NONE);
269  }
270  else {
271  uiItemR(col, ptr, "width", 0, IFACE_("Amount"), ICON_NONE);
272  }
273 
274  uiItemR(layout, ptr, "segments", 0, NULL, ICON_NONE);
275 
276  uiItemS(layout);
277 
278  col = uiLayoutColumn(layout, false);
279  uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NONE);
280  int limit_method = RNA_enum_get(ptr, "limit_method");
281  if (limit_method == MOD_BEVEL_ANGLE) {
282  sub = uiLayoutColumn(col, false);
283  uiLayoutSetActive(sub, edge_bevel);
284  uiItemR(col, ptr, "angle_limit", 0, NULL, ICON_NONE);
285  }
286  else if (limit_method == MOD_BEVEL_VGROUP) {
287  modifier_vgroup_ui(col, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
288  }
289 
290  modifier_panel_end(layout, ptr);
291 }
292 
293 static void profile_panel_draw(const bContext *UNUSED(C), Panel *panel)
294 {
295  uiLayout *row;
296  uiLayout *layout = panel->layout;
297 
299 
300  int profile_type = RNA_enum_get(ptr, "profile_type");
301  int miter_inner = RNA_enum_get(ptr, "miter_inner");
302  int miter_outer = RNA_enum_get(ptr, "miter_outer");
303  bool edge_bevel = RNA_enum_get(ptr, "affect") != MOD_BEVEL_AFFECT_VERTICES;
304 
305  uiItemR(layout, ptr, "profile_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
306 
307  uiLayoutSetPropSep(layout, true);
308 
310  row = uiLayoutRow(layout, false);
312  row,
313  profile_type == MOD_BEVEL_PROFILE_SUPERELLIPSE ||
314  (profile_type == MOD_BEVEL_PROFILE_CUSTOM && edge_bevel &&
315  !((miter_inner == MOD_BEVEL_MITER_SHARP) && (miter_outer == MOD_BEVEL_MITER_SHARP))));
316  uiItemR(row,
317  ptr,
318  "profile",
320  (profile_type == MOD_BEVEL_PROFILE_SUPERELLIPSE) ? IFACE_("Shape") :
321  IFACE_("Miter Shape"),
322  ICON_NONE);
323 
324  if (profile_type == MOD_BEVEL_PROFILE_CUSTOM) {
325  uiLayout *sub = uiLayoutColumn(layout, false);
326  uiLayoutSetPropDecorate(sub, false);
327  uiTemplateCurveProfile(sub, ptr, "custom_profile");
328  }
329  }
330 }
331 
332 static void geometry_panel_draw(const bContext *UNUSED(C), Panel *panel)
333 {
334  uiLayout *row;
335  uiLayout *layout = panel->layout;
336 
338 
339  bool edge_bevel = RNA_enum_get(ptr, "affect") != MOD_BEVEL_AFFECT_VERTICES;
340 
341  uiLayoutSetPropSep(layout, true);
342 
343  row = uiLayoutRow(layout, false);
344  uiLayoutSetActive(row, edge_bevel);
345  uiItemR(row, ptr, "miter_outer", 0, IFACE_("Miter Outer"), ICON_NONE);
346  row = uiLayoutRow(layout, false);
347  uiLayoutSetActive(row, edge_bevel);
348  uiItemR(row, ptr, "miter_inner", 0, IFACE_("Inner"), ICON_NONE);
349  if (RNA_enum_get(ptr, "miter_inner") == BEVEL_MITER_ARC) {
350  row = uiLayoutRow(layout, false);
351  uiLayoutSetActive(row, edge_bevel);
352  uiItemR(row, ptr, "spread", 0, NULL, ICON_NONE);
353  }
354  uiItemS(layout);
355 
356  row = uiLayoutRow(layout, false);
357  uiLayoutSetActive(row, edge_bevel);
358  uiItemR(row, ptr, "vmesh_method", 0, IFACE_("Intersections"), ICON_NONE);
359  uiItemR(layout, ptr, "use_clamp_overlap", 0, NULL, ICON_NONE);
360  row = uiLayoutRow(layout, false);
361  uiLayoutSetActive(row, edge_bevel);
362  uiItemR(row, ptr, "loop_slide", 0, NULL, ICON_NONE);
363 }
364 
365 static void shading_panel_draw(const bContext *UNUSED(C), Panel *panel)
366 {
367  uiLayout *col;
368  uiLayout *layout = panel->layout;
369 
371 
372  bool edge_bevel = RNA_enum_get(ptr, "affect") != MOD_BEVEL_AFFECT_VERTICES;
373 
374  uiLayoutSetPropSep(layout, true);
375 
376  uiItemR(layout, ptr, "harden_normals", 0, NULL, ICON_NONE);
377 
378  col = uiLayoutColumnWithHeading(layout, true, IFACE_("Mark"));
379  uiLayoutSetActive(col, edge_bevel);
380  uiItemR(col, ptr, "mark_seam", 0, IFACE_("Seam"), ICON_NONE);
381  uiItemR(col, ptr, "mark_sharp", 0, IFACE_("Sharp"), ICON_NONE);
382 
383  uiItemR(layout, ptr, "material", 0, NULL, ICON_NONE);
384  uiItemR(layout, ptr, "face_strength_mode", 0, NULL, ICON_NONE);
385 }
386 
387 static void panelRegister(ARegionType *region_type)
388 {
391  region_type, "profile", "Profile", NULL, profile_panel_draw, panel_type);
393  region_type, "geometry", "Geometry", NULL, geometry_panel_draw, panel_type);
395  region_type, "shading", "Shading", NULL, shading_panel_draw, panel_type);
396 }
397 
398 static void blendWrite(BlendWriter *writer, const ID *UNUSED(id_owner), const ModifierData *md)
399 {
400  const BevelModifierData *bmd = (const BevelModifierData *)md;
401 
402  BLO_write_struct(writer, BevelModifierData, bmd);
403 
404  if (bmd->custom_profile) {
406  }
407 }
408 
409 static void blendRead(BlendDataReader *reader, ModifierData *md)
410 {
412 
413  BLO_read_data_address(reader, &bmd->custom_profile);
414  if (bmd->custom_profile) {
416  }
417 }
418 
420  /* name */ N_("Bevel"),
421  /* structName */ "BevelModifierData",
422  /* structSize */ sizeof(BevelModifierData),
423  /* srna */ &RNA_BevelModifier,
427  /* icon */ ICON_MOD_BEVEL,
428  /* copyData */ copyData,
429  /* deformVerts */ NULL,
430  /* deformMatrices */ NULL,
431  /* deformVertsEM */ NULL,
432  /* deformMatricesEM */ NULL,
433  /* modifyMesh */ modifyMesh,
434  /* modifyGeometrySet */ NULL,
435  /* initData */ initData,
436  /* requiredDataMask */ requiredDataMask,
437  /* freeData */ freeData,
438  /* isDisabled */ isDisabled,
439  /* updateDepsgraph */ NULL,
440  /* dependsOnTime */ NULL,
441  /* dependsOnNormals */ dependsOnNormals,
442  /* foreachIDLink */ NULL,
443  /* foreachTexLink */ NULL,
444  /* freeRuntimeData */ NULL,
445  /* uiPanel */ panelRegister,
446  /* blendWrite */ blendWrite,
447  /* blendRead */ blendRead,
448 };
void BKE_curveprofile_blend_read(struct BlendDataReader *reader, struct CurveProfile *profile)
Definition: curveprofile.cc:88
struct CurveProfile * BKE_curveprofile_copy(const struct CurveProfile *profile)
void BKE_curveprofile_blend_write(struct BlendWriter *writer, const struct CurveProfile *profile)
Definition: curveprofile.cc:82
struct CurveProfile * BKE_curveprofile_add(eCurveProfilePresets preset)
Definition: curveprofile.cc:31
void BKE_curveprofile_free(struct CurveProfile *profile)
Definition: curveprofile.cc:50
support for deformation groups and hooks.
float BKE_defvert_array_find_weight_safe(const struct MDeformVert *dvert, int index, int defgroup)
Definition: deform.c:710
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:67
@ eModifierTypeFlag_EnableInEditmode
Definition: BKE_modifier.h:78
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:69
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:66
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:47
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:46
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 BLO_write_struct(writer, struct_name, data_ptr)
#define IFACE_(msgid)
@ PROF_PRESET_LINE
#define CD_MASK_ORIGINDEX
#define CD_MASK_MDEFORMVERT
@ CD_BWEIGHT
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
@ 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
@ MOD_BEVEL_MARK_SHARP
@ MOD_BEVEL_MARK_SEAM
struct BevelModifierData BevelModifierData
@ eModifierType_Bevel
@ MOD_BEVEL_AFFECT_VERTICES
@ MOD_BEVEL_MITER_SHARP
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:332
static void copyData(const ModifierData *md_src, ModifierData *md_dst, const int flag)
Definition: MOD_bevel.c:58
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
Definition: MOD_bevel.c:82
static bool isDisabled(const Scene *UNUSED(scene), ModifierData *md, bool UNUSED(userRenderParams))
Definition: MOD_bevel.c:245
static void shading_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_bevel.c:365
static void blendRead(BlendDataReader *reader, ModifierData *md)
Definition: MOD_bevel.c:409
static void profile_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_bevel.c:293
static bool dependsOnNormals(ModifierData *UNUSED(md))
Definition: MOD_bevel.c:234
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_bevel.c:251
ModifierTypeInfo modifierType_Bevel
Definition: MOD_bevel.c:419
static void initData(ModifierData *md)
Definition: MOD_bevel.c:47
static void panelRegister(ARegionType *region_type)
Definition: MOD_bevel.c:387
static void blendWrite(BlendWriter *writer, const ID *UNUSED(id_owner), const ModifierData *md)
Definition: MOD_bevel.c:398
static void freeData(ModifierData *md)
Definition: MOD_bevel.c:239
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_bevel.c:67
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
Definition: MOD_ui_common.c:91
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:235
#define C
Definition: RandGen.cpp:25
void uiLayoutSetActive(uiLayout *layout, bool active)
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)
@ UI_ITEM_R_EXPAND
@ UI_ITEM_R_SLIDER
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:7704
@ BM_ELEM_TAG
Definition: bmesh_class.h:484
#define BM_elem_index_get(ele)
Definition: bmesh_inline.h:110
#define BM_elem_flag_enable(ele, hflag)
Definition: bmesh_inline.h:14
float BM_elem_float_data_get(CustomData *cd, void *element, int type)
Definition: bmesh_interp.c:990
#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.cc:258
@ BEVEL_MITER_ARC
@ BEVEL_AMT_PERCENT
bool BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb)
Definition: bmesh_query.c:553
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
#define cosf(x)
Definition: cuda/compat.h:101
Scene scene
uint col
ccl_gpu_kernel_postfix ccl_global float int int int int float threshold
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
float no[3]
Definition: bmesh_class.h:271
struct BMFace * f
Definition: bmesh_class.h:171
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
Definition: DNA_ID.h:368
float smoothresh
struct Object * object
Definition: BKE_modifier.h:141
void * data
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480