12#define DNA_DEPRECATED_ALLOW
210 if (md->
next !=
nullptr) {
213 else if (md->
prev !=
nullptr) {
223 if (modifiers && md) {
249 if (md->type == type) {
265 if (md->persistent_uid == persistent_uid) {
327 const char *md_src_data = ((
const char *)md_src) + data_size;
328 char *md_dst_data = ((
char *)md_dst) + data_size;
330 memcpy(md_dst_data, md_src_data,
size_t(mti->
struct_size) - data_size);
407 va_start(ap, _format);
408 vsnprintf(buffer,
sizeof(buffer),
format, ap);
410 buffer[
sizeof(buffer) - 1] =
'\0';
434 va_start(ap, _format);
435 vsnprintf(buffer,
sizeof(buffer),
format, ap);
437 buffer[
sizeof(buffer) - 1] =
'\0';
461 int *r_lastPossibleCageIndex,
469 if (r_lastPossibleCageIndex) {
471 *r_lastPossibleCageIndex = -1;
476 for (
int i = 0; md;
i++, md = md->
next) {
478 bool supports_mapping;
491 if (r_lastPossibleCageIndex && supports_mapping) {
492 *r_lastPossibleCageIndex =
i;
502 if (!supports_mapping) {
518 if ((md->
mode & required_mode) != required_mode) {
551 bool have_deform_modifier =
false;
554 for (; md; md = md->
next) {
561 have_deform_modifier =
true;
569 if (!have_deform_modifier) {
576 curr->
next = dataMasks;
580 if (!have_deform_modifier) {
590 for (curr = dataMasks, prev =
nullptr; curr; prev = curr, curr = curr->
next) {
653 Object *armature =
nullptr;
656 for (; md; md = md->
next) {
659 armature = amd->object;
667 for (; md; md = md->
next) {
670 armature = amd->object;
688 for (; md; md = md->
next) {
711 for (; md; md = md->
next) {
734 for (; md; md = md->
next) {
756 for (; md; md = md->
next) {
772 for (; md; md = md->
next) {
806 for (; md; md = md->
next) {
876 switch (mesh->
runtime->wrapper_type) {
924 mesh->tag_positions_changed();
939 mesh_to_deform->vert_positions_for_write().copy_from(positions);
940 mesh_to_deform->tag_positions_changed();
951 positions.
copy_from(deformed_mesh->vert_positions());
953 mesh->tag_positions_changed();
991 if (
mesh !=
nullptr) {
996 if (
mesh ==
nullptr) {
1012 if (object_eval ==
object) {
1029 blender::StringRef(
object.
id.override_library->reference->lib->runtime->filepath_abs));
1048 int modifiers_num = 0;
1050 if (md->persistent_uid <= 0) {
1053 uids.
add(md->persistent_uid);
1056 if (uids.
size() != modifiers_num) {
1064 if (modbase ==
nullptr) {
1070 if (mti ==
nullptr) {
1176 fluid_modifier_data->
type = type;
1201 switch (old_fluidsim_settings->
type) {
1246 else if (old_modifier_data->
type == eModifierType_Smoke) {
1262 new_modifier_data->
next = old_modifier_data->
next;
1263 new_modifier_data->
prev = old_modifier_data->
prev;
1264 if (new_modifier_data->
prev !=
nullptr) {
1265 new_modifier_data->
prev->
next = new_modifier_data;
1267 if (new_modifier_data->
next !=
nullptr) {
1268 new_modifier_data->
next->
prev = new_modifier_data;
1270 if (modifiers->
first == old_modifier_data) {
1271 modifiers->
first = new_modifier_data;
1273 if (modifiers->
last == old_modifier_data) {
1274 modifiers->
last = new_modifier_data;
1280 return new_modifier_data;
1288 md->error =
nullptr;
1289 md->runtime =
nullptr;
1298 bool is_allocated =
false;
1304 RPT_(
"Possible data loss when saving this file! %s modifier is deprecated (Object: %s)"),
1308 is_allocated =
true;
1310 else if (md->type == eModifierType_Smoke) {
1314 RPT_(
"Possible data loss when saving this file! %s modifier is deprecated (Object: %s)"),
1318 is_allocated =
true;
1324 if (mti ==
nullptr) {
1363 fmd->
flow =
nullptr;
1401 "High resolution manta cache not available due to pointcache update. Please "
1402 "reset the simulation.\n");
1425 fmd->
flow =
nullptr;
1438 fmd->
flow =
nullptr;
1456 surface->canvas = pmd->
canvas;
1457 surface->data =
nullptr;
1461 if (surface->effector_weights ==
nullptr) {
1476 if ((mti !=
nullptr) && (mti->
blend_read !=
nullptr)) {
1484using Clock = std::chrono::high_resolution_clock;
1488 return std::chrono::duration<double, std::chrono::seconds::period>(
1489 Clock::now().time_since_epoch())
1501 const double duration = end_time - start_time_;
1502 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
char * STRNCPY(char(&dst)[N], const char *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)
T * DEG_get_original(T *id)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ FLUID_FLOW_BEHAVIOR_OUTFLOW
@ FLUID_FLOW_BEHAVIOR_INFLOW
@ FLUID_FLOW_NEEDS_UPDATE
@ FLUID_DOMAIN_TYPE_LIQUID
@ FLUID_EFFECTOR_NEEDS_UPDATE
@ 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)
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
#define ID_IS_LINKED(_id)
#define ID_BLEND_PATH(_bmain, _id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
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
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
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)