Revision: 28646
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28646
Author:   blendix
Date:     2010-05-07 11:48:40 +0200 (Fri, 07 May 2010)

Log Message:
-----------
Multires: fix for "failed to read" error message with external displacements.

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

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c 2010-05-07 
09:46:54 UTC (rev 28645)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c 2010-05-07 
09:48:40 UTC (rev 28646)
@@ -559,7 +559,7 @@
                        d[i].disps = MEM_callocN(sizeof(float)*3*d[i].totdisp, 
"mdisps read");
 
                if(!cdf_read_data(cdf, d[i].totdisp*3*sizeof(float), 
d[i].disps)) {
-                       printf("failed to read %d/%d %d\n", i, count, 
d[i].totdisp);
+                       printf("failed to read multires displacement %d/%d 
%d\n", i, count, d[i].totdisp);
                        return 0;
                }
        }
@@ -574,7 +574,7 @@
 
        for(i = 0; i < count; ++i) {
                if(!cdf_write_data(cdf, d[i].totdisp*3*sizeof(float), 
d[i].disps)) {
-                       printf("failed to write %d/%d %d\n", i, count, 
d[i].totdisp);
+                       printf("failed to write multires displacement %d/%d 
%d\n", i, count, d[i].totdisp);
                        return 0;
                }
        }

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c   2010-05-07 
09:46:54 UTC (rev 28645)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c   2010-05-07 
09:48:40 UTC (rev 28646)
@@ -264,7 +264,39 @@
        return result;
 }
 
+static void multires_set_tot_mdisps(Mesh *me, int lvl)
+{
+       MDisps *mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
+       int i;
 
+       if(mdisps) {
+               for(i = 0; i < me->totface; i++) {
+                       if(mdisps[i].totdisp == 0) {
+                               int nvert = (me->mface[i].v4)? 4: 3;
+                               mdisps[i].totdisp = 
multires_grid_tot[lvl]*nvert;
+                       }
+               }
+       }
+}
+
+static void multires_reallocate_mdisps(Mesh *me, MDisps *mdisps, int lvl)
+{
+       int i;
+
+       /* reallocate displacements to be filled in */
+       for(i = 0; i < me->totface; ++i) {
+               int nvert = (me->mface[i].v4)? 4: 3;
+               int totdisp = multires_grid_tot[lvl]*nvert;
+               float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, 
"multires disps");
+
+               if(mdisps[i].disps)
+                       MEM_freeN(mdisps[i].disps);
+
+               mdisps[i].disps = disps;
+               mdisps[i].totdisp = totdisp;
+       }
+}
+
 static void column_vectors_to_mat3(float mat[][3], float v1[3], float v2[3], 
float v3[3])
 {
        copy_v3_v3(mat[0], v1);
@@ -320,6 +352,7 @@
        int levels = mmd->totlvl - lvl;
        MDisps *mdisps;
 
+       multires_set_tot_mdisps(me, mmd->totlvl);
        CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, 
me->totface);
        mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
 
@@ -393,24 +426,6 @@
        return subsurf_make_derived_from_derived(dm, &smd, 0, NULL, 0, 0);
 }
 
-static void multires_reallocate_mdisps(Mesh *me, MDisps *mdisps, int lvl)
-{
-       int i;
-
-       /* reallocate displacements to be filled in */
-       for(i = 0; i < me->totface; ++i) {
-               int nvert = (me->mface[i].v4)? 4: 3;
-               int totdisp = multires_grid_tot[lvl]*nvert;
-               float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, 
"multires disps");
-
-               if(mdisps[i].disps)
-                       MEM_freeN(mdisps[i].disps);
-
-               mdisps[i].disps = disps;
-               mdisps[i].totdisp = totdisp;
-       }
-}
-
 void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int 
updateblock, int simple)
 {
        Mesh *me = ob->data;
@@ -615,6 +630,7 @@
        ob = ccgdm->multires.ob;
        me = ccgdm->multires.ob->data;
        mmd = ccgdm->multires.mmd;
+       multires_set_tot_mdisps(me, mmd->totlvl);
        CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, 
me->totface);
        mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
 
@@ -750,6 +766,7 @@
                memcpy(subGridData[i], gridData[i], 
sizeof(DMGridData)*gridSize*gridSize);
        }
 
+       multires_set_tot_mdisps(me, mmd->totlvl);
        CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, 
me->totface);
        multiresModifier_disp_run(result, ob->data, 0, 0, subGridData, 
mmd->totlvl);
 


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

Reply via email to