Revision: 17282 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17282 Author: blendix Date: 2008-11-02 01:25:39 +0100 (Sun, 02 Nov 2008)
Log Message: ----------- Fix for two proxy + undo related crashes: * When making a proxy, the lib linked IPO driver was also changed to point to the proxy object, and after undo this local proxy object was replaced so the pointer became invalid. In fact it is not needed at all to change this because the IPO code maps the pointer to the local proxy object already. * Undoing the make proxy operation would crash because the proxy_from pointer in the library linked object would still point to the removed object. Now it clears all these pointers before undo, because on each undo memory file read they will be set again anyway. Modified Paths: -------------- trunk/blender/source/blender/blenkernel/intern/object.c trunk/blender/source/blender/blenloader/intern/readblenentry.c trunk/blender/source/blender/blenloader/intern/readfile.c trunk/blender/source/blender/blenloader/intern/readfile.h Modified: trunk/blender/source/blender/blenkernel/intern/object.c =================================================================== --- trunk/blender/source/blender/blenkernel/intern/object.c 2008-11-01 22:28:27 UTC (rev 17281) +++ trunk/blender/source/blender/blenkernel/intern/object.c 2008-11-02 00:25:39 UTC (rev 17282) @@ -1163,7 +1163,10 @@ ListBase targets = {NULL, NULL}; bConstraintTarget *ct; - if(con->ipo) { + /* note that we can't change lib linked ipo blocks. for making + * proxies this still works correct however because the object + * is changed to object->proxy_from when evaluating the driver. */ + if(con->ipo && !con->ipo->id.lib) { IpoCurve *icu; for(icu= con->ipo->curve.first; icu; icu= icu->next) { if(icu->driver && icu->driver->ob==ob) Modified: trunk/blender/source/blender/blenloader/intern/readblenentry.c =================================================================== --- trunk/blender/source/blender/blenloader/intern/readblenentry.c 2008-11-01 22:28:27 UTC (rev 17281) +++ trunk/blender/source/blender/blenloader/intern/readblenentry.c 2008-11-02 00:25:39 UTC (rev 17282) @@ -364,6 +364,9 @@ if (fd) { strcpy(fd->filename, filename); + /* clear ob->proxy_from pointers in G.main */ + blo_clear_proxy_pointers_from_lib(fd); + /* separate libraries from G.main */ blo_split_main(&mainlist, G.main); /* add the library pointers in oldmap lookup */ Modified: trunk/blender/source/blender/blenloader/intern/readfile.c =================================================================== --- trunk/blender/source/blender/blenloader/intern/readfile.c 2008-11-01 22:28:27 UTC (rev 17281) +++ trunk/blender/source/blender/blenloader/intern/readfile.c 2008-11-02 00:25:39 UTC (rev 17282) @@ -1130,6 +1130,19 @@ } } +/* lib linked proxy objects point to our local data, we need + * to clear that pointer before reading the undo memfile since + * the object might be removed, it is set again in reading + * if the local object still exists */ +void blo_clear_proxy_pointers_from_lib(FileData *fd) +{ + Object *ob= G.main->object.first; + + for(;ob; ob= ob->id.next) + if(ob->id.lib) + ob->proxy_from= NULL; +} + /* assumed; G.main still exists */ void blo_make_image_pointer_map(FileData *fd) { Modified: trunk/blender/source/blender/blenloader/intern/readfile.h =================================================================== --- trunk/blender/source/blender/blenloader/intern/readfile.h 2008-11-01 22:28:27 UTC (rev 17281) +++ trunk/blender/source/blender/blenloader/intern/readfile.h 2008-11-02 00:25:39 UTC (rev 17282) @@ -112,6 +112,7 @@ FileData *blo_openblendermemory( void *buffer, int buffersize, BlendReadError *error_r); FileData *blo_openblendermemfile(struct MemFile *memfile, BlendReadError *error_r); +void blo_clear_proxy_pointers_from_lib(FileData *fd); void blo_make_image_pointer_map(FileData *fd); void blo_end_image_pointer_map(FileData *fd); void blo_add_library_pointer_map(ListBase *mainlist, FileData *fd); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs