[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [10836] trunk/blender/source/blender: == Multires ==

Nicholas Bishop nicholasbishop at gmail.com
Fri Jun 1 04:21:13 CEST 2007


Revision: 10836
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=10836
Author:   nicholasbishop
Date:     2007-06-01 04:21:11 +0200 (Fri, 01 Jun 2007)

Log Message:
-----------
== Multires ==

* Moved the multires vertex data from struct MultiresLevel to struct Multires. There's no longer any reason to store data seperately for each level; it was just taking up extra memory.

* Incremented the subversion to 2 and adjusted do_versions to correctly load older files.

* Refactored the multires update process (which handles propagating changes to other levels)

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/include/multires.h
    trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
    trunk/blender/source/blender/src/multires-firstlevel.c
    trunk/blender/source/blender/src/multires.c

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2007-06-01 02:21:11 UTC (rev 10836)
@@ -44,7 +44,7 @@
 struct MemFile;
 
 #define BLENDER_VERSION			244
-#define BLENDER_SUBVERSION		1
+#define BLENDER_SUBVERSION		2
 
 #define BLENDER_MINVERSION		240
 #define BLENDER_MINSUBVERSION	0

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2007-06-01 02:21:11 UTC (rev 10836)
@@ -2272,7 +2272,7 @@
 		lvl= multires_level_n(me->mr, BLI_countlist(&me->mr->levels));
 		vert_copy= MEM_callocN(sizeof(float)*3*lvl->totvert, "multires vert_copy");
 		for(i=0; i<lvl->totvert; ++i)
-			VecCopyf(&vert_copy[i*3], lvl->verts[i].co);
+			VecCopyf(&vert_copy[i*3], me->mr->verts[i].co);
 	
 		/* Goto the pin level for multires */
 		me->mr->newlvl= me->mr->pinlvl;

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2007-06-01 02:21:11 UTC (rev 10836)
@@ -504,7 +504,7 @@
 		if(me->mr) {
 			lvl = multires_level_n(me->mr, me->mr->pinlvl);
 			vcos = MEM_callocN(sizeof(*vcos)*lvl->totvert, "orco mr mesh");
-			mvert = lvl->verts;
+			mvert = me->mr->verts;
 			totvert = lvl->totvert;
 		}
 		else {

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2007-06-01 02:21:11 UTC (rev 10836)
@@ -2554,6 +2554,8 @@
 			mesh->mr->edge_flags= MEM_callocN(sizeof(short)*lvl->totedge, "Multires Edge Flags");
 		if(!mesh->mr->edge_creases)
 			mesh->mr->edge_creases= MEM_callocN(sizeof(char)*lvl->totedge, "Multires Edge Creases");
+
+		mesh->mr->verts = newdataadr(fd, mesh->mr->verts);
 			
 		for(; lvl; lvl= lvl->next) {
 			lvl->verts= newdataadr(fd, lvl->verts);
@@ -6469,6 +6471,25 @@
 			for(sce= main->scene.first; sce; sce= sce->id.next)
 				sce->r.mode |= R_SSS;
 		}
+		if(main->versionfile != 244 || main->subversionfile < 2) {
+			/* Copy over old per-level multires vertex data
+			   into a single vertex array in struct Multires */
+			Mesh *me;
+			for(me = main->mesh.first; me; me=me->id.next) {
+				if(me->mr) {
+					MultiresLevel *lvl = me->mr->levels.last;
+					if(lvl) {
+						me->mr->verts = lvl->verts;
+						lvl->verts = NULL;
+						/* Don't need the other vert arrays */
+						for(lvl = lvl->prev; lvl; lvl = lvl->prev) {
+							MEM_freeN(lvl->verts);
+							lvl->verts = NULL;
+						}
+					}
+				}
+			}
+		}
 	}
 
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2007-06-01 02:21:11 UTC (rev 10836)
@@ -1156,13 +1156,17 @@
 					writedata(wd, DATA, sizeof(short)*lvl->totedge, mesh->mr->edge_flags);
 					writedata(wd, DATA, sizeof(char)*lvl->totedge, mesh->mr->edge_creases);
 				}
+
 				for(; lvl; lvl= lvl->next) {
 					writestruct(wd, DATA, "MultiresLevel", 1, lvl);
-					writestruct(wd, DATA, "MVert", lvl->totvert, lvl->verts);
 					writestruct(wd, DATA, "MultiresFace", lvl->totface, lvl->faces);
 					writestruct(wd, DATA, "MultiresEdge", lvl->totedge, lvl->edges);
 					writestruct(wd, DATA, "MultiresColFace", lvl->totface, lvl->colfaces);
 				}
+
+				lvl= mesh->mr->levels.last;
+				if(lvl)
+					writestruct(wd, DATA, "MVert", lvl->totvert, mesh->mr->verts);
 			}
 
 			/* PMV data */

Modified: trunk/blender/source/blender/include/multires.h
===================================================================
--- trunk/blender/source/blender/include/multires.h	2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/include/multires.h	2007-06-01 02:21:11 UTC (rev 10836)
@@ -31,6 +31,7 @@
 #define MULTIRES_H
 
 struct CustomData;
+struct EditMesh;
 struct Object;
 struct MDeformVert;
 struct Mesh;
@@ -65,6 +66,7 @@
 
 /* multires-firstlevel.c */
 /* Generic */
+void multires_update_first_level(struct Mesh *me, struct EditMesh *em);
 void multires_update_customdata(struct MultiresLevel *lvl1, struct CustomData *src,
                                 struct CustomData *dst, const int type);
 void multires_customdata_to_mesh(struct Mesh *me, struct EditMesh *em, struct MultiresLevel *lvl,

Modified: trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_meshdata_types.h	2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/makesdna/DNA_meshdata_types.h	2007-06-01 02:21:11 UTC (rev 10836)
@@ -109,7 +109,6 @@
 typedef struct MultiresLevel {
 	struct MultiresLevel *next, *prev;
 
-	MVert *verts;
 	MultiresFace *faces;
 	MultiresColFace *colfaces;
 	MultiresEdge *edges;
@@ -118,10 +117,15 @@
 	struct MultiresMapNode *map_mem;
 
 	unsigned int totvert, totface, totedge, pad;
+
+	/* Kept for compatibility with older files */
+	MVert *verts;
 } MultiresLevel;
 
 typedef struct Multires {
 	ListBase levels;
+	MVert *verts;
+
 	unsigned char level_count, current, newlvl, edgelvl, pinlvl, renderlvl;
 	unsigned char use_col, pad;
 

Modified: trunk/blender/source/blender/src/multires-firstlevel.c
===================================================================
--- trunk/blender/source/blender/src/multires-firstlevel.c	2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/src/multires-firstlevel.c	2007-06-01 02:21:11 UTC (rev 10836)
@@ -55,6 +55,8 @@
 
 MDeformVert *subdivide_dverts(MDeformVert *src, MultiresLevel *lvl);
 MTFace *subdivide_mtfaces(MTFace *src, MultiresLevel *lvl);
+void multires_update_edge_flags(Mesh *me, EditMesh *em);
+void eed_to_medge_flag(EditEdge *eed, short *flag, char *crease);
 
 /***********    Generic     ***********/
 
@@ -221,6 +223,41 @@
 	mr->fdata= cdf;
 }
 
+/* Update all special first-level data, if the first-level is active */
+void multires_update_first_level(Mesh *me, EditMesh *em)
+{
+	if(me && me->mr && me->mr->current == 1) {
+		multires_update_customdata(me->mr->levels.first, em ? &em->vdata : &me->vdata,
+		                           &me->mr->vdata, CD_MDEFORMVERT);
+		multires_update_customdata(me->mr->levels.first, em ? &em->fdata : &me->fdata,
+		                           &me->mr->fdata, CD_MTFACE);
+		multires_update_edge_flags(me, em);
+	}
+}
+
+/*********** Multires.edge_flags ***********/
+void multires_update_edge_flags(Mesh *me, EditMesh *em)
+{
+	MultiresLevel *lvl= me->mr->levels.first;
+	EditEdge *eed= NULL;
+	int i;
+	
+	if(em) eed= em->edges.first;
+	for(i=0; i<lvl->totedge; ++i) {
+		if(em) {
+			me->mr->edge_flags[i]= 0;
+			eed_to_medge_flag(eed, &me->mr->edge_flags[i], &me->mr->edge_creases[i]);
+			eed= eed->next;
+		}
+		else {
+			me->mr->edge_flags[i]= me->medge[i].flag;
+			me->mr->edge_creases[i]= me->medge[i].crease;
+		}
+	}
+}
+
+
+
 /*********** Multires.vdata ***********/
 
 /* MDeformVert */

Modified: trunk/blender/source/blender/src/multires.c
===================================================================
--- trunk/blender/source/blender/src/multires.c	2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/src/multires.c	2007-06-01 02:21:11 UTC (rev 10836)
@@ -484,13 +484,14 @@
 		tmp.v3= efa->v3->tmp.l;
 		tmp.v4= 0;
 		if(efa->v4) tmp.v4= efa->v4->tmp.l;
-		tmp.flag= efa->flag;
-		if(efa->f & 1) tmp.flag |= ME_FACE_SEL;
-		else f->flag &= ~ME_FACE_SEL;
-		if(efa->h) tmp.flag |= ME_HIDE;
 		test_index_face(&tmp, NULL, 0, efa->v4?4:3);
 		for(j=0; j<4; ++j) f->v[j]= (&tmp.v1)[j];
-		f->flag= tmp.flag;
+
+		/* Flags */
+		f->flag= efa->flag;
+		if(efa->f & 1) f->flag |= ME_FACE_SEL;
+		else f->flag &= ~ME_FACE_SEL;
+		if(efa->h) f->flag |= ME_HIDE;
 		f->mat_nr= efa->mat_nr;
 	} else {		
 		f->v[0]= m->v1;
@@ -575,12 +576,12 @@
 
 	/* Load vertices and vdata (MDeformVerts) */
 	lvl->totvert= em ? BLI_countlist(&em->verts) : me->totvert;
-	lvl->verts= MEM_callocN(sizeof(MVert)*lvl->totvert,"multires verts");
+	me->mr->verts= MEM_callocN(sizeof(MVert)*lvl->totvert,"multires verts");
 	multires_update_customdata(me->mr->levels.first, em ? &em->vdata : &me->vdata,
 	                           &me->mr->vdata, CD_MDEFORMVERT);
 	if(em) eve= em->verts.first;
 	for(i=0; i<lvl->totvert; ++i) {
-		multires_get_vert(&lvl->verts[i], eve, &me->mvert[i], i);
+		multires_get_vert(&me->mr->verts[i], eve, &me->mvert[i], i);
 		if(em) eve= eve->next;
 	}
 
@@ -636,7 +637,6 @@
 		MultiresLevel *lvl= MEM_dupallocN(orig);
 		
 		lvl->next= lvl->prev= NULL;
-		lvl->verts= MEM_dupallocN(orig->verts);
 		lvl->faces= MEM_dupallocN(orig->faces);
 		lvl->colfaces= MEM_dupallocN(orig->colfaces);
 		lvl->edges= MEM_dupallocN(orig->edges);
@@ -658,6 +658,8 @@
 		
 		for(lvl= orig->levels.first; lvl; lvl= lvl->next)
 			BLI_addtail(&mr->levels, multires_level_copy(lvl));
+
+		mr->verts= MEM_dupallocN(orig->verts);
 		
 		lvl= mr->levels.first;
 		if(lvl) {
@@ -690,6 +692,8 @@
 			lvl= lvl->next;
 		}
 
+		MEM_freeN(mr->verts);
+
 		BLI_freelistN(&mr->levels);
 
 		MEM_freeN(mr);
@@ -700,7 +704,6 @@
 void multires_free_level(MultiresLevel *lvl)
 {
 	if(lvl) {
-		if(lvl->verts) MEM_freeN(lvl->verts);
 		if(lvl->faces) MEM_freeN(lvl->faces);
 		if(lvl->edges) MEM_freeN(lvl->edges);
 		if(lvl->colfaces) MEM_freeN(lvl->colfaces);
@@ -844,6 +847,7 @@
 	Mesh *me= me_v;
 	MultiresLevel *lvl= MEM_callocN(sizeof(MultiresLevel), "multireslevel");
 	MultiApplyData data;
+	MVert *oldverts= NULL;
 	
 	multires_check_state();
 
@@ -859,15 +863,16 @@
 	/* Create vertices
 	   =============== */
 	lvl->totvert= lvl->prev->totvert + lvl->prev->totedge + lvl->prev->totface;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list