Blender  V2.93
MOD_weightvgedit.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) 2011 by Bastien Montagne.
17  * All rights reserved.
18  */
19 
24 #include <string.h>
25 
26 #include "BLI_utildefines.h"
27 
28 #include "BLI_ghash.h"
29 #include "BLI_listbase.h"
30 #include "BLI_rand.h"
31 
32 #include "BLT_translation.h"
33 
34 #include "DNA_color_types.h" /* CurveMapping. */
35 #include "DNA_defaults.h"
36 #include "DNA_mesh_types.h"
37 #include "DNA_meshdata_types.h"
38 #include "DNA_modifier_types.h"
39 #include "DNA_object_types.h"
40 #include "DNA_screen_types.h"
41 
42 #include "BKE_colortools.h" /* CurveMapping. */
43 #include "BKE_context.h"
44 #include "BKE_deform.h"
45 #include "BKE_lib_query.h"
46 #include "BKE_modifier.h"
47 #include "BKE_screen.h"
48 #include "BKE_texture.h" /* Texture masking. */
49 
50 #include "UI_interface.h"
51 #include "UI_resources.h"
52 
53 #include "BLO_read_write.h"
54 
55 #include "RNA_access.h"
56 
57 #include "DEG_depsgraph_build.h"
58 #include "DEG_depsgraph_query.h"
59 
60 #include "MEM_guardedalloc.h"
61 
62 #include "MOD_modifiertypes.h"
63 #include "MOD_ui_common.h"
64 #include "MOD_util.h"
65 #include "MOD_weightvg_util.h"
66 
67 /**************************************
68  * Modifiers functions. *
69  **************************************/
70 static void initData(ModifierData *md)
71 {
73 
75 
77 
78  wmd->cmap_curve = BKE_curvemapping_add(1, 0.0, 0.0, 1.0, 1.0);
80 }
81 
82 static void freeData(ModifierData *md)
83 {
86 }
87 
88 static void copyData(const ModifierData *md, ModifierData *target, const int flag)
89 {
90  const WeightVGEditModifierData *wmd = (const WeightVGEditModifierData *)md;
92 
93  BKE_modifier_copydata_generic(md, target, flag);
94 
96 }
97 
98 static void requiredDataMask(Object *UNUSED(ob),
99  ModifierData *md,
100  CustomData_MeshMasks *r_cddata_masks)
101 {
103 
104  /* We need vertex groups! */
105  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
106 
107  /* Ask for UV coordinates if we need them. */
108  if (wmd->mask_tex_mapping == MOD_DISP_MAP_UV) {
109  r_cddata_masks->fmask |= CD_MASK_MTFACE;
110  }
111 
112  /* No need to ask for CD_PREVIEW_MLOOPCOL... */
113 }
114 
115 static bool dependsOnTime(ModifierData *md)
116 {
118 
119  if (wmd->mask_texture) {
121  }
122  return false;
123 }
124 
125 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
126 {
128 
129  walk(userData, ob, (ID **)&wmd->mask_texture, IDWALK_CB_USER);
130  walk(userData, ob, (ID **)&wmd->mask_tex_map_obj, IDWALK_CB_NOP);
131 }
132 
133 static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
134 {
135  walk(userData, ob, md, "mask_texture");
136 }
137 
139 {
141  bool need_transform_relation = false;
142 
143  if (wmd->mask_texture != NULL) {
144  DEG_add_generic_id_relation(ctx->node, &wmd->mask_texture->id, "WeightVGEdit Modifier");
145 
148  ctx->node, wmd->mask_tex_map_obj, wmd->mask_tex_map_bone, "WeightVGEdit Modifier");
149  need_transform_relation = true;
150  }
151  else if (wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) {
152  need_transform_relation = true;
153  }
154  }
155 
156  if (need_transform_relation) {
157  DEG_add_modifier_to_transform_relation(ctx->node, "WeightVGEdit Modifier");
158  }
159 }
160 
161 static bool isDisabled(const struct Scene *UNUSED(scene),
162  ModifierData *md,
163  bool UNUSED(useRenderParams))
164 {
166  /* If no vertex group, bypass. */
167  return (wmd->defgrp_name[0] == '\0');
168 }
169 
171 {
172  BLI_assert(mesh != NULL);
173 
175 
176  MDeformVert *dvert = NULL;
177  MDeformWeight **dw = NULL;
178  float *org_w; /* Array original weights. */
179  float *new_w; /* Array new weights. */
180  int i;
181  const bool invert_vgroup_mask = (wmd->edit_flags & MOD_WVG_EDIT_INVERT_VGROUP_MASK) != 0;
182 
183  /* Flags. */
184  const bool do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0;
185  const bool do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0;
186  /* Only do weight-preview in Object, Sculpt and Pose modes! */
187 #if 0
188  const bool do_prev = (wmd->modifier.mode & eModifierMode_DoWeightPreview);
189 #endif
190 
191  /* Get number of verts. */
192  const int numVerts = mesh->totvert;
193 
194  /* Check if we can just return the original mesh.
195  * Must have verts and therefore verts assigned to vgroups to do anything useful!
196  */
197  if ((numVerts == 0) || BLI_listbase_is_empty(&ctx->object->defbase)) {
198  return mesh;
199  }
200 
201  /* Get vgroup idx from its name. */
202  const int defgrp_index = BKE_object_defgroup_name_index(ctx->object, wmd->defgrp_name);
203  if (defgrp_index == -1) {
204  return mesh;
205  }
206 
207  const bool has_mdef = CustomData_has_layer(&mesh->vdata, CD_MDEFORMVERT);
208  /* If no vertices were ever added to an object's vgroup, dvert might be NULL. */
209  if (!has_mdef) {
210  /* If this modifier is not allowed to add vertices, just return. */
211  if (!do_add) {
212  return mesh;
213  }
214  }
215 
216  if (has_mdef) {
217  dvert = CustomData_duplicate_referenced_layer(&mesh->vdata, CD_MDEFORMVERT, numVerts);
218  }
219  else {
220  /* Add a valid data layer! */
221  dvert = CustomData_add_layer(&mesh->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, numVerts);
222  }
223  /* Ultimate security check. */
224  if (!dvert) {
225  return mesh;
226  }
227  mesh->dvert = dvert;
228 
229  /* Get org weights, assuming 0.0 for vertices not in given vgroup. */
230  org_w = MEM_malloc_arrayN(numVerts, sizeof(float), "WeightVGEdit Modifier, org_w");
231  new_w = MEM_malloc_arrayN(numVerts, sizeof(float), "WeightVGEdit Modifier, new_w");
232  dw = MEM_malloc_arrayN(numVerts, sizeof(MDeformWeight *), "WeightVGEdit Modifier, dw");
233  for (i = 0; i < numVerts; i++) {
234  dw[i] = BKE_defvert_find_index(&dvert[i], defgrp_index);
235  if (dw[i]) {
236  org_w[i] = new_w[i] = dw[i]->weight;
237  }
238  else {
239  org_w[i] = new_w[i] = wmd->default_weight;
240  }
241  }
242 
243  /* Do mapping. */
244  const bool do_invert_mapping = (wmd->edit_flags & MOD_WVG_INVERT_FALLOFF) != 0;
245  const bool do_normalize = (wmd->edit_flags & MOD_WVG_EDIT_WEIGHTS_NORMALIZE) != 0;
246  if (do_invert_mapping || wmd->falloff_type != MOD_WVG_MAPPING_NONE) {
247  RNG *rng = NULL;
248 
249  if (wmd->falloff_type == MOD_WVG_MAPPING_RANDOM) {
251  }
252 
253  weightvg_do_map(numVerts, new_w, wmd->falloff_type, do_invert_mapping, wmd->cmap_curve, rng);
254 
255  if (rng) {
256  BLI_rng_free(rng);
257  }
258  }
259 
260  /* Do masking. */
262  weightvg_do_mask(ctx,
263  numVerts,
264  NULL,
265  org_w,
266  new_w,
267  ctx->object,
268  mesh,
269  wmd->mask_constant,
270  wmd->mask_defgrp_name,
271  scene,
272  wmd->mask_texture,
274  wmd->mask_tex_mapping,
275  wmd->mask_tex_map_obj,
276  wmd->mask_tex_map_bone,
278  invert_vgroup_mask);
279 
280  /* Update/add/remove from vgroup. */
281  weightvg_update_vg(dvert,
282  defgrp_index,
283  dw,
284  numVerts,
285  NULL,
286  org_w,
287  do_add,
288  wmd->add_threshold,
289  do_rem,
290  wmd->rem_threshold,
291  do_normalize);
292 
293  /* If weight preview enabled... */
294 #if 0 /* XXX Currently done in mod stack :/ */
295  if (do_prev) {
296  DM_update_weight_mcol(ob, dm, 0, org_w, 0, NULL);
297  }
298 #endif
299 
300  /* Freeing stuff. */
301  MEM_freeN(org_w);
302  MEM_freeN(new_w);
303  MEM_freeN(dw);
304 
305  mesh->runtime.is_original = false;
306 
307  /* Return the vgroup-modified mesh. */
308  return mesh;
309 }
310 
311 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
312 {
313  uiLayout *sub, *col, *row;
314  uiLayout *layout = panel->layout;
315 
316  PointerRNA ob_ptr;
318 
319  uiLayoutSetPropSep(layout, true);
320 
321  col = uiLayoutColumn(layout, true);
322  uiItemPointerR(col, ptr, "vertex_group", &ob_ptr, "vertex_groups", NULL, ICON_NONE);
323 
324  uiItemR(layout, ptr, "default_weight", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
325 
326  col = uiLayoutColumnWithHeading(layout, false, IFACE_("Group Add"));
327  row = uiLayoutRow(col, true);
328  uiLayoutSetPropDecorate(row, false);
329  sub = uiLayoutRow(row, true);
330  uiItemR(sub, ptr, "use_add", 0, "", ICON_NONE);
331  sub = uiLayoutRow(sub, true);
332  uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_add"));
333  uiLayoutSetPropSep(sub, false);
334  uiItemR(sub, ptr, "add_threshold", UI_ITEM_R_SLIDER, "Threshold", ICON_NONE);
335  uiItemDecoratorR(row, ptr, "add_threshold", 0);
336 
337  col = uiLayoutColumnWithHeading(layout, false, IFACE_("Group Remove"));
338  row = uiLayoutRow(col, true);
339  uiLayoutSetPropDecorate(row, false);
340  sub = uiLayoutRow(row, true);
341  uiItemR(sub, ptr, "use_remove", 0, "", ICON_NONE);
342  sub = uiLayoutRow(sub, true);
343  uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_remove"));
344  uiLayoutSetPropSep(sub, false);
345  uiItemR(sub, ptr, "remove_threshold", UI_ITEM_R_SLIDER, "Threshold", ICON_NONE);
346  uiItemDecoratorR(row, ptr, "remove_threshold", 0);
347 
348  uiItemR(layout, ptr, "normalize", 0, NULL, ICON_NONE);
349 
350  modifier_panel_end(layout, ptr);
351 }
352 
353 static void falloff_panel_draw(const bContext *UNUSED(C), Panel *panel)
354 {
355  uiLayout *row, *sub;
356  uiLayout *layout = panel->layout;
357 
358  PointerRNA ob_ptr;
360 
361  uiLayoutSetPropSep(layout, true);
362 
363  row = uiLayoutRow(layout, true);
364  uiItemR(row, ptr, "falloff_type", 0, IFACE_("Type"), ICON_NONE);
365  sub = uiLayoutRow(row, true);
366  uiLayoutSetPropSep(sub, false);
367  uiItemR(row, ptr, "invert_falloff", 0, "", ICON_ARROW_LEFTRIGHT);
368  if (RNA_enum_get(ptr, "falloff_type") == MOD_WVG_MAPPING_CURVE) {
369  uiTemplateCurveMapping(layout, ptr, "map_curve", 0, false, false, false, false);
370  }
371 }
372 
373 static void influence_panel_draw(const bContext *C, Panel *panel)
374 {
375  uiLayout *layout = panel->layout;
376 
377  PointerRNA ob_ptr;
379 
380  weightvg_ui_common(C, &ob_ptr, ptr, layout);
381 }
382 
383 static void panelRegister(ARegionType *region_type)
384 {
385  PanelType *panel_type = modifier_panel_register(
386  region_type, eModifierType_WeightVGEdit, panel_draw);
388  region_type, "falloff", "Falloff", NULL, falloff_panel_draw, panel_type);
390  region_type, "influence", "Influence", NULL, influence_panel_draw, panel_type);
391 }
392 
393 static void blendWrite(BlendWriter *writer, const ModifierData *md)
394 {
395  const WeightVGEditModifierData *wmd = (const WeightVGEditModifierData *)md;
396 
397  if (wmd->cmap_curve) {
399  }
400 }
401 
402 static void blendRead(BlendDataReader *reader, ModifierData *md)
403 {
405 
406  BLO_read_data_address(reader, &wmd->cmap_curve);
407  if (wmd->cmap_curve) {
409  }
410 }
411 
413  /* name */ "VertexWeightEdit",
414  /* structName */ "WeightVGEditModifierData",
415  /* structSize */ sizeof(WeightVGEditModifierData),
416  /* srna */ &RNA_VertexWeightEditModifier,
420  /* icon */ ICON_MOD_VERTEX_WEIGHT,
421 
422  /* copyData */ copyData,
423 
424  /* deformVerts */ NULL,
425  /* deformMatrices */ NULL,
426  /* deformVertsEM */ NULL,
427  /* deformMatricesEM */ NULL,
428  /* modifyMesh */ modifyMesh,
429  /* modifyHair */ NULL,
430  /* modifyGeometrySet */ NULL,
431  /* modifyVolume */ NULL,
432 
433  /* initData */ initData,
434  /* requiredDataMask */ requiredDataMask,
435  /* freeData */ freeData,
436  /* isDisabled */ isDisabled,
437  /* updateDepsgraph */ updateDepsgraph,
438  /* dependsOnTime */ dependsOnTime,
439  /* dependsOnNormals */ NULL,
440  /* foreachIDLink */ foreachIDLink,
441  /* foreachTexLink */ foreachTexLink,
442  /* freeRuntimeData */ NULL,
443  /* panelRegister */ panelRegister,
444  /* blendWrite */ blendWrite,
445  /* blendRead */ blendRead,
446 };
void BKE_curvemapping_init(struct CurveMapping *cumap)
Definition: colortools.c:1200
struct CurveMapping * BKE_curvemapping_copy(const struct CurveMapping *cumap)
void BKE_curvemapping_blend_read(struct BlendDataReader *reader, struct CurveMapping *cumap)
Definition: colortools.c:1252
void BKE_curvemapping_blend_write(struct BlendWriter *writer, const struct CurveMapping *cumap)
void BKE_curvemapping_free(struct CurveMapping *cumap)
Definition: colortools.c:119
struct CurveMapping * BKE_curvemapping_add(int tot, float minx, float miny, float maxx, float maxy)
Definition: colortools.c:88
@ CD_CALLOC
bool CustomData_has_layer(const struct CustomData *data, int type)
void * CustomData_duplicate_referenced_layer(struct CustomData *data, const int type, const int totelem)
Definition: customdata.c:2788
void * CustomData_add_layer(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem)
Definition: customdata.c:2620
support for deformation groups and hooks.
int BKE_object_defgroup_name_index(const struct Object *ob, const char *name)
struct MDeformWeight * BKE_defvert_find_index(const struct MDeformVert *dv, const int defgroup)
@ IDWALK_CB_USER
Definition: BKE_lib_query.h:87
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:47
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(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
Definition: BKE_modifier.h:121
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_NonGeometrical
Definition: BKE_modifier.h:76
bool BKE_texture_dependsOnTime(const struct Tex *texture)
Definition: texture.c:697
#define BLI_assert(a)
Definition: BLI_assert.h:58
#define BLI_ghashutil_strhash(key)
Definition: BLI_ghash.h:350
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
Definition: BLI_listbase.h:124
Random number functions.
void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
Definition: rand.cc:76
struct RNG * BLI_rng_new_srandom(unsigned int seed)
Definition: rand.cc:64
#define UNUSED(x)
#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)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
void DEG_add_generic_id_relation(struct DepsNodeHandle *node_handle, struct ID *id, const char *description)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define CD_MASK_MDEFORMVERT
@ CD_MDEFORMVERT
#define CD_MASK_MTFACE
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:44
@ MOD_DISP_MAP_OBJECT
@ MOD_DISP_MAP_GLOBAL
@ MOD_DISP_MAP_UV
struct WeightVGEditModifierData WeightVGEditModifierData
@ eModifierType_WeightVGEdit
@ MOD_WVG_EDIT_INVERT_VGROUP_MASK
@ MOD_WVG_EDIT_WEIGHTS_NORMALIZE
@ MOD_WVG_INVERT_FALLOFF
@ MOD_WVG_EDIT_REMFVG
@ MOD_WVG_EDIT_ADD2VG
@ MOD_WVG_MAPPING_NONE
@ MOD_WVG_MAPPING_CURVE
@ MOD_WVG_MAPPING_RANDOM
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
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)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
void MOD_depsgraph_update_object_bone_relation(struct DepsNodeHandle *node, Object *object, const char *bonename, const char *description)
Definition: MOD_util.c:270
void weightvg_do_map(int num, float *new_w, short falloff_type, const bool do_invert, CurveMapping *cmap, RNG *rng)
void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, MDeformWeight **dws, int num, const int *indices, const float *weights, const bool do_add, const float add_thresh, const bool do_rem, const float rem_thresh, const bool do_normalize)
void weightvg_do_mask(const ModifierEvalContext *ctx, const int num, const int *indices, float *org_w, const float *new_w, Object *ob, Mesh *mesh, const float fact, const char defgrp_name[MAX_VGROUP_NAME], Scene *scene, Tex *texture, const int tex_use_channel, const int tex_mapping, Object *tex_map_object, const char *text_map_bone, const char *tex_uvlayer_name, const bool invert_vgroup_mask)
void weightvg_ui_common(const bContext *C, PointerRNA *ob_ptr, PointerRNA *ptr, uiLayout *layout)
static void influence_panel_draw(const bContext *C, Panel *panel)
ModifierTypeInfo modifierType_WeightVGEdit
static void copyData(const ModifierData *md, ModifierData *target, const int flag)
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void falloff_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
static void blendWrite(BlendWriter *writer, const ModifierData *md)
static void blendRead(BlendDataReader *reader, ModifierData *md)
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
static bool dependsOnTime(ModifierData *md)
static void freeData(ModifierData *md)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
StructRNA RNA_VertexWeightEditModifier
#define C
Definition: RandGen.cpp:39
void uiLayoutSetActive(uiLayout *layout, bool active)
@ UI_ITEM_R_SLIDER
uiLayout * uiLayoutColumnWithHeading(uiLayout *layout, bool align, const char *heading)
void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int type, bool levels, bool brush, bool neg_slope, bool tone)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
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 uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiItemDecoratorR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int index)
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
Scene scene
uint col
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
Definition: mallocn.c:48
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
char name[66]
Definition: DNA_ID.h:283
struct MDeformVert * dvert
int totvert
Mesh_Runtime runtime
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:153
struct Object * object
Definition: BKE_modifier.h:154
struct DepsNodeHandle * node
Definition: BKE_modifier.h:147
ListBase defbase
struct uiLayout * layout
Definition: rand.cc:48
struct CurveMapping * cmap_curve
PointerRNA * ptr
Definition: wm_files.c:3157