Revision: 16099
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16099
Author:   nicholasbishop
Date:     2008-08-14 06:14:13 +0200 (Thu, 14 Aug 2008)

Log Message:
-----------
For file loading and mesh joining, allow single-step subdivision (same result, 
just faster)

Modified Paths:
--------------
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
    branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c
    branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-08-14 03:23:36 UTC (rev 16098)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-08-14 04:14:13 UTC (rev 16099)
@@ -27,50 +27,12 @@
  * ***** END GPL LICENSE BLOCK *****
  */ 
 
-struct CustomData;
-struct EditMesh;
-struct MCol;
-struct Multires;
-struct MultiresColFace;
-struct MultiresLevel;
+struct DerivedMesh;
 struct Mesh;
+struct MFace;
+struct Multires;
 struct Object;
 
-/* Level access */
-struct MultiresLevel *multires_level_n(struct Multires *mr, int n);
-
-/* Level control */
-void multires_set_level(struct Object *ob, struct Mesh *me, const int render);
-void multires_free_level(struct MultiresLevel *lvl);
-
-void multires_edge_level_update(struct Object *ob, struct Mesh *me);
-
-void multires_free(struct Multires *mr);
-struct Multires *multires_copy(struct Multires *orig);
-void multires_create(struct Object *ob, struct Mesh *me);
-
-/* CustomData */
-void multires_delete_layer(struct Mesh *me, struct CustomData *cd, const int 
type, int n);
-void multires_add_layer(struct Mesh *me, struct CustomData *cd, const int 
type, const int n);
-void multires_del_lower_customdata(struct Multires *mr, struct MultiresLevel 
*cr_lvl);
-void multires_to_mcol(struct MultiresColFace *f, struct MCol *mcol);
-/* After adding or removing vcolor layers, run this */
-void multires_load_cols(struct Mesh *me);
-
-/* Private (used in multires-firstlevel.c) */
-void multires_level_to_mesh(struct Object *ob, struct Mesh *me, const int 
render);
-void multires_update_levels(struct Mesh *me, const int render);
-void multires_update_first_level(struct Mesh *me, struct EditMesh *em);
-void multires_update_customdata(struct MultiresLevel *lvl1, struct EditMesh 
*em, struct CustomData *src,
-                               struct CustomData *dst, const int type);
-void multires_customdata_to_mesh(struct Mesh *me, struct EditMesh *em,
-                                struct MultiresLevel *lvl, struct CustomData 
*src,
-                                 struct CustomData *dst, const int type);
-
-struct DerivedMesh;
-struct MFace;
-struct MEdge;
-
 typedef struct MultiresSubsurf {
        struct Mesh *me;
        int totlvl, lvl;
@@ -81,6 +43,8 @@
        int index;
 } IndexNode;
 
+void multires_free(struct Multires*);
+
 void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace 
*mface,
                          const int totvert, const int totface);
 
@@ -125,7 +89,6 @@
        int x, y, ax, ay;
 } MultiresDisplacer;
 
-
 void multires_load_old(struct DerivedMesh *, struct Multires *);
 void multires_force_update(struct Object *ob);
 
@@ -134,7 +97,8 @@
 
 int multiresModifier_switch_level(struct Object *ob, const int);
 void multiresModifier_join(struct Object *ob);
-void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct 
Object *ob, int updateblock, int simple);
+void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct 
Object *ob, int distance,
+                               int updateblock, int simple);
 void multiresModifier_setLevel(void *mmd_v, void *ob_v);
 int multiresModifier_reshape(struct MultiresModifierData *mmd, struct Object 
*dst, struct Object *src);
 

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-08-14 03:23:36 UTC (rev 16098)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-08-14 04:14:13 UTC (rev 16099)
@@ -475,13 +475,8 @@
                                BLI_insertlinkbefore(&base->object->modifiers, 
md, mmd);
                        }
 
-                       if(mmd) {
-                               int i;
-
-                               /* TODO: subdivision should be doable in one 
step rather than iteratively. */
-                               for(i = mmd->totlvl; i < highest_lvl; ++i)
-                                       multiresModifier_subdivide(mmd, 
base->object, 0, 0);
-                       }
+                       if(mmd)
+                               multiresModifier_subdivide(mmd, base->object, 
highest_lvl - mmd->totlvl, 0, 0);
                }
                base = base->next;
        }
@@ -763,7 +758,7 @@
        mrdm->release(mrdm);
 }
 
-void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int 
updateblock, int simple)
+void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int 
distance, int updateblock, int simple)
 {
        DerivedMesh *final = NULL;
        int totsubvert, totsubface, totsubedge;
@@ -771,6 +766,9 @@
        MDisps *mdisps;
        int i;
 
+       if(distance == 0)
+               return;
+
        if(mmd->totlvl == multires_max_levels) {
                // TODO
                return;
@@ -778,8 +776,8 @@
 
        multires_force_update(ob);
 
-       ++mmd->lvl;
-       ++mmd->totlvl;
+       mmd->lvl = mmd->totlvl;
+       mmd->totlvl += distance;
 
        mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
        if(!mdisps)
@@ -790,7 +788,7 @@
                MultiresModifierData mmd_sub;
 
                orig = CDDM_from_mesh(me, NULL);
-               mmd_sub.lvl = mmd_sub.totlvl = mmd->totlvl - 1;
+               mmd_sub.lvl = mmd_sub.totlvl = mmd->lvl;
                mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 
0);
                totsubvert = mrdm->getNumVerts(mrdm);
                totsubedge = mrdm->getNumEdges(mrdm);
@@ -798,13 +796,13 @@
                orig->needsFree = 1;
                orig->release(orig);
                
-               final = multires_subdisp_pre(mrdm, 1, simple);
+               final = multires_subdisp_pre(mrdm, distance, simple);
                mrdm->needsFree = 1;
+               *MultiresDM_get_flags(mrdm) |= MULTIRES_DM_UPDATE_BLOCK;
                mrdm->release(mrdm);
        }
 
        for(i = 0; i < me->totface; ++i) {
-               //const int totdisp = (me->mface[i].v4 ? 
multires_quad_tot[totlvl] : multires_tri_tot[totlvl]);
                const int totdisp = multires_quad_tot[mmd->totlvl - 1];
                float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, 
"multires disps");
 
@@ -821,11 +819,13 @@
 
                orig = CDDM_from_mesh(me, NULL);
 
-               multires_subdisp(orig, me, final, mmd->totlvl - 1, mmd->totlvl, 
totsubvert, totsubedge, totsubface, 0);
+               multires_subdisp(orig, me, final, mmd->lvl, mmd->totlvl, 
totsubvert, totsubedge, totsubface, 0);
 
                orig->needsFree = 1;
                orig->release(orig);
        }
+
+       mmd->lvl = mmd->totlvl;
 }
 
 void multiresModifier_setLevel(void *mmd_v, void *ob_v)

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c    
    2008-08-14 03:23:36 UTC (rev 16098)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c    
    2008-08-14 04:14:13 UTC (rev 16099)
@@ -7843,8 +7843,7 @@
                                        mmd = 
(MultiresModifierData*)modifier_new(eModifierType_Multires);
                                        BLI_insertlinkbefore(&ob->modifiers, 
md, mmd);
 
-                                       for(i = 1; i < me->mr->level_count; ++i)
-                                               multiresModifier_subdivide(mmd, 
ob, 1, 0);
+                                       multiresModifier_subdivide(mmd, ob, 
me->mr->level_count - 1, 1, 0);
 
                                        mmd->lvl = mmd->totlvl;
                                        orig = CDDM_from_mesh(me, NULL);

Modified: branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c       
2008-08-14 03:23:36 UTC (rev 16098)
+++ branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c       
2008-08-14 04:14:13 UTC (rev 16099)
@@ -1658,7 +1658,7 @@
        MultiresModifierData *mmd = mmd_v;
 
        if(mmd && ob_v) {
-               multiresModifier_subdivide(mmd, ob_v, 0, mmd->simple);
+               multiresModifier_subdivide(mmd, ob_v, 1, 0, mmd->simple);
                BIF_undo_push("Multires subdivide");
        }
 }


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to