Commit: c6d3f76e69fbd213e6076071da67dd700e522c4f
Author: Bastien Montagne
Date:   Tue Jun 14 15:47:54 2016 +0200
Branches: asset-engine
https://developer.blender.org/rBc6d3f76e69fbd213e6076071da67dd700e522c4f

Fix save/load issues with new virtual-lib assets.

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

M       source/blender/blenkernel/intern/library.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/writefile.c

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

diff --git a/source/blender/blenkernel/intern/library.c 
b/source/blender/blenkernel/intern/library.c
index d3c5afe..f35dd97 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -2046,10 +2046,11 @@ static void library_asset_dependencies_rebuild(ID 
*asset)
        BLI_assert(lib && lib->asset_repository);
 
        if (!(lib && lib->asset_repository)) {
+               printf("asset: %s\n", asset->name);
                printf("lib: %p\n", lib);
                printf("lib: %s\n", lib->id.name);
                printf("lib: %s\n", lib->name);
-               printf("lib: %p\n", lib->asset_repository);
+               printf("lib: %p\n\n\n", lib->asset_repository);
        }
 
        asset->tag |= LIB_TAG_ASSET;
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index 1c045d9..3950076 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2148,6 +2148,9 @@ static void direct_link_id(FileData *fd, ID *id)
                /* this case means the data was written incorrectly, it should 
not happen */
                IDP_DirectLinkGroup_OrFree(&id->properties, (fd->flags & 
FD_FLAGS_SWITCH_ENDIAN), fd);
        }
+       if (id->uuid) {
+               id->uuid = newdataadr(fd, id->uuid);
+       }
 }
 
 /* ************ READ CurveMapping *************** */
@@ -8019,6 +8022,7 @@ static BHead *read_libblock(FileData *fd, Main *main, 
BHead *bhead, const short
                return blo_nextbhead(fd, bhead);
        
        id->tag = tag | LIB_TAG_NEED_LINK;
+       printf("id: %s (%p, %p), lib: %p\n", id->name, id, id->uuid, 
main->curlib);
        id->lib = main->curlib;
        id->us = ID_FAKE_USERS(id);
        id->icon_id = 0;
@@ -8491,7 +8495,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const 
char *filepath)
                        bhead->code = ID_SCR;
                        /* deliberate pass on to default */
                default:
-                       bhead = read_libblock(fd, bfd->main, bhead, 
LIB_TAG_LOCAL, NULL);
+                       bhead = read_libblock(fd, mainlist.last, bhead, 
LIB_TAG_LOCAL, NULL);
                }
        }
        
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index 97f6d3c..6d0b6cc 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -294,7 +294,7 @@ typedef struct {
 
        unsigned char *buf;
        MemFile *compare, *current;
-       
+
        int tot, count, error;
 
        /* Wrap writing, so we can use zlib or
@@ -358,7 +358,7 @@ static void writedata_free(WriteData *wd)
  * \param len Length of new chunk of data
  * \warning Talks to other functions with global parameters
  */
- 
+
 #define MYWRITE_FLUSH          NULL
 
 static void mywrite(WriteData *wd, const void *adr, int len)
@@ -375,7 +375,7 @@ static void mywrite(WriteData *wd, const void *adr, int len)
        }
 
        wd->tot+= len;
-       
+
        /* if we have a single big chunk, write existing data in
         * buffer and write out big chunk in smaller pieces */
        if (len>MYWRITE_MAX_CHUNK) {
@@ -422,7 +422,7 @@ static WriteData *bgnwrite(WriteWrap *ww, MemFile *compare, 
MemFile *current)
        wd->current= current;
        /* this inits comparing */
        memfile_chunk_add(compare, NULL, NULL, 0);
-       
+
        return wd;
 }
 
@@ -440,7 +440,7 @@ static int endwrite(WriteData *wd)
                writedata_do_write(wd, wd->buf, wd->count);
                wd->count= 0;
        }
-       
+
        err= wd->error;
        writedata_free(wd);
 
@@ -506,7 +506,7 @@ static void writedata(WriteData *wd, int filecode, int len, 
const void *adr)  /*
 static void writelist(WriteData *wd, int filecode, const char *structname, 
ListBase *lb)
 {
        Link *link = lb->first;
-       
+
        while (link) {
                writestruct(wd, filecode, structname, 1, link);
                link = link->next;
@@ -592,7 +592,14 @@ static void write_iddata(void *wd, ID *id)
 {
        /* ID_WM's id->properties are considered runtime only, and never 
written in .blend file. */
        if (id->properties && !ELEM(GS(id->name), ID_WM)) {
-               IDP_WriteProperty(id->properties, wd);
+               /* We want to write IDProps from 'virtual' libraries too, but 
not from 'real' linked datablocks... */
+               if (!id->uuid || (id->lib && (id->lib->flag & 
LIBRARY_FLAG_VIRTUAL))) {
+                       IDP_WriteProperty(id->properties, wd);
+               }
+       }
+       if (id->uuid) {
+               BLI_assert(id->lib && id->lib->asset_repository);
+               writestruct(wd, DATA, "AssetUUID", 1, id->uuid);
        }
 }
 
@@ -626,25 +633,25 @@ static void write_previews(WriteData *wd, PreviewImage 
*prv)
 static void write_fmodifiers(WriteData *wd, ListBase *fmodifiers)
 {
        FModifier *fcm;
-       
+
        /* Write all modifiers first (for faster reloading) */
        writelist(wd, DATA, "FModifier", fmodifiers);
-       
+
        /* Modifiers */
        for (fcm= fmodifiers->first; fcm; fcm= fcm->next) {
                const FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
-               
+
                /* Write the specific data */
                if (fmi && fcm->data) {
                        /* firstly, just write the plain fmi->data struct */
                        writestruct(wd, DATA, fmi->structName, 1, fcm->data);
-                       
+
                        /* do any modifier specific stuff */
                        switch (fcm->type) {
                                case FMODIFIER_TYPE_GENERATOR:
                                {
                                        FMod_Generator *data= (FMod_Generator 
*)fcm->data;
-                                       
+
                                        /* write coefficients array */
                                        if (data->coefficients)
                                                writedata(wd, DATA, 
sizeof(float)*(data->arraysize), data->coefficients);
@@ -654,7 +661,7 @@ static void write_fmodifiers(WriteData *wd, ListBase 
*fmodifiers)
                                case FMODIFIER_TYPE_ENVELOPE:
                                {
                                        FMod_Envelope *data= (FMod_Envelope 
*)fcm->data;
-                                       
+
                                        /* write envelope data */
                                        if (data->data)
                                                writestruct(wd, DATA, 
"FCM_EnvelopeData", data->totvert, data->data);
@@ -664,7 +671,7 @@ static void write_fmodifiers(WriteData *wd, ListBase 
*fmodifiers)
                                case FMODIFIER_TYPE_PYTHON:
                                {
                                        FMod_Python *data = (FMod_Python 
*)fcm->data;
-                                       
+
                                        /* Write ID Properties -- and copy this 
comment EXACTLY for easy finding
                                         * of library blocks that implement 
this.*/
                                        IDP_WriteProperty(data->prop, wd);
@@ -679,7 +686,7 @@ static void write_fmodifiers(WriteData *wd, ListBase 
*fmodifiers)
 static void write_fcurves(WriteData *wd, ListBase *fcurves)
 {
        FCurve *fcu;
-       
+
        writelist(wd, DATA, "FCurve", fcurves);
        for (fcu=fcurves->first; fcu; fcu=fcu->next) {
                /* curve data */
@@ -687,20 +694,20 @@ static void write_fcurves(WriteData *wd, ListBase 
*fcurves)
                        writestruct(wd, DATA, "BezTriple", fcu->totvert, 
fcu->bezt);
                if (fcu->fpt)
                        writestruct(wd, DATA, "FPoint", fcu->totvert, fcu->fpt);
-                       
+
                if (fcu->rna_path)
                        writedata(wd, DATA, strlen(fcu->rna_path)+1, 
fcu->rna_path);
-               
+
                /* driver data */
                if (fcu->driver) {
                        ChannelDriver *driver= fcu->driver;
                        DriverVar *dvar;
-                       
+
                        writestruct(wd, DATA, "ChannelDriver", 1, driver);
-                       
+
                        /* variables */
                        writelist(wd, DATA, "DriverVar", &driver->variables);
-                       for (dvar= driver->variables.first; dvar; dvar= 
dvar->next) {                           
+                       for (dvar= driver->variables.first; dvar; dvar= 
dvar->next) {
                                DRIVER_TARGETS_USED_LOOPER(dvar)
                                {
                                        if (dtar->rna_path)
@@ -709,7 +716,7 @@ static void write_fcurves(WriteData *wd, ListBase *fcurves)
                                DRIVER_TARGETS_LOOPER_END
                        }
                }
-               
+
                /* write F-Modifiers */
                write_fmodifiers(wd, &fcu->modifiers);
        }
@@ -720,24 +727,24 @@ static void write_actions(WriteData *wd, ListBase *idbase)
        bAction *act;
        bActionGroup *grp;
        TimeMarker *marker;
-       
+
        for (act=idbase->first; act; act= act->id.next) {
                if (act->id.us>0 || wd->current) {
                        writestruct(wd, ID_AC, "bAction", 1, act);
                        write_iddata(wd, &act->id);
 
                        write_fcurves(wd, &act->curves);
-                       
+
                        for (grp=act->groups.first; grp; grp=grp->next) {
                                writestruct(wd, DATA, "bActionGroup", 1, grp);
                        }
-                       
+
                        for (marker=act->markers.first; marker; 
marker=marker->next) {
                                writestruct(wd, DATA, "TimeMarker", 1, marker);
                        }
                }
        }
-       
+
        /* flush helps the compression for undo-save */
        mywrite(wd, MYWRITE_FLUSH, 0);
 }
@@ -746,16 +753,16 @@ static void write_keyingsets(WriteData *wd, ListBase 
*list)
 {
        KeyingSet *ks;
        KS_Path *ksp;
-       
+
        for (ks= list->first; ks; ks= ks->next) {
                /* KeyingSet */
                writestruct(wd, DATA, "KeyingSet", 1, ks);
-               
+
                /* Paths */
                for (ksp= ks->paths.first; ksp; ksp= ksp->next) {
                        /* Path */
                        writestruct(wd, DATA, "KS_Path", 1, ksp);
-                       
+
                        if (ksp->rna_path)
                                writedata(wd, DATA, strlen(ksp->rna_path)+1, 
ksp->rna_path);
                }
@@ -765,13 +772,13 @@ static void write_keyingsets(WriteData *wd, ListBase 
*list)
 static void write_nlastrips(WriteData *wd, ListBase *strips)
 {
        NlaStrip *strip;
-       
+
        writelist(wd, DATA, "NlaStrip", strips);
        for (strip= strips->first; strip; strip= strip->next) {
                /* write the strip's F-Curves and modifiers */
                write_fcurves(wd, &strip->fcurves);
                write_fmodifiers(wd, &strip->modifiers);
-               
+
                /* write the strip's children */
                write_nlastrips(wd, &strip->strips);
        }
@@ -780,12 +787,12 @@ static void write_nlastrips(WriteData *wd, ListBase 
*strips)
 static void write_nladata(WriteData *wd, ListBase *nlabase)
 {
        NlaTrack *nlt;
-       
+
        /* write all the tracks */
        for (nlt= nlabase->first; nlt; nlt= nlt->next) {
                /* write the track first */
                writestruct(wd, DATA, "NlaTrack", 1, nlt);
-               
+
                /* write the track's strips */
                write_nlastrips(wd, &nlt->strips);
        }
@@ -794,13 +801,13 @@ static void write_nladata(WriteData *wd, ListBase 
*nlabase)
 static void write_animdata(WriteData *wd, AnimData *adt)
 {
        AnimOverride *aor;
-       
+
        /* firstly, just write the AnimData block */
        writestruct(wd, DATA, "AnimData", 1, adt);
-       
+
        /* write drivers */
        write_fcurves(wd, &adt->drivers);
-       
+
        /* write overrides */
        // FIXME: are these needed?
        for (aor= adt->overrides.first; aor; aor= aor->next) {
@@ -808,9 +815,9 @@ static void write_animdata(WriteData *wd, AnimData *adt)
                writestruct(wd, DATA, "AnimOverride", 1, aor);
                writedata(wd, DATA, strlen(aor->rna_path)+1, aor->rna_path);
        }
-       
+
        // TODO write the remaps (if they are needed)
-       
+
        /* write NLA data */
        write_nladata(wd, &adt->nla_tracks);
 }
@@ -835,14 +842,14 @@ static void write_node_socket(WriteData *wd, bNodeTree 
*UNUSED(ntree), bNode *no
 #ifdef USE_NODE_COMPAT_CUSTOMNODES
        /* forward compatibility code, so older blenders still open */
        sock->stack_type = 1;
-       
+
        if (node->type == NODE_GROUP) {
                bNodeTree *ngroup = (bNodeTree *)node->id;
                if (ngroup) {
                        /* for node gro

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to