diff options
Diffstat (limited to 'source')
12 files changed, 39 insertions, 36 deletions
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index 14305323db9..a05ed67063a 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -466,6 +466,8 @@ void BKE_modifiers_foreach_tex_link(struct Object *ob, TexWalkFunc walk, void *u struct ModifierData *BKE_modifiers_findby_type(const struct Object *ob, ModifierType type); struct ModifierData *BKE_modifiers_findby_name(const struct Object *ob, const char *name); +struct ModifierData *BKE_modifiers_findby_session_uuid(const struct Object *ob, + const SessionUUID *session_uuid); void BKE_modifiers_clear_errors(struct Object *ob); /** * used for buttons, to find out if the 'draw deformed in edit-mode option is there. @@ -564,7 +566,8 @@ const char *BKE_modifier_path_relbase_from_global(struct Object *ob); * For a given modifier data, get corresponding original one. * If the modifier data is already original, return it as-is. */ -struct ModifierData *BKE_modifier_get_original(struct ModifierData *md); +struct ModifierData *BKE_modifier_get_original(const struct Object *object, + struct ModifierData *md); struct ModifierData *BKE_modifier_get_evaluated(struct Depsgraph *depsgraph, struct Object *object, struct ModifierData *md); diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index bdf2568287b..829ef08a8fb 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -290,6 +290,16 @@ ModifierData *BKE_modifiers_findby_name(const Object *ob, const char *name) return BLI_findstring(&(ob->modifiers), name, offsetof(ModifierData, name)); } +ModifierData *BKE_modifiers_findby_session_uuid(const Object *ob, const SessionUUID *session_uuid) +{ + LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) { + if (BLI_session_uuid_is_equal(&md->session_uuid, session_uuid)) { + return md; + } + } + return NULL; +} + void BKE_modifiers_clear_errors(Object *ob) { LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) { @@ -439,9 +449,7 @@ void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *_for #ifndef NDEBUG if ((md->mode & eModifierMode_Virtual) == 0) { /* Ensure correct object is passed in. */ - const Object *ob_orig = (Object *)DEG_get_original_id((ID *)&ob->id); - const ModifierData *md_orig = md->orig_modifier_data ? md->orig_modifier_data : md; - BLI_assert(BLI_findindex(&ob_orig->modifiers, md_orig) != -1); + BLI_assert(BKE_modifier_get_original(ob, md) != NULL); } #endif @@ -1052,12 +1060,10 @@ Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, return me; } -ModifierData *BKE_modifier_get_original(ModifierData *md) +ModifierData *BKE_modifier_get_original(const Object *object, ModifierData *md) { - if (md->orig_modifier_data == NULL) { - return md; - } - return md->orig_modifier_data; + const Object *object_orig = DEG_get_original_object((Object *)object); + return BKE_modifiers_findby_session_uuid(object_orig, &md->session_uuid); } struct ModifierData *BKE_modifier_get_evaluated(Depsgraph *depsgraph, @@ -1068,7 +1074,7 @@ struct ModifierData *BKE_modifier_get_evaluated(Depsgraph *depsgraph, if (object_eval == object) { return md; } - return BKE_modifiers_findby_name(object_eval, md->name); + return BKE_modifiers_findby_session_uuid(object_eval, &md->session_uuid); } void BKE_modifier_check_uuids_unique_and_report(const Object *object) diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc index 8a3c5c5b776..c2b85caad66 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc @@ -674,12 +674,6 @@ void update_pose_orig_pointers(const bPose *pose_orig, bPose *pose_cow) update_list_orig_pointers(&pose_orig->chanbase, &pose_cow->chanbase, &bPoseChannel::orig_pchan); } -void update_modifiers_orig_pointers(const Object *object_orig, Object *object_cow) -{ - update_list_orig_pointers( - &object_orig->modifiers, &object_cow->modifiers, &ModifierData::orig_modifier_data); -} - void update_nla_strips_orig_pointers(const ListBase *strips_orig, ListBase *strips_cow) { NlaStrip *strip_orig = reinterpret_cast<NlaStrip *>(strips_orig->first); @@ -766,7 +760,6 @@ void update_id_after_copy(const Depsgraph *depsgraph, BKE_gpencil_update_orig_pointers(object_orig, object_cow); } update_particles_after_copy(depsgraph, object_orig, object_cow); - update_modifiers_orig_pointers(object_orig, object_cow); update_proxy_pointers_after_copy(depsgraph, object_orig, object_cow); break; } diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc index 1081528ece1..17369f723ec 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_object.cc @@ -71,7 +71,6 @@ void ObjectRuntimeBackup::backup_modifier_runtime_data(Object *object) const SessionUUID &session_uuid = modifier_data->session_uuid; BLI_assert(BLI_session_uuid_is_generated(&session_uuid)); - BLI_assert(modifier_data->orig_modifier_data != nullptr); modifier_runtime_data.add(session_uuid, ModifierDataBackup(modifier_data)); modifier_data->runtime = nullptr; } @@ -150,8 +149,9 @@ void ObjectRuntimeBackup::restore_to_object(Object *object) void ObjectRuntimeBackup::restore_modifier_runtime_data(Object *object) { LISTBASE_FOREACH (ModifierData *, modifier_data, &object->modifiers) { - BLI_assert(modifier_data->orig_modifier_data != nullptr); const SessionUUID &session_uuid = modifier_data->session_uuid; + BLI_assert(BLI_session_uuid_is_generated(&session_uuid)); + optional<ModifierDataBackup> backup = modifier_runtime_data.pop_try(session_uuid); if (backup.has_value()) { modifier_data->runtime = backup->runtime; diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c index 787d7cbaab0..14f47a84286 100644 --- a/source/blender/editors/armature/meshlaplacian.c +++ b/source/blender/editors/armature/meshlaplacian.c @@ -1742,14 +1742,15 @@ static void harmonic_coordinates_bind(MeshDeformModifierData *mmd, MeshDeformBin free_bvhtree_from_mesh(&mdb->bvhdata); } -void ED_mesh_deform_bind_callback(MeshDeformModifierData *mmd, +void ED_mesh_deform_bind_callback(Object *object, + MeshDeformModifierData *mmd, Mesh *cagemesh, float *vertexcos, int totvert, float cagemat[4][4]) { MeshDeformModifierData *mmd_orig = (MeshDeformModifierData *)BKE_modifier_get_original( - &mmd->modifier); + object, &mmd->modifier); MeshDeformBind mdb; MVert *mvert; int a; diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h index afba3c7b96a..0521b39ca1a 100644 --- a/source/blender/editors/include/ED_armature.h +++ b/source/blender/editors/include/ED_armature.h @@ -369,7 +369,8 @@ void ED_pose_bone_select_tag_update(struct Object *ob); void ED_pose_bone_select(struct Object *ob, struct bPoseChannel *pchan, bool select); /* meshlaplacian.c */ -void ED_mesh_deform_bind_callback(struct MeshDeformModifierData *mmd, +void ED_mesh_deform_bind_callback(struct Object *object, + struct MeshDeformModifierData *mmd, struct Mesh *cagemesh, float *vertexcos, int totvert, diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 1d0796bda8b..8e38d52a4d7 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -128,15 +128,11 @@ typedef struct ModifierData { char *error; - /** Pointer to a #ModifierData in the original domain. */ - struct ModifierData *orig_modifier_data; - /** Runtime field which contains unique identifier of the modifier. */ SessionUUID session_uuid; /** Runtime field which contains runtime data which is specific to a modifier type. */ void *runtime; - void *_pad1; } ModifierData; typedef enum { @@ -1012,7 +1008,8 @@ typedef struct MeshDeformModifierData { float *bindcos; /* runtime */ - void (*bindfunc)(struct MeshDeformModifierData *mmd, + void (*bindfunc)(struct Object *object, + struct MeshDeformModifierData *mmd, struct Mesh *cagemesh, float *vertexcos, int totvert, diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index fbc7625d815..23ec5148f00 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -249,7 +249,8 @@ static void rna_ParticleHairKey_location_object_get(PointerRNA *ptr, float *valu * * Such trickery is needed to allow modification of hair keys in the original object using * evaluated particle and object to access proper hair matrix. */ -static int hair_key_index_get(/*const*/ HairKey *hair_key, +static int hair_key_index_get(const Object *object, + /*const*/ HairKey *hair_key, /*const*/ ParticleSystemModifierData *modifier, /*const*/ ParticleData *particle) { @@ -261,7 +262,7 @@ static int hair_key_index_get(/*const*/ HairKey *hair_key, const int particle_index = particle - particle_system->particles; const ParticleSystemModifierData *original_modifier = (ParticleSystemModifierData *) - BKE_modifier_get_original(&modifier->modifier); + BKE_modifier_get_original(object, &modifier->modifier); const ParticleSystem *original_particle_system = original_modifier->psys; const ParticleData *original_particle = &original_particle_system->particles[particle_index]; @@ -288,7 +289,7 @@ static void hair_key_location_object_set(HairKey *hair_key, NULL; if (hair_mesh != NULL) { - const int hair_key_index = hair_key_index_get(hair_key, modifier, particle); + const int hair_key_index = hair_key_index_get(object, hair_key, modifier, particle); if (hair_key_index == -1) { return; } @@ -368,7 +369,7 @@ static void rna_ParticleHairKey_co_object_set(ID *id, /* Mark particle system as edited, so then particle_system_update() does not reset the hair * keys from path. This behavior is similar to how particle edit mode sets flags. */ ParticleSystemModifierData *orig_modifier = (ParticleSystemModifierData *) - modifier->modifier.orig_modifier_data; + BKE_modifier_get_original(object, &modifier->modifier); orig_modifier->psys->flag |= PSYS_EDITED; hair_key_location_object_set(hair_key, object, modifier, particle, co); diff --git a/source/blender/modifiers/intern/MOD_correctivesmooth.c b/source/blender/modifiers/intern/MOD_correctivesmooth.c index fe331b2147f..d75c2a13587 100644 --- a/source/blender/modifiers/intern/MOD_correctivesmooth.c +++ b/source/blender/modifiers/intern/MOD_correctivesmooth.c @@ -610,7 +610,7 @@ static void correctivesmooth_modifier_do(ModifierData *md, BLI_assert(csmd->bind_coords != NULL); /* Copy bound data to the original modifier. */ CorrectiveSmoothModifierData *csmd_orig = (CorrectiveSmoothModifierData *) - BKE_modifier_get_original(&csmd->modifier); + BKE_modifier_get_original(ob, &csmd->modifier); csmd_orig->bind_coords = MEM_dupallocN(csmd->bind_coords); csmd_orig->bind_coords_num = csmd->bind_coords_num; } diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c index 3e751eeb239..5c6bcb4ba24 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.c +++ b/source/blender/modifiers/intern/MOD_meshdeform.c @@ -390,7 +390,7 @@ static void meshdeformModifier_do(ModifierData *md, } if (!recursive_bind_sentinel) { recursive_bind_sentinel = 1; - mmd->bindfunc(mmd, cagemesh, (float *)vertexCos, numVerts, cagemat); + mmd->bindfunc(ob, mmd, cagemesh, (float *)vertexCos, numVerts, cagemat); recursive_bind_sentinel = 0; } diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 1bb53b7a25e..fdf1f1a68aa 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -1148,7 +1148,8 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree, if (geo_logger.has_value()) { geo_logger->log_output_geometry(output_geometry_set); - NodesModifierData *nmd_orig = (NodesModifierData *)BKE_modifier_get_original(&nmd->modifier); + NodesModifierData *nmd_orig = (NodesModifierData *)BKE_modifier_get_original(ctx->object, + &nmd->modifier); clear_runtime_data(nmd_orig); nmd_orig->runtime_eval_log = new geo_log::ModifierLog(*geo_logger); } diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c index fd41eedba80..70a05002a4f 100644 --- a/source/blender/modifiers/intern/MOD_surfacedeform.c +++ b/source/blender/modifiers/intern/MOD_surfacedeform.c @@ -1454,7 +1454,7 @@ static void surfacedeformModifier_do(ModifierData *md, BKE_modifier_set_error(ob, md, "Attempt to bind from inactive dependency graph"); return; } - ModifierData *md_orig = BKE_modifier_get_original(md); + ModifierData *md_orig = BKE_modifier_get_original(ob, md); freeData(md_orig); } return; @@ -1478,7 +1478,7 @@ static void surfacedeformModifier_do(ModifierData *md, } SurfaceDeformModifierData *smd_orig = (SurfaceDeformModifierData *)BKE_modifier_get_original( - md); + ob, md); float tmp_mat[4][4]; invert_m4_m4(tmp_mat, ob->obmat); |