Merge branch 'blender-v3.1-release'

This commit is contained in:
Sergey Sharybin 2022-02-03 10:02:36 +01:00
commit b9483ea380
12 changed files with 39 additions and 36 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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,

View File

@ -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,

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);