[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