Revision: 15649
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15649
Author:   nicholasbishop
Date:     2008-07-20 07:41:55 +0200 (Sun, 20 Jul 2008)

Log Message:
-----------
Updating for all multires levels should work now.

Modified Paths:
--------------
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
    
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-07-20 05:01:29 UTC (rev 15648)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-07-20 05:41:55 UTC (rev 15649)
@@ -97,6 +97,7 @@
 int MultiresDM_get_totorco(struct DerivedMesh *);
 int MultiresDM_get_totored(struct DerivedMesh *);
 void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct 
DerivedMesh*));
+void MultiresDM_block_update(struct DerivedMesh *);
 
 /* Modifier */
 struct MDisps;

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
   2008-07-20 05:01:29 UTC (rev 15648)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
   2008-07-20 05:41:55 UTC (rev 15649)
@@ -1170,6 +1170,7 @@
        IndexNode *vert_face_map_mem;
 
        Mesh *me;
+       int block_update;
 
        void (*update)(DerivedMesh*);
 } MultiresDM;
@@ -1179,7 +1180,7 @@
        MultiresDM *mrdm = (MultiresDM*)dm;
 
        /* Before freeing, need to update the displacement map */
-       if(dm->needsFree)
+       if(dm->needsFree && !mrdm->block_update)
                mrdm->update(dm);
 
        if(DM_release(dm)) {
@@ -1269,6 +1270,7 @@
        mrdm->lvl = lvl;
        mrdm->totlvl = totlvl;
        mrdm->subco = MEM_callocN(sizeof(float)*3*numVerts, "multires 
subdivided coords");
+       mrdm->block_update = 0;
 
        MultiresDM_calc_norm(mrdm);
 
@@ -1358,3 +1360,8 @@
 
        return mrdm->vert_face_map;
 }
+
+void MultiresDM_block_update(DerivedMesh *dm)
+{
+       ((MultiresDM*)dm)->block_update = 1;
+}

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-07-20 05:01:29 UTC (rev 15648)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-07-20 05:41:55 UTC (rev 15649)
@@ -1403,7 +1403,7 @@
 }
 
 void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, int 
lvl, int totlvl,
-                     int totsubvert, int totsubedge, int totsubface)
+                     int totsubvert, int totsubedge, int totsubface, MVert 
*addverts)
 {
        DerivedMesh *mrdm;
        MultiresModifierData mmd_sub;
@@ -1585,6 +1585,11 @@
                }
        }
 
+       if(addverts) {
+               for(i = 0; i < totvert; ++i)
+                       VecAddf(mvd[i].co, mvd[i].co, addverts[i].co);
+       }
+
        final->needsFree = 1;
        final->release(final);
        mrdm->needsFree = 1;
@@ -1653,7 +1658,7 @@
 
                orig = CDDM_from_mesh(me, NULL);
 
-               multires_subdisp(orig, me, final, mmd->totlvl - 1, mmd->totlvl, 
totsubvert, totsubedge, totsubface);
+               multires_subdisp(orig, me, final, mmd->totlvl - 1, mmd->totlvl, 
totsubvert, totsubedge, totsubface, NULL);
 
                orig->needsFree = 1;
                orig->release(orig);
@@ -1909,6 +1914,48 @@
 
                d.subco = MultiresDM_get_subco(dm);
 
+               if(lvl < totlvl) {
+                       /* Propagate disps upwards */
+                       Mesh *me = MultiresDM_get_mesh(dm);
+                       DerivedMesh *orig = CDDM_from_mesh(me, NULL), 
*orig_mrdm, *final, *orig_top_mrdm;
+                       MultiresModifierData mmd;
+                       MVert *verts_orig, *verts_new, *orig_top_verts;
+
+                       /* Regenerate the vertex coords at the top level using 
the unmodified disps */
+                       mmd.totlvl = totlvl;
+                       mmd.lvl = totlvl;
+                       orig_top_mrdm = multires_dm_create_from_derived(&mmd, 
orig, me, 0, 0);
+                       MultiresDM_block_update(orig_top_mrdm);
+                       orig_top_verts = CDDM_get_verts(orig_top_mrdm);
+
+                       /* Regenerate the current level as a MultiresDM using 
the unmodified disps */
+                       mmd.totlvl = totlvl;
+                       mmd.lvl = lvl;
+                       orig_mrdm = multires_dm_create_from_derived(&mmd, orig, 
me, 0, 0);
+                       MultiresDM_block_update(orig_mrdm);
+
+                       /* Subtract the original vertex cos from the new vertex 
cos */
+                       verts_orig = CDDM_get_verts(orig_mrdm);
+                       verts_new = CDDM_get_verts(dm);
+                       for(i = 0; i < dm->getNumVerts(dm); ++i)
+                               VecSubf(verts_new[i].co, verts_new[i].co, 
verts_orig[i].co);
+
+                       orig_mrdm->release(orig_mrdm);
+
+                       final = multires_subdisp_pre(dm, totlvl - lvl);
+
+                       // ?
+                       orig->release(orig);
+                       orig = CDDM_from_mesh(me, NULL);
+
+                       multires_subdisp(orig, me, final, lvl, totlvl, 
dm->getNumVerts(dm), dm->getNumEdges(dm),
+                                        dm->getNumFaces(dm), orig_top_verts);
+                       orig->release(orig);
+                       orig_top_mrdm->release(orig_top_mrdm);
+
+                       return;
+               }
+
                /* Update the current level */
                for(i = 0; i < MultiresDM_get_totorfa(dm); ++i) {
                        const int numVerts = mface[i].v4 ? 4 : 3;
@@ -1971,15 +2018,6 @@
                        ++mvert;
                        ++d.subco;
                }
-
-               if(lvl < totlvl) {
-                       /* Propagate disps upwards */
-                       Mesh *me = MultiresDM_get_mesh(dm);
-                       DerivedMesh *orig = CDDM_from_mesh(me, NULL);
-                       multires_subdisp(orig, me, multires_subdisp_pre(dm, 
totlvl - lvl),
-                                        lvl, totlvl, dm->getNumVerts(dm), 
dm->getNumEdges(dm), dm->getNumFaces(dm));
-                       orig->release(orig);
-               }
        }
 }
 


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

Reply via email to