Blender  V3.3
MOD_datatransfer.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2014 Blender Foundation. All rights reserved. */
3 
8 #include "BLI_utildefines.h"
9 
10 #include "BLI_math.h"
11 
12 #include "BLT_translation.h"
13 
14 #include "DNA_mesh_types.h"
15 #include "DNA_meshdata_types.h"
16 #include "DNA_modifier_types.h"
17 #include "DNA_object_types.h"
18 #include "DNA_screen_types.h"
19 
20 #include "BKE_context.h"
21 #include "BKE_customdata.h"
22 #include "BKE_data_transfer.h"
23 #include "BKE_lib_id.h"
24 #include "BKE_lib_query.h"
25 #include "BKE_mesh_mapping.h"
26 #include "BKE_mesh_remap.h"
27 #include "BKE_modifier.h"
28 #include "BKE_report.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 "DEG_depsgraph_query.h"
38 
39 #include "MEM_guardedalloc.h"
40 
41 #include "MOD_ui_common.h"
42 #include "MOD_util.h"
43 
44 /**************************************
45  * Modifiers functions. *
46  **************************************/
47 static void initData(ModifierData *md)
48 {
50  int i;
51 
52  dtmd->ob_source = NULL;
53  dtmd->data_types = 0;
54 
59 
60  dtmd->map_max_distance = 1.0f;
61  dtmd->map_ray_radius = 0.0f;
62 
63  for (i = 0; i < DT_MULTILAYER_INDEX_MAX; i++) {
66  }
67 
68  dtmd->mix_mode = CDT_MIX_TRANSFER;
69  dtmd->mix_factor = 1.0f;
70  dtmd->defgrp_name[0] = '\0';
71 
73 }
74 
75 static void requiredDataMask(Object *UNUSED(ob),
76  ModifierData *md,
77  CustomData_MeshMasks *r_cddata_masks)
78 {
80 
81  if (dtmd->defgrp_name[0] != '\0') {
82  /* We need vertex groups! */
83  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
84  }
85 
87 }
88 
90 {
93 
94  if ((item_types & ME_VERT) && (dtmd->vmap_mode & (MREMAP_USE_NORPROJ | MREMAP_USE_NORMAL))) {
95  return true;
96  }
97  if ((item_types & ME_EDGE) && (dtmd->emap_mode & (MREMAP_USE_NORPROJ | MREMAP_USE_NORMAL))) {
98  return true;
99  }
100  if ((item_types & ME_LOOP) && (dtmd->lmap_mode & (MREMAP_USE_NORPROJ | MREMAP_USE_NORMAL))) {
101  return true;
102  }
103  if ((item_types & ME_POLY) && (dtmd->pmap_mode & (MREMAP_USE_NORPROJ | MREMAP_USE_NORMAL))) {
104  return true;
105  }
106 
107  return false;
108 }
109 
110 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
111 {
113  walk(userData, ob, (ID **)&dtmd->ob_source, IDWALK_CB_NOP);
114 }
115 
117 {
119  if (dtmd->ob_source != NULL) {
120  CustomData_MeshMasks cddata_masks = {0};
123  dtmd->vmap_mode, dtmd->emap_mode, dtmd->lmap_mode, dtmd->pmap_mode, &cddata_masks);
124 
126  ctx->node, dtmd->ob_source, DEG_OB_COMP_GEOMETRY, "DataTransfer Modifier");
127  DEG_add_customdata_mask(ctx->node, dtmd->ob_source, &cddata_masks);
128 
131  ctx->node, dtmd->ob_source, DEG_OB_COMP_TRANSFORM, "DataTransfer Modifier");
132  DEG_add_modifier_to_transform_relation(ctx->node, "DataTransfer Modifier");
133  }
134  }
135 }
136 
137 static bool isDisabled(const struct Scene *UNUSED(scene),
138  ModifierData *md,
139  bool UNUSED(useRenderParams))
140 {
141  /* If no source object, bypass. */
143  /* The object type check is only needed here in case we have a placeholder
144  * object assigned (because the library containing the mesh is missing).
145  *
146  * In other cases it should be impossible to have a type mismatch.
147  */
148  return !dtmd->ob_source || dtmd->ob_source->type != OB_MESH;
149 }
150 
151 #define DT_TYPES_AFFECT_MESH \
152  (DT_TYPE_BWEIGHT_VERT | DT_TYPE_BWEIGHT_EDGE | DT_TYPE_CREASE | DT_TYPE_SHARP_EDGE | \
153  DT_TYPE_LNOR | DT_TYPE_SHARP_FACE)
154 
155 static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *me_mod)
156 {
159  Mesh *result = me_mod;
160  ReportList reports;
161 
162  /* Only used to check whether we are operating on org data or not... */
163  Mesh *me = ctx->object->data;
164 
165  Object *ob_source = dtmd->ob_source;
166 
167  const bool invert_vgroup = (dtmd->flags & MOD_DATATRANSFER_INVERT_VGROUP) != 0;
168 
169  const float max_dist = (dtmd->flags & MOD_DATATRANSFER_MAP_MAXDIST) ? dtmd->map_max_distance :
170  FLT_MAX;
171 
172  SpaceTransform space_transform_data;
173  SpaceTransform *space_transform = (dtmd->flags & MOD_DATATRANSFER_OBSRC_TRANSFORM) ?
174  &space_transform_data :
175  NULL;
176 
177  if (space_transform) {
178  BLI_SPACE_TRANSFORM_SETUP(space_transform, ctx->object, ob_source);
179  }
180 
181  if (((result == me) || (me->mvert == result->mvert) || (me->medge == result->medge)) &&
182  (dtmd->data_types & DT_TYPES_AFFECT_MESH)) {
183  /* We need to duplicate data here, otherwise setting custom normals, edges' sharpness, etc.,
184  * could modify org mesh, see T43671. */
186  }
187 
188  BKE_reports_init(&reports, RPT_STORE);
189 
190  /* NOTE: no islands precision for now here. */
192  scene,
193  ob_source,
194  ctx->object,
195  result,
196  dtmd->data_types,
197  false,
198  dtmd->vmap_mode,
199  dtmd->emap_mode,
200  dtmd->lmap_mode,
201  dtmd->pmap_mode,
202  space_transform,
203  false,
204  max_dist,
205  dtmd->map_ray_radius,
206  0.0f,
207  dtmd->layers_select_src,
208  dtmd->layers_select_dst,
209  dtmd->mix_mode,
210  dtmd->mix_factor,
211  dtmd->defgrp_name,
212  invert_vgroup,
213  &reports)) {
214  result->runtime.is_original = false;
215  }
216 
217  if (BKE_reports_contain(&reports, RPT_ERROR)) {
218  const char *report_str = BKE_reports_string(&reports, RPT_ERROR);
219  BKE_modifier_set_error(ctx->object, md, "%s", report_str);
220  MEM_freeN((void *)report_str);
221  }
222  else if ((dtmd->data_types & DT_TYPE_LNOR) && !(me->flag & ME_AUTOSMOOTH)) {
224  ctx->object, (ModifierData *)dtmd, "Enable 'Auto Smooth' in Object Data Properties");
225  }
226 
227  return result;
228 }
229 
230 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
231 {
232  uiLayout *sub, *row;
233  uiLayout *layout = panel->layout;
234 
235  PointerRNA ob_ptr;
237 
238  uiLayoutSetPropSep(layout, true);
239 
240  row = uiLayoutRow(layout, true);
241  uiItemR(row, ptr, "object", 0, IFACE_("Source"), ICON_NONE);
242  sub = uiLayoutRow(row, true);
243  uiLayoutSetPropDecorate(sub, false);
244  uiItemR(sub, ptr, "use_object_transform", 0, "", ICON_ORIENTATION_GLOBAL);
245 
246  uiItemR(layout, ptr, "mix_mode", 0, NULL, ICON_NONE);
247 
248  row = uiLayoutRow(layout, false);
249  uiLayoutSetActive(row,
250  !ELEM(RNA_enum_get(ptr, "mix_mode"),
254  uiItemR(row, ptr, "mix_factor", 0, NULL, ICON_NONE);
255 
256  modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
257 
258  uiItemO(layout, IFACE_("Generate Data Layers"), ICON_NONE, "OBJECT_OT_datalayout_transfer");
259 
260  modifier_panel_end(layout, ptr);
261 }
262 
263 static void vertex_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
264 {
266  uiLayout *layout = panel->layout;
267 
268  uiItemR(layout, ptr, "use_vert_data", 0, NULL, ICON_NONE);
269 }
270 
271 static void vertex_panel_draw(const bContext *UNUSED(C), Panel *panel)
272 {
273  uiLayout *layout = panel->layout;
274 
276 
277  bool use_vert_data = RNA_boolean_get(ptr, "use_vert_data");
278  uiLayoutSetActive(layout, use_vert_data);
279 
280  uiItemR(layout, ptr, "data_types_verts", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
281 
282  uiLayoutSetPropSep(layout, true);
283 
284  uiItemR(layout, ptr, "vert_mapping", 0, IFACE_("Mapping"), ICON_NONE);
285 }
286 
287 static void vertex_vgroup_panel_draw(const bContext *UNUSED(C), Panel *panel)
288 {
289  uiLayout *layout = panel->layout;
290 
292 
293  uiLayoutSetActive(layout, RNA_enum_get(ptr, "data_types_verts") & DT_TYPE_MDEFORMVERT);
294 
295  uiLayoutSetPropSep(layout, true);
296 
297  uiItemR(layout, ptr, "layers_vgroup_select_src", 0, IFACE_("Layer Selection"), ICON_NONE);
298  uiItemR(layout, ptr, "layers_vgroup_select_dst", 0, IFACE_("Layer Mapping"), ICON_NONE);
299 }
300 
301 static void edge_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
302 {
303  uiLayout *layout = panel->layout;
304 
306 
307  uiItemR(layout, ptr, "use_edge_data", 0, NULL, ICON_NONE);
308 }
309 
310 static void edge_panel_draw(const bContext *UNUSED(C), Panel *panel)
311 {
312  uiLayout *layout = panel->layout;
313 
315 
316  uiLayoutSetActive(layout, RNA_boolean_get(ptr, "use_edge_data"));
317 
318  uiItemR(layout, ptr, "data_types_edges", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
319 
320  uiLayoutSetPropSep(layout, true);
321 
322  uiItemR(layout, ptr, "edge_mapping", 0, IFACE_("Mapping"), ICON_NONE);
323 }
324 
326 {
327  uiLayout *layout = panel->layout;
328 
330 
331  uiItemR(layout, ptr, "use_loop_data", 0, NULL, ICON_NONE);
332 }
333 
334 static void face_corner_panel_draw(const bContext *UNUSED(C), Panel *panel)
335 {
336  uiLayout *layout = panel->layout;
337 
339 
340  uiLayoutSetActive(layout, RNA_boolean_get(ptr, "use_loop_data"));
341 
342  uiItemR(layout, ptr, "data_types_loops", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
343 
344  uiLayoutSetPropSep(layout, true);
345 
346  uiItemR(layout, ptr, "loop_mapping", 0, IFACE_("Mapping"), ICON_NONE);
347 }
348 
349 static void vert_vcol_panel_draw(const bContext *UNUSED(C), Panel *panel)
350 {
351  uiLayout *layout = panel->layout;
352 
354 
355  uiLayoutSetPropSep(layout, true);
356 
357  uiLayoutSetActive(layout,
358  RNA_enum_get(ptr, "data_types_verts") &
360 
361  uiItemR(layout, ptr, "layers_vcol_vert_select_src", 0, IFACE_("Layer Selection"), ICON_NONE);
362  uiItemR(layout, ptr, "layers_vcol_vert_select_dst", 0, IFACE_("Layer Mapping"), ICON_NONE);
363 }
364 
365 static void face_corner_vcol_panel_draw(const bContext *UNUSED(C), Panel *panel)
366 {
367  uiLayout *layout = panel->layout;
368 
370 
371  uiLayoutSetPropSep(layout, true);
372 
373  uiLayoutSetActive(layout,
374  RNA_enum_get(ptr, "data_types_loops") &
376 
377  uiItemR(layout, ptr, "layers_vcol_loop_select_src", 0, IFACE_("Layer Selection"), ICON_NONE);
378  uiItemR(layout, ptr, "layers_vcol_loop_select_dst", 0, IFACE_("Layer Mapping"), ICON_NONE);
379 }
380 
381 static void face_corner_uv_panel_draw(const bContext *UNUSED(C), Panel *panel)
382 {
383  uiLayout *layout = panel->layout;
384 
386 
387  uiLayoutSetPropSep(layout, true);
388 
389  uiLayoutSetActive(layout, RNA_enum_get(ptr, "data_types_loops") & DT_TYPE_UV);
390 
391  uiItemR(layout, ptr, "layers_uv_select_src", 0, IFACE_("Layer Selection"), ICON_NONE);
392  uiItemR(layout, ptr, "layers_uv_select_dst", 0, IFACE_("Layer Mapping"), ICON_NONE);
393  uiItemR(layout, ptr, "islands_precision", 0, NULL, ICON_NONE);
394 }
395 
396 static void face_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
397 {
398  uiLayout *layout = panel->layout;
399 
401 
402  uiItemR(layout, ptr, "use_poly_data", 0, NULL, ICON_NONE);
403 }
404 
405 static void face_panel_draw(const bContext *UNUSED(C), Panel *panel)
406 {
407  uiLayout *layout = panel->layout;
408 
410 
411  uiLayoutSetActive(layout, RNA_boolean_get(ptr, "use_poly_data"));
412 
413  uiItemR(layout, ptr, "data_types_polys", 0, NULL, ICON_NONE);
414 
415  uiLayoutSetPropSep(layout, true);
416 
417  uiItemR(layout, ptr, "poly_mapping", 0, IFACE_("Mapping"), ICON_NONE);
418 }
419 
420 static void advanced_panel_draw(const bContext *UNUSED(C), Panel *panel)
421 {
422  uiLayout *row, *sub;
423  uiLayout *layout = panel->layout;
424 
426 
427  uiLayoutSetPropSep(layout, true);
428 
429  row = uiLayoutRowWithHeading(layout, true, IFACE_("Max Distance"));
430  uiItemR(row, ptr, "use_max_distance", 0, "", ICON_NONE);
431  sub = uiLayoutRow(row, true);
432  uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max_distance"));
433  uiItemR(sub, ptr, "max_distance", 0, "", ICON_NONE);
434 
435  uiItemR(layout, ptr, "ray_radius", 0, NULL, ICON_NONE);
436 }
437 
438 static void panelRegister(ARegionType *region_type)
439 {
440  PanelType *panel_type = modifier_panel_register(
441  region_type, eModifierType_DataTransfer, panel_draw);
442  PanelType *vertex_panel = modifier_subpanel_register(
443  region_type, "vertex", "", vertex_panel_draw_header, vertex_panel_draw, panel_type);
445  region_type, "vertex_vgroup", "Vertex Groups", NULL, vertex_vgroup_panel_draw, vertex_panel);
446 
448  region_type, "vert_vcol", "Colors", NULL, vert_vcol_panel_draw, vertex_panel);
449 
451  region_type, "edge", "", edge_panel_draw_header, edge_panel_draw, panel_type);
452 
453  PanelType *face_corner_panel = modifier_subpanel_register(region_type,
454  "face_corner",
455  "",
458  panel_type);
459  modifier_subpanel_register(region_type,
460  "face_corner_vcol",
461  "Colors",
462  NULL,
464  face_corner_panel);
466  region_type, "face_corner_uv", "UVs", NULL, face_corner_uv_panel_draw, face_corner_panel);
467 
469  region_type, "face", "", face_panel_draw_header, face_panel_draw, panel_type);
471  region_type, "advanced", "Topology Mapping", NULL, advanced_panel_draw, panel_type);
472 }
473 
474 #undef DT_TYPES_AFFECT_MESH
475 
477  /* name */ N_("DataTransfer"),
478  /* structName */ "DataTransferModifierData",
479  /* structSize */ sizeof(DataTransferModifierData),
480  /* srna */ &RNA_DataTransferModifier,
484  /* icon */ ICON_MOD_DATA_TRANSFER,
485 
486  /* copyData */ BKE_modifier_copydata_generic,
487 
488  /* deformVerts */ NULL,
489  /* deformMatrices */ NULL,
490  /* deformVertsEM */ NULL,
491  /* deformMatricesEM */ NULL,
492  /* modifyMesh */ modifyMesh,
493  /* modifyGeometrySet */ NULL,
494 
495  /* initData */ initData,
496  /* requiredDataMask */ requiredDataMask,
497  /* freeData */ NULL,
498  /* isDisabled */ isDisabled,
499  /* updateDepsgraph */ updateDepsgraph,
500  /* dependsOnTime */ NULL,
501  /* dependsOnNormals */ dependsOnNormals,
502  /* foreachIDLink */ foreachIDLink,
503  /* foreachTexLink */ NULL,
504  /* freeRuntimeData */ NULL,
505  /* panelRegister */ panelRegister,
506  /* blendWrite */ NULL,
507  /* blendRead */ NULL,
508 };
CustomData interface, see also DNA_customdata_types.h.
@ ME_VERT
@ ME_POLY
@ ME_LOOP
@ ME_EDGE
@ CDT_MIX_REPLACE_BELOW_THRESHOLD
@ CDT_MIX_REPLACE_ABOVE_THRESHOLD
@ CDT_MIX_TRANSFER
@ CDT_MIX_NOMIX
@ DT_MULTILAYER_INDEX_MAX
@ DT_LAYERS_ALL_SRC
int BKE_object_data_transfer_get_dttypes_item_types(int dtdata_types)
@ DT_LAYERS_NAME_DST
@ DT_TYPE_MLOOPCOL_LOOP
@ DT_TYPE_UV
@ DT_TYPE_MPROPCOL_VERT
@ DT_TYPE_MLOOPCOL_VERT
@ DT_TYPE_LNOR
@ DT_TYPE_MPROPCOL_LOOP
@ DT_TYPE_MDEFORMVERT
void BKE_object_data_transfer_dttypes_to_cdmask(int dtdata_types, struct CustomData_MeshMasks *r_data_masks)
Definition: data_transfer.c:40
bool BKE_object_data_transfer_ex(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, struct Mesh *me_dst, int data_types, bool use_create, int map_vert_mode, int map_edge_mode, int map_loop_mode, int map_poly_mode, struct SpaceTransform *space_transform, bool auto_transform, float max_distance, float ray_radius, float islands_handling_precision, const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX], int mix_mode, float mix_factor, const char *vgroup_name, bool invert_vgroup, struct ReportList *reports)
@ LIB_ID_COPY_LOCALIZE
Definition: BKE_lib_id.h:187
struct ID * BKE_id_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r_newid, int flag)
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:33
void BKE_mesh_remap_calc_source_cddata_masks_from_map_modes(int vert_mode, int edge_mode, int loop_mode, int poly_mode, struct CustomData_MeshMasks *cddata_mask)
@ MREMAP_MODE_VERT_NEAREST
@ MREMAP_MODE_LOOP_NEAREST_POLYNOR
@ MREMAP_USE_NORMAL
@ MREMAP_MODE_EDGE_NEAREST
@ MREMAP_USE_NORPROJ
@ MREMAP_MODE_POLY_NEAREST
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:107
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:68
@ eModifierTypeFlag_UsesPreview
Definition: BKE_modifier.h:99
@ 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_NonGeometrical
Definition: BKE_modifier.h:62
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
bool BKE_reports_contain(ReportList *reports, eReportType level)
Definition: report.c:293
char * BKE_reports_string(ReportList *reports, eReportType level)
Definition: report.c:231
void BKE_reports_init(ReportList *reports, int flag)
Definition: report.c:50
#define BLI_SPACE_TRANSFORM_SETUP(data, local, target)
#define UNUSED(x)
#define ELEM(...)
#define IFACE_(msgid)
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
void DEG_add_customdata_mask(struct DepsNodeHandle *handle, struct Object *object, const struct CustomData_MeshMasks *masks)
@ DEG_OB_COMP_GEOMETRY
@ DEG_OB_COMP_TRANSFORM
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define CD_MASK_MDEFORMVERT
@ ME_AUTOSMOOTH
struct DataTransferModifierData DataTransferModifierData
@ MOD_DATATRANSFER_OBSRC_TRANSFORM
@ MOD_DATATRANSFER_MAP_MAXDIST
@ MOD_DATATRANSFER_INVERT_VGROUP
@ eModifierType_DataTransfer
Object is a sort of wrapper for general info.
@ OB_MESH
Read Guarded memory(de)allocation.
static void vertex_vgroup_panel_draw(const bContext *UNUSED(C), Panel *panel)
#define DT_TYPES_AFFECT_MESH
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static void face_panel_draw(const bContext *UNUSED(C), Panel *panel)
static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
static void face_corner_vcol_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void vertex_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
static bool dependsOnNormals(ModifierData *md)
static void face_corner_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
static void face_corner_uv_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void advanced_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void edge_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void edge_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
static void face_corner_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static void face_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
ModifierTypeInfo modifierType_DataTransfer
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
static void vertex_panel_draw(const bContext *UNUSED(C), Panel *panel)
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *me_mod)
static void vert_vcol_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
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)
#define C
Definition: RandGen.cpp:25
uiLayout * uiLayoutRowWithHeading(uiLayout *layout, bool align, const char *heading)
void uiLayoutSetActive(uiLayout *layout, bool active)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
@ UI_ITEM_R_EXPAND
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
Scene scene
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4863
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
Definition: DNA_ID.h:368
struct MEdge * medge
struct MVert * mvert
uint16_t flag
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:140
struct Object * object
Definition: BKE_modifier.h:141
struct DepsNodeHandle * node
Definition: BKE_modifier.h:134
void * data
struct uiLayout * layout
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480