Revision: 19854
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19854
Author:   nicholasbishop
Date:     2009-04-21 18:58:25 +0200 (Tue, 21 Apr 2009)

Log Message:
-----------
Fix for bug #17457. This bug relates to files that have missing multires vertex 
data.

The fix is, if the file was saved on the highest multires level, then mesh 
contains a copy of the vertices anyway, and we can just copy it back into 
multires.

Otherwise, multires is removed from the mesh to avoid a crash.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/blenloader/intern/readfile.c

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c   2009-04-21 
15:38:53 UTC (rev 19853)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c   2009-04-21 
16:58:25 UTC (rev 19854)
@@ -111,7 +111,8 @@
                        lvl= lvl->next;
                }
 
-               MEM_freeN(mr->verts);
+               if(mr->verts)
+                       MEM_freeN(mr->verts);
 
                BLI_freelistN(&mr->levels);
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2009-04-21 
15:38:53 UTC (rev 19853)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2009-04-21 
16:58:25 UTC (rev 19854)
@@ -2876,6 +2876,18 @@
                        lvl->map_mem= NULL;
                }
        }
+
+       /* Gracefully handle corrupted mesh */
+       if(mesh->mr && !mesh->mr->verts) {
+               /* If totals match, simply load the current mesh verts into 
multires */
+               if(mesh->totvert == 
((MultiresLevel*)mesh->mr->levels.last)->totvert)
+                       mesh->mr->verts = MEM_dupallocN(mesh->mvert);
+               else {
+                       /* Otherwise, we can't recover the data, silently 
remove multires */
+                       multires_free(mesh->mr);
+                       mesh->mr = NULL;
+               }
+       }
        
        if((fd->flags & FD_FLAGS_SWITCH_ENDIAN) && mesh->tface) {
                TFace *tf= mesh->tface;


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

Reply via email to