forked from bartvdbraak/blender
Modifier: Maintain per-modifier session UUID
Allows to keep track of modifiers, which is required, for example, for runtime data preservation in depsgraph.
This commit is contained in:
parent
ca2c4907fb
commit
6f99dfc0c6
@ -413,9 +413,13 @@ void BKE_modifier_type_panel_id(ModifierType type, char *r_idname);
|
||||
* default values if pointer is optional.
|
||||
*/
|
||||
struct ModifierData *BKE_modifier_new(int type);
|
||||
|
||||
void BKE_modifier_free_ex(struct ModifierData *md, const int flag);
|
||||
void BKE_modifier_free(struct ModifierData *md);
|
||||
|
||||
/* Generate new UUID for the given modifier. */
|
||||
void BKE_modifier_session_uuid_generate(struct ModifierData *md);
|
||||
|
||||
bool BKE_modifier_unique_name(struct ListBase *modifiers, struct ModifierData *md);
|
||||
|
||||
void BKE_modifier_copydata_generic(const struct ModifierData *md,
|
||||
@ -539,6 +543,8 @@ void BKE_modifier_deform_vertsEM(ModifierData *md,
|
||||
struct Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(struct Object *ob_eval,
|
||||
const bool get_cage_mesh);
|
||||
|
||||
void BKE_modifier_check_uuids_unique_and_report(const struct Object *object);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -409,6 +409,8 @@ struct Mesh *BKE_object_to_mesh(struct Depsgraph *depsgraph,
|
||||
|
||||
void BKE_object_to_mesh_clear(struct Object *object);
|
||||
|
||||
void BKE_object_check_uuids_unique_and_report(const struct Object *object);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "BLI_linklist.h"
|
||||
#include "BLI_listbase.h"
|
||||
#include "BLI_path_util.h"
|
||||
#include "BLI_session_uuid.h"
|
||||
#include "BLI_string.h"
|
||||
#include "BLI_string_utils.h"
|
||||
#include "BLI_utildefines.h"
|
||||
@ -150,6 +151,8 @@ ModifierData *BKE_modifier_new(int type)
|
||||
mti->initData(md);
|
||||
}
|
||||
|
||||
BKE_modifier_session_uuid_generate(md);
|
||||
|
||||
return md;
|
||||
}
|
||||
|
||||
@ -192,6 +195,11 @@ void BKE_modifier_free(ModifierData *md)
|
||||
BKE_modifier_free_ex(md, 0);
|
||||
}
|
||||
|
||||
void BKE_modifier_session_uuid_generate(ModifierData *md)
|
||||
{
|
||||
md->session_uuid = BLI_session_uuid_generate();
|
||||
}
|
||||
|
||||
bool BKE_modifier_unique_name(ListBase *modifiers, ModifierData *md)
|
||||
{
|
||||
if (modifiers && md) {
|
||||
@ -368,6 +376,17 @@ void BKE_modifier_copydata_ex(ModifierData *md, ModifierData *target, const int
|
||||
mti->foreachObjectLink(target, NULL, (ObjectWalkFunc)modifier_copy_data_id_us_cb, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (flag & LIB_ID_CREATE_NO_MAIN) {
|
||||
/* Make sure UUID is the same between the source and the target.
|
||||
* This is needed in the cases when UUID is to be preserved and when there is no copyData
|
||||
* callback, or the copyData does not do full byte copy of the modifier data. */
|
||||
target->session_uuid = md->session_uuid;
|
||||
}
|
||||
else {
|
||||
/* In the case copyData made full byte copy force UUID to be re-generated. */
|
||||
BKE_modifier_session_uuid_generate(md);
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_modifier_copydata(ModifierData *md, ModifierData *target)
|
||||
@ -1071,3 +1090,26 @@ struct ModifierData *BKE_modifier_get_evaluated(Depsgraph *depsgraph,
|
||||
}
|
||||
return BKE_modifiers_findby_name(object_eval, md->name);
|
||||
}
|
||||
|
||||
void BKE_modifier_check_uuids_unique_and_report(const Object *object)
|
||||
{
|
||||
struct GSet *used_uuids = BLI_gset_new(
|
||||
BLI_session_uuid_ghash_hash, BLI_session_uuid_ghash_compare, "modifier used uuids");
|
||||
|
||||
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
|
||||
const SessionUUID *session_uuid = &md->session_uuid;
|
||||
if (!BLI_session_uuid_is_generated(session_uuid)) {
|
||||
printf("Modifier %s -> %s does not have UUID generated.\n", object->id.name + 2, md->name);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (BLI_gset_lookup(used_uuids, session_uuid) != NULL) {
|
||||
printf("Modifier %s -> %s has duplicate UUID generated.\n", object->id.name + 2, md->name);
|
||||
continue;
|
||||
}
|
||||
|
||||
BLI_gset_insert(used_uuids, (void *)session_uuid);
|
||||
}
|
||||
|
||||
BLI_gset_free(used_uuids, NULL);
|
||||
}
|
||||
|
@ -4714,3 +4714,9 @@ void BKE_object_to_mesh_clear(Object *object)
|
||||
BKE_id_free(NULL, object->runtime.object_as_temp_mesh);
|
||||
object->runtime.object_as_temp_mesh = NULL;
|
||||
}
|
||||
|
||||
void BKE_object_check_uuids_unique_and_report(const Object *object)
|
||||
{
|
||||
BKE_pose_check_uuids_unique_and_report(object->pose);
|
||||
BKE_modifier_check_uuids_unique_and_report(object);
|
||||
}
|
||||
|
@ -5296,6 +5296,8 @@ static void direct_link_modifiers(BlendDataReader *reader, ListBase *lb, Object
|
||||
BLO_read_list(reader, lb);
|
||||
|
||||
for (md = lb->first; md; md = md->next) {
|
||||
BKE_modifier_session_uuid_generate(md);
|
||||
|
||||
md->error = NULL;
|
||||
md->runtime = NULL;
|
||||
|
||||
|
@ -292,7 +292,7 @@ bool id_copy_inplace_no_main(const ID *id, ID *newid)
|
||||
const ID_Type id_type = GS(id_for_copy->name);
|
||||
if (id_type == ID_OB) {
|
||||
const Object *object = reinterpret_cast<const Object *>(id_for_copy);
|
||||
BKE_pose_check_uuids_unique_and_report(object->pose);
|
||||
BKE_object_check_uuids_unique_and_report(object);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
#include "DNA_defs.h"
|
||||
#include "DNA_listBase.h"
|
||||
#include "DNA_session_uuid_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -124,6 +125,11 @@ typedef struct ModifierData {
|
||||
|
||||
/* 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;
|
||||
} ModifierData;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user