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

Nicholas Bishop nicholasbishop at gmail.com
Wed Dec 26 11:43:51 CET 2007


Revision: 13002
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13002
Author:   nicholasbishop
Date:     2007-12-26 11:43:51 +0100 (Wed, 26 Dec 2007)

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

Fixed bad level calls within multires usage.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_multires.h
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/include/multires.h
    trunk/blender/source/blender/python/api2_2x/Mesh.c
    trunk/blender/source/blender/src/buttons_editing.c
    trunk/blender/source/blender/src/multires.c
    trunk/blender/source/blender/src/space.c

Modified: trunk/blender/source/blender/blenkernel/BKE_multires.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_multires.h	2007-12-26 09:39:15 UTC (rev 13001)
+++ trunk/blender/source/blender/blenkernel/BKE_multires.h	2007-12-26 10:43:51 UTC (rev 13002)
@@ -53,6 +53,7 @@
 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, MCol mcol[4]);
 /* After adding or removing vcolor layers, run this */
 void multires_load_cols(struct Mesh *me);
 

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2007-12-26 09:39:15 UTC (rev 13001)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2007-12-26 10:43:51 UTC (rev 13002)
@@ -994,19 +994,6 @@
 	return -1;
 }
 
-static void medge_flag_to_eed(const short flag, const char crease, EditEdge *eed)
-{
-	if(!eed) return;
-	
-	if(flag & ME_SEAM) eed->seam= 1;
-	if(flag & ME_SHARP) eed->sharp = 1;
-	if(flag & SELECT) eed->f |= SELECT;
-	if(flag & ME_FGON) eed->h= EM_FGON;
-	if(flag & ME_HIDE) eed->h |= 1;
-	
-	eed->crease= ((float)crease)/255.0;
-}
-
 static float clamp_component(const float c)
 {
 	if(c<0) return 0;
@@ -1014,7 +1001,7 @@
 	else return c;
 }
 
-static void multires_to_mcol(MultiresColFace *f, MCol mcol[4])
+void multires_to_mcol(MultiresColFace *f, MCol mcol[4])
 {
 	unsigned char j;
 	for(j=0; j<4; ++j) {
@@ -1031,88 +1018,51 @@
 	MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
 	int i;
 	EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL;
-	EditVert **eves= NULL;
-	EditEdge *eed= NULL;
 	
-	if(em) {
-		/* Remove editmesh elements */
-		free_editMesh(em);
+	if(em)
+		return;
+
+	CustomData_free_layer_active(&me->vdata, CD_MVERT, me->totvert);
+	CustomData_free_layer_active(&me->edata, CD_MEDGE, me->totedge);
+	CustomData_free_layer_active(&me->fdata, CD_MFACE, me->totface);
+	CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
+	CustomData_free_layers(&me->fdata, CD_MTFACE, me->totface);
+	CustomData_free_layers(&me->fdata, CD_MCOL, me->totface);
 		
-		eves= MEM_callocN(sizeof(EditVert*)*lvl->totvert, "editvert pointers");
-	} else {
-		CustomData_free_layer_active(&me->vdata, CD_MVERT, me->totvert);
-		CustomData_free_layer_active(&me->edata, CD_MEDGE, me->totedge);
-		CustomData_free_layer_active(&me->fdata, CD_MFACE, me->totface);
-		CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
-		CustomData_free_layers(&me->fdata, CD_MTFACE, me->totface);
-		CustomData_free_layers(&me->fdata, CD_MCOL, me->totface);
-		
-		me->totvert= lvl->totvert;
-		me->totface= lvl->totface;
-		me->totedge= lvl->totedge;
+	me->totvert= lvl->totvert;
+	me->totface= lvl->totface;
+	me->totedge= lvl->totedge;
 
-		CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
-		CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, me->totedge);
-		CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface);
-		mesh_update_customdata_pointers(me);
-	}
+	CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
+	CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, me->totedge);
+	CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface);
+	mesh_update_customdata_pointers(me);
 
 	/* Vertices/Edges/Faces */
 	
 	for(i=0; i<lvl->totvert; ++i) {
-		if(em) {
-			eves[i]= addvertlist(me->mr->verts[i].co, NULL);
-			if(me->mr->verts[i].flag & 1) eves[i]->f |= SELECT;
-			if(me->mr->verts[i].flag & ME_HIDE) eves[i]->h= 1;
-			eves[i]->data= NULL;
-		}
-		else
-			me->mvert[i]= me->mr->verts[i];
+		me->mvert[i]= me->mr->verts[i];
 	}
 	for(i=0; i<lvl->totedge; ++i) {
-		if(em) {
-			addedgelist(eves[lvl->edges[i].v[0]], eves[lvl->edges[i].v[1]], NULL);
-		} else {
-			me->medge[i].v1= lvl->edges[i].v[0];
-			me->medge[i].v2= lvl->edges[i].v[1];
-			me->medge[i].flag &= ~ME_HIDE;
-		}
+		me->medge[i].v1= lvl->edges[i].v[0];
+		me->medge[i].v2= lvl->edges[i].v[1];
+		me->medge[i].flag &= ~ME_HIDE;
 	}
 	for(i=0; i<lvl->totface; ++i) {
-		if(em) {
-			EditVert *eve4= lvl->faces[i].v[3] ? eves[lvl->faces[i].v[3]] : NULL;
-			EditFace *efa= addfacelist(eves[lvl->faces[i].v[0]], eves[lvl->faces[i].v[1]],
-			               eves[lvl->faces[i].v[2]], eve4, NULL, NULL);
-			efa->flag= lvl->faces[i].flag & ~ME_HIDE;
-			efa->mat_nr= lvl->faces[i].mat_nr;
-			if(lvl->faces[i].flag & ME_FACE_SEL)
-				efa->f |= SELECT;
-			if(lvl->faces[i].flag & ME_HIDE) efa->h= 1;
-			efa->data= NULL;
-		}
-		else {
-			me->mface[i].v1= lvl->faces[i].v[0];
-			me->mface[i].v2= lvl->faces[i].v[1];
-			me->mface[i].v3= lvl->faces[i].v[2];
-			me->mface[i].v4= lvl->faces[i].v[3];
-			me->mface[i].flag= lvl->faces[i].flag;
-			me->mface[i].flag &= ~ME_HIDE;
-			me->mface[i].mat_nr= lvl->faces[i].mat_nr;
-		}
+		me->mface[i].v1= lvl->faces[i].v[0];
+		me->mface[i].v2= lvl->faces[i].v[1];
+		me->mface[i].v3= lvl->faces[i].v[2];
+		me->mface[i].v4= lvl->faces[i].v[3];
+		me->mface[i].flag= lvl->faces[i].flag;
+		me->mface[i].flag &= ~ME_HIDE;
+		me->mface[i].mat_nr= lvl->faces[i].mat_nr;
 	}
 	
 	/* Edge flags */
-	if(em) eed= em->edges.first;
 	if(lvl==me->mr->levels.first) {
 		for(i=0; i<lvl->totedge; ++i) {
-			if(em) {
-				medge_flag_to_eed(me->mr->edge_flags[i], me->mr->edge_creases[i], eed);
-				eed= eed->next;
-			}
-			else {
-				me->medge[i].flag= me->mr->edge_flags[i];
-				me->medge[i].crease= me->mr->edge_creases[i];
-			}
+			me->medge[i].flag= me->mr->edge_flags[i];
+			me->medge[i].crease= me->mr->edge_creases[i];
 		}
 	} else {
 		MultiresLevel *lvl1= me->mr->levels.first;
@@ -1120,67 +1070,32 @@
 		for(i=0; i<last; ++i) {
 			const int ndx= i / pow(2, me->mr->current-1);
 			
-			if(em) {
-				medge_flag_to_eed(me->mr->edge_flags[ndx], me->mr->edge_creases[ndx], eed);
-				eed= eed->next;
-			}
-			else {
-				me->medge[i].flag= me->mr->edge_flags[ndx];
-				me->medge[i].crease= me->mr->edge_creases[ndx];
-			}
+			me->medge[i].flag= me->mr->edge_flags[ndx];
+			me->medge[i].crease= me->mr->edge_creases[ndx];
 		}
 	}
 
-	if(em) {
-		eed= em->edges.first;
-		for(i=0, eed= em->edges.first; i<lvl->totedge; ++i, eed= eed->next) {
-			eed->h= me->mr->verts[lvl->edges[i].v[0]].flag & ME_HIDE ||
-				me->mr->verts[lvl->edges[i].v[1]].flag & ME_HIDE;
-		}
-	}
-	
-	EM_select_flush();
-
 	multires_customdata_to_mesh(me, em, lvl, &me->mr->vdata, em ? &em->vdata : &me->vdata, CD_MDEFORMVERT);
 	multires_customdata_to_mesh(me, em, lvl, &me->mr->fdata, em ? &em->fdata : &me->fdata, CD_MTFACE);
 
 	/* Colors */
 	if(me->mr->use_col) {
-		MCol c[4];
-		EditFace *efa= NULL;
-		CustomData *src= em ? &em->fdata : &me->fdata;
-		if(em) {
-			if(me->mr->use_col) EM_add_data_layer(src, CD_MCOL);
-			efa= em->faces.first;
-		}
-		else {
-			if(me->mr->use_col) me->mcol= CustomData_add_layer(src, CD_MCOL, CD_CALLOC, NULL, me->totface);
-		}
+		CustomData *src= &me->fdata;
 		
+		if(me->mr->use_col) me->mcol= CustomData_add_layer(src, CD_MCOL, CD_CALLOC, NULL, me->totface);
+		
 		for(i=0; i<lvl->totface; ++i) {
-			if(em) {
-				if(me->mr->use_col) {
-					multires_to_mcol(&lvl->colfaces[i], c);
-					CustomData_em_set(src, efa->data, CD_MCOL, c);
-				}
-				efa= efa->next;
-			}
-			else if(me->mr->use_col) multires_to_mcol(&lvl->colfaces[i], &me->mcol[i*4]);
+			if(me->mr->use_col)
+				multires_to_mcol(&lvl->colfaces[i], &me->mcol[i*4]);
 		}
 			
 	}
 	
 	mesh_update_customdata_pointers(me);
 	
-	if(em) {
-		MEM_freeN(eves);
-		DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
-		recalc_editnormals();
-	} else {
-		multires_edge_level_update(ob,me);
-		DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
-		mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
-	}
+	multires_edge_level_update(ob,me);
+	DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+	mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
 }
 
 void multires_add_level(Object *ob, Mesh *me, const char subdiv_type)

Modified: trunk/blender/source/blender/include/multires.h
===================================================================
--- trunk/blender/source/blender/include/multires.h	2007-12-26 09:39:15 UTC (rev 13001)
+++ trunk/blender/source/blender/include/multires.h	2007-12-26 10:43:51 UTC (rev 13002)
@@ -47,6 +47,7 @@
 
 void multires_make(void *ob, void *me);
 void multires_delete(void *ob, void *me);
+void multires_level_to_editmesh(struct Object *ob, struct Mesh *me, const int render);
 void multires_subdivide(void *ob, void *me);
 void multires_del_lower(void *ob, void *me);
 void multires_del_higher(void *ob, void *me);

Modified: trunk/blender/source/blender/python/api2_2x/Mesh.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Mesh.c	2007-12-26 09:39:15 UTC (rev 13001)
+++ trunk/blender/source/blender/python/api2_2x/Mesh.c	2007-12-26 10:43:51 UTC (rev 13002)
@@ -7161,7 +7161,7 @@
 	switch ((int)type) {
 	case MESH_MULTIRES_LEVEL:
 		self->mesh->mr->newlvl = i;
-		multires_set_level(self->object, self->mesh, 0);
+		multires_set_level_cb(self->object, self->mesh);
 		break;
 	case MESH_MULTIRES_EDGE:
 		self->mesh->mr->edgelvl = i;

Modified: trunk/blender/source/blender/src/buttons_editing.c
===================================================================
--- trunk/blender/source/blender/src/buttons_editing.c	2007-12-26 09:39:15 UTC (rev 13001)
+++ trunk/blender/source/blender/src/buttons_editing.c	2007-12-26 10:43:51 UTC (rev 13002)
@@ -737,6 +737,7 @@
 	   from the data stored in multires */
 	if(me && me->mr) {
 		multires_delete_layer(me, &me->mr->fdata, type, layer - &data->layers[index]);
+		multires_level_to_editmesh(OBACT, me, 0);
 	}
 	else if(G.obedit) {
 		EM_free_data_layer(data, type);
@@ -4468,6 +4469,7 @@
 
 			if(me && me->mr) {
 				multires_add_layer(me, &me->mr->fdata, CD_MTFACE, layernum);
+				multires_level_to_editmesh(ob, me, 0);
 			}
 			else if(G.obedit) {
 				EM_add_data_layer(&em->fdata, CD_MTFACE);

Modified: trunk/blender/source/blender/src/multires.c

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list