Revision: 15630
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15630
Author:   nicholasbishop
Date:     2008-07-18 22:57:46 +0200 (Fri, 18 Jul 2008)

Log Message:
-----------
More progress with subdividing disps for editing the inbetween levels.

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/modifier.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
    branches/soc-2008-nicholasbishop/source/blender/src/editmesh_mods.c

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-07-18 20:31:40 UTC (rev 15629)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-07-18 20:57:46 UTC (rev 15630)
@@ -82,6 +82,8 @@
                          const int totvert, const int totface);
 
 /* MultiresDM */
+void MultiresDM_set_mesh(struct DerivedMesh *dm, struct Mesh *me);
+struct Mesh *MultiresDM_get_mesh(struct DerivedMesh *dm);
 struct DerivedMesh *MultiresDM_new(struct DerivedMesh*, int, int, int, int, 
int);
 void *MultiresDM_get_vertnorm(struct DerivedMesh *);
 void *MultiresDM_get_orco(struct DerivedMesh *);
@@ -124,7 +126,8 @@
 
 void multires_force_update(struct Object *ob);
 
-struct DerivedMesh *multires_dm_create_from_derived(struct 
MultiresModifierData*, struct DerivedMesh*, int, int);
+struct DerivedMesh *multires_dm_create_from_derived(struct 
MultiresModifierData*, struct DerivedMesh*,
+                                                   struct Mesh *, int, int);
 
 void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct 
Object *ob);
 void multiresModifier_setLevel(void *mmd_v, void *ob_v);

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
   2008-07-18 20:31:40 UTC (rev 15629)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
   2008-07-18 20:57:46 UTC (rev 15630)
@@ -1169,6 +1169,8 @@
        ListBase *vert_face_map;
        IndexNode *vert_face_map_mem;
 
+       Mesh *me;
+
        void (*update)(DerivedMesh*);
 } MultiresDM;
 
@@ -1275,6 +1277,16 @@
        return dm;
 }
 
+void MultiresDM_set_mesh(DerivedMesh *dm, Mesh *me)
+{
+       ((MultiresDM*)dm)->me = me;
+}
+
+Mesh *MultiresDM_get_mesh(DerivedMesh *dm)
+{
+       return ((MultiresDM*)dm)->me;
+}
+
 void *MultiresDM_get_vertnorm(DerivedMesh *dm)
 {
        return ((MultiresDM*)dm)->norm;

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c    
    2008-07-18 20:31:40 UTC (rev 15629)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c    
    2008-07-18 20:57:46 UTC (rev 15630)
@@ -7220,7 +7220,7 @@
        if(mmd->lvl == 1)
                return dm;
 
-       return multires_dm_create_from_derived(mmd, dm, useRenderParams, 
isFinalCalc);
+       return multires_dm_create_from_derived(mmd, dm, get_mesh(ob), 
useRenderParams, isFinalCalc);
 }
 
 /***/

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-07-18 20:31:40 UTC (rev 15629)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-07-18 20:57:46 UTC (rev 15630)
@@ -1410,62 +1410,86 @@
        MVert *mvs = CDDM_get_verts(final);
        MVert *mvd, *mvd_f1, *mvs_f1, *mvd_f3, *mvd_f4;
        MVert *mvd_f2, *mvs_f2, *mvs_e1, *mvd_e1, *mvs_e2;
-       int totorco, totvert;
+       int totvert;
+       int slo1 = multires_side_tot[lvl - 1];
+       int sll = slo1 / 2;
        int slo2 = multires_side_tot[totlvl - 2];
        int shi2 = multires_side_tot[totlvl - 1];
-       int i, j;
+       int skip = multires_side_tot[totlvl - lvl] - 1;
+       int i, j, k;
 
-       /* Base mesh */
-       int base_totvert, base_totedge, base_totface;
-       MFace *base_mface;
-       if(me) {
-               base_totvert = me->totvert;
-               base_totedge = me->totedge;
-               base_totface = me->totface;
-               base_mface = me->mface;
-       }
-       else {
-               base_totvert = MultiresDM_get_totorco(orig);
-               base_totedge = MultiresDM_get_totored(orig);
-               base_totface = MultiresDM_get_totorfa(orig);
-               base_mface = MultiresDM_get_orfa(orig);
-       }
-
        mmd_sub.lvl = mmd_sub.totlvl = totlvl;
-       mrdm = multires_dm_create_from_derived(&mmd_sub, orig, 0, 0);
+       mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 0);
                
        mvd = CDDM_get_verts(mrdm);
        /* Need to map from ccg to mrdm */
-       totorco = MultiresDM_get_totorco(mrdm);
        totvert = mrdm->getNumVerts(mrdm);
 
        /* Load base verts */
-       for(i = 0; i < base_totvert; ++i)
-               VecCopyf(mvd[totvert - totorco + i].co, mvs[totvert - totorco + 
i].co);
+       for(i = 0; i < me->totvert; ++i)
+               VecCopyf(mvd[totvert - me->totvert + i].co, mvs[totvert - 
me->totvert + i].co);
 
        mvd_f1 = mvd;
        mvs_f1 = mvs;
        mvd_f2 = mvd;
        mvs_f2 = mvs + totvert - totsubvert;
-       mvs_e1 = mvs + totsubface;
-       for(i = 0; i < base_totface; ++i) {
-               const int end = base_mface[i].v4 ? 4 : 3;
-               int x, y;
+       mvs_e1 = mvs + totsubface * (skip-1) * (skip-1);
 
+       for(i = 0; i < me->totface; ++i) {
+               const int end = me->mface[i].v4 ? 4 : 3;
+               int x, y, x2, y2, mov;
+
                mvd_f1 += 1 + end * (slo2-2); //center+edgecross
                mvd_f3 = mvd_f4 = mvd_f1;
 
                for(j = 0; j < end; ++j) {
-                       /* Update face centers created in the top level */
-                       for(y = 1; y < slo2 - 1; y += 2) {
-                               for(x = 1; x < slo2 - 1; x += 2) {
+                       mvd_f1 += (skip/2 - 1) * (slo2 - 2) + (skip/2 - 1);
+                       /* Update sub faces */
+                       for(y = 0; y < sll; ++y) {
+                               for(x = 0; x < sll; ++x) {
+                                       /* Face center */
                                        VecCopyf(mvd_f1->co, mvs_f1->co);
-                                       mvd_f1 += 2;
                                        mvs_f1 += 1;
+
+                                       /* Now we hold the center of the 
subface at mvd_f1
+                                          and offset it to the edge cross and 
face verts */
+
+                                       /* Edge cross */
+                                       for(k = 0; k < 4; ++k) {
+                                               if(k == 0) mov = -1;
+                                               else if(k == 1) mov = slo2 - 2;
+                                               else if(k == 2) mov = 1;
+                                               else if(k == 3) mov = -(slo2 - 
2);
+
+                                               for(x2 = 1; x2 < skip/2; ++x2) {
+                                                       VecCopyf((mvd_f1 + mov 
* x2)->co, mvs_f1->co);
+                                                       ++mvs_f1;
+                                               }
+                                       }
+
+                                       /* Main face verts */
+                                       for(k = 0; k < 4; ++k) {
+                                               int movx, movy;
+
+                                               if(k == 0) { movx = -1; movy = 
-(slo2 - 2); }
+                                               else if(k == 1) { movx = slo2 - 
2; movy = -1; }
+                                               else if(k == 2) { movx = 1; 
movy = slo2 - 2; }
+                                               else if(k == 3) { movx = -(slo2 
- 2); movy = 1; }
+
+                                               for(y2 = 1; y2 < skip/2; ++y2) {
+                                                       for(x2 = 1; x2 < 
skip/2; ++x2) {
+                                                               
VecCopyf((mvd_f1 + movy * y2 + movx * x2)->co, mvs_f1->co);
+                                                               ++mvs_f1;
+                                                       }
+                                               }
+                                       }
+                                                       
+                                       mvd_f1 += skip;
                                }
-                               mvd_f1 += slo2 - 3;
+                               mvd_f1 += (skip - 1) * (slo2 - 2) - 1;
                        }
-                       mvd_f1 -= slo2 - 2;
+                       mvd_f1 -= (skip - 1) * (slo2 - 2) - 1 + skip;
+                       mvd_f1 += (slo2 - 2) * (skip/2-1) + skip/2-1 + 1;
                }
 
                /* update face center verts */
@@ -1476,70 +1500,89 @@
 
                /* update face edge verts */
                for(j = 0; j < end; ++j) {
-                       VecCopyf(mvd_f2->co, mvs_e1->co);
-                       mvd_f2++;
-                       mvs_e1++;
-                       for(x = 2; x < slo2 - 1; x += 2) {
-                               VecCopyf(mvd_f2->co, mvs_f2->co);
-                               mvd_f2++;
-                               mvs_f2++;
+                       MVert *restore;
 
+                       /* Super-face edge cross */
+                       for(k = 0; k < skip-1; ++k) {
                                VecCopyf(mvd_f2->co, mvs_e1->co);
                                mvd_f2++;
                                mvs_e1++;
                        }
+                       for(x = 1; x < sll; ++x) {
+                               VecCopyf(mvd_f2->co, mvs_f2->co);
+                               mvd_f2++;
+                               mvs_f2++;
 
-                       for(y = 0; y < slo2/2 - 1; ++y) {
-                               for(x = 0; x < slo2/2; ++x) {
-                                       VecCopyf(mvd_f3[1+(y*2) + x*(2 * 
(slo2-2))].co,
-                                                mvs_e1->co);
-                                       mvs_e1+=2;
+                               for(k = 0; k < skip-1; ++k) {
+                                       VecCopyf(mvd_f2->co, mvs_e1->co);
+                                       mvd_f2++;
+                                       mvs_e1++;
                                }
                        }
 
-                       mvs_e1 -= (slo2/2) * (slo2/2 - 1) * 2 - 1;
-                       for(y = 0; y < slo2/2 - 1; ++y) {
-                               for(x = 0; x < slo2/2; ++x) {
-                                       VecCopyf(mvd_f3[(slo2-2) + (x*2) + 
y*2*(slo2-2)].co,
-                                                mvs_e1->co);
-                                       mvs_e1+=2;
+                       restore = mvs_e1;
+                       for(y = 0; y < sll - 1; ++y) {
+                               for(x = 0; x < sll; ++x) {
+                                       for(k = 0; k < skip - 1; ++k) {
+                                               
VecCopyf(mvd_f3[(skip-1)+(y*skip) + (x*skip+k)*(slo2-2)].co,
+                                                        mvs_e1->co);
+                                               ++mvs_e1;
+                                       }
+                                       mvs_e1 += skip-1;
                                }
                        }
+                       
+                       mvs_e1 = restore + skip - 1;
+                       for(y = 0; y < sll - 1; ++y) {
+                               for(x = 0; x < sll; ++x) {
+                                       for(k = 0; k < skip - 1; ++k) {
+                                               
VecCopyf(mvd_f3[(slo2-2)*(skip-1)+(x*skip)+k + y*skip*(slo2-2)].co,
+                                                        mvs_e1->co);
+                                               ++mvs_e1;
+                                       }
+                                       mvs_e1 += skip - 1;
+                               }
+                       }
 
                        mvd_f3 += (slo2-2)*(slo2-2);
-                       mvs_e1 -= 1;
+                       mvs_e1 -= skip - 1;
                }
 
                /* update base (2) face verts */
                for(j = 0; j < end; ++j) {
-                       mvd_f2 += slo2 - 1;
-                       for(y = 1; y < slo2 - 2; y += 2) {
-                               for(x = 1; x < slo2 - 2; x += 2) {
+                       mvd_f2 += (slo2 - 1) * (skip - 1);
+                       for(y = 0; y < sll - 1; ++y) {
+                               for(x = 0; x < sll - 1; ++x) {
                                        VecCopyf(mvd_f2->co, mvs_f2->co);
-                                       mvd_f2 += 2;
+                                       mvd_f2 += skip;
                                        ++mvs_f2;
                                }
-                               mvd_f2 += slo2 - 1;
+                               mvd_f2 += (slo2 - 1) * (skip - 1);
                        }
-                       mvd_f2 -= 1;
+                       mvd_f2 -= (skip - 1);
                }
        }
 
        /* edges */
-       mvd_e1 = mvd + totvert - base_totvert - base_totedge * (shi2-2);
-       mvs_e2 = mvs + totvert - base_totvert - base_totedge * (slo2-2);
-       for(i = 0; i < base_totedge; ++i) {
-               VecCopyf(mvd_e1->co, mvs_e1->co);
-               mvd_e1++;
-               mvs_e1++;
-               for(j = 0; j < slo2-2; j++) {
-                       VecCopyf(mvd_e1->co, mvs_e2->co);
-                       mvd_e1++;
-                       mvs_e2++;
+       mvd_e1 = mvd + totvert - me->totvert - me->totedge * (shi2-2);
+       mvs_e2 = mvs + totvert - me->totvert - me->totedge * (slo1-2);
+       for(i = 0; i < me->totedge; ++i) {
+               for(j = 0; j < skip - 1; ++j) {
                        VecCopyf(mvd_e1->co, mvs_e1->co);
                        mvd_e1++;
                        mvs_e1++;
                }
+               for(j = 0; j < slo1 - 2; j++) {
+                       VecCopyf(mvd_e1->co, mvs_e2->co);
+                       mvd_e1++;
+                       mvs_e2++;
+                       
+                       for(k = 0; k < skip - 1; ++k) {
+                               VecCopyf(mvd_e1->co, mvs_e1->co);
+                               mvd_e1++;
+                               mvs_e1++;
+                       }
+               }
        }
 
        final->needsFree = 1;
@@ -1580,7 +1623,7 @@
 
                orig = CDDM_from_mesh(me, NULL);
                mmd_sub.lvl = mmd_sub.totlvl = mmd->totlvl - 1;
-               mrdm = multires_dm_create_from_derived(&mmd_sub, orig, 0, 0);
+               mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 
0);
                totsubvert = mrdm->getNumVerts(mrdm);
                totsubedge = mrdm->getNumEdges(mrdm);
                totsubface = mrdm->getNumFaces(mrdm);
@@ -1854,7 +1897,7 @@
        if(mdisps) {
                MultiresDisplacer d;
                const int lvl = MultiresDM_get_lvl(dm);
-               //const int totlvl = MultiresDM_get_totlvl(dm);
+               const int totlvl = MultiresDM_get_totlvl(dm);
                const int gridFaces = multires_side_tot[lvl - 2] - 1;
                const int edgeSize = multires_side_tot[lvl - 1] - 1;
                ListBase *map = MultiresDM_get_vert_face_map(dm);
@@ -1929,8 +1972,14 @@
                        ++d.subco;
                }
 
-               /* Propagate disps upwards */

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to