Blender  V3.3
MOD_warp.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include <string.h>
8 
9 #include "MEM_guardedalloc.h"
10 
11 #include "BLI_utildefines.h"
12 
13 #include "BLI_math.h"
14 
15 #include "BLT_translation.h"
16 
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_screen_types.h"
22 
23 #include "BKE_action.h" /* BKE_pose_channel_find_name */
24 #include "BKE_colortools.h"
25 #include "BKE_context.h"
26 #include "BKE_deform.h"
27 #include "BKE_editmesh.h"
28 #include "BKE_lib_id.h"
29 #include "BKE_lib_query.h"
30 #include "BKE_mesh.h"
31 #include "BKE_mesh_wrapper.h"
32 #include "BKE_modifier.h"
33 #include "BKE_screen.h"
34 #include "BKE_texture.h"
35 
36 #include "UI_interface.h"
37 #include "UI_resources.h"
38 
39 #include "BLO_read_write.h"
40 
41 #include "RNA_access.h"
42 #include "RNA_prototypes.h"
43 
44 #include "DEG_depsgraph.h"
45 #include "DEG_depsgraph_query.h"
46 
47 #include "RE_texture.h"
48 
49 #include "MOD_ui_common.h"
50 #include "MOD_util.h"
51 
52 static void initData(ModifierData *md)
53 {
55 
57 
59 
60  wmd->curfalloff = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
61 }
62 
63 static void copyData(const ModifierData *md, ModifierData *target, const int flag)
64 {
65  const WarpModifierData *wmd = (const WarpModifierData *)md;
66  WarpModifierData *twmd = (WarpModifierData *)target;
67 
68  BKE_modifier_copydata_generic(md, target, flag);
69 
71 }
72 
73 static void requiredDataMask(Object *UNUSED(ob),
74  ModifierData *md,
75  CustomData_MeshMasks *r_cddata_masks)
76 {
78 
79  /* ask for vertexgroups if we need them */
80  if (wmd->defgrp_name[0] != '\0') {
81  r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
82  }
83 
84  /* ask for UV coordinates if we need them */
85  if (wmd->texmapping == MOD_DISP_MAP_UV) {
86  r_cddata_masks->fmask |= CD_MASK_MTFACE;
87  }
88 }
89 
90 static void matrix_from_obj_pchan(float mat[4][4],
91  const float obinv[4][4],
92  Object *ob,
93  const char *bonename)
94 {
95  bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, bonename);
96  if (pchan) {
97  float mat_bone_world[4][4];
98  mul_m4_m4m4(mat_bone_world, ob->obmat, pchan->pose_mat);
99  mul_m4_m4m4(mat, obinv, mat_bone_world);
100  }
101  else {
102  mul_m4_m4m4(mat, obinv, ob->obmat);
103  }
104 }
105 
106 static bool dependsOnTime(struct Scene *UNUSED(scene), ModifierData *md)
107 {
108  WarpModifierData *wmd = (WarpModifierData *)md;
109 
110  if (wmd->texture) {
111  return BKE_texture_dependsOnTime(wmd->texture);
112  }
113 
114  return false;
115 }
116 
117 static void freeData(ModifierData *md)
118 {
119  WarpModifierData *wmd = (WarpModifierData *)md;
121 }
122 
123 static bool isDisabled(const struct Scene *UNUSED(scene),
124  ModifierData *md,
125  bool UNUSED(userRenderParams))
126 {
127  WarpModifierData *wmd = (WarpModifierData *)md;
128 
129  return !(wmd->object_from && wmd->object_to);
130 }
131 
132 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
133 {
134  WarpModifierData *wmd = (WarpModifierData *)md;
135 
136  walk(userData, ob, (ID **)&wmd->texture, IDWALK_CB_USER);
137  walk(userData, ob, (ID **)&wmd->object_from, IDWALK_CB_NOP);
138  walk(userData, ob, (ID **)&wmd->object_to, IDWALK_CB_NOP);
139  walk(userData, ob, (ID **)&wmd->map_object, IDWALK_CB_NOP);
140 }
141 
142 static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
143 {
144  walk(userData, ob, md, "texture");
145 }
146 
148 {
149  WarpModifierData *wmd = (WarpModifierData *)md;
150  bool need_transform_relation = false;
151 
152  if (wmd->object_from != NULL && wmd->object_to != NULL) {
154  ctx->node, wmd->object_from, wmd->bone_from, "Warp Modifier");
156  ctx->node, wmd->object_to, wmd->bone_to, "Warp Modifier");
157  need_transform_relation = true;
158  }
159 
160  if (wmd->texture != NULL) {
161  DEG_add_generic_id_relation(ctx->node, &wmd->texture->id, "Warp Modifier");
162 
163  if ((wmd->texmapping == MOD_DISP_MAP_OBJECT) && wmd->map_object != NULL) {
165  ctx->node, wmd->map_object, wmd->map_bone, "Warp Modifier");
166  need_transform_relation = true;
167  }
168  else if (wmd->texmapping == MOD_DISP_MAP_GLOBAL) {
169  need_transform_relation = true;
170  }
171  }
172 
173  if (need_transform_relation) {
174  DEG_add_modifier_to_transform_relation(ctx->node, "Warp Modifier");
175  }
176 }
177 
179  const ModifierEvalContext *ctx,
180  Mesh *mesh,
181  float (*vertexCos)[3],
182  int verts_num)
183 {
184  Object *ob = ctx->object;
185  float obinv[4][4];
186  float mat_from[4][4];
187  float mat_from_inv[4][4];
188  float mat_to[4][4];
189  float mat_unit[4][4];
190  float mat_final[4][4];
191 
192  float tmat[4][4];
193 
194  const float falloff_radius_sq = square_f(wmd->falloff_radius);
195  float strength = wmd->strength;
196  float fac = 1.0f, weight;
197  int i;
198  int defgrp_index;
199  MDeformVert *dvert, *dv = NULL;
200  const bool invert_vgroup = (wmd->flag & MOD_WARP_INVERT_VGROUP) != 0;
201  float(*tex_co)[3] = NULL;
202 
203  if (!(wmd->object_from && wmd->object_to)) {
204  return;
205  }
206 
207  MOD_get_vgroup(ob, mesh, wmd->defgrp_name, &dvert, &defgrp_index);
208  if (dvert == NULL) {
209  defgrp_index = -1;
210  }
211 
212  if (wmd->curfalloff == NULL) { /* should never happen, but bad lib linking could cause it */
213  wmd->curfalloff = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
214  }
215 
216  if (wmd->curfalloff) {
218  }
219 
220  invert_m4_m4(obinv, ob->obmat);
221 
222  /* Checks that the objects/bones are available. */
223  matrix_from_obj_pchan(mat_from, obinv, wmd->object_from, wmd->bone_from);
224  matrix_from_obj_pchan(mat_to, obinv, wmd->object_to, wmd->bone_to);
225 
226  invert_m4_m4(tmat, mat_from); // swap?
227  mul_m4_m4m4(mat_final, tmat, mat_to);
228 
229  invert_m4_m4(mat_from_inv, mat_from);
230 
231  unit_m4(mat_unit);
232 
233  if (strength < 0.0f) {
234  float loc[3];
235  strength = -strength;
236 
237  /* inverted location is not useful, just use the negative */
238  copy_v3_v3(loc, mat_final[3]);
239  invert_m4(mat_final);
240  negate_v3_v3(mat_final[3], loc);
241  }
242  weight = strength;
243 
244  Tex *tex_target = wmd->texture;
245  if (mesh != NULL && tex_target != NULL) {
246  tex_co = MEM_malloc_arrayN(verts_num, sizeof(*tex_co), "warpModifier_do tex_co");
247  MOD_get_texture_coords((MappingInfoModifierData *)wmd, ctx, ob, mesh, vertexCos, tex_co);
248 
250  }
251 
252  for (i = 0; i < verts_num; i++) {
253  float *co = vertexCos[i];
254 
255  if (wmd->falloff_type == eWarp_Falloff_None ||
256  ((fac = len_squared_v3v3(co, mat_from[3])) < falloff_radius_sq &&
257  (fac = (wmd->falloff_radius - sqrtf(fac)) / wmd->falloff_radius))) {
258  /* skip if no vert group found */
259  if (defgrp_index != -1) {
260  dv = &dvert[i];
261  weight = (invert_vgroup ? (1.0f - BKE_defvert_find_weight(dv, defgrp_index)) :
262  BKE_defvert_find_weight(dv, defgrp_index)) *
263  strength;
264  if (weight <= 0.0f) {
265  continue;
266  }
267  }
268 
269  /* closely match PROP_SMOOTH and similar */
270  switch (wmd->falloff_type) {
271  case eWarp_Falloff_None:
272  fac = 1.0f;
273  break;
274  case eWarp_Falloff_Curve:
275  fac = BKE_curvemapping_evaluateF(wmd->curfalloff, 0, fac);
276  break;
277  case eWarp_Falloff_Sharp:
278  fac = fac * fac;
279  break;
281  fac = 3.0f * fac * fac - 2.0f * fac * fac * fac;
282  break;
283  case eWarp_Falloff_Root:
284  fac = sqrtf(fac);
285  break;
287  /* pass */
288  break;
289  case eWarp_Falloff_Const:
290  fac = 1.0f;
291  break;
293  fac = sqrtf(2 * fac - fac * fac);
294  break;
296  fac = fac * (2.0f - fac);
297  break;
298  }
299 
300  fac *= weight;
301 
302  if (tex_co) {
304  TexResult texres;
305  BKE_texture_get_value(scene, tex_target, tex_co[i], &texres, false);
306  fac *= texres.tin;
307  }
308 
309  if (fac != 0.0f) {
310  /* into the 'from' objects space */
311  mul_m4_v3(mat_from_inv, co);
312 
313  if (fac == 1.0f) {
314  mul_m4_v3(mat_final, co);
315  }
316  else {
317  if (wmd->flag & MOD_WARP_VOLUME_PRESERVE) {
318  /* interpolate the matrix for nicer locations */
319  blend_m4_m4m4(tmat, mat_unit, mat_final, fac);
320  mul_m4_v3(tmat, co);
321  }
322  else {
323  float tvec[3];
324  mul_v3_m4v3(tvec, mat_final, co);
325  interp_v3_v3v3(co, co, tvec, fac);
326  }
327  }
328 
329  /* out of the 'from' objects space */
330  mul_m4_v3(mat_from, co);
331  }
332  }
333  }
334 
335  if (tex_co) {
336  MEM_freeN(tex_co);
337  }
338 }
339 
340 static void deformVerts(ModifierData *md,
341  const ModifierEvalContext *ctx,
342  Mesh *mesh,
343  float (*vertexCos)[3],
344  int verts_num)
345 {
346  WarpModifierData *wmd = (WarpModifierData *)md;
347  Mesh *mesh_src = NULL;
348 
349  if (wmd->defgrp_name[0] != '\0' || wmd->texture != NULL) {
350  /* mesh_src is only needed for vgroups and textures. */
351  mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, verts_num, false, false);
352  }
353 
354  warpModifier_do(wmd, ctx, mesh_src, vertexCos, verts_num);
355 
356  if (!ELEM(mesh_src, NULL, mesh)) {
357  BKE_id_free(NULL, mesh_src);
358  }
359 }
360 
361 static void deformVertsEM(ModifierData *md,
362  const ModifierEvalContext *ctx,
363  struct BMEditMesh *em,
364  Mesh *mesh,
365  float (*vertexCos)[3],
366  int verts_num)
367 {
368  WarpModifierData *wmd = (WarpModifierData *)md;
369  Mesh *mesh_src = NULL;
370 
371  if (wmd->defgrp_name[0] != '\0' || wmd->texture != NULL) {
372  /* mesh_src is only needed for vgroups and textures. */
373  mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, verts_num, false, false);
374  }
375 
376  /* TODO(Campbell): use edit-mode data only (remove this line). */
377  if (mesh_src != NULL) {
379  }
380 
381  warpModifier_do(wmd, ctx, mesh_src, vertexCos, verts_num);
382 
383  if (!ELEM(mesh_src, NULL, mesh)) {
384  BKE_id_free(NULL, mesh_src);
385  }
386 }
387 
388 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
389 {
390  uiLayout *col;
391  uiLayout *layout = panel->layout;
392 
393  PointerRNA ob_ptr;
395 
396  uiLayoutSetPropSep(layout, true);
397 
398  col = uiLayoutColumn(layout, true);
399  uiItemR(col, ptr, "object_from", 0, NULL, ICON_NONE);
400  PointerRNA from_obj_ptr = RNA_pointer_get(ptr, "object_from");
401  if (!RNA_pointer_is_null(&from_obj_ptr) && RNA_enum_get(&from_obj_ptr, "type") == OB_ARMATURE) {
402 
403  PointerRNA from_obj_data_ptr = RNA_pointer_get(&from_obj_ptr, "data");
404  uiItemPointerR(col, ptr, "bone_from", &from_obj_data_ptr, "bones", IFACE_("Bone"), ICON_NONE);
405  }
406 
407  col = uiLayoutColumn(layout, true);
408  uiItemR(col, ptr, "object_to", 0, NULL, ICON_NONE);
409  PointerRNA to_obj_ptr = RNA_pointer_get(ptr, "object_to");
410  if (!RNA_pointer_is_null(&to_obj_ptr) && RNA_enum_get(&to_obj_ptr, "type") == OB_ARMATURE) {
411  PointerRNA to_obj_data_ptr = RNA_pointer_get(&to_obj_ptr, "data");
412  uiItemPointerR(col, ptr, "bone_to", &to_obj_data_ptr, "bones", IFACE_("Bone"), ICON_NONE);
413  }
414 
415  uiItemR(layout, ptr, "use_volume_preserve", 0, NULL, ICON_NONE);
416 
417  uiItemR(layout, ptr, "strength", 0, NULL, ICON_NONE);
418 
419  modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
420 
421  modifier_panel_end(layout, ptr);
422 }
423 
424 static void falloff_panel_draw(const bContext *UNUSED(C), Panel *panel)
425 {
426  uiLayout *layout = panel->layout;
427 
429 
430  bool use_falloff = (RNA_enum_get(ptr, "falloff_type") != eWarp_Falloff_None);
431 
432  uiLayoutSetPropSep(layout, true);
433 
434  uiItemR(layout, ptr, "falloff_type", 0, NULL, ICON_NONE);
435 
436  if (use_falloff) {
437  uiItemR(layout, ptr, "falloff_radius", 0, NULL, ICON_NONE);
438  }
439 
440  if (use_falloff && RNA_enum_get(ptr, "falloff_type") == eWarp_Falloff_Curve) {
441  uiTemplateCurveMapping(layout, ptr, "falloff_curve", 0, false, false, false, false);
442  }
443 }
444 
445 static void texture_panel_draw(const bContext *C, Panel *panel)
446 {
447  uiLayout *col;
448  uiLayout *layout = panel->layout;
449 
450  PointerRNA ob_ptr;
452 
453  int texture_coords = RNA_enum_get(ptr, "texture_coords");
454 
455  uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL);
456 
457  uiLayoutSetPropSep(layout, true);
458 
459  col = uiLayoutColumn(layout, false);
460  uiItemR(col, ptr, "texture_coords", 0, IFACE_("Coordinates"), ICON_NONE);
461  if (texture_coords == MOD_DISP_MAP_OBJECT) {
462  uiItemR(col, ptr, "texture_coords_object", 0, IFACE_("Object"), ICON_NONE);
463  PointerRNA texture_coords_obj_ptr = RNA_pointer_get(ptr, "texture_coords_object");
464  if (!RNA_pointer_is_null(&texture_coords_obj_ptr) &&
465  (RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE)) {
466  PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data");
468  ptr,
469  "texture_coords_bone",
470  &texture_coords_obj_data_ptr,
471  "bones",
472  IFACE_("Bone"),
473  ICON_NONE);
474  }
475  }
476  else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) {
477  PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data");
478  uiItemPointerR(col, ptr, "uv_layer", &obj_data_ptr, "uv_layers", NULL, ICON_NONE);
479  }
480 }
481 
482 static void panelRegister(ARegionType *region_type)
483 {
484  PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Warp, panel_draw);
486  region_type, "falloff", "Falloff", NULL, falloff_panel_draw, panel_type);
488  region_type, "texture", "Texture", NULL, texture_panel_draw, panel_type);
489 }
490 
491 static void blendWrite(BlendWriter *writer, const ID *UNUSED(id_owner), const ModifierData *md)
492 {
493  const WarpModifierData *wmd = (const WarpModifierData *)md;
494 
495  BLO_write_struct(writer, WarpModifierData, wmd);
496 
497  if (wmd->curfalloff) {
499  }
500 }
501 
502 static void blendRead(BlendDataReader *reader, ModifierData *md)
503 {
504  WarpModifierData *wmd = (WarpModifierData *)md;
505 
506  BLO_read_data_address(reader, &wmd->curfalloff);
507  if (wmd->curfalloff) {
509  }
510 }
511 
513  /* name */ N_("Warp"),
514  /* structName */ "WarpModifierData",
515  /* structSize */ sizeof(WarpModifierData),
516  /* srna */ &RNA_WarpModifier,
517  /* type */ eModifierTypeType_OnlyDeform,
520  /* icon */ ICON_MOD_WARP,
521  /* copyData */ copyData,
522 
523  /* deformVerts */ deformVerts,
524  /* deformMatrices */ NULL,
525  /* deformVertsEM */ deformVertsEM,
526  /* deformMatricesEM */ NULL,
527  /* modifyMesh */ NULL,
528  /* modifyGeometrySet */ NULL,
529 
530  /* initData */ initData,
531  /* requiredDataMask */ requiredDataMask,
532  /* freeData */ freeData,
533  /* isDisabled */ isDisabled,
534  /* updateDepsgraph */ updateDepsgraph,
535  /* dependsOnTime */ dependsOnTime,
536  /* dependsOnNormals */ NULL,
537  /* foreachIDLink */ foreachIDLink,
538  /* foreachTexLink */ foreachTexLink,
539  /* freeRuntimeData */ NULL,
540  /* panelRegister */ panelRegister,
541  /* blendWrite */ blendWrite,
542  /* blendRead */ blendRead,
543 };
typedef float(TangentPoint)[2]
Blender kernel action and pose functionality.
struct bPoseChannel * BKE_pose_channel_find_name(const struct bPose *pose, const char *name)
void BKE_curvemapping_init(struct CurveMapping *cumap)
Definition: colortools.c:1235
struct CurveMapping * BKE_curvemapping_copy(const struct CurveMapping *cumap)
float BKE_curvemapping_evaluateF(const struct CurveMapping *cumap, int cur, float value)
void BKE_curvemapping_blend_read(struct BlendDataReader *reader, struct CurveMapping *cumap)
Definition: colortools.c:1300
void BKE_curvemapping_blend_write(struct BlendWriter *writer, const struct CurveMapping *cumap)
void BKE_curvemapping_free(struct CurveMapping *cumap)
Definition: colortools.c:103
struct CurveMapping * BKE_curvemapping_add(int tot, float minx, float miny, float maxx, float maxy)
Definition: colortools.c:72
support for deformation groups and hooks.
float BKE_defvert_find_weight(const struct MDeformVert *dvert, int defgroup)
Definition: deform.c:704
void BKE_id_free(struct Main *bmain, void *idv)
@ IDWALK_CB_USER
Definition: BKE_lib_query.h:73
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:33
void BKE_mesh_wrapper_ensure_mdata(struct Mesh *me)
Definition: mesh_wrapper.cc:94
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:107
@ eModifierTypeFlag_AcceptsCVs
Definition: BKE_modifier.h:67
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:69
@ eModifierTypeFlag_AcceptsVertexCosOnly
Definition: BKE_modifier.h:100
void(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
Definition: BKE_modifier.h:108
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_OnlyDeform
Definition: BKE_modifier.h:44
bool BKE_texture_dependsOnTime(const struct Tex *texture)
Definition: texture.c:670
void BKE_texture_get_value(const struct Scene *scene, struct Tex *texture, const float *tex_co, struct TexResult *texres, bool use_color_management)
#define BLI_assert(a)
Definition: BLI_assert.h:46
MINLINE float square_f(float a)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
Definition: math_matrix.c:259
bool invert_m4(float R[4][4])
Definition: math_matrix.c:1206
void blend_m4_m4m4(float out[4][4], const float dst[4][4], const float src[4][4], float srcweight)
Definition: math_matrix.c:2409
void unit_m4(float m[4][4])
Definition: rct.c:1090
bool invert_m4_m4(float R[4][4], const float A[4][4])
Definition: math_matrix.c:1287
void mul_m4_v3(const float M[4][4], float r[3])
Definition: math_matrix.c:729
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
Definition: math_matrix.c:739
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
Definition: math_vector.c:29
#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)
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
#define CD_MASK_MTFACE
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
@ eWarp_Falloff_Linear
@ eWarp_Falloff_Curve
@ eWarp_Falloff_Sharp
@ eWarp_Falloff_Const
@ eWarp_Falloff_InvSquare
@ eWarp_Falloff_Smooth
@ eWarp_Falloff_None
@ eWarp_Falloff_Sphere
@ eWarp_Falloff_Root
@ eModifierType_Warp
@ MOD_DISP_MAP_OBJECT
@ MOD_DISP_MAP_GLOBAL
@ MOD_DISP_MAP_UV
struct WarpModifierData WarpModifierData
@ MOD_WARP_VOLUME_PRESERVE
@ MOD_WARP_INVERT_VGROUP
Object is a sort of wrapper for general info.
@ OB_ARMATURE
@ OB_MESH
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)
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)
Mesh * MOD_deform_mesh_eval_get(Object *ob, struct BMEditMesh *em, Mesh *mesh, const float(*vertexCos)[3], const int verts_num, const bool use_normals, const bool use_orco)
Definition: MOD_util.c:167
void MOD_init_texture(MappingInfoModifierData *dmd, const ModifierEvalContext *ctx)
Definition: MOD_util.c:45
void MOD_depsgraph_update_object_bone_relation(struct DepsNodeHandle *node, Object *object, const char *bonename, const char *description)
Definition: MOD_util.c:258
void MOD_get_texture_coords(MappingInfoModifierData *dmd, const ModifierEvalContext *UNUSED(ctx), Object *ob, Mesh *mesh, float(*cos)[3], float(*r_texco)[3])
Definition: MOD_util.c:59
void MOD_get_vgroup(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index)
Definition: MOD_util.c:235
static void copyData(const ModifierData *md, ModifierData *target, const int flag)
Definition: MOD_warp.c:63
static void warpModifier_do(WarpModifierData *wmd, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertexCos)[3], int verts_num)
Definition: MOD_warp.c:178
static void deformVerts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertexCos)[3], int verts_num)
Definition: MOD_warp.c:340
static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(userRenderParams))
Definition: MOD_warp.c:123
static void deformVertsEM(ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em, Mesh *mesh, float(*vertexCos)[3], int verts_num)
Definition: MOD_warp.c:361
static void falloff_panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_warp.c:424
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
Definition: MOD_warp.c:147
static bool dependsOnTime(struct Scene *UNUSED(scene), ModifierData *md)
Definition: MOD_warp.c:106
ModifierTypeInfo modifierType_Warp
Definition: MOD_warp.c:512
static void texture_panel_draw(const bContext *C, Panel *panel)
Definition: MOD_warp.c:445
static void blendRead(BlendDataReader *reader, ModifierData *md)
Definition: MOD_warp.c:502
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
Definition: MOD_warp.c:132
static void matrix_from_obj_pchan(float mat[4][4], const float obinv[4][4], Object *ob, const char *bonename)
Definition: MOD_warp.c:90
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
Definition: MOD_warp.c:388
static void initData(ModifierData *md)
Definition: MOD_warp.c:52
static void panelRegister(ARegionType *region_type)
Definition: MOD_warp.c:482
static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
Definition: MOD_warp.c:142
static void blendWrite(BlendWriter *writer, const ID *UNUSED(id_owner), const ModifierData *md)
Definition: MOD_warp.c:491
static void freeData(ModifierData *md)
Definition: MOD_warp.c:117
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition: MOD_warp.c:73
#define C
Definition: RandGen.cpp:25
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)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiTemplateID(uiLayout *layout, const struct bContext *C, struct PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int filter, bool live_icon, const char *text)
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:34
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
#define sqrtf(x)
Definition: metal/compat.h:243
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5167
bool RNA_pointer_is_null(const PointerRNA *ptr)
Definition: rna_access.c:164
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
Definition: DNA_ID.h:368
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:140
struct Object * object
Definition: BKE_modifier.h:141
struct DepsNodeHandle * node
Definition: BKE_modifier.h:134
struct bPose * pose
float obmat[4][4]
struct uiLayout * layout
float tin
Definition: RE_texture.h:86
struct Object * map_object
struct CurveMapping * curfalloff
struct Object * object_to
struct Object * object_from
float pose_mat[4][4]
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480