Blender  V2.93
BKE_modifier.h
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 #pragma once
17 
22 #include "BKE_customdata.h"
23 #include "BLI_compiler_attrs.h"
24 #include "DNA_modifier_types.h" /* needed for all enum typdefs */
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
30 struct ARegionType;
31 struct BMEditMesh;
32 struct BlendDataReader;
33 struct BlendLibReader;
34 struct BlendWriter;
36 struct DepsNodeHandle;
37 struct Depsgraph;
38 struct GeometrySet;
39 struct ID;
40 struct ListBase;
41 struct Main;
42 struct Mesh;
43 struct ModifierData;
44 struct Object;
45 struct Scene;
46 struct bArmature;
47 
48 typedef enum {
49  /* Should not be used, only for None modifier type */
51 
59 
62  /* Modifier can add and remove geometry. */
64 
71 
78 
79 typedef enum {
84 
93 
99 
105 
108 
111 
115 
119 
120 typedef void (*IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag);
121 typedef void (*TexWalkFunc)(void *userData,
122  struct Object *ob,
123  struct ModifierData *md,
124  const char *propname);
125 
126 typedef enum ModifierApplyFlag {
133  MOD_APPLY_ORCO = 1 << 2,
143 
145  struct Scene *scene;
146  struct Object *object;
147  struct DepsNodeHandle *node;
149 
150 /* Contains the information for deformXXX and applyXXX functions below that
151  * doesn't change between consecutive modifiers. */
152 typedef struct ModifierEvalContext {
154  struct Object *object;
157 
158 typedef struct ModifierTypeInfo {
159  /* The user visible name for this modifier */
160  char name[32];
161 
162  /* The DNA struct name for the modifier data type, used to
163  * write the DNA data out.
164  */
165  char structName[32];
166 
167  /* The size of the modifier data type, used by allocation. */
169 
170  /* StructRNA of this modifier. This is typically something like RNA_*Modifier. */
171  struct StructRNA *srna;
172 
175 
176  /* Icon of the modifier. Usually something like ICON_MOD_*. */
177  int icon;
178 
179  /********************* Non-optional functions *********************/
180 
187  void (*copyData)(const struct ModifierData *md, struct ModifierData *target, const int flag);
188 
189  /********************* Deform modifier functions *********************/
190 
197  void (*deformVerts)(struct ModifierData *md,
198  const struct ModifierEvalContext *ctx,
199  struct Mesh *mesh,
200  float (*vertexCos)[3],
201  int numVerts);
202 
206  void (*deformMatrices)(struct ModifierData *md,
207  const struct ModifierEvalContext *ctx,
208  struct Mesh *mesh,
209  float (*vertexCos)[3],
210  float (*defMats)[3][3],
211  int numVerts);
215  void (*deformVertsEM)(struct ModifierData *md,
216  const struct ModifierEvalContext *ctx,
217  struct BMEditMesh *editData,
218  struct Mesh *mesh,
219  float (*vertexCos)[3],
220  int numVerts);
221 
222  /* Set deform matrix per vertex for crazy-space correction */
223  void (*deformMatricesEM)(struct ModifierData *md,
224  const struct ModifierEvalContext *ctx,
225  struct BMEditMesh *editData,
226  struct Mesh *mesh,
227  float (*vertexCos)[3],
228  float (*defMats)[3][3],
229  int numVerts);
230 
231  /********************* Non-deform modifier functions *********************/
232 
244  struct Mesh *(*modifyMesh)(struct ModifierData *md,
245  const struct ModifierEvalContext *ctx,
246  struct Mesh *mesh);
247 
248  struct Hair *(*modifyHair)(struct ModifierData *md,
249  const struct ModifierEvalContext *ctx,
250  struct Hair *hair);
251 
257  void (*modifyGeometrySet)(struct ModifierData *md,
258  const struct ModifierEvalContext *ctx,
259  struct GeometrySet *geometry_set);
260 
261  struct Volume *(*modifyVolume)(struct ModifierData *md,
262  const struct ModifierEvalContext *ctx,
263  struct Volume *volume);
264 
265  /********************* Optional functions *********************/
266 
273  void (*initData)(struct ModifierData *md);
274 
289  void (*requiredDataMask)(struct Object *ob,
290  struct ModifierData *md,
291  struct CustomData_MeshMasks *r_cddata_masks);
292 
301  void (*freeData)(struct ModifierData *md);
302 
312  bool (*isDisabled)(const struct Scene *scene, struct ModifierData *md, bool userRenderParams);
313 
320 
327  bool (*dependsOnTime)(struct ModifierData *md);
328 
337  bool (*dependsOnNormals)(struct ModifierData *md);
338 
347  void (*foreachIDLink)(struct ModifierData *md,
348  struct Object *ob,
349  IDWalkFunc walk,
350  void *userData);
351 
360  void (*foreachTexLink)(struct ModifierData *md,
361  struct Object *ob,
362  TexWalkFunc walk,
363  void *userData);
364 
376  void (*freeRuntimeData)(void *runtime_data);
377 
379  void (*panelRegister)(struct ARegionType *region_type);
380 
388  void (*blendWrite)(struct BlendWriter *writer, const struct ModifierData *md);
389 
396  void (*blendRead)(struct BlendDataReader *reader, struct ModifierData *md);
398 
399 /* Used to find a modifier's panel type. */
400 #define MODIFIER_TYPE_PANEL_PREFIX "MOD_PT_"
401 
402 /* Initialize modifier's global data (type info and some common global storage). */
403 void BKE_modifier_init(void);
404 
406 
407 /* For modifier UI panels. */
408 void BKE_modifier_type_panel_id(ModifierType type, char *r_idname);
409 void BKE_modifier_panel_expand(struct ModifierData *md);
410 
411 /* Modifier utility calls, do call through type pointer and return
412  * default values if pointer is optional.
413  */
414 struct ModifierData *BKE_modifier_new(int type);
415 
416 void BKE_modifier_free_ex(struct ModifierData *md, const int flag);
417 void BKE_modifier_free(struct ModifierData *md);
418 void BKE_modifier_remove_from_list(struct Object *ob, struct ModifierData *md);
419 
420 /* Generate new UUID for the given modifier. */
422 
423 bool BKE_modifier_unique_name(struct ListBase *modifiers, struct ModifierData *md);
424 
426  struct ModifierData *md_dst,
427  const int flag);
428 void BKE_modifier_copydata(struct ModifierData *md, struct ModifierData *target);
429 void BKE_modifier_copydata_ex(struct ModifierData *md,
430  struct ModifierData *target,
431  const int flag);
434 bool BKE_modifier_supports_cage(struct Scene *scene, struct ModifierData *md);
435 bool BKE_modifier_couldbe_cage(struct Scene *scene, struct ModifierData *md);
439 bool BKE_modifier_is_enabled(const struct Scene *scene,
440  struct ModifierData *md,
441  int required_mode);
443  const struct ModifierData *md);
444 void BKE_modifier_set_error(const struct Object *ob,
445  struct ModifierData *md,
446  const char *format,
447  ...) ATTR_PRINTF_FORMAT(3, 4);
448 bool BKE_modifier_is_preview(struct ModifierData *md);
449 
450 void BKE_modifiers_foreach_ID_link(struct Object *ob, IDWalkFunc walk, void *userData);
451 void BKE_modifiers_foreach_tex_link(struct Object *ob, TexWalkFunc walk, void *userData);
452 
454 struct ModifierData *BKE_modifiers_findby_name(const struct Object *ob, const char *name);
455 void BKE_modifiers_clear_errors(struct Object *ob);
457  struct Object *ob,
458  int *r_lastPossibleCageIndex,
459  bool is_virtual);
460 
461 bool BKE_modifiers_is_modifier_enabled(struct Object *ob, int modifierType);
463 bool BKE_modifiers_is_cloth_enabled(struct Object *ob);
465 
470 bool BKE_modifiers_uses_multires(struct Object *ob);
471 bool BKE_modifiers_uses_armature(struct Object *ob, struct bArmature *arm);
472 bool BKE_modifiers_uses_subsurf_facedots(const struct Scene *scene, struct Object *ob);
473 bool BKE_modifiers_is_correctable_deformed(const struct Scene *scene, struct Object *ob);
475 
476 typedef struct CDMaskLink {
477  struct CDMaskLink *next;
478  struct CustomData_MeshMasks mask;
480 
488  struct Object *ob,
489  struct ModifierData *md,
490  struct CustomData_MeshMasks *final_datamask,
491  int required_mode,
492  ModifierData *previewmd,
493  const struct CustomData_MeshMasks *previewmask);
495  struct ModifierData *md,
496  int required_mode);
497 
498 typedef struct VirtualModifierData {
504 
506  struct VirtualModifierData *data);
507 
509 void BKE_modifiers_test_object(struct Object *ob);
510 
511 /* here for do_versions */
513 
514 void BKE_modifier_path_init(char *path, int path_maxlen, const char *name);
515 const char *BKE_modifier_path_relbase(struct Main *bmain, struct Object *ob);
516 const char *BKE_modifier_path_relbase_from_global(struct Object *ob);
517 
518 /* Accessors of original/evaluated modifiers. */
519 
520 /* For a given modifier data, get corresponding original one.
521  * If the modifier data is already original, return it as-is. */
524  struct Object *object,
525  struct ModifierData *md);
526 
527 /* wrappers for modifier callbacks that ensure valid normals */
528 
530  const struct ModifierEvalContext *ctx,
531  struct Mesh *me);
532 
534  const struct ModifierEvalContext *ctx,
535  struct Mesh *me,
536  float (*vertexCos)[3],
537  int numVerts);
538 
540  const struct ModifierEvalContext *ctx,
541  struct BMEditMesh *em,
542  struct Mesh *me,
543  float (*vertexCos)[3],
544  int numVerts);
545 
547  const bool get_cage_mesh);
548 
550 
551 void BKE_modifier_blend_write(struct BlendWriter *writer, struct ListBase *modbase);
553  struct ListBase *lb,
554  struct Object *ob);
555 void BKE_modifier_blend_read_lib(struct BlendLibReader *reader, struct Object *ob);
556 
557 #ifdef __cplusplus
558 }
559 #endif
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
void BKE_modifier_copydata(struct ModifierData *md, struct ModifierData *target)
bool BKE_modifier_is_non_geometrical(ModifierData *md)
void BKE_modifier_path_init(char *path, int path_maxlen, const char *name)
void BKE_modifier_check_uuids_unique_and_report(const struct Object *object)
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
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 BKE_modifier_free_ex(struct ModifierData *md, const int flag)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
Definition: BKE_modifier.h:120
ModifierTypeFlag
Definition: BKE_modifier.h:79
@ eModifierTypeFlag_AcceptsBMesh
Definition: BKE_modifier.h:117
@ eModifierTypeFlag_Single
Definition: BKE_modifier.h:107
@ eModifierTypeFlag_UsesPointCache
Definition: BKE_modifier.h:104
@ eModifierTypeFlag_NoUserAdd
Definition: BKE_modifier.h:110
@ eModifierTypeFlag_AcceptsCVs
Definition: BKE_modifier.h:81
@ eModifierTypeFlag_SupportsMapping
Definition: BKE_modifier.h:82
@ eModifierTypeFlag_UsesPreview
Definition: BKE_modifier.h:113
@ eModifierTypeFlag_EnableInEditmode
Definition: BKE_modifier.h:92
@ eModifierTypeFlag_SupportsEditmode
Definition: BKE_modifier.h:83
@ eModifierTypeFlag_AcceptsVertexCosOnly
Definition: BKE_modifier.h:114
@ eModifierTypeFlag_RequiresOriginalData
Definition: BKE_modifier.h:98
@ eModifierTypeFlag_AcceptsMesh
Definition: BKE_modifier.h:80
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:121
struct ModifierUpdateDepsgraphContext ModifierUpdateDepsgraphContext
bool BKE_modifiers_uses_subsurf_facedots(const struct Scene *scene, struct Object *ob)
bool BKE_modifier_depends_ontime(struct ModifierData *md)
void BKE_modifier_free(struct ModifierData *md)
void BKE_modifiers_foreach_tex_link(struct Object *ob, TexWalkFunc walk, void *userData)
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 bool BKE_modifier_is_preview(struct ModifierData *md)
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_modifiers_test_object(struct Object *ob)
struct ModifierData * BKE_modifier_get_evaluated(struct Depsgraph *depsgraph, struct Object *object, struct ModifierData *md)
struct ModifierEvalContext ModifierEvalContext
struct ModifierTypeInfo ModifierTypeInfo
void BKE_modifier_copydata_ex(struct ModifierData *md, struct ModifierData *target, const int flag)
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)
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
ModifierTypeType
Definition: BKE_modifier.h:48
@ eModifierTypeType_OnlyDeform
Definition: BKE_modifier.h:58
@ eModifierTypeType_NonGeometrical
Definition: BKE_modifier.h:76
@ eModifierTypeType_DeformOrConstruct
Definition: BKE_modifier.h:70
@ eModifierTypeType_None
Definition: BKE_modifier.h:50
@ eModifierTypeType_Constructive
Definition: BKE_modifier.h:61
@ eModifierTypeType_Nonconstructive
Definition: BKE_modifier.h:63
void BKE_modifiers_foreach_ID_link(struct Object *ob, IDWalkFunc walk, void *userData)
void BKE_modifier_blend_write(struct BlendWriter *writer, struct ListBase *modbase)
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)
struct ModifierData * BKE_modifier_get_original(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:126
@ MOD_APPLY_USECACHE
Definition: BKE_modifier.h:131
@ MOD_APPLY_RENDER
Definition: BKE_modifier.h:128
@ MOD_APPLY_IGNORE_SIMPLIFY
Definition: BKE_modifier.h:136
@ MOD_APPLY_TO_BASE_MESH
Definition: BKE_modifier.h:141
@ MOD_APPLY_ORCO
Definition: BKE_modifier.h:133
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)
struct Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(struct Object *ob_eval, const bool get_cage_mesh)
size_t ATTR_PRINTF_FORMAT(3, 4)
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:51
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
format
Definition: logImageCore.h:47
static ulong * next
Definition: DNA_ID.h:273
Definition: BKE_main.h:116
struct Depsgraph * depsgraph
Definition: BKE_modifier.h:153
ModifierApplyFlag flag
Definition: BKE_modifier.h:155
struct Object * object
Definition: BKE_modifier.h:154
bool(* isDisabled)(const struct Scene *scene, struct ModifierData *md, bool userRenderParams)
Definition: BKE_modifier.h:312
void(* modifyGeometrySet)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct GeometrySet *geometry_set)
Definition: BKE_modifier.h:257
void(* copyData)(const struct ModifierData *md, struct ModifierData *target, const int flag)
Definition: BKE_modifier.h:187
ModifierTypeFlag flags
Definition: BKE_modifier.h:174
void(* deformVertsEM)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct BMEditMesh *editData, struct Mesh *mesh, float(*vertexCos)[3], int numVerts)
Definition: BKE_modifier.h:215
ModifierTypeType type
Definition: BKE_modifier.h:173
void(* updateDepsgraph)(struct ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
Definition: BKE_modifier.h:319
void(* freeData)(struct ModifierData *md)
Definition: BKE_modifier.h:301
void(* panelRegister)(struct ARegionType *region_type)
Definition: BKE_modifier.h:379
void(* blendWrite)(struct BlendWriter *writer, const struct ModifierData *md)
Definition: BKE_modifier.h:388
struct StructRNA * srna
Definition: BKE_modifier.h:171
void(* deformVerts)(struct ModifierData *md, const struct ModifierEvalContext *ctx, struct Mesh *mesh, float(*vertexCos)[3], int numVerts)
Definition: BKE_modifier.h:197
void(* foreachTexLink)(struct ModifierData *md, struct Object *ob, TexWalkFunc walk, void *userData)
Definition: BKE_modifier.h:360
void(* blendRead)(struct BlendDataReader *reader, struct ModifierData *md)
Definition: BKE_modifier.h:396
char structName[32]
Definition: BKE_modifier.h:165
void(* requiredDataMask)(struct Object *ob, struct ModifierData *md, struct CustomData_MeshMasks *r_cddata_masks)
Definition: BKE_modifier.h:289
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:206
void(* freeRuntimeData)(void *runtime_data)
Definition: BKE_modifier.h:376
bool(* dependsOnNormals)(struct ModifierData *md)
Definition: BKE_modifier.h:337
bool(* dependsOnTime)(struct ModifierData *md)
Definition: BKE_modifier.h:327
void(* foreachIDLink)(struct ModifierData *md, struct Object *ob, IDWalkFunc walk, void *userData)
Definition: BKE_modifier.h:347
void(* initData)(struct ModifierData *md)
Definition: BKE_modifier.h:273
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:223
struct DepsNodeHandle * node
Definition: BKE_modifier.h:147
ArmatureModifierData amd
Definition: BKE_modifier.h:499
CurveModifierData cmd
Definition: BKE_modifier.h:500
LatticeModifierData lmd
Definition: BKE_modifier.h:501
ShapeKeyModifierData smd
Definition: BKE_modifier.h:502
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)