Blender V4.3
BKE_modifier.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4#pragma once
5
10#include "BLI_function_ref.hh"
12#include "BLI_span.hh"
13
14#include "DNA_modifier_types.h" /* Needed for all enum type definitions. */
15
17
18namespace blender::bke {
19struct GeometrySet;
20}
21struct ARegionType;
22struct bArmature;
23struct BMEditMesh;
24struct BlendDataReader;
25struct BlendWriter;
27struct DepsNodeHandle;
28struct Depsgraph;
29struct ID;
30struct ListBase;
31struct Main;
32struct Mesh;
33struct ModifierData;
34struct Object;
35struct PointerRNA;
36struct PropertyRNA;
37struct Scene;
38struct StructRNA;
39struct IDCacheKey;
40
41enum class ModifierTypeType {
42 /* Should not be used, only for None modifier type */
43 None,
44
52
55 /* Modifier can add and remove geometry. */
57
64
70};
71
130
131using IDWalkFunc = void (*)(void *user_data, Object *ob, ID **idpoin, int cb_flag);
132using TexWalkFunc = void (*)(void *user_data,
133 Object *ob,
134 ModifierData *md,
135 const PointerRNA *ptr,
136 PropertyRNA *texture_prop);
137
156
162
163/* Contains the information for deformXXX and applyXXX functions below that
164 * doesn't change between consecutive modifiers. */
170
172 /* A unique identifier for this modifier. Used to generate the panel id type name.
173 * See #BKE_modifier_type_panel_id. */
174 char idname[64];
175
176 /* The user visible name for this modifier */
177 char name[64];
178
179 /* The DNA struct name for the modifier data type, used to
180 * write the DNA data out.
181 */
182 char struct_name[64];
183
184 /* The size of the modifier data type, used by allocation. */
186
187 /* StructRNA of this modifier. This is typically something like RNA_*Modifier. */
189
192
193 /* Icon of the modifier. Usually something like ICON_MOD_*. */
194 int icon;
195
196 /********************* Non-optional functions *********************/
197
204 void (*copy_data)(const ModifierData *md, ModifierData *target, int flag);
205
206 /********************* Deform modifier functions *********************/
207
214 const ModifierEvalContext *ctx,
215 Mesh *mesh,
217
222 const ModifierEvalContext *ctx,
223 Mesh *mesh,
231 const ModifierEvalContext *ctx,
232 const BMEditMesh *em,
233 Mesh *mesh,
235
236 /* Set deform matrix per vertex for crazy-space correction */
238 const ModifierEvalContext *ctx,
239 const BMEditMesh *em,
240 Mesh *mesh,
243
244 /********************* Non-deform modifier functions *********************/
245
257 Mesh *(*modify_mesh)(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh);
258
265 const ModifierEvalContext *ctx,
266 blender::bke::GeometrySet *geometry_set);
267
268 /********************* Optional functions *********************/
269
277
293
303
313 bool (*is_disabled)(const Scene *scene, ModifierData *md, bool use_render_params);
314
321
329
336
345 void (*foreach_ID_link)(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data);
346
355 void (*foreach_tex_link)(ModifierData *md, Object *ob, TexWalkFunc walk, void *user_data);
356
368 void (*free_runtime_data)(void *runtime_data);
369
371 void (*panel_register)(ARegionType *region_type);
372
380 void (*blend_write)(BlendWriter *writer, const ID *id_owner, const ModifierData *md);
381
389
394 Object *object,
395 ModifierData *md,
396 blender::FunctionRef<void(const IDCacheKey &cache_key, void **cache_p, uint flags)> fn);
397};
398
399/* Used to set 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). */
403void BKE_modifier_init();
404
406
407/* For modifier UI panels. */
408
412void BKE_modifier_type_panel_id(ModifierType type, char *r_idname);
414
415/* Modifier utility calls, do call through type pointer and return
416 * default values if pointer is optional.
417 */
419
426
428
430
434void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag);
435void BKE_modifier_copydata(const ModifierData *md, ModifierData *target);
436void BKE_modifier_copydata_ex(const ModifierData *md, ModifierData *target, int flag);
450bool BKE_modifier_is_enabled(const Scene *scene, ModifierData *md, int required_mode);
458
459/* Set modifier execution error.
460 * The message will be shown in the interface and will be logged as an error to the console. */
461void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *format, ...)
462 ATTR_PRINTF_FORMAT(3, 4);
463
464/* Set modifier execution warning, which does not prevent the modifier from being applied but which
465 * might need an attention. The message will only be shown in the interface, but will not appear in
466 * the logs. */
467void BKE_modifier_set_warning(const Object *ob, ModifierData *md, const char *format, ...)
468 ATTR_PRINTF_FORMAT(3, 4);
469
470void BKE_modifiers_foreach_ID_link(Object *ob, IDWalkFunc walk, void *user_data);
471void BKE_modifiers_foreach_tex_link(Object *ob, TexWalkFunc walk, void *user_data);
472
474ModifierData *BKE_modifiers_findby_name(const Object *ob, const char *name);
475ModifierData *BKE_modifiers_findby_persistent_uid(const Object *ob, int persistent_uid);
476
478
488
495int BKE_modifiers_get_cage_index(const Scene *scene,
496 Object *ob,
497 int *r_lastPossibleCageIndex,
498 bool is_virtual);
499
520
525
533 ModifierData *md,
534 CustomData_MeshMasks *final_datamask,
535 int required_mode);
536
543
549
554
559
563void BKE_modifier_path_init(char *path, int path_maxncpy, const char *name);
564const char *BKE_modifier_path_relbase(Main *bmain, Object *ob);
566
567/* Accessors of original/evaluated modifiers. */
568
575
576/* wrappers for modifier callbacks that ensure valid normals */
577
579
581 const ModifierEvalContext *ctx,
582 Mesh *mesh,
584
586 const ModifierEvalContext *ctx,
587 const BMEditMesh *em,
588 Mesh *mesh,
590
598
599void BKE_modifier_blend_write(BlendWriter *writer, const ID *id_owner, ListBase *modbase);
601
602namespace blender::bke {
603
609 private:
610 ModifierData &md_;
611 double start_time_;
612
613 public:
616};
617
618} // namespace blender::bke
bool BKE_modifier_depends_ontime(Scene *scene, ModifierData *md)
void BKE_modifier_panel_expand(ModifierData *md)
bool BKE_modifier_is_non_geometrical(ModifierData *md)
Object * BKE_modifiers_is_deformed_by_curve(Object *ob)
void BKE_modifier_path_init(char *path, int path_maxncpy, const char *name)
void BKE_modifiers_clear_errors(Object *ob)
void BKE_modifier_blend_write(BlendWriter *writer, const ID *id_owner, ListBase *modbase)
Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval)
bool BKE_modifier_is_enabled(const Scene *scene, ModifierData *md, int required_mode)
int BKE_modifiers_get_cage_index(const Scene *scene, Object *ob, int *r_lastPossibleCageIndex, bool is_virtual)
void BKE_modifier_copydata_ex(const ModifierData *md, ModifierData *target, int flag)
ModifierData * BKE_modifiers_findby_type(const Object *ob, ModifierType type)
bool BKE_modifiers_uses_multires(Object *ob)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
CDMaskLink * BKE_modifier_calc_data_masks(const Scene *scene, ModifierData *md, CustomData_MeshMasks *final_datamask, int required_mode)
void BKE_modifiers_persistent_uid_init(const Object &object, ModifierData &md)
Object * BKE_modifiers_is_deformed_by_lattice(Object *ob)
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
void(*)(void *user_data, Object *ob, ModifierData *md, const PointerRNA *ptr, PropertyRNA *texture_prop) TexWalkFunc
ModifierTypeFlag
@ eModifierTypeFlag_AcceptsBMesh
@ eModifierTypeFlag_Single
@ eModifierTypeFlag_UsesPointCache
@ eModifierTypeFlag_NoUserAdd
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_AcceptsGreasePencil
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsVertexCosOnly
@ eModifierTypeFlag_RequiresOriginalData
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_blend_read_data(BlendDataReader *reader, ListBase *lb, Object *ob)
const char * BKE_modifier_path_relbase_from_global(Object *ob)
bool BKE_modifiers_uses_armature(Object *ob, bArmature *arm)
void void void BKE_modifiers_foreach_ID_link(Object *ob, IDWalkFunc walk, void *user_data)
ModifierData * BKE_modifier_get_original(const Object *object, ModifierData *md)
bool BKE_modifier_supports_mapping(ModifierData *md)
ModifierData * BKE_modifiers_findby_name(const Object *ob, const char *name)
bool BKE_modifier_supports_cage(Scene *scene, ModifierData *md)
void BKE_modifier_init()
const char * BKE_modifier_path_relbase(Main *bmain, Object *ob)
void BKE_modifier_free_temporary_data(ModifierData *md)
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
ModifierData * BKE_modifier_copy_ex(const ModifierData *md, int flag)
bool BKE_modifier_is_same_topology(ModifierData *md)
void BKE_modifier_unique_name(ListBase *modifiers, ModifierData *md)
Mesh * BKE_modifier_modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
void BKE_modifier_free(ModifierData *md)
bool BKE_modifier_is_nonlocal_in_liboverride(const Object *ob, const ModifierData *md)
void BKE_modifiers_test_object(Object *ob)
void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
Object * BKE_modifiers_is_deformed_by_meshdeform(Object *ob)
void BKE_modifier_remove_from_list(Object *ob, ModifierData *md)
void BKE_modifier_mdef_compact_influences(ModifierData *md)
ModifierTypeType
bool BKE_modifiers_persistent_uids_are_valid(const Object &object)
void BKE_modifier_free_ex(ModifierData *md, int flag)
void BKE_modifier_deform_vertsEM(ModifierData *md, const ModifierEvalContext *ctx, const BMEditMesh *em, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
bool BKE_modifier_is_correctable_deformed(ModifierData *md)
ModifierData * BKE_modifier_get_evaluated(Depsgraph *depsgraph, Object *object, ModifierData *md)
ModifierData * BKE_modifiers_get_virtual_modifierlist(const Object *ob, VirtualModifierData *data)
bool BKE_modifiers_is_correctable_deformed(const Scene *scene, Object *ob)
void BKE_modifier_type_panel_id(ModifierType type, char *r_idname)
ModifierData * BKE_modifier_new(int type)
bool BKE_modifier_couldbe_cage(Scene *scene, ModifierData *md)
Object * BKE_modifiers_is_deformed_by_armature(Object *ob)
ModifierApplyFlag
@ MOD_APPLY_TO_ORIGINAL
@ MOD_APPLY_USECACHE
@ MOD_APPLY_RENDER
@ MOD_APPLY_IGNORE_SIMPLIFY
@ MOD_APPLY_ORCO
ModifierData * BKE_modifiers_findby_persistent_uid(const Object *ob, int persistent_uid)
void void BKE_modifier_set_warning(const Object *ob, ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_modifier_deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
void BKE_modifier_copydata(const ModifierData *md, ModifierData *target)
void BKE_modifiers_foreach_tex_link(Object *ob, TexWalkFunc walk, void *user_data)
#define ATTR_PRINTF_FORMAT(format_param, dots_param)
unsigned int uint
#define ENUM_OPERATORS(_type, _max)
const Depsgraph * depsgraph
format
Definition DNA_ID.h:413
ModifierApplyFlag flag
void(* copy_data)(const ModifierData *md, ModifierData *target, int flag)
bool(* depends_on_time)(Scene *scene, ModifierData *md)
void(* modify_geometry_set)(ModifierData *md, const ModifierEvalContext *ctx, blender::bke::GeometrySet *geometry_set)
void(* blend_write)(BlendWriter *writer, const ID *id_owner, const ModifierData *md)
void(* foreach_ID_link)(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
void(* required_data_mask)(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
void(* deform_verts)(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
void(* free_data)(ModifierData *md)
void(* deform_matrices_EM)(ModifierData *md, const ModifierEvalContext *ctx, const BMEditMesh *em, Mesh *mesh, blender::MutableSpan< blender::float3 > positions, blender::MutableSpan< blender::float3x3 > matrices)
void(* free_runtime_data)(void *runtime_data)
bool(* is_disabled)(const Scene *scene, ModifierData *md, bool use_render_params)
ModifierTypeFlag flags
ModifierTypeType type
void(* panel_register)(ARegionType *region_type)
void(* foreach_cache)(Object *object, ModifierData *md, blender::FunctionRef< void(const IDCacheKey &cache_key, void **cache_p, uint flags)> fn)
bool(* depends_on_normals)(ModifierData *md)
void(* deform_verts_EM)(ModifierData *md, const ModifierEvalContext *ctx, const BMEditMesh *em, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
void(* blend_read)(BlendDataReader *reader, ModifierData *md)
void(* init_data)(ModifierData *md)
void(* foreach_tex_link)(ModifierData *md, Object *ob, TexWalkFunc walk, void *user_data)
void(* update_depsgraph)(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
void(* deform_matrices)(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions, blender::MutableSpan< blender::float3x3 > matrices)
ArmatureModifierData amd
CurveModifierData cmd
LatticeModifierData lmd
ShapeKeyModifierData smd
PointerRNA * ptr
Definition wm_files.cc:4126
uint8_t flag
Definition wm_window.cc:138