LibOverride: Add an 'post apply' callback to IDTypeInfo.
Currently this is needed to properly tag PointCache's for info update (fixes an issue reported in T82503). Suspect we may need this in more cases in the future though, RNA assign/update processes are not always 100% enough to deal with complicated corner cases.
This commit is contained in:
parent
7e32bb8492
commit
be7106a974
|
@ -106,6 +106,8 @@ typedef void (*IDTypeBlendReadUndoPreserve)(struct BlendLibReader *reader,
|
|||
struct ID *id_new,
|
||||
struct ID *id_old);
|
||||
|
||||
typedef void (*IDTypeLibOverrideApplyPost)(struct ID *id_dst, struct ID *id_src);
|
||||
|
||||
typedef struct IDTypeInfo {
|
||||
/* ********** General IDType data. ********** */
|
||||
|
||||
|
@ -207,6 +209,13 @@ typedef struct IDTypeInfo {
|
|||
* \note Called from #setup_app_data when undoing or redoing a memfile step.
|
||||
*/
|
||||
IDTypeBlendReadUndoPreserve blend_read_undo_preserve;
|
||||
|
||||
/**
|
||||
* Called after library override operations have been applied.
|
||||
*
|
||||
* \note Currently needed for some update operation on point caches.
|
||||
*/
|
||||
IDTypeLibOverrideApplyPost lib_override_apply_post;
|
||||
} IDTypeInfo;
|
||||
|
||||
/* ********** Declaration of each IDTypeInfo. ********** */
|
||||
|
|
|
@ -298,6 +298,8 @@ IDTypeInfo IDType_ID_AC = {
|
|||
.blend_read_expand = action_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/* ***************** Library data level operations on action ************** */
|
||||
|
|
|
@ -331,6 +331,8 @@ IDTypeInfo IDType_ID_AR = {
|
|||
.blend_read_expand = armature_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -410,6 +410,8 @@ IDTypeInfo IDType_ID_BR = {
|
|||
.blend_read_expand = brush_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = brush_undo_preserve,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
static RNG *brush_rng;
|
||||
|
|
|
@ -142,6 +142,8 @@ IDTypeInfo IDType_ID_CF = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/* TODO: make this per cache file to avoid global locks. */
|
||||
|
|
|
@ -203,6 +203,8 @@ IDTypeInfo IDType_ID_CA = {
|
|||
.blend_read_expand = camera_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -362,6 +362,8 @@ IDTypeInfo IDType_ID_GR = {
|
|||
.blend_read_expand = collection_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -327,6 +327,8 @@ IDTypeInfo IDType_ID_CU = {
|
|||
.blend_read_expand = curve_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
static int cu_isectLL(const float v1[3],
|
||||
|
|
|
@ -176,6 +176,8 @@ IDTypeInfo IDType_ID_VF = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/***************************** VFont *******************************/
|
||||
|
|
|
@ -329,6 +329,8 @@ IDTypeInfo IDType_ID_GD = {
|
|||
.blend_read_expand = greasepencil_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/* ************************************************** */
|
||||
|
|
|
@ -197,6 +197,8 @@ IDTypeInfo IDType_ID_HA = {
|
|||
.blend_read_expand = hair_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
static void hair_random(Hair *hair)
|
||||
|
|
|
@ -338,6 +338,8 @@ IDTypeInfo IDType_ID_IM = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/* prototypes */
|
||||
|
|
|
@ -200,6 +200,8 @@ IDTypeInfo IDType_ID_IP = {
|
|||
.blend_read_expand = ipo_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/* *************************************************** */
|
||||
|
|
|
@ -223,6 +223,8 @@ IDTypeInfo IDType_ID_KE = {
|
|||
.blend_read_expand = shapekey_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
#define KEY_MODE_DUMMY 0 /* use where mode isn't checked for */
|
||||
|
|
|
@ -205,6 +205,8 @@ IDTypeInfo IDType_ID_LT = {
|
|||
.blend_read_expand = lattice_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
int BKE_lattice_index_from_uvw(Lattice *lt, const int u, const int v, const int w)
|
||||
|
|
|
@ -112,6 +112,8 @@ IDTypeInfo IDType_ID_LINK_PLACEHOLDER = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/* GS reads the memory pointed at in a specific ordering.
|
||||
|
|
|
@ -84,6 +84,8 @@ IDTypeInfo IDType_ID_LI = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
void BKE_library_filepath_set(Main *bmain, Library *lib, const char *filepath)
|
||||
|
|
|
@ -209,6 +209,8 @@ IDTypeInfo IDType_ID_LA = {
|
|||
.blend_read_expand = light_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
Light *BKE_light_add(Main *bmain, const char *name)
|
||||
|
|
|
@ -107,6 +107,8 @@ IDTypeInfo IDType_ID_LP = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
void BKE_lightprobe_type_set(LightProbe *probe, const short lightprobe_type)
|
||||
|
|
|
@ -767,6 +767,8 @@ IDTypeInfo IDType_ID_LS = {
|
|||
.blend_read_expand = linestyle_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
static const char *modifier_name[LS_MODIFIER_NUM] = {
|
||||
|
|
|
@ -270,6 +270,8 @@ IDTypeInfo IDType_ID_MSK = {
|
|||
.blend_read_expand = mask_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
static struct {
|
||||
|
|
|
@ -274,6 +274,8 @@ IDTypeInfo IDType_ID_MA = {
|
|||
.blend_read_expand = material_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
void BKE_gpencil_material_attr_init(Material *ma)
|
||||
|
|
|
@ -204,6 +204,8 @@ IDTypeInfo IDType_ID_MB = {
|
|||
.blend_read_expand = metaball_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/* Functions */
|
||||
|
|
|
@ -364,6 +364,8 @@ IDTypeInfo IDType_ID_ME = {
|
|||
.blend_read_expand = mesh_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
|
@ -362,6 +362,8 @@ IDTypeInfo IDType_ID_MC = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/*********************** movieclip buffer loaders *************************/
|
||||
|
|
|
@ -888,6 +888,8 @@ IDTypeInfo IDType_ID_NT = {
|
|||
.blend_read_expand = ntree_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
static void node_add_sockets_from_type(bNodeTree *ntree, bNode *node, bNodeType *ntype)
|
||||
|
|
|
@ -1118,6 +1118,20 @@ static void object_blend_read_expand(BlendExpander *expander, ID *id)
|
|||
}
|
||||
}
|
||||
|
||||
static void object_lib_override_apply_post(ID *id_dst, ID *UNUSED(id_src))
|
||||
{
|
||||
Object *object = (Object *)id_dst;
|
||||
|
||||
ListBase pidlist;
|
||||
BKE_ptcache_ids_from_object(&pidlist, object, NULL, 0);
|
||||
LISTBASE_FOREACH (PTCacheID *, pid, &pidlist) {
|
||||
LISTBASE_FOREACH (PointCache *, point_cache, pid->ptcaches) {
|
||||
point_cache->flag |= PTCACHE_FLAG_INFO_DIRTY;
|
||||
}
|
||||
}
|
||||
BLI_freelistN(&pidlist);
|
||||
}
|
||||
|
||||
IDTypeInfo IDType_ID_OB = {
|
||||
.id_code = ID_OB,
|
||||
.id_filter = FILTER_ID_OB,
|
||||
|
@ -1141,6 +1155,8 @@ IDTypeInfo IDType_ID_OB = {
|
|||
.blend_read_expand = object_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = object_lib_override_apply_post,
|
||||
};
|
||||
|
||||
void BKE_object_workob_clear(Object *workob)
|
||||
|
|
|
@ -158,6 +158,8 @@ IDTypeInfo IDType_ID_PAL = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = palette_undo_preserve,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
static void paint_curve_copy_data(Main *UNUSED(bmain),
|
||||
|
@ -221,6 +223,8 @@ IDTypeInfo IDType_ID_PC = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
const char PAINT_CURSOR_SCULPT[3] = {255, 100, 100};
|
||||
|
|
|
@ -511,6 +511,8 @@ IDTypeInfo IDType_ID_PA = {
|
|||
.blend_read_expand = particle_settings_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
unsigned int PSYS_FRAND_SEED_OFFSET[PSYS_FRAND_COUNT];
|
||||
|
|
|
@ -190,6 +190,8 @@ IDTypeInfo IDType_ID_PT = {
|
|||
/* blend_read_expand */ pointcloud_blend_read_expand,
|
||||
|
||||
/* blend_read_undo_preserve */ nullptr,
|
||||
|
||||
/* lib_override_apply_post */ nullptr,
|
||||
};
|
||||
|
||||
static void pointcloud_random(PointCloud *pointcloud)
|
||||
|
|
|
@ -1687,6 +1687,19 @@ static void scene_undo_preserve(BlendLibReader *reader, ID *id_new, ID *id_old)
|
|||
}
|
||||
}
|
||||
|
||||
static void scene_lib_override_apply_post(ID *id_dst, ID *UNUSED(id_src))
|
||||
{
|
||||
Scene *scene = (Scene *)id_dst;
|
||||
|
||||
if (scene->rigidbody_world != NULL) {
|
||||
PTCacheID pid;
|
||||
BKE_ptcache_id_from_rigidbody(&pid, NULL, scene->rigidbody_world);
|
||||
LISTBASE_FOREACH (PointCache *, point_cache, pid.ptcaches) {
|
||||
point_cache->flag |= PTCACHE_FLAG_INFO_DIRTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IDTypeInfo IDType_ID_SCE = {
|
||||
.id_code = ID_SCE,
|
||||
.id_filter = FILTER_ID_SCE,
|
||||
|
@ -1712,6 +1725,8 @@ IDTypeInfo IDType_ID_SCE = {
|
|||
.blend_read_expand = scene_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = scene_undo_preserve,
|
||||
|
||||
.lib_override_apply_post = scene_lib_override_apply_post,
|
||||
};
|
||||
|
||||
const char *RE_engine_id_BLENDER_EEVEE = "BLENDER_EEVEE";
|
||||
|
|
|
@ -315,6 +315,8 @@ IDTypeInfo IDType_ID_SCR = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/* ************ Spacetype/regiontype handling ************** */
|
||||
|
|
|
@ -173,6 +173,8 @@ IDTypeInfo IDType_ID_SIM = {
|
|||
/* blend_read_expand */ simulation_blend_read_expand,
|
||||
|
||||
/* blend_read_undo_preserve */ nullptr,
|
||||
|
||||
/* lib_override_apply_post */ nullptr,
|
||||
};
|
||||
|
||||
void *BKE_simulation_add(Main *bmain, const char *name)
|
||||
|
|
|
@ -221,6 +221,8 @@ IDTypeInfo IDType_ID_SO = {
|
|||
.blend_read_expand = sound_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
#ifdef WITH_AUDASPACE
|
||||
|
|
|
@ -114,6 +114,8 @@ IDTypeInfo IDType_ID_SPK = {
|
|||
.blend_read_expand = speaker_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
void *BKE_speaker_add(Main *bmain, const char *name)
|
||||
|
|
|
@ -258,6 +258,8 @@ IDTypeInfo IDType_ID_TXT = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -226,6 +226,8 @@ IDTypeInfo IDType_ID_TE = {
|
|||
.blend_read_expand = texture_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/* Utils for all IDs using those texture slots. */
|
||||
|
|
|
@ -644,6 +644,8 @@ IDTypeInfo IDType_ID_VO = {
|
|||
/* blend_read_expand */ volume_blend_read_expand,
|
||||
|
||||
/* blend_read_undo_preserve */ nullptr,
|
||||
|
||||
/* lib_override_apply_post */ nullptr,
|
||||
};
|
||||
|
||||
void BKE_volume_init_grids(Volume *volume)
|
||||
|
|
|
@ -192,6 +192,8 @@ IDTypeInfo IDType_ID_WS = {
|
|||
.blend_read_expand = workspace_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
|
|
@ -206,6 +206,8 @@ IDTypeInfo IDType_ID_WO = {
|
|||
.blend_read_expand = world_blend_read_expand,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
World *BKE_world_add(Main *bmain, const char *name)
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
|
||||
#include "BKE_armature.h"
|
||||
#include "BKE_idprop.h"
|
||||
#include "BKE_idtype.h"
|
||||
#include "BKE_lib_override.h"
|
||||
#include "BKE_main.h"
|
||||
|
||||
|
@ -1178,6 +1179,17 @@ void RNA_struct_override_apply(Main *bmain,
|
|||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/* Some cases (like point caches) may require additional post-processing. */
|
||||
if (RNA_struct_is_a(ptr_dst->type, &RNA_ID)) {
|
||||
ID *id_dst = ptr_dst->data;
|
||||
ID *id_src = ptr_src->data;
|
||||
const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(id_dst);
|
||||
if (id_type->lib_override_apply_post != NULL) {
|
||||
id_type->lib_override_apply_post(id_dst, id_src);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG_OVERRIDE_TIMEIT
|
||||
TIMEIT_END_AVERAGED(RNA_struct_override_apply);
|
||||
#endif
|
||||
|
|
|
@ -279,6 +279,8 @@ IDTypeInfo IDType_ID_WM = {
|
|||
.blend_read_expand = NULL,
|
||||
|
||||
.blend_read_undo_preserve = NULL,
|
||||
|
||||
.lib_override_apply_post = NULL,
|
||||
};
|
||||
|
||||
#define MAX_OP_REGISTERED 32
|
||||
|
|
Loading…
Reference in New Issue