[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16099] branches/soc-2008-nicholasbishop/ source/blender: For file loading and mesh joining, allow single-step subdivision (same result, just faster)

Nicholas Bishop nicholasbishop at gmail.com
Thu Aug 14 06:14:16 CEST 2008


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");
 	}
 }





More information about the Bf-blender-cvs mailing list