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