[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22900] branches/bmesh/blender/source/ blender: vpaint works with the new face structures, yay, though it probably still has issues, needs more testing.

Joseph Eagar joeedh at gmail.com
Sun Aug 30 23:30:07 CEST 2009


Revision: 22900
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22900
Author:   joeedh
Date:     2009-08-30 23:30:07 +0200 (Sun, 30 Aug 2009)

Log Message:
-----------
vpaint works with the new face structures, yay, though it probably still has issues, needs more testing.   also hopefully fixed subsurf crash everyone but me was getting, what I found should have caused crashes even for me, no idea why it did not.  also got face flags to work with subsurf, and partially got materials, though theres still a problem there.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h
    branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
    branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_vertex.c
    branches/bmesh/blender/source/blender/makesdna/DNA_meshdata_types.h
    branches/bmesh/blender/source/blender/makesrna/intern/rna_mesh.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h	2009-08-30 21:00:26 UTC (rev 22899)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h	2009-08-30 21:30:07 UTC (rev 22900)
@@ -226,7 +226,6 @@
 void *CustomData_get_layer_n(const struct CustomData *data, int type, int n);
 void *CustomData_get_layer_named(const struct CustomData *data, int type,
                                  char *name);
-
 int CustomData_get_layer_index(const struct CustomData *data, int type);
 int CustomData_get_named_layer_index(const struct CustomData *data, int type, char *name);
 int CustomData_get_active_layer_index(const struct CustomData *data, int type);

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2009-08-30 21:00:26 UTC (rev 22899)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2009-08-30 21:30:07 UTC (rev 22900)
@@ -57,11 +57,24 @@
 void BKE_mesh_end_editmesh(struct Mesh *me, struct EditMesh *em);
 struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me);
 
+/*
+  this function recreates a tesselation.
+  returns number of tesselation faces.
+ */
+int mesh_recalcTesselation(struct CustomData *fdata, struct CustomData *ldata, 
+	struct CustomData *pdata, struct MVert *mvert, int totface, 
+	int totloop, int totpoly);
+
 void unlink_mesh(struct Mesh *me);
 void free_mesh(struct Mesh *me);
 struct Mesh *add_mesh(char *name);
 struct Mesh *copy_mesh(struct Mesh *me);
 void mesh_update_customdata_pointers(struct Mesh *me);
+
+/*this ensures grouped customdata (e.g. mtexpoly and mloopuv and mtface, or
+  mloopcol and mcol) have the same relative active/render/clone/mask indices.*/
+void mesh_update_linked_customdata(struct Mesh *me);
+
 void make_local_tface(struct Mesh *me);
 void make_local_mesh(struct Mesh *me);
 void boundbox_mesh(struct Mesh *me, float *loc, float *size);

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h	2009-08-30 21:00:26 UTC (rev 22899)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h	2009-08-30 21:30:07 UTC (rev 22900)
@@ -54,3 +54,4 @@
 BMEditMesh *BMEdit_Create(BMesh *bm);
 BMEditMesh *BMEdit_Copy(BMEditMesh *tm);
 void BMEdit_Free(BMEditMesh *em);
+void BMEdit_UpdateLinkedCustomData(BMEditMesh *em);

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-08-30 21:00:26 UTC (rev 22899)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-08-30 21:30:07 UTC (rev 22900)
@@ -819,141 +819,14 @@
 
 }
 
-void cddm_loops_to_corners(CustomData *fdata, CustomData *ldata, 
-			   CustomData *pdata, int lindex[3], int findex, 
-			   int polyindex, int numTex, int numCol) 
-{
-	MTFace *texface;
-	MTexPoly *texpoly;
-	MCol *mcol;
-	MLoopCol *mloopcol;
-	MLoopUV *mloopuv;
-	int i, j;
-
-	for(i=0; i < numTex; i++){
-		texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
-		texpoly = CustomData_get_n(pdata, CD_MTEXPOLY, polyindex, i);
-		
-		texface->tpage = texpoly->tpage;
-		texface->flag = texpoly->flag;
-		texface->transp = texpoly->transp;
-		texface->mode = texpoly->mode;
-		texface->tile = texpoly->tile;
-		texface->unwrap = texpoly->unwrap;
-
-		for (j=0; j<3; j++) {
-			mloopuv = CustomData_get_n(ldata, CD_MLOOPUV, lindex[j], i);
-			texface->uv[j][0] = mloopuv->uv[0];
-			texface->uv[j][1] = mloopuv->uv[1];
-		}
-	}
-
-	for(i=0; i < numCol; i++){
-		mcol = CustomData_get_n(fdata, CD_MCOL, findex, i);
-
-		for (j=0; j<3; j++) {
-			mloopcol = CustomData_get_n(ldata, CD_MLOOPCOL, lindex[j], i);
-			mcol[j].r = mloopcol->r;
-			mcol[j].g = mloopcol->g;
-			mcol[j].b = mloopcol->b;
-			mcol[j].a = mloopcol->a;
-		}
-	}
-}
-
 static void cdDM_recalcTesselation(DerivedMesh *dm)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
-	MPoly *mp;
-	MLoop *ml;
-	MFace *mf = NULL;
-	V_DECLARE(mf);
-	EditVert *v, *lastv, *firstv;
-	EditFace *f;
-	V_DECLARE(origIndex);
-	int i, j, k, lindex[3], *origIndex = NULL, *polyorigIndex;
-	int numTex, numCol;
 
-	numTex = CustomData_number_of_layers(&dm->loopData, CD_MLOOPUV);
-	numCol = CustomData_number_of_layers(&dm->loopData, CD_MLOOPCOL);
+	dm->numFaceData = mesh_recalcTesselation(&dm->faceData, &dm->loopData, 
+		&dm->polyData, cddm->mvert, dm->numFaceData, dm->numLoopData, dm->numPolyData);
 	
-	k = 0;
-	mp = cddm->mpoly;
-	polyorigIndex = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
-	for (i=0; i<dm->numPolyData; i++, mp++) {
-		ml = cddm->mloop + mp->loopstart;
-		firstv = NULL;
-		lastv = NULL;
-		for (j=0; j<mp->totloop; j++, ml++) {
-			v = BLI_addfillvert(cddm->mvert[ml->v].co);
-			if (polyorigIndex)
-				v->tmp.l = polyorigIndex[i];
-			else
-				v->tmp.l = i;
-
-			v->keyindex = mp->loopstart + j;
-
-			if (lastv)
-				BLI_addfilledge(lastv, v);
-
-			if (!firstv)
-				firstv = v;
-			lastv = v;
-		}
-		BLI_addfilledge(lastv, firstv);
-		
-		BLI_edgefill(0, 0);
-		for (f=fillfacebase.first; f; f=f->next) {
-			V_GROW(mf);
-			V_GROW(origIndex);
-
-			/*these are loop indices, they'll be transformed
-			  into vert indices later.*/
-			mf[k].v1 = f->v1->keyindex;
-			mf[k].v2 = f->v2->keyindex;
-			mf[k].v3 = f->v3->keyindex;
-			origIndex[k] = f->v1->tmp.l;
-
-			k++;
-		}
-
-		BLI_end_edgefill();
-	}
-
-	memset(&dm->faceData, 0, sizeof(CustomData));
-	dm->numFaceData = k;
-	
-	CustomData_add_layer(&dm->faceData, CD_MFACE, CD_ASSIGN, mf, dm->numFaceData);
-	CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_ASSIGN, origIndex, dm->numFaceData);
-	CustomData_from_bmeshpoly(&dm->faceData, &dm->polyData, &dm->loopData, dm->numFaceData);
-
-	/*set convienence pointer*/
-	cddm->mface = mf;
-
-	for (i=0; i<dm->numFaceData; i++, mf++) {
-		lindex[0] = mf->v1;
-		lindex[1] = mf->v2;
-		lindex[2] = mf->v3;
-
-		/*ensure winding is correct*/
-		if (mf->v1 > mf->v2) {
-			SWAP(int, mf->v1, mf->v2);
-		}
-		if (mf->v2 > mf->v3) {
-			SWAP(int, mf->v2, mf->v3);
-		}
-		if (mf->v1 > mf->v2) {
-			SWAP(int, mf->v1, mf->v2);
-		}
-
-		/*transform loop indices to vert indices*/
-		mf->v1 = cddm->mloop[mf->v1].v;
-		mf->v2 = cddm->mloop[mf->v2].v;
-		mf->v3 = cddm->mloop[mf->v3].v;
-
-		cddm_loops_to_corners(&dm->faceData, &dm->loopData, &dm->polyData,
-			lindex, i, origIndex[i], numTex, numCol);
-	}
+	cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
 }
 
 static void cdDM_release(DerivedMesh *dm)

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2009-08-30 21:00:26 UTC (rev 22899)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2009-08-30 21:30:07 UTC (rev 22900)
@@ -213,6 +213,26 @@
 	}
 }
 
+void BMEdit_UpdateLinkedCustomData(BMEditMesh *em)
+{
+	BMesh *bm = em->bm;
+	int act;
+
+	if (CustomData_has_layer(&bm->pdata, CD_MTEXPOLY)) {
+		act = CustomData_get_active_layer(&bm->pdata, CD_MTEXPOLY);
+		CustomData_set_layer_active(&bm->ldata, CD_MLOOPUV, act);
+
+		act = CustomData_get_render_layer(&bm->pdata, CD_MTEXPOLY);
+		CustomData_set_layer_render(&bm->ldata, CD_MLOOPUV, act);
+
+		act = CustomData_get_clone_layer(&bm->pdata, CD_MTEXPOLY);
+		CustomData_set_layer_clone(&bm->ldata, CD_MLOOPUV, act);
+
+		act = CustomData_get_mask_layer(&bm->pdata, CD_MTEXPOLY);
+		CustomData_set_layer_mask(&bm->ldata, CD_MLOOPUV, act);
+	}
+}
+
 /*does not free the BMEditMesh struct itself*/
 void BMEdit_Free(BMEditMesh *em)
 {

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2009-08-30 21:00:26 UTC (rev 22899)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2009-08-30 21:30:07 UTC (rev 22900)
@@ -86,9 +86,72 @@
 	BMEdit_RecalcTesselation(me->edit_btmesh);
 }
 
+static void mesh_ensure_tesselation_customdata(Mesh *me)
+{
+	int tottex, totcol;
 
+	tottex = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+	totcol = CustomData_number_of_layers(&me->fdata, CD_MCOL);
+	
+	if (tottex != CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY) ||
+	    totcol != CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL))
+	{
+		CustomData_free(&me->fdata, me->totface);
+		memset(&me->fdata, 0, sizeof(&me->fdata));
+
+		CustomData_from_bmeshpoly(&me->fdata, &me->pdata, &me->ldata, me->totface);
+		printf("Warning! Tesselation uvs or vcol data got out of sync, had to reset!\n");
+	}
+}
+
+/*this ensures grouped customdata (e.g. mtexpoly and mloopuv and mtface, or
+  mloopcol and mcol) have the same relative active/render/clone/mask indices.*/
+void mesh_update_linked_customdata(Mesh *me)
+{
+	int act;
+
+	if (me->edit_btmesh)
+		BMEdit_UpdateLinkedCustomData(me->edit_btmesh);
+
+	mesh_ensure_tesselation_customdata(me);
+
+	if (CustomData_has_layer(&me->pdata, CD_MTEXPOLY)) {
+		act = CustomData_get_active_layer(&me->pdata, CD_MTEXPOLY);
+		CustomData_set_layer_active(&me->ldata, CD_MLOOPUV, act);
+		CustomData_set_layer_active(&me->fdata, CD_MTFACE, act);
+
+		act = CustomData_get_render_layer(&me->pdata, CD_MTEXPOLY);
+		CustomData_set_layer_render(&me->ldata, CD_MLOOPUV, act);
+		CustomData_set_layer_render(&me->fdata, CD_MTFACE, act);
+
+		act = CustomData_get_clone_layer(&me->pdata, CD_MTEXPOLY);
+		CustomData_set_layer_clone(&me->ldata, CD_MLOOPUV, act);
+		CustomData_set_layer_clone(&me->fdata, CD_MTFACE, act);
+
+		act = CustomData_get_mask_layer(&me->pdata, CD_MTEXPOLY);
+		CustomData_set_layer_mask(&me->ldata, CD_MLOOPUV, act);
+		CustomData_set_layer_mask(&me->fdata, CD_MTFACE, act);
+	}
+
+	if (CustomData_has_layer(&me->ldata, CD_MLOOPCOL)) {
+		act = CustomData_get_active_layer(&me->ldata, CD_MLOOPCOL);
+		CustomData_set_layer_active(&me->fdata, CD_MCOL, act);
+
+		act = CustomData_get_render_layer(&me->ldata, CD_MLOOPCOL);
+		CustomData_set_layer_render(&me->fdata, CD_MCOL, act);
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list