Blender  V2.93
MOD_datatransfer.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) 2014 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include "BLI_utildefines.h"
25 
26 #include "BLI_math.h"
27 
28 #include "BLT_translation.h"
29 
30 #include "DNA_mesh_types.h"
31 #include "DNA_meshdata_types.h"
32 #include "DNA_modifier_types.h"
33 #include "DNA_object_types.h"
34 #include "DNA_screen_types.h"
35 
36 #include "BKE_context.h"
37 #include "BKE_customdata.h"
38 #include "BKE_data_transfer.h"
39 #include "BKE_lib_id.h"
40 #include "BKE_lib_query.h"
41 #include "BKE_mesh_mapping.h"
42 #include "BKE_mesh_remap.h"
43 #include "BKE_modifier.h"
44 #include "BKE_report.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 "DEG_depsgraph_query.h"
53 
54 #include "MEM_guardedalloc.h"
55 
56 #include "MOD_ui_common.h"
57 #include "MOD_util.h"
58 
59 /**************************************
60  * Modifiers functions. *
61  **************************************/
62 static void initData(ModifierData *md)
63 {
65  int i;
66 
67  dtmd->ob_source = NULL;
68  dtmd->data_types = 0;
69 
74 
75  dtmd->map_max_distance = 1.0f;
76  dtmd->map_ray_radius = 0.0f;
77 
78  for (i = 0; i < DT_MULTILAYER_INDEX_MAX; i++) {
81  }
82 
83  dtmd->mix_mode = CDT_MIX_TRANSFER;
84  dtmd->mix_factor = 1.0f;
85  dtmd->defgrp_name[0] = '\0';
86 
88 }
89 
90 static void requiredDataMask(Object *UNUSED(ob),
91  ModifierData *md,
92  CustomData_MeshMasks *r_cddata_masks)
93 {
95 
96  if (dtmd->defgrp_name[0] != '\0') {
97  /* We need vertex groups! */
98  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
99  }
100 
102 }
103 
105 {
108 
109  if ((item_types & ME_VERT) && (dtmd->vmap_mode & (MREMAP_USE_NORPROJ | MREMAP_USE_NORMAL))) {
110  return true;
111  }
112  if ((item_types & ME_EDGE) && (dtmd->emap_mode & (MREMAP_USE_NORPROJ | MREMAP_USE_NORMAL))) {
113  return true;
114  }
115  if ((item_types & ME_LOOP) && (dtmd->lmap_mode & (MREMAP_USE_NORPROJ | MREMAP_USE_NORMAL))) {
116  return true;
117  }
118  if ((item_types & ME_POLY) && (dtmd->pmap_mode & (MREMAP_USE_NORPROJ | MREMAP_USE_NORMAL))) {
119  return true;
120  }
121 
122  return false;
123 }
124 
125 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
126 {
128  walk(userData, ob, (ID **)&dtmd->ob_source, IDWALK_CB_NOP);
129 }
130 
132 {
134  if (dtmd->ob_source != NULL) {
135  CustomData_MeshMasks cddata_masks = {0};
138  dtmd->vmap_mode, dtmd->emap_mode, dtmd->lmap_mode, dtmd->pmap_mode, &cddata_masks);
139 
141  ctx->node, dtmd->ob_source, DEG_OB_COMP_GEOMETRY, "DataTransfer Modifier");
142  DEG_add_customdata_mask(ctx->node, dtmd->ob_source, &cddata_masks);
143 
146  ctx->node, dtmd->ob_source, DEG_OB_COMP_TRANSFORM, "DataTransfer Modifier");
147  DEG_add_modifier_to_transform_relation(ctx->node, "DataTransfer Modifier");
148  }
149  }
150 }
151 
152 static bool isDisabled(const struct Scene *UNUSED(scene),
153  ModifierData *md,
154  bool UNUSED(useRenderParams))
155 {
156  /* If no source object, bypass. */
158  /* The object type check is only needed here in case we have a placeholder
159  * object assigned (because the library containing the mesh is missing).
160  *
161  * In other cases it should be impossible to have a type mismatch.
162  */
163  return !dtmd->ob_source || dtmd->ob_source->type != OB_MESH;
164 }
165 
166 #define HIGH_POLY_WARNING 10000
167 #define DT_TYPES_AFFECT_MESH \
168  (DT_TYPE_BWEIGHT_VERT | DT_TYPE_BWEIGHT_EDGE | DT_TYPE_CREASE | DT_TYPE_SHARP_EDGE | \
169  DT_TYPE_LNOR | DT_TYPE_SHARP_FACE)
170 
171 static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *me_mod)
172 {
175  Mesh *result = me_mod;
176  ReportList reports;
177 
178  /* Only used to check whether we are operating on org data or not... */
179  Mesh *me = ctx->object->data;
180 
181  Object *ob_source = dtmd->ob_source;
182 
183  const bool invert_vgroup = (dtmd->flags & MOD_DATATRANSFER_INVERT_VGROUP) != 0;
184 
185  const float max_dist = (dtmd->flags & MOD_DATATRANSFER_MAP_MAXDIST) ? dtmd->map_max_distance :
186  FLT_MAX;
187 
188  SpaceTransform space_transform_data;
189  SpaceTransform *space_transform = (dtmd->flags & MOD_DATATRANSFER_OBSRC_TRANSFORM) ?
190  &space_transform_data :
191  NULL;
192 
193  if (space_transform) {
194  BLI_SPACE_TRANSFORM_SETUP(space_transform, ctx->object, ob_source);
195  }
196 
197  if (((result == me) || (me->mvert == result->mvert) || (me->medge == result->medge)) &&
198  (dtmd->data_types & DT_TYPES_AFFECT_MESH)) {
199  /* We need to duplicate data here, otherwise setting custom normals, edges' sharpness, etc.,
200  * could modify org mesh, see T43671. */
202  }
203 
204  BKE_reports_init(&reports, RPT_STORE);
205 
206  /* Note: no islands precision for now here. */
208  scene,
209  ob_source,
210  ctx->object,
211  result,
212  dtmd->data_types,
213  false,
214  dtmd->vmap_mode,
215  dtmd->emap_mode,
216  dtmd->lmap_mode,
217  dtmd->pmap_mode,
218  space_transform,
219  false,
220  max_dist,
221  dtmd->map_ray_radius,
222  0.0f,
223  dtmd->layers_select_src,
224  dtmd->layers_select_dst,
225  dtmd->mix_mode,
226  dtmd->mix_factor,
227  dtmd->defgrp_name,
228  invert_vgroup,
229  &reports)) {
230  result->runtime.is_original = false;
231  }
232 
233  if (BKE_reports_contain(&reports, RPT_ERROR)) {
234  const char *report_str = BKE_reports_string(&reports, RPT_ERROR);
235  BKE_modifier_set_error(ctx->object, md, "%s", report_str);
236  MEM_freeN((void *)report_str);
237  }
238  else if ((dtmd->data_types & DT_TYPE_LNOR) && !(me->flag & ME_AUTOSMOOTH)) {
240  ctx->object, (ModifierData *)dtmd, "Enable 'Auto Smooth' in Object Data Properties");
241  }
242  else if (result->totvert > HIGH_POLY_WARNING ||
243  ((Mesh *)(ob_source->data))->totvert > HIGH_POLY_WARNING) {
245  ctx->object,
246  md,
247  "Source or destination object has a high polygon count, computation might be slow");
248  }
249 
250  return result;
251 }
252 
253 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
254 {
255  uiLayout *sub, *row;
256  uiLayout *layout = panel->layout;
257 
258  PointerRNA ob_ptr;
260 
261  uiLayoutSetPropSep(layout, true);
262 
263  row = uiLayoutRow(layout, true);
264  uiItemR(row, ptr, "object", 0, IFACE_("Source"), ICON_NONE);
265  sub = uiLayoutRow(row, true);
266  uiLayoutSetPropDecorate(sub, false);
267  uiItemR(sub, ptr, "use_object_transform", 0, "", ICON_ORIENTATION_GLOBAL);
268 
269  uiItemR(layout, ptr, "mix_mode", 0, NULL, ICON_NONE);
270 
271  row = uiLayoutRow(layout, false);
272  uiLayoutSetActive(row,
273  !ELEM(RNA_enum_get(ptr, "mix_mode"),
277  uiItemR(row, ptr, "mix_factor", 0, NULL, ICON_NONE);
278 
279  modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
280 
281  uiItemO(layout, IFACE_("Generate Data Layers"), ICON_NONE, "OBJECT_OT_datalayout_transfer");
282 
283  modifier_panel_end(layout, ptr);
284 }
285 
286 static void vertex_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
287 {
289  uiLayout *layout = panel->layout;
290 
291  uiItemR(layout, ptr, "use_vert_data", 0, NULL, ICON_NONE);
292 }
293 
294 static void vertex_panel_draw(const bContext *UNUSED(C), Panel *panel)
295 {
296  uiLayout *layout = panel->layout;
297 
299 
300  bool use_vert_data = RNA_boolean_get(ptr, "use_vert_data");
301  uiLayoutSetActive(layout, use_vert_data);
302 
303  uiItemR(layout, ptr, "data_types_verts", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
304 
305  uiLayoutSetPropSep(layout, true);
306 
307  uiItemR(layout, ptr, "vert_mapping", 0, IFACE_("Mapping"), ICON_NONE);
308 }
309 
310 static void vertex_vgroup_panel_draw(const bContext *UNUSED(C), Panel *panel)
311 {
312  uiLayout *layout = panel->layout;
313 
315 
316  uiLayoutSetActive(layout, RNA_enum_get(ptr, "data_types_verts") & DT_TYPE_MDEFORMVERT);
317 
318  uiLayoutSetPropSep(layout, true);
319 
320  uiItemR(layout, ptr, "layers_vgroup_select_src", 0, IFACE_("Layer Selection"), ICON_NONE);
321  uiItemR(layout, ptr, "layers_vgroup_select_dst", 0, IFACE_("Layer Mapping"), ICON_NONE);
322 }
323 
324 static void edge_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
325 {
326  uiLayout *layout = panel->layout;
327 
329 
330  uiItemR(layout, ptr, "use_edge_data", 0, NULL, ICON_NONE);
331 }
332 
333 static void edge_panel_draw(const bContext *UNUSED(C), Panel *panel)
334 {
335  uiLayout *layout = panel->layout;
336 
338 
339  uiLayoutSetActive(layout, RNA_boolean_get(ptr, "use_edge_data"));
340 
341  uiItemR(layout, ptr, "data_types_edges", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
342 
343  uiLayoutSetPropSep(layout, true);
344 
345  uiItemR(layout, ptr, "edge_mapping", 0, IFACE_("Mapping"), ICON_NONE);
346 }
347 
349 {
350  uiLayout *layout = panel->layout;
351 
353 
354  uiItemR(layout, ptr, "use_loop_data", 0, NULL, ICON_NONE);
355 }
356 
357 static void face_corner_panel_draw(const bContext *UNUSED(C), Panel *panel)
358 {
359  uiLayout *layout = panel->layout;
360 
362 
363  uiLayoutSetActive(layout, RNA_boolean_get(ptr, "use_loop_data"));
364 
365  uiItemR(layout, ptr, "data_types_loops", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
366 
367  uiLayoutSetPropSep(layout, true);
368 
369  uiItemR(layout, ptr, "loop_mapping", 0, IFACE_("Mapping"), ICON_NONE);
370 }
371 
372 static void face_corner_vcol_panel_draw(const bContext *UNUSED(C), Panel *panel)
373 {
374  uiLayout *layout = panel->layout;
375 
377 
378  uiLayoutSetPropSep(layout, true);
379 
380  uiLayoutSetActive(layout, RNA_enum_get(ptr, "data_types_loops") & DT_TYPE_VCOL);
381 
382  uiItemR(layout, ptr, "layers_vcol_select_src", 0, IFACE_("Layer Selection"), ICON_NONE);
383  uiItemR(layout, ptr, "layers_vcol_select_dst", 0, IFACE_("Layer Mapping"), ICON_NONE);
384 }
385 
386 static void face_corner_uv_panel_draw(const bContext *UNUSED(C), Panel *panel)
387 {
388  uiLayout *layout = panel->layout;
389 
391 
392  uiLayoutSetPropSep(layout, true);
393 
394  uiLayoutSetActive(layout, RNA_enum_get(ptr, "data_types_loops") & DT_TYPE_UV);
395 
396  uiItemR(layout, ptr, "layers_uv_select_src", 0, IFACE_("Layer Selection"), ICON_NONE);
397  uiItemR(layout, ptr, "layers_uv_select_dst", 0, IFACE_("Layer Mapping"), ICON_NONE);
398  uiItemR(layout, ptr, "islands_precision", 0, NULL, ICON_NONE);
399 }
400 
401 static void face_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
402 {
403  uiLayout *layout = panel->layout;
404 
406 
407  uiItemR(layout, ptr, "use_poly_data", 0, NULL, ICON_NONE);
408 }
409 
410 static void face_panel_draw(const bContext *UNUSED(C), Panel *panel)
411 {
412  uiLayout *layout = panel->layout;
413 
415 
416  uiLayoutSetActive(layout, RNA_boolean_get(ptr, "use_poly_data"));
417 
418  uiItemR(layout, ptr, "data_types_polys", 0, NULL, ICON_NONE);
419 
420  uiLayoutSetPropSep(layout, true);
421 
422  uiItemR(layout, ptr, "poly_mapping", 0, IFACE_("Mapping"), ICON_NONE);
423 }
424 
425 static void advanced_panel_draw(const bContext *UNUSED(C), Panel *panel)
426 {
427  uiLayout *row, *sub;
428  uiLayout *layout = panel->layout;
429 
431 
432  uiLayoutSetPropSep(layout, true);
433 
434  row = uiLayoutRowWithHeading(layout, true, IFACE_("Max Distance"));
435  uiItemR(row, ptr, "use_max_distance", 0, "", ICON_NONE);
436  sub = uiLayoutRow(row, true);
437  uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max_distance"));
438  uiItemR(sub, ptr, "max_distance", 0, "", ICON_NONE);
439 
440  uiItemR(layout, ptr, "ray_radius", 0, NULL, ICON_NONE);
441 }
442 
443 static void panelRegister(ARegionType *region_type)
444 {
445  PanelType *panel_type = modifier_panel_register(
446  region_type, eModifierType_DataTransfer, panel_draw);
447  PanelType *vertex_panel = modifier_subpanel_register(
448  region_type, "vertex", "", vertex_panel_draw_header, vertex_panel_draw, panel_type);
450  region_type, "vertex_vgroup", "Vertex Groups", NULL, vertex_vgroup_panel_draw, vertex_panel);
451 
453  region_type, "edge", "", edge_panel_draw_header, edge_panel_draw, panel_type);
454 
455  PanelType *face_corner_panel = modifier_subpanel_register(region_type,
456  "face_corner",
457  "",
460  panel_type);
461  modifier_subpanel_register(region_type,
462  "face_corner_vcol",
463  "Vertex Colors",
464  NULL,
466  face_corner_panel);
468  region_type, "face_corner_uv", "UVs", NULL, face_corner_uv_panel_draw, face_corner_panel);
469 
471  region_type, "face", "", face_panel_draw_header, face_panel_draw, panel_type);
473  region_type, "advanced", "Topology Mapping", NULL, advanced_panel_draw, panel_type);
474 }
475 
476 #undef HIGH_POLY_WARNING
477 #undef DT_TYPES_AFFECT_MESH
478 
480  /* name */ "DataTransfer",
481  /* structName */ "DataTransferModifierData",
482  /* structSize */ sizeof(DataTransferModifierData),
483  /* srna */ &RNA_DataTransferModifier,
487  /* icon */ ICON_MOD_DATA_TRANSFER,
488 
489  /* copyData */ BKE_modifier_copydata_generic,
490 
491  /* deformVerts */ NULL,
492  /* deformMatrices */ NULL,
493  /* deformVertsEM */ NULL,
494  /* deformMatricesEM */ NULL,
495  /* modifyMesh */ modifyMesh,
496  /* modifyHair */ NULL,
497  /* modifyGeometrySet */ NULL,
498  /* modifyVolume */ NULL,
499 
500  /* initData */ initData,
501  /* requiredDataMask */ requiredDataMask,
502  /* freeData */ NULL,
503  /* isDisabled */ isDisabled,
504  /* updateDepsgraph */ updateDepsgraph,
505  /* dependsOnTime */ NULL,
506  /* dependsOnNormals */ dependsOnNormals,
507  /* foreachIDLink */ foreachIDLink,
508  /* foreachTexLink */ NULL,
509  /* freeRuntimeData */ NULL,
510  /* panelRegister */ panelRegister,
511  /* blendWrite */ NULL,
512  /* blendRead */ NULL,
513 };
CustomData interface, see also DNA_customdata_types.h.
@ CDT_MIX_REPLACE_BELOW_THRESHOLD
@ CDT_MIX_REPLACE_ABOVE_THRESHOLD
@ CDT_MIX_TRANSFER
@ CDT_MIX_NOMIX
@ ME_VERT
@ ME_POLY
@ ME_LOOP
@ ME_EDGE
@ DT_LAYERS_ALL_SRC
@ DT_LAYERS_NAME_DST
bool BKE_object_data_transfer_ex(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, struct Mesh *me_dst, const int data_types, bool use_create, const int map_vert_mode, const int map_edge_mode, const int map_loop_mode, const int map_poly_mode, struct SpaceTransform *space_transform, const bool auto_transform, const float max_distance, const float ray_radius, const float islands_handling_precision, const int fromlayers_select[DT_MULTILAYER_INDEX_MAX], const int tolayers_select[DT_MULTILAYER_INDEX_MAX], const int mix_mode, const float mix_factor, const char *vgroup_name, const bool invert_vgroup, struct ReportList *reports)
int BKE_object_data_transfer_get_dttypes_item_types(const int dtdata_types)
@ DT_TYPE_UV
@ DT_TYPE_LNOR
@ DT_TYPE_VCOL
@ DT_TYPE_MDEFORMVERT
@ DT_MULTILAYER_INDEX_MAX
void BKE_object_data_transfer_dttypes_to_cdmask(const int dtdata_types, struct CustomData_MeshMasks *r_data_masks)
Definition: data_transfer.c:56
@ LIB_ID_COPY_LOCALIZE
Definition: BKE_lib_id.h:145
struct ID * BKE_id_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r_newid, const int flag)
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:47
void BKE_mesh_remap_calc_source_cddata_masks_from_map_modes(const int vert_mode, const int edge_mode, const int loop_mode, const 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:120
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:82
@ eModifierTypeFlag_UsesPreview
Definition: BKE_modifier.h:113
@ 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_NonGeometrical
Definition: BKE_modifier.h:76
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
char * BKE_reports_string(ReportList *reports, ReportType level)
Definition: report.c:254
void BKE_reports_init(ReportList *reports, int flag)
Definition: report.c:66
bool BKE_reports_contain(ReportList *reports, ReportType level)
Definition: report.c:308
#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
@ eModifierType_DataTransfer
@ MOD_DATATRANSFER_OBSRC_TRANSFORM
@ MOD_DATATRANSFER_MAP_MAXDIST
@ MOD_DATATRANSFER_INVERT_VGROUP
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)
#define HIGH_POLY_WARNING
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 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)
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)
StructRNA RNA_DataTransferModifier
#define C
Definition: RandGen.cpp:39
uiLayout * uiLayoutRowWithHeading(uiLayout *layout, bool align, const char *heading)
void uiLayoutSetActive(uiLayout *layout, bool active)
@ UI_ITEM_R_EXPAND
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
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:41
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6261
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6402
Definition: DNA_ID.h:273
struct MEdge * medge
struct MVert * mvert
short flag
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:153
struct Object * object
Definition: BKE_modifier.h:154
struct DepsNodeHandle * node
Definition: BKE_modifier.h:147
void * data
struct uiLayout * layout
PointerRNA * ptr
Definition: wm_files.c:3157