12#define DNA_DEPRECATED_ALLOW
212 if (md->
next !=
nullptr) {
215 else if (md->
prev !=
nullptr) {
225 if (modifiers && md) {
251 if (md->type == type) {
267 if (md->persistent_uid == persistent_uid) {
329 const char *md_src_data = ((
const char *)md_src) + data_size;
330 char *md_dst_data = ((
char *)md_dst) + data_size;
332 memcpy(md_dst_data, md_src_data,
size_t(mti->
struct_size) - data_size);
409 va_start(ap, _format);
410 vsnprintf(buffer,
sizeof(buffer),
format, ap);
412 buffer[
sizeof(buffer) - 1] =
'\0';
436 va_start(ap, _format);
437 vsnprintf(buffer,
sizeof(buffer),
format, ap);
439 buffer[
sizeof(buffer) - 1] =
'\0';
463 int *r_lastPossibleCageIndex,
471 if (r_lastPossibleCageIndex) {
473 *r_lastPossibleCageIndex = -1;
478 for (
int i = 0; md;
i++, md = md->
next) {
480 bool supports_mapping;
493 if (r_lastPossibleCageIndex && supports_mapping) {
494 *r_lastPossibleCageIndex =
i;
504 if (!supports_mapping) {
520 if ((md->
mode & required_mode) != required_mode) {
553 bool have_deform_modifier =
false;
556 for (; md; md = md->
next) {
563 have_deform_modifier =
true;
571 if (!have_deform_modifier) {
578 curr->
next = dataMasks;
582 if (!have_deform_modifier) {
592 for (curr = dataMasks, prev =
nullptr; curr; prev = curr, curr = curr->
next) {
655 Object *armature =
nullptr;
658 for (; md; md = md->
next) {
661 armature = amd->object;
669 for (; md; md = md->
next) {
672 armature = amd->object;
690 for (; md; md = md->
next) {
713 for (; md; md = md->
next) {
736 for (; md; md = md->
next) {
758 for (; md; md = md->
next) {
774 for (; md; md = md->
next) {
808 for (; md; md = md->
next) {
878 switch (mesh->
runtime->wrapper_type) {
926 mesh->tag_positions_changed();
941 mesh_to_deform->vert_positions_for_write().copy_from(positions);
942 mesh_to_deform->tag_positions_changed();
953 positions.
copy_from(deformed_mesh->vert_positions());
955 mesh->tag_positions_changed();
993 if (
mesh !=
nullptr) {
998 if (
mesh ==
nullptr) {
1014 if (object_eval ==
object) {
1031 blender::StringRef(
object.
id.override_library->reference->lib->runtime->filepath_abs));
1050 int modifiers_num = 0;
1052 if (md->persistent_uid <= 0) {
1055 uids.
add(md->persistent_uid);
1058 if (uids.
size() != modifiers_num) {
1066 if (modbase ==
nullptr) {
1072 if (mti ==
nullptr) {
1178 fluid_modifier_data->
type = type;
1203 switch (old_fluidsim_settings->
type) {
1248 else if (old_modifier_data->
type == eModifierType_Smoke) {
1264 new_modifier_data->
next = old_modifier_data->
next;
1265 new_modifier_data->
prev = old_modifier_data->
prev;
1266 if (new_modifier_data->
prev !=
nullptr) {
1267 new_modifier_data->
prev->
next = new_modifier_data;
1269 if (new_modifier_data->
next !=
nullptr) {
1270 new_modifier_data->
next->
prev = new_modifier_data;
1272 if (modifiers->
first == old_modifier_data) {
1273 modifiers->
first = new_modifier_data;
1275 if (modifiers->
last == old_modifier_data) {
1276 modifiers->
last = new_modifier_data;
1282 return new_modifier_data;
1290 md->error =
nullptr;
1291 md->runtime =
nullptr;
1300 bool is_allocated =
false;
1306 RPT_(
"Possible data loss when saving this file! %s modifier is deprecated (Object: %s)"),
1310 is_allocated =
true;
1312 else if (md->type == eModifierType_Smoke) {
1316 RPT_(
"Possible data loss when saving this file! %s modifier is deprecated (Object: %s)"),
1320 is_allocated =
true;
1326 if (mti ==
nullptr) {
1365 fmd->
flow =
nullptr;
1403 "High resolution manta cache not available due to pointcache update. Please "
1404 "reset the simulation.\n");
1427 fmd->
flow =
nullptr;
1440 fmd->
flow =
nullptr;
1458 surface->canvas = pmd->
canvas;
1459 surface->data =
nullptr;
1463 if (surface->effector_weights ==
nullptr) {
1478 if ((mti !=
nullptr) && (mti->
blend_read !=
nullptr)) {
1486using Clock = std::chrono::high_resolution_clock;
1490 return std::chrono::duration<double, std::chrono::seconds::period>(
1491 Clock::now().time_since_epoch())
1503 const double duration = end_time - start_time_;
1504 md_.execution_time = duration;
void CustomData_MeshMasks_update(CustomData_MeshMasks *mask_dst, const CustomData_MeshMasks *mask_src)
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
blender::Span< blender::float3 > BKE_editmesh_cache_ensure_vert_normals(BMEditMesh &em, blender::bke::EditMeshData &emd)
struct EffectorWeights * BKE_effector_add_weights(struct Collection *collection)
void BKE_fluid_flow_behavior_set(struct Object *object, struct FluidFlowSettings *settings, int behavior)
void BKE_fluid_effector_type_set(struct Object *object, struct FluidEffectorSettings *settings, int type)
void BKE_fluid_domain_type_set(struct Object *object, struct FluidDomainSettings *settings, int type)
void BKE_fluid_modifier_create_type_data(struct FluidModifierData *fmd)
void BKE_fluid_flow_type_set(struct Object *object, struct FluidFlowSettings *settings, int type)
void BKE_fluid_modifier_free(struct FluidModifierData *fmd)
Key * BKE_key_from_object(Object *ob)
@ LIB_ID_CREATE_NO_USER_REFCOUNT
LibraryForeachIDCallbackFlag
const char * BKE_main_blendfile_path_from_global()
Mesh * BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num)
void BKE_mesh_wrapper_ensure_mdata(Mesh *mesh)
Mesh * BKE_mesh_wrapper_ensure_subdivision(Mesh *mesh)
#define MODIFIER_TYPE_PANEL_PREFIX
void(*)(void *user_data, Object *ob, ID **idpoin, LibraryForeachIDCallbackFlag cb_flag) IDWalkFunc
@ eModifierTypeFlag_AcceptsBMesh
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
bool BKE_modifier_supports_mapping(ModifierData *md)
void(*)(void *user_data, Object *ob, ModifierData *md, const PointerRNA *ptr, PropertyRNA *texture_prop) TexWalkFunc
void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *ob)
General operations, lookup, etc. for blender objects.
void BKE_object_modifier_set_active(Object *ob, ModifierData *md)
Mesh * BKE_object_get_evaluated_mesh(const Object *object_eval)
const Mesh * BKE_object_get_editmesh_eval_final(const Object *object)
struct PointCache * BKE_ptcache_add(struct ListBase *ptcaches)
void BKE_ptcache_blend_read_data(struct BlendDataReader *reader, struct ListBase *ptcaches, struct PointCache **ocache, int force_disk)
void BKE_ptcache_free_list(struct ListBase *ptcaches)
void BKE_ptcache_blend_write(struct BlendWriter *writer, struct ListBase *ptcaches)
#define BLI_assert_unreachable()
void BLI_linklist_reverse(LinkNode **listp) ATTR_NONNULL(1)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define BLI_path_join(...)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
#define STRNCPY_UTF8(dst, src)
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
#define BLI_string_join(...)
ThreadRWMutex * BLI_rw_mutex_alloc(void)
#define UNUSED_VARS_NDEBUG(...)
void * BLO_read_get_new_data_address_no_us(BlendDataReader *reader, const void *old_address, size_t expected_size)
BlendFileReadReport * BLO_read_data_reports(BlendDataReader *reader)
void BLO_write_struct_by_name(BlendWriter *writer, const char *struct_name, const void *data_ptr)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_read_struct_list(reader, struct_name, list)
#define BLO_read_struct(reader, struct_name, ptr_p)
void BLO_reportf_wrap(BlendFileReadReport *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
#define CLOG_WARN(clg_ref,...)
bool DEG_object_geometry_is_evaluated(const Object &object)
T * DEG_get_original(T *id)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
#define ID_IS_LINKED(_id)
#define ID_BLEND_PATH(_bmain, _id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
@ FLUID_FLOW_NEEDS_UPDATE
@ FLUID_DOMAIN_TYPE_LIQUID
@ FLUID_EFFECTOR_NEEDS_UPDATE
@ FLUID_FLOW_BEHAVIOR_OUTFLOW
@ FLUID_FLOW_BEHAVIOR_INFLOW
@ FLUID_EFFECTOR_TYPE_GUIDE
@ FLUID_EFFECTOR_TYPE_COLLISION
@ eModifierFlag_OverrideLibrary_Local
@ eModifierMode_DisableTemporary
@ eModifierType_MeshDeform
@ eModifierType_GreasePencilArmature
@ eModifierType_Collision
@ eModifierType_DynamicPaint
Object is a sort of wrapper for general info.
#define BASE_SELECTED(v3d, base)
@ UI_PANEL_DATA_EXPAND_ROOT
Read Guarded memory(de)allocation.
void modifier_type_init(ModifierTypeInfo *types[])
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)
static void modifier_ensure_type(FluidModifierData *fluid_modifier_data, int type)
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)
void BKE_modifiers_foreach_ID_link(Object *ob, IDWalkFunc walk, void *user_data)
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)
ModifierData * BKE_modifiers_findby_type(const Object *ob, ModifierType type)
void BKE_modifier_copydata_ex(const ModifierData *md, ModifierData *target, const int flag)
void BKE_modifier_copydata_generic(const ModifierData *md_src, ModifierData *md_dst, const int)
bool BKE_modifiers_uses_multires(Object *ob)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
static ModifierTypeInfo * modifier_types[NUM_MODIFIER_TYPES]
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)
static void modifier_copy_data_id_us_cb(void *, Object *, ID **idpoin, const LibraryForeachIDCallbackFlag cb_flag)
void BKE_modifier_blend_read_data(BlendDataReader *reader, ListBase *lb, Object *ob)
void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *_format,...)
const char * BKE_modifier_path_relbase_from_global(Object *ob)
bool BKE_modifiers_uses_armature(Object *ob, bArmature *arm)
ModifierData * BKE_modifiers_get_virtual_modifierlist(const Object *ob, VirtualModifierData *virtual_modifier_data)
ModifierData * BKE_modifier_get_original(const Object *object, ModifierData *md)
bool BKE_modifier_supports_mapping(ModifierData *md)
static ModifierData * modifier_allocate_and_init(ModifierType type)
ModifierData * BKE_modifiers_findby_name(const Object *ob, const char *name)
static void modifier_free_data_id_us_cb(void *, Object *, ID **idpoin, const LibraryForeachIDCallbackFlag cb_flag)
static ModifierData * modifier_replace_with_fluid(BlendDataReader *reader, Object *object, ListBase *modifiers, ModifierData *old_modifier_data)
bool BKE_modifier_supports_cage(Scene *scene, ModifierData *md)
const char * BKE_modifier_path_relbase(Main *bmain, Object *ob)
void BKE_modifier_free_temporary_data(ModifierData *md)
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)
Object * BKE_modifiers_is_deformed_by_meshdeform(Object *ob)
void BKE_modifier_remove_from_list(Object *ob, ModifierData *md)
bool BKE_modifiers_persistent_uids_are_valid(const Object &object)
static VirtualModifierData virtualModifierCommonData
bool BKE_modifier_deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
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)
void BKE_modifier_free_ex(ModifierData *md, const int flag)
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)
void BKE_modifier_set_warning(const Object *ob, ModifierData *md, const char *_format,...)
void BKE_modifier_copydata(const ModifierData *md, ModifierData *target)
ModifierData * BKE_modifiers_findby_persistent_uid(const Object *ob, const int persistent_uid)
static void ensure_non_lazy_normals(Mesh *mesh)
void BKE_modifiers_foreach_tex_link(Object *ob, TexWalkFunc walk, void *user_data)
void BM_mesh_normals_update(BMesh *bm)
BPy_StructRNA * depsgraph
unsigned long long int uint64_t
constexpr int64_t size() const
constexpr void copy_from(Span< T > values) const
bool same_topology_as(const Mesh &mesh) const
ScopedModifierTimer(ModifierData &md)
static void modifier_free_data_id_us_cb(void *, Object *, ID **idpoin, const LibraryForeachIDCallbackFlag cb_flag)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
static double get_current_time_in_seconds()
std::chrono::high_resolution_clock Clock
uint64_t get_default_hash(const T &v, const Args &...args)
float(* vert_coords_prev)[3]
CustomData_MeshMasks mask
struct ClothSolverResult * solver_result
struct ClothHairData * hairdata
struct Cloth * clothObject
struct PointCache * point_cache
struct ClothSimSettings * sim_parms
struct ClothCollSettings * coll_parms
struct EffectorWeights * effector_weights
struct ColorBand * vel_ramp
struct DynamicPaintModifierData * pmd
struct ParticleSystem * psys
struct ColorBand * paint_ramp
struct DynamicPaintModifierData * pmd
struct DynamicPaintCanvasSettings * canvas
struct DynamicPaintBrushSettings * brush
struct ListBase ptcaches[2]
struct FluidModifierData * fmd
GPUTexture * tex_velocity_z
GPUTexture * tex_velocity_y
struct PointCache * point_cache[2]
GPUTexture * tex_flame_coba
GPUTexture * tex_velocity_x
struct EffectorWeights * effector_weights
struct FluidModifierData * fmd
struct FluidModifierData * fmd
struct ParticleSystem * psys
struct FluidDomainSettings * domain
struct FluidEffectorSettings * effector
struct FluidFlowSettings * flow
struct FluidsimSettings * fss
static GeometrySet from_mesh(Mesh *mesh, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
MeshRuntimeHandle * runtime
struct ModifierData * next
struct ModifierData * prev
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)
bool(* is_disabled)(const Scene *scene, ModifierData *md, bool use_render_params)
bool(* depends_on_normals)(ModifierData *md)
Mesh *(* modify_mesh)(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
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)
char idname[BKE_ST_MAXNAME]
Array< float3 > vert_positions
void * BKE_tempdir_session
static DynamicLibrary lib
#define writestruct(wd, filecode, struct_id, nr, adr)