[Bf-blender-cvs] [88fbf0a8fc1] master: Fix (studio-reported) bad remapping of libraries.

Bastien Montagne noreply at git.blender.org
Wed Jul 13 16:11:28 CEST 2022


Commit: 88fbf0a8fc1c4192279ebd4c31b66acf05117aa6
Author: Bastien Montagne
Date:   Wed Jul 13 16:10:03 2022 +0200
Branches: master
https://developer.blender.org/rB88fbf0a8fc1c4192279ebd4c31b66acf05117aa6

Fix (studio-reported) bad remapping of libraries.

New remapper code would also fail in some cases when remapping
libraries, similar to the issue yesterday, because ID_LI type had no
mask value.

That would fail to remap `parent` member of a library to NULL when
deleting that parent, leading to a crash e.g. in Outliner tree building
code.

Reported by @JulienKaspar from Blender studio.

===================================================================

M	source/blender/blenkernel/intern/idtype.c
M	source/blender/blenkernel/intern/lib_query.c
M	source/blender/blenkernel/intern/library.c
M	source/blender/makesdna/DNA_ID.h

===================================================================

diff --git a/source/blender/blenkernel/intern/idtype.c b/source/blender/blenkernel/intern/idtype.c
index edb6fe5d69b..923582dff4c 100644
--- a/source/blender/blenkernel/intern/idtype.c
+++ b/source/blender/blenkernel/intern/idtype.c
@@ -227,7 +227,8 @@ uint64_t BKE_idtype_idcode_to_idfilter(const short idcode)
     CASE_IDFILTER_NONE(IP);
     CASE_IDFILTER(KE);
     CASE_IDFILTER(LA);
-    CASE_IDFILTER_NONE(LI);
+    CASE_IDFILTER(LI);
+    CASE_IDFILTER(LP);
     CASE_IDFILTER(LS);
     CASE_IDFILTER(LT);
     CASE_IDFILTER(MA);
@@ -241,12 +242,11 @@ uint64_t BKE_idtype_idcode_to_idfilter(const short idcode)
     CASE_IDFILTER(PAL);
     CASE_IDFILTER(PC);
     CASE_IDFILTER(PT);
-    CASE_IDFILTER(LP);
     CASE_IDFILTER(SCE);
     CASE_IDFILTER(SCR);
     CASE_IDFILTER(SIM);
-    CASE_IDFILTER(SPK);
     CASE_IDFILTER(SO);
+    CASE_IDFILTER(SPK);
     CASE_IDFILTER(TE);
     CASE_IDFILTER(TXT);
     CASE_IDFILTER(VF);
@@ -269,6 +269,8 @@ short BKE_idtype_idcode_from_idfilter(const uint64_t idfilter)
   case FILTER_ID_##_id: \
     return ID_##_id
 
+#define CASE_IDFILTER_NONE(_id) (void)0
+
   switch (idfilter) {
     CASE_IDFILTER(AC);
     CASE_IDFILTER(AR);
@@ -280,8 +282,11 @@ short BKE_idtype_idcode_from_idfilter(const uint64_t idfilter)
     CASE_IDFILTER(GR);
     CASE_IDFILTER(CV);
     CASE_IDFILTER(IM);
+    CASE_IDFILTER_NONE(IP);
     CASE_IDFILTER(KE);
     CASE_IDFILTER(LA);
+    CASE_IDFILTER(LI);
+    CASE_IDFILTER(LP);
     CASE_IDFILTER(LS);
     CASE_IDFILTER(LT);
     CASE_IDFILTER(MA);
@@ -295,12 +300,11 @@ short BKE_idtype_idcode_from_idfilter(const uint64_t idfilter)
     CASE_IDFILTER(PAL);
     CASE_IDFILTER(PC);
     CASE_IDFILTER(PT);
-    CASE_IDFILTER(LP);
     CASE_IDFILTER(SCE);
     CASE_IDFILTER(SCR);
     CASE_IDFILTER(SIM);
-    CASE_IDFILTER(SPK);
     CASE_IDFILTER(SO);
+    CASE_IDFILTER(SPK);
     CASE_IDFILTER(TE);
     CASE_IDFILTER(TXT);
     CASE_IDFILTER(VF);
@@ -314,6 +318,7 @@ short BKE_idtype_idcode_from_idfilter(const uint64_t idfilter)
   return 0;
 
 #undef CASE_IDFILTER
+#undef CASE_IDFILTER_NONE
 }
 
 int BKE_idtype_idcode_to_index(const short idcode)
diff --git a/source/blender/blenkernel/intern/lib_query.c b/source/blender/blenkernel/intern/lib_query.c
index 38252a46b93..a869bf4c4b0 100644
--- a/source/blender/blenkernel/intern/lib_query.c
+++ b/source/blender/blenkernel/intern/lib_query.c
@@ -391,8 +391,7 @@ uint64_t BKE_library_id_can_use_filter_id(const ID *id_owner)
 
   switch ((ID_Type)id_type_owner) {
     case ID_LI:
-      /* ID_LI doesn't exist as filter_id. */
-      return 0;
+      return FILTER_ID_LI;
     case ID_SCE:
       return FILTER_ID_OB | FILTER_ID_WO | FILTER_ID_SCE | FILTER_ID_MC | FILTER_ID_MA |
              FILTER_ID_GR | FILTER_ID_TXT | FILTER_ID_LS | FILTER_ID_MSK | FILTER_ID_SO |
@@ -472,6 +471,8 @@ uint64_t BKE_library_id_can_use_filter_id(const ID *id_owner)
       /* Deprecated... */
       return 0;
   }
+
+  BLI_assert_unreachable();
   return 0;
 }
 
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 03a17b2ecc5..4962b1c448e 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -63,7 +63,7 @@ static void library_foreach_path(ID *id, BPathForeachPathData *bpath_data)
 
 IDTypeInfo IDType_ID_LI = {
     .id_code = ID_LI,
-    .id_filter = 0,
+    .id_filter = FILTER_ID_LI,
     .main_listbase_index = INDEX_ID_LI,
     .struct_size = sizeof(Library),
     .name = "Library",
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index f6032b71155..d3fc279381f 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -926,6 +926,7 @@ typedef enum IDRecalcFlag {
 #define FILTER_ID_KE (1ULL << 36)
 #define FILTER_ID_SCR (1ULL << 37)
 #define FILTER_ID_WM (1ULL << 38)
+#define FILTER_ID_LI (1ULL << 39)
 
 #define FILTER_ID_ALL \
   (FILTER_ID_AC | FILTER_ID_AR | FILTER_ID_BR | FILTER_ID_CA | FILTER_ID_CU_LEGACY | \
@@ -934,7 +935,7 @@ typedef enum IDRecalcFlag {
    FILTER_ID_OB | FILTER_ID_PA | FILTER_ID_PAL | FILTER_ID_PC | FILTER_ID_SCE | FILTER_ID_SPK | \
    FILTER_ID_SO | FILTER_ID_TE | FILTER_ID_TXT | FILTER_ID_VF | FILTER_ID_WO | FILTER_ID_CF | \
    FILTER_ID_WS | FILTER_ID_LP | FILTER_ID_CV | FILTER_ID_PT | FILTER_ID_VO | FILTER_ID_SIM | \
-   FILTER_ID_KE | FILTER_ID_SCR | FILTER_ID_WM)
+   FILTER_ID_KE | FILTER_ID_SCR | FILTER_ID_WM | FILTER_ID_LI)
 
 /**
  * This enum defines the index assigned to each type of IDs in the array returned by



More information about the Bf-blender-cvs mailing list