Blender  V3.3
BKE_modifier.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 #pragma once
3 
8 #include "BKE_customdata.h"
9 #include "BLI_compiler_attrs.h"
10 #include "DNA_modifier_types.h" /* needed for all enum typdefs */
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 struct ARegionType;
17 struct BMEditMesh;
18 struct BlendDataReader;
19 struct BlendLibReader;
20 struct BlendWriter;
22 struct DepsNodeHandle;
23 struct Depsgraph;
24 struct GeometrySet;
25 struct ID;
26 struct ListBase;
27 struct Main;
28 struct Mesh;
29 struct ModifierData;
30 struct Object;
31 struct Scene;
32 struct bArmature;
33 
34 typedef enum {
35  /* Should not be used, only for None modifier type */
37 
45 
48  /* Modifier can add and remove geometry. */
50 
57 
64 
65 typedef enum {
70 
79 
85 
91 
94 
97 
101 
106 
107 typedef void (*IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag);
108 typedef void (*TexWalkFunc)(void *userData,
109  struct Object *ob,
110  struct ModifierData *md,
111  const char *propname);
112 
113 typedef enum ModifierApplyFlag {
120  MOD_APPLY_ORCO = 1 << 2,
130 
132  struct Scene *scene;
133  struct Object *object;
134  struct DepsNodeHandle *node;
136 
137 /* Contains the information for deformXXX and applyXXX functions below that
138  * doesn't change between consecutive modifiers. */
139 typedef struct ModifierEvalContext {
141  struct Object *object;
144 
145 typedef struct ModifierTypeInfo {
146  /* The user visible name for this modifier */
147  char name[32];
148 
149  /* The DNA struct name for the modifier data type, used to
150  * write the DNA data out.
151  */
152  char structName[32];
153 
154  /* The size of the modifier data type, used by allocation. */
156 
157  /* StructRNA of this modifier. This is typically something like RNA_*Modifier. */
158  struct StructRNA *srna;
159 
162 
163  /* Icon of the modifier. Usually something like ICON_MOD_*. */
164  int icon;
165 
166  /********************* Non-optional functions *********************/
167 
174  void (*copyData)(const struct ModifierData *md, struct ModifierData *target, int flag);
175 
176  /********************* Deform modifier functions *********************/
177 
185  const struct ModifierEvalContext *ctx,
186  struct Mesh *mesh,
187  float (*vertexCos)[3],
188  int numVerts);
189 
194  const struct ModifierEvalContext *ctx,
195  struct Mesh *mesh,
196  float (*vertexCos)[3],
197  float (*defMats)[3][3],
198  int numVerts);
203  const struct ModifierEvalContext *ctx,
204  struct BMEditMesh *editData,
205  struct Mesh *mesh,
206  float (*vertexCos)[3],
207  int numVerts);
208 
209  /* Set deform matrix per vertex for crazy-space correction */
211  const struct ModifierEvalContext *ctx,
212  struct BMEditMesh *editData,
213  struct Mesh *mesh,
214  float (*vertexCos)[3],
215  float (*defMats)[3][3],
216  int numVerts);
217 
218  /********************* Non-deform modifier functions *********************/
219 
231  struct Mesh *(*modifyMesh)(struct ModifierData *md,
232  const struct ModifierEvalContext *ctx,
233  struct Mesh *mesh);
234 
241  const struct ModifierEvalContext *ctx,
242  struct GeometrySet *geometry_set);
243 
244  /********************* Optional functions *********************/
245 
252  void (*initData)(struct ModifierData *md);
253 
268  void (*requiredDataMask)(struct Object *ob,
269  struct ModifierData *md,
270  struct CustomData_MeshMasks *r_cddata_masks);
271 
280  void (*freeData)(struct ModifierData *md);
281 
291  bool (*isDisabled)(const struct Scene *scene, struct ModifierData *md, bool userRenderParams);
292 
299 
306  bool (*dependsOnTime)(struct Scene *scene, struct ModifierData *md);
307 
317 
327  struct Object *ob,
328  IDWalkFunc walk,
329  void *userData);
330 
340  struct Object *ob,
341  TexWalkFunc walk,
342  void *userData);
343 
355  void (*freeRuntimeData)(void *runtime_data);
356 
358  void (*panelRegister)(struct ARegionType *region_type);
359 
367  void (*blendWrite)(struct BlendWriter *writer,
368  const struct ID *id_owner,
369  const struct ModifierData *md);
370 
377  void (*blendRead)(struct BlendDataReader *reader, struct ModifierData *md);
379 
380 /* Used to find a modifier's panel type. */
381 #define MODIFIER_TYPE_PANEL_PREFIX "MOD_PT_"
382 
383 /* Initialize modifier's global data (type info and some common global storage). */
384 void BKE_modifier_init(void);
385 
387 
388 /* For modifier UI panels. */
389 
393 void BKE_modifier_type_panel_id(ModifierType type, char *r_idname);
394 void BKE_modifier_panel_expand(struct ModifierData *md);
395 
396 /* Modifier utility calls, do call through type pointer and return
397  * default values if pointer is optional.
398  */
399 struct ModifierData *BKE_modifier_new(int type);
400 
401 void BKE_modifier_free_ex(struct ModifierData *md, int flag);
402 void BKE_modifier_free(struct ModifierData *md);
406 void BKE_modifier_remove_from_list(struct Object *ob, struct ModifierData *md);
407 
408 /* Generate new UUID for the given modifier. */
410 
411 bool BKE_modifier_unique_name(struct ListBase *modifiers, struct ModifierData *md);
412 
413 struct ModifierData *BKE_modifier_copy_ex(const struct ModifierData *md, int flag);
414 
419  struct ModifierData *md_dst,
420  int flag);
421 void BKE_modifier_copydata(const struct ModifierData *md, struct ModifierData *target);
423  struct ModifierData *target,
424  int flag);
425 bool BKE_modifier_depends_ontime(struct Scene *scene, struct ModifierData *md);
427 bool BKE_modifier_supports_cage(struct Scene *scene, struct ModifierData *md);
428 bool BKE_modifier_couldbe_cage(struct Scene *scene, struct ModifierData *md);
438 bool BKE_modifier_is_enabled(const struct Scene *scene,
439  struct ModifierData *md,
440  int required_mode);
448  const struct ModifierData *md);
449 
450 /* Set modifier execution error.
451  * The message will be shown in the interface and will be logged as an error to the console. */
452 void BKE_modifier_set_error(const struct Object *ob,
453  struct ModifierData *md,
454  const char *format,
455  ...) ATTR_PRINTF_FORMAT(3, 4);
456 
457 /* Set modifier execution warning, which does not prevent the modifier from being applied but which
458  * might need an attention. The message will only be shown in the interface, but will not appear in
459  * the logs. */
460 void BKE_modifier_set_warning(const struct Object *ob,
461  struct ModifierData *md,
462  const char *format,
463  ...) ATTR_PRINTF_FORMAT(3, 4);
464 
465 bool BKE_modifier_is_preview(struct ModifierData *md);
466 
467 void BKE_modifiers_foreach_ID_link(struct Object *ob, IDWalkFunc walk, void *userData);
468 void BKE_modifiers_foreach_tex_link(struct Object *ob, TexWalkFunc walk, void *userData);
469 
471 struct ModifierData *BKE_modifiers_findby_name(const struct Object *ob, const char *name);
473  const SessionUUID *session_uuid);
474 void BKE_modifiers_clear_errors(struct Object *ob);
482  struct Object *ob,
483  int *r_lastPossibleCageIndex,
484  bool is_virtual);
485 
486 bool BKE_modifiers_is_modifier_enabled(struct Object *ob, int modifierType);
488 bool BKE_modifiers_is_cloth_enabled(struct Object *ob);
490 
507 bool BKE_modifiers_uses_multires(struct Object *ob);
508 bool BKE_modifiers_uses_armature(struct Object *ob, struct bArmature *arm);
509 bool BKE_modifiers_is_correctable_deformed(const struct Scene *scene, struct Object *ob);
511 
512 typedef struct CDMaskLink {
513  struct CDMaskLink *next;
514  struct CustomData_MeshMasks mask;
516 
524  struct Object *ob,
525  struct ModifierData *md,
526  struct CustomData_MeshMasks *final_datamask,
527  int required_mode,
528  ModifierData *previewmd,
529  const struct CustomData_MeshMasks *previewmask);
531  struct ModifierData *md,
532  int required_mode);
533 
534 typedef struct VirtualModifierData {
540 
546  struct VirtualModifierData *data);
547 
551 void BKE_modifiers_test_object(struct Object *ob);
552 
557 
561 void BKE_modifier_path_init(char *path, int path_maxlen, const char *name);
562 const char *BKE_modifier_path_relbase(struct Main *bmain, struct Object *ob);
563 const char *BKE_modifier_path_relbase_from_global(struct Object *ob);
564 
565 /* Accessors of original/evaluated modifiers. */
566 
571 struct ModifierData *BKE_modifier_get_original(const struct Object *object,
572  struct ModifierData *md);
574  struct Object *object,
575  struct ModifierData *md);
576 
577 /* wrappers for modifier callbacks that ensure valid normals */
578 
580  const struct ModifierEvalContext *ctx,
581  struct Mesh *me);
582 
584  const struct ModifierEvalContext *ctx,
585  struct Mesh *me,
586  float (*vertexCos)[3],
587  int numVerts);
588 
590  const struct ModifierEvalContext *ctx,
591  struct BMEditMesh *em,
592  struct Mesh *me,
593  float (*vertexCos)[3],
594  int numVerts);
595 
603 
605 
607  const struct ID *id_owner,
608  struct ListBase *modbase);
610  struct ListBase *lb,
611  struct Object *ob);
612 void BKE_modifier_blend_read_lib(struct BlendLibReader *reader, struct Object *ob);
613 
614 #ifdef __cplusplus
615 }
616 #endif
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
void BKE_modifier_copydata_ex(const struct ModifierData *md, struct ModifierData *target, int flag)
bool BKE_modifier_is_non_geometrical(ModifierData *md)
void BKE_modifier_path_init(char *path, int path_maxlen, const char *name)
struct ModifierData * BKE_modifiers_findby_session_uuid(const struct Object *ob, const SessionUUID *session_uuid)
void BKE_modifier_check_uuids_unique_and_report(const struct Object *object)
struct ModifierData * BKE_modifier_get_original(const struct Object *object, struct ModifierData *md)
struct VirtualModifierData VirtualModifierData
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
void BKE_modifier_mdef_compact_influences(struct ModifierData *md)
bool BKE_modifiers_is_particle_enabled(struct Object *ob)
struct Object * BKE_modifiers_is_deformed_by_armature(struct Object *ob)
struct Object * BKE_modifiers_is_deformed_by_curve(struct Object *ob)
struct CDMaskLink CDMaskLink
void void BKE_modifier_set_warning(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
bool BKE_modifiers_uses_armature(struct Object *ob, struct bArmature *arm)
void BKE_modifier_deform_vertsEM(ModifierData *md, const struct ModifierEvalContext *ctx, struct BMEditMesh *em, struct Mesh *me, float(*vertexCos)[3], int numVerts)
void BKE_modifier_blend_read_lib(struct BlendLibReader *reader, struct Object *ob)
bool BKE_modifier_is_enabled(const struct Scene *scene, struct ModifierData *md, int required_mode)
bool BKE_modifier_is_nonlocal_in_liboverride(const struct Object *ob, const struct ModifierData *md)
bool BKE_modifiers_is_softbody_enabled(struct Object *ob)
struct Mesh * BKE_modifier_modify_mesh(ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *me)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:107
ModifierTypeFlag
Definition: BKE_modifier.h:65
@ eModifierTypeFlag_AcceptsBMesh
Definition: BKE_modifier.h:103
@ eModifierTypeFlag_Single
Definition: BKE_modifier.h:93
@ eModifierTypeFlag_UsesPointCache
Definition: BKE_modifier.h:90
@ eModifierTypeFlag_NoUserAdd
Definition: BKE_modifier.h:96
@ eModifierTypeFlag_AcceptsCVs
Definition: BKE_modifier.h:67
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:68
@ eModifierTypeFlag_UsesPreview
Definition: BKE_modifier.h:99
@ eModifierTypeFlag_EnableInEditmode
Definition: BKE_modifier.h:78
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:69
@ eModifierTypeFlag_AcceptsVertexCosOnly
Definition: BKE_modifier.h:100
@ eModifierTypeFlag_RequiresOriginalData
Definition: BKE_modifier.h:84
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:66
void BKE_modifier_deform_verts(ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *me, float(*vertexCos)[3], int numVerts)
void(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
Definition: BKE_modifier.h:108
struct ModifierUpdateDepsgraphContext ModifierUpdateDepsgraphContext
void BKE_modifier_free(struct ModifierData *md)
void BKE_modifiers_foreach_tex_link(struct Object *ob, TexWalkFunc walk, void *userData)
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
struct ModifierData * BKE_modifier_get_last_preview(const struct Scene *scene, struct ModifierData *md, int required_mode)
struct ModifierData * BKE_modifiers_get_virtual_modifierlist(const struct Object *ob, struct VirtualModifierData *data)
void BKE_modifier_panel_expand(struct ModifierData *md)
const char * BKE_modifier_path_relbase_from_global(struct Object *ob)
bool BKE_modifier_couldbe_cage(struct Scene *scene, struct ModifierData *md)
const char * BKE_modifier_path_relbase(struct Main *bmain, struct Object *ob)
void BKE_modifier_free_ex(struct ModifierData *md, int flag)
void BKE_modifier_copydata(const struct ModifierData *md, struct ModifierData *target)
void BKE_modifiers_test_object(struct Object *ob)
struct ModifierData * BKE_modifier_get_evaluated(struct Depsgraph *depsgraph, struct Object *object, struct ModifierData *md)
bool BKE_modifier_depends_ontime(struct Scene *scene, struct ModifierData *md)
struct ModifierEvalContext ModifierEvalContext
struct ModifierTypeInfo ModifierTypeInfo
struct Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(struct Object *ob_eval)
void BKE_modifier_blend_write(struct BlendWriter *writer, const struct ID *id_owner, struct ListBase *modbase)
struct ModifierData * BKE_modifiers_findby_type(const struct Object *ob, ModifierType type)
bool BKE_modifier_is_same_topology(ModifierData *md)
void BKE_modifier_remove_from_list(struct Object *ob, struct ModifierData *md)
bool BKE_modifier_supports_mapping(struct ModifierData *md)
struct ModifierData * BKE_modifier_new(int type)
bool BKE_modifier_supports_cage(struct Scene *scene, struct ModifierData *md)
bool BKE_modifiers_is_correctable_deformed(const struct Scene *scene, struct Object *ob)
ModifierTypeType
Definition: BKE_modifier.h:34
@ eModifierTypeType_OnlyDeform
Definition: BKE_modifier.h:44
@ eModifierTypeType_NonGeometrical
Definition: BKE_modifier.h:62
@ eModifierTypeType_DeformOrConstruct
Definition: BKE_modifier.h:56
@ eModifierTypeType_None
Definition: BKE_modifier.h:36
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:47
@ eModifierTypeType_Nonconstructive
Definition: BKE_modifier.h:49
void BKE_modifiers_foreach_ID_link(struct Object *ob, IDWalkFunc walk, void *userData)
bool BKE_modifier_is_correctable_deformed(struct ModifierData *md)
void BKE_modifier_blend_read_data(struct BlendDataReader *reader, struct ListBase *lb, struct Object *ob)
struct ModifierData * BKE_modifiers_findby_name(const struct Object *ob, const char *name)
struct Object * BKE_modifiers_is_deformed_by_lattice(struct Object *ob)
void BKE_modifier_free_temporary_data(struct ModifierData *md)
void void bool BKE_modifier_is_preview(struct ModifierData *md)
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_modifiers_clear_errors(struct Object *ob)
struct CDMaskLink * BKE_modifier_calc_data_masks(const struct Scene *scene, struct Object *ob, struct ModifierData *md, struct CustomData_MeshMasks *final_datamask, int required_mode, ModifierData *previewmd, const struct CustomData_MeshMasks *previewmask)
void BKE_modifier_type_panel_id(ModifierType type, char *r_idname)
ModifierApplyFlag
Definition: BKE_modifier.h:113
@ MOD_APPLY_USECACHE
Definition: BKE_modifier.h:118
@ MOD_APPLY_RENDER
Definition: BKE_modifier.h:115
@ MOD_APPLY_IGNORE_SIMPLIFY
Definition: BKE_modifier.h:123
@ MOD_APPLY_TO_BASE_MESH
Definition: BKE_modifier.h:128
@ MOD_APPLY_ORCO
Definition: BKE_modifier.h:120
struct ModifierData * BKE_modifier_copy_ex(const struct ModifierData *md, int flag)
int BKE_modifiers_get_cage_index(const struct Scene *scene, struct Object *ob, int *r_lastPossibleCageIndex, bool is_virtual)
bool BKE_modifiers_uses_multires(struct Object *ob)
struct Object * BKE_modifiers_is_deformed_by_meshdeform(struct Object *ob)
bool BKE_modifiers_is_modifier_enabled(struct Object *ob, int modifierType)
void BKE_modifier_session_uuid_generate(struct ModifierData *md)
bool BKE_modifiers_is_cloth_enabled(struct Object *ob)
void BKE_modifier_init(void)
bool BKE_modifier_unique_name(struct ListBase *modifiers, struct ModifierData *md)
size_t ATTR_PRINTF_FORMAT(3, 4)
#define ENUM_OPERATORS(_type, _max)
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:35
ModifierType
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Scene scene
const Depsgraph * depsgraph
SyclQueue void void size_t num_bytes void
format
Definition: logImageCore.h:38
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
Definition: math_float4.h:513
static ulong * next
Definition: DNA_ID.h:368
Definition: BKE_main.h:121
SessionUUID session_uuid
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:140
ModifierApplyFlag flag
Definition: BKE_modifier.h:142
struct Object * object
Definition: BKE_modifier.h:141
bool(* isDisabled)(const struct Scene *scene, struct ModifierData *md, bool userRenderParams)
Definition: BKE_modifier.h:291
void(* modifyGeometrySet)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct GeometrySet *geometry_set)
Definition: BKE_modifier.h:240
ModifierTypeFlag flags
Definition: BKE_modifier.h:161
void(* deformVertsEM)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct BMEditMesh *editData, struct Mesh *mesh, float(*vertexCos)[3], int numVerts)
Definition: BKE_modifier.h:202
ModifierTypeType type
Definition: BKE_modifier.h:160
void(* updateDepsgraph)(struct ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
Definition: BKE_modifier.h:298
void(* freeData)(struct ModifierData *md)
Definition: BKE_modifier.h:280
void(* panelRegister)(struct ARegionType *region_type)
Definition: BKE_modifier.h:358
void(* blendWrite)(struct BlendWriter *writer, const struct ID *id_owner, const struct ModifierData *md)
Definition: BKE_modifier.h:367
struct StructRNA * srna
Definition: BKE_modifier.h:158
void(* deformVerts)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh, float(*vertexCos)[3], int numVerts)
Definition: BKE_modifier.h:184
void(* foreachTexLink)(struct ModifierData *md, struct Object *ob, TexWalkFunc walk, void *userData)
Definition: BKE_modifier.h:339
void(* blendRead)(struct BlendDataReader *reader, struct ModifierData *md)
Definition: BKE_modifier.h:377
char structName[32]
Definition: BKE_modifier.h:152
void(* requiredDataMask)(struct Object *ob, struct ModifierData *md, struct CustomData_MeshMasks *r_cddata_masks)
Definition: BKE_modifier.h:268
void(* deformMatrices)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh, float(*vertexCos)[3], float(*defMats)[3][3], int numVerts)
Definition: BKE_modifier.h:193
bool(* dependsOnTime)(struct Scene *scene, struct ModifierData *md)
Definition: BKE_modifier.h:306
void(* freeRuntimeData)(void *runtime_data)
Definition: BKE_modifier.h:355
bool(* dependsOnNormals)(struct ModifierData *md)
Definition: BKE_modifier.h:316
void(* foreachIDLink)(struct ModifierData *md, struct Object *ob, IDWalkFunc walk, void *userData)
Definition: BKE_modifier.h:326
void(* initData)(struct ModifierData *md)
Definition: BKE_modifier.h:252
void(* copyData)(const struct ModifierData *md, struct ModifierData *target, int flag)
Definition: BKE_modifier.h:174
void(* deformMatricesEM)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct BMEditMesh *editData, struct Mesh *mesh, float(*vertexCos)[3], float(*defMats)[3][3], int numVerts)
Definition: BKE_modifier.h:210
struct DepsNodeHandle * node
Definition: BKE_modifier.h:134
ArmatureModifierData amd
Definition: BKE_modifier.h:535
CurveModifierData cmd
Definition: BKE_modifier.h:536
LatticeModifierData lmd
Definition: BKE_modifier.h:537
ShapeKeyModifierData smd
Definition: BKE_modifier.h:538