Fix for assert failure in material preview
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 4 Dec 2018 11:30:24 +0000 (12:30 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 4 Dec 2018 11:31:32 +0000 (12:31 +0100)
All localized datablocks are not supposed to have animation
data associated with them.

There was an easy way to reproduce assert failure: toggle
animation decorator for Viewport Display -> Color.

source/blender/blenkernel/BKE_library.h
source/blender/blenkernel/intern/lamp.c
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/material.c
source/blender/blenkernel/intern/texture.c
source/blender/blenkernel/intern/world.c

index 038e9377ba4e804ef8c44fb2d7acc4dbaacb2716..a4eb40cbb380639fdce25d6d5eb9cbdf99a6e672 100644 (file)
@@ -93,6 +93,8 @@ void BKE_libblock_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r
 void *BKE_libblock_copy(struct Main *bmain, const struct ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 /* "Deprecated" old API. */
 void *BKE_libblock_copy_nolib(const struct ID *id, const bool do_action) ATTR_NONNULL();
+/* Special version. sued by datablock localization. */
+void *BKE_libblock_copy_for_localize(const struct ID *id);
 
 void  BKE_libblock_rename(struct Main *bmain, struct ID *id, const char *name) ATTR_NONNULL();
 void  BLI_libblock_ensure_unique_name(struct Main *bmain, const char *name) ATTR_NONNULL();
index 681ff3b619fa21c76d09e570f9245eeece99717c..29f62519350208fac9d803a9ebef2e16c33a92c5 100644 (file)
@@ -150,7 +150,7 @@ Lamp *BKE_lamp_localize(Lamp *la)
         *
         * NOTE: Only possible once nested node trees are fully converted to that too. */
 
-       Lamp *lan = BKE_libblock_copy_nolib(&la->id, false);
+       Lamp *lan = BKE_libblock_copy_for_localize(&la->id);
 
        lan->curfalloff = curvemapping_copy(la->curfalloff);
 
index aa6cbcc343eb396b846ce57625f3d42b01f60a4e..a76ac02e06fd567cc2fd96daf8161711a4028cab 100644 (file)
@@ -1362,6 +1362,16 @@ void *BKE_libblock_copy_nolib(const ID *id, const bool do_action)
        return idn;
 }
 
+void *BKE_libblock_copy_for_localize(const ID *id)
+{
+       ID *idn;
+       BKE_libblock_copy_ex(NULL, id, &idn, (LIB_ID_CREATE_NO_MAIN |
+                                             LIB_ID_CREATE_NO_USER_REFCOUNT |
+                                             LIB_ID_COPY_ACTIONS |
+                                             LIB_ID_COPY_NO_ANIMDATA));
+       return idn;
+}
+
 void BKE_library_free(Library *lib)
 {
        if (lib->packedfile)
index 6741ebf39d2a80d27987329a794d5f59ba15aa9f..d45b19bc0bf4de01c2504c1e17bfd3a6d1bb3a9f 100644 (file)
@@ -235,7 +235,7 @@ Material *BKE_material_localize(Material *ma)
         *
         * NOTE: Only possible once nested node trees are fully converted to that too. */
 
-       Material *man = BKE_libblock_copy_nolib(&ma->id, false);
+       Material *man = BKE_libblock_copy_for_localize(&ma->id);
 
        man->texpaintslot = NULL;
        man->preview = NULL;
index 5031b2de46222ffb87e2eb992fb13e34959cc1e1..bd527ed8a44154eace7054d625d4ecf57910791a 100644 (file)
@@ -476,7 +476,7 @@ Tex *BKE_texture_localize(Tex *tex)
 
        Tex *texn;
 
-       texn = BKE_libblock_copy_nolib(&tex->id, false);
+       texn = BKE_libblock_copy_for_localize(&tex->id);
 
        /* image texture: BKE_texture_free also doesn't decrease */
 
index f4c32987117f51bfcce5982e8f5ac38af32d1559..e7a4167087b0eb521f59c3ad271f239b951399a1 100644 (file)
@@ -154,7 +154,7 @@ World *BKE_world_localize(World *wrld)
 
        World *wrldn;
 
-       wrldn = BKE_libblock_copy_nolib(&wrld->id, false);
+       wrldn = BKE_libblock_copy_for_localize(&wrld->id);
 
        if (wrld->nodetree)
                wrldn->nodetree = ntreeLocalize(wrld->nodetree);