12#define DNA_DEPRECATED_ALLOW
209 if (md->
next !=
nullptr) {
212 else if (md->
prev !=
nullptr) {
222 if (modifiers && md) {
248 if (md->type == type) {
264 if (md->persistent_uid == persistent_uid) {
326 const char *md_src_data = ((
const char *)md_src) + data_size;
327 char *md_dst_data = ((
char *)md_dst) + data_size;
329 memcpy(md_dst_data, md_src_data,
size_t(mti->
struct_size) - data_size);
350 target->mode = md->
mode;
351 target->flag = md->
flag;
406 va_start(ap, _format);
407 vsnprintf(buffer,
sizeof(buffer),
format, ap);
409 buffer[
sizeof(buffer) - 1] =
'\0';
433 va_start(ap, _format);
434 vsnprintf(buffer,
sizeof(buffer),
format, ap);
436 buffer[
sizeof(buffer) - 1] =
'\0';
460 int *r_lastPossibleCageIndex,
468 if (r_lastPossibleCageIndex) {
470 *r_lastPossibleCageIndex = -1;
475 for (
int i = 0; md; i++, md = md->
next) {
477 bool supports_mapping;
490 if (r_lastPossibleCageIndex && supports_mapping) {
491 *r_lastPossibleCageIndex = i;
501 if (!supports_mapping) {
517 if ((md->
mode & required_mode) != required_mode) {
550 bool have_deform_modifier =
false;
553 for (; md; md = md->
next) {
556 curr = MEM_cnew<CDMaskLink>(__func__);
560 have_deform_modifier =
true;
568 if (!have_deform_modifier) {
575 curr->
next = dataMasks;
579 if (!have_deform_modifier) {
580 final_datamask->
vmask &= ~CD_MASK_ORCO;
589 for (curr = dataMasks, prev =
nullptr; curr; prev = curr, curr = curr->
next) {
652 Object *armature =
nullptr;
655 for (; md; md = md->
next) {
658 armature = amd->object;
666 for (; md; md = md->
next) {
669 armature = amd->object;
687 for (; md; md = md->
next) {
710 for (; md; md = md->
next) {
733 for (; md; md = md->
next) {
755 for (; md; md = md->
next) {
771 for (; md; md = md->
next) {
805 for (; md; md = md->
next) {
875 switch (mesh->runtime->wrapper_type) {
920 mesh->tag_positions_changed();
945 Mesh *mesh =
nullptr;
955 if (mesh ==
nullptr) {
971 if (object_eval ==
object) {
988 blender::StringRef(
object.
id.override_library->reference->lib->runtime.filepath_abs));
1007 int modifiers_num = 0;
1009 if (md->persistent_uid <= 0) {
1012 uids.
add(md->persistent_uid);
1015 if (uids.
size() != modifiers_num) {
1023 if (modbase ==
nullptr) {
1029 if (mti ==
nullptr) {
1135 fluid_modifier_data->
type = type;
1160 switch (old_fluidsim_settings->
type) {
1205 else if (old_modifier_data->
type == eModifierType_Smoke) {
1221 new_modifier_data->
next = old_modifier_data->
next;
1222 new_modifier_data->
prev = old_modifier_data->
prev;
1223 if (new_modifier_data->
prev !=
nullptr) {
1224 new_modifier_data->
prev->
next = new_modifier_data;
1226 if (new_modifier_data->
next !=
nullptr) {
1227 new_modifier_data->
next->
prev = new_modifier_data;
1229 if (modifiers->
first == old_modifier_data) {
1230 modifiers->
first = new_modifier_data;
1232 if (modifiers->
last == old_modifier_data) {
1233 modifiers->
last = new_modifier_data;
1239 return new_modifier_data;
1247 md->error =
nullptr;
1248 md->runtime =
nullptr;
1252 md->flag &= ~eModifierFlag_OverrideLibrary_Local;
1257 bool is_allocated =
false;
1263 RPT_(
"Possible data loss when saving this file! %s modifier is deprecated (Object: %s)"),
1267 is_allocated =
true;
1269 else if (md->type == eModifierType_Smoke) {
1273 RPT_(
"Possible data loss when saving this file! %s modifier is deprecated (Object: %s)"),
1277 is_allocated =
true;
1283 if (mti ==
nullptr) {
1322 fmd->
flow =
nullptr;
1360 "High resolution manta cache not available due to pointcache update. Please "
1361 "reset the simulation.\n");
1381 fmd->
flow->
flags &= ~FLUID_FLOW_NEEDS_UPDATE;
1384 fmd->
flow =
nullptr;
1397 fmd->
flow =
nullptr;
1415 surface->canvas = pmd->
canvas;
1416 surface->data =
nullptr;
1420 if (surface->effector_weights ==
nullptr) {
1435 if ((mti !=
nullptr) && (mti->
blend_read !=
nullptr)) {
1443using Clock = std::chrono::high_resolution_clock;
1447 return std::chrono::duration<double, std::chrono::seconds::period>(
1448 Clock::now().time_since_epoch())
1460 const double duration = end_time - start_time_;
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
const char * BKE_main_blendfile_path_from_global()
void BKE_mesh_wrapper_ensure_mdata(Mesh *mesh)
#define MODIFIER_TYPE_PANEL_PREFIX
void(*)(void *user_data, Object *ob, ModifierData *md, const PointerRNA *ptr, PropertyRNA *texture_prop) TexWalkFunc
@ eModifierTypeFlag_AcceptsBMesh
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
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)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define BLI_path_join(...)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
#define STRNCPY(dst, src)
#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)
Object * DEG_get_original_object(Object *object)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
#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_DOMAIN_TYPE_LIQUID
@ FLUID_EFFECTOR_TYPE_GUIDE
@ FLUID_EFFECTOR_TYPE_COLLISION
@ FLUID_FLOW_BEHAVIOR_OUTFLOW
@ FLUID_FLOW_BEHAVIOR_INFLOW
@ eModifierFlag_OverrideLibrary_Local
@ eModifierMode_DisableTemporary
struct ModifierData ModifierData
@ 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)
static void modifier_free_data_id_us_cb(void *, Object *, ID **idpoin, int cb_flag)
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)
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 ModifierData * modifier_replace_with_fluid(BlendDataReader *reader, Object *object, ListBase *modifiers, ModifierData *old_modifier_data)
bool BKE_modifier_supports_cage(Scene *scene, ModifierData *md)
static void modifier_copy_data_id_us_cb(void *, Object *, ID **idpoin, int cb_flag)
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
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_deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
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)
ScopedModifierTimer(ModifierData &md)
const Depsgraph * depsgraph
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
static double get_current_time_in_seconds()
std::chrono::high_resolution_clock Clock
uint64_t get_default_hash(const T &v)
unsigned __int64 uint64_t
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
struct GPUTexture * tex_density
struct GPUTexture * tex_velocity_x
struct GPUTexture * tex_color
struct GPUTexture * tex_wt
struct GPUTexture * tex_velocity_y
struct GPUTexture * tex_field
struct GPUTexture * tex_velocity_z
struct PointCache * point_cache[2]
struct GPUTexture * tex_shadow
struct GPUTexture * tex_coba
struct GPUTexture * tex_flame
struct EffectorWeights * effector_weights
struct GPUTexture * tex_flame_coba
struct FluidModifierData * fmd
struct FluidModifierData * fmd
struct ParticleSystem * psys
struct FluidDomainSettings * domain
struct FluidEffectorSettings * effector
struct FluidFlowSettings * flow
struct FluidsimSettings * fss
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(* 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)