diff options
author | Joseph Eagar <joeedh@gmail.com> | 2009-07-24 14:43:58 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2009-07-24 14:43:58 +0400 |
commit | 62a847d741ed35a56d01197bf2dd0a2d8c8ce8cf (patch) | |
tree | 94924b59855ee012443b03844feebcf22cf96fda /source/blender | |
parent | c691b2b037fe5030726340a6461ceba1573074f5 (diff) |
uv texture (though not glsl) works now. also fixed some bugs. still some issues left, and for some reason textured objs aren't displaying properly in object mode.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/editderivedbmesh.c | 252 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifiers_bmesh.c | 2 | ||||
-rw-r--r-- | source/blender/bmesh/bmesh.h | 4 | ||||
-rw-r--r-- | source/blender/bmesh/operators/removedoubles.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawmesh.c | 59 |
7 files changed, 231 insertions, 94 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 20bcfcac373..6288e5d71b0 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -316,7 +316,7 @@ struct DerivedMesh { */ void (*drawFacesTex)(DerivedMesh *dm, int (*setDrawOptions)(struct MTFace *tface, - struct MCol *mcol, int matnr)); + int has_vcol, int matnr)); /* Draw all faces with GLSL materials * o setMaterial is called for every different material nr diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index e8cba86709a..c1e412458ee 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -394,7 +394,7 @@ static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned cha } static void cdDM_drawFacesTex_common(DerivedMesh *dm, - int (*drawParams)(MTFace *tface, MCol *mcol, int matnr), + int (*drawParams)(MTFace *tface, int has_vcol, int matnr), int (*drawParamsMapped)(void *userData, int index), void *userData) { @@ -412,7 +412,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, unsigned char *cp = NULL; if(drawParams) { - flag = drawParams(tf? &tf[i]: NULL, mcol? &mcol[i*4]: NULL, mf->mat_nr); + flag = drawParams(tf? &tf[i]: NULL, mcol != NULL, mf->mat_nr); } else { if(index) { diff --git a/source/blender/blenkernel/intern/editderivedbmesh.c b/source/blender/blenkernel/intern/editderivedbmesh.c index cbac230c118..2d8e61b41ce 100644 --- a/source/blender/blenkernel/intern/editderivedbmesh.c +++ b/source/blender/blenkernel/intern/editderivedbmesh.c @@ -417,7 +417,7 @@ static void bmDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *us BMIter viter; eve = BMIter_New(&viter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&viter)) { + for (i=0; eve; eve=BMIter_Step(&viter), i++) { BMINDEX_SET(eve, i); } @@ -532,11 +532,19 @@ static void bmDM__calcFaceCent(BMesh *bm, BMFace *efa, float cent[3], cent[0] = cent[1] = cent[2] = 0.0f; /*simple (and stupid) median (average) based method :/ */ - - l = BMIter_New(&iter, bm, BM_LOOPS_OF_FACE, efa); - for (; l; l=BMIter_Step(&iter)) { - VECADD(cent, cent, l->v->co); - tot++; + + if (vertexCos) { + l = BMIter_New(&iter, bm, BM_LOOPS_OF_FACE, efa); + for (; l; l=BMIter_Step(&iter)) { + VECADD(cent, cent, vertexCos[BMINDEX_GET(l->v)]); + tot++; + } + } else { + l = BMIter_New(&iter, bm, BM_LOOPS_OF_FACE, efa); + for (; l; l=BMIter_Step(&iter)) { + VECADD(cent, cent, l->v->co); + tot++; + } } if (tot==0) return; @@ -554,7 +562,7 @@ static void bmDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *use if (bmdm->vertexCos) { eve = BMIter_New(&iter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&iter)); + for (i=0; eve; eve=BMIter_Step(&iter), i++) BMINDEX_SET(eve, i); } @@ -576,7 +584,7 @@ static void bmDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us BMVert *eve; eve = BMIter_New(&iter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL); - for (i=0; eve; eve=BMIter_Step(&iter)) + for (i=0; eve; eve=BMIter_Step(&iter), i++) BMINDEX_SET(eve, i); efa = BMIter_New(&iter, bmdm->tc->bm, BM_FACES_OF_MESH, NULL); @@ -587,8 +595,8 @@ static void bmDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us BMLoop **l = bmdm->tc->looptris[i]; int drawSmooth; - drawSmooth = (efa->head.flag & BM_SMOOTH); efa = l[0]->f; + drawSmooth = (efa->head.flag & BM_SMOOTH); draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, BMINDEX_GET(efa), &drawSmooth); if(draw) { @@ -602,7 +610,7 @@ static void bmDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us glBegin(GL_TRIANGLES); if (!drawSmooth) { - glNormal3fv(efa->no); + glNormal3fv(bmdm->faceNos[i]); glVertex3fv(bmdm->vertexCos[(int) BMINDEX_GET(l[0]->v)]); glVertex3fv(bmdm->vertexCos[(int) BMINDEX_GET(l[1]->v)]); glVertex3fv(bmdm->vertexCos[(int) BMINDEX_GET(l[2]->v)]); @@ -630,7 +638,6 @@ static void bmDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us int drawSmooth; efa = l[0]->f; - drawSmooth = (efa->head.flag & BM_SMOOTH); draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, BMINDEX_GET(efa), &drawSmooth); @@ -664,102 +671,211 @@ static void bmDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us } } +static void bmdm_get_tri_tex(BMesh *bm, BMLoop **ls, MLoopUV *luv[3], MLoopCol *lcol[3], + int has_uv, int has_col) +{ + if (has_uv) { + luv[0] = CustomData_bmesh_get(&bm->ldata, ls[0]->head.data, CD_MLOOPUV); + luv[1] = CustomData_bmesh_get(&bm->ldata, ls[1]->head.data, CD_MLOOPUV); + luv[2] = CustomData_bmesh_get(&bm->ldata, ls[2]->head.data, CD_MLOOPUV); + } + + if (has_col) { + lcol[0] = CustomData_bmesh_get(&bm->ldata, ls[0]->head.data, CD_MLOOPCOL); + lcol[1] = CustomData_bmesh_get(&bm->ldata, ls[1]->head.data, CD_MLOOPCOL); + lcol[2] = CustomData_bmesh_get(&bm->ldata, ls[2]->head.data, CD_MLOOPCOL); + } + + +} + static void bmDM_drawFacesTex_common(DerivedMesh *dm, - int (*drawParams)(MTFace *tface, MCol *mcol, int matnr), + int (*drawParams)(MTFace *tface, int has_vcol, int matnr), int (*drawParamsMapped)(void *userData, int index), void *userData) { -#if 0 EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm; + BMEditMesh *em = bmdm->tc; BMesh *bm= bmdm->tc->bm; float (*vertexCos)[3]= bmdm->vertexCos; float (*vertexNos)[3]= bmdm->vertexNos; BMFace *efa; + BMVert *eve; BMIter iter; - int i; + MLoopUV *luv[3], dummyluv = {0}; + MLoopCol *lcol[3], dummylcol = {0}; + int i, has_vcol = CustomData_has_layer(&bm->ldata, CD_MLOOPCOL); + int has_uv = CustomData_has_layer(&bm->pdata, CD_MTEXPOLY); + + luv[0] = luv[1] = luv[2] = &dummyluv; + lcol[0] = lcol[1] = lcol[2] = &dummylcol; + + dummylcol.a = dummylcol.r = dummylcol.g = dummylcol.b = 255; /* always use smooth shading even for flat faces, else vertex colors wont interpolate */ glShadeModel(GL_SMOOTH); - if (vertexCos) { - BMVert *eve; + i = 0; + BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) + BMINDEX_SET(efa, i++); - for (i=0,eve=bm->verts.first; eve; eve= eve->next) + if (vertexCos) { + i = 0; + BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) BMINDEX_SET(eve, i++); - - for (i=0,efa= bm->faces.first; efa; i++,efa= efa->next) { - MTFace *tf= CustomData_bm_get(&bm->pdata, efa->data, CD_MTFACE); - MCol *mcol= CustomData_bm_get(&bm->pdata, efa->data, CD_MCOL); + + for (i=0; i<em->tottri; i++) { + BMLoop **ls = em->looptris[i]; + MTexPoly *tp= CustomData_bmesh_get(&bm->pdata, ls[0]->f->head.data, CD_MTEXPOLY); + MTFace mtf = {0}; unsigned char *cp= NULL; - int drawSmooth= (efa->flag & ME_SMOOTH); + int drawSmooth= BM_TestHFlag(ls[0]->f->head.data, BM_SMOOTH); int flag; + efa = ls[0]->f; + + if (has_uv) { + mtf.flag = tp->flag; + mtf.tpage = tp->tpage; + mtf.transp = tp->transp; + mtf.mode = tp->mode; + mtf.tile = tp->tile; + mtf.unwrap = tp->unwrap; + } + if(drawParams) - flag= drawParams(tf, mcol, efa->mat_nr); + flag= drawParams(&mtf, has_vcol, efa->mat_nr); else if(drawParamsMapped) - flag= drawParamsMapped(userData, i); + flag= drawParamsMapped(userData, BMINDEX_GET(efa)); else flag= 1; if(flag != 0) { /* flag 0 == the face is hidden or invisible */ /* we always want smooth here since otherwise vertex colors dont interpolate */ - if (mcol) { - if (flag==1) { - cp= (unsigned char*)mcol; - } - } else { + if (!has_vcol) { glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT); } - glBegin(efa->v4?GL_QUADS:GL_TRIANGLES); + + glBegin(GL_TRIANGLES); if (!drawSmooth) { glNormal3fv(bmdm->faceNos[i]); + + bmdm_get_tri_tex(bm, ls, luv, lcol, has_uv, has_vcol); + + glTexCoord2fv(luv[0]->uv); + glColor3ub(lcol[0]->r, lcol[0]->g, lcol[0]->b); + glVertex3fv(vertexCos[BMINDEX_GET(ls[0]->v)]); + + glTexCoord2fv(luv[1]->uv); + glColor3ub(lcol[1]->r, lcol[1]->g, lcol[1]->b); + glVertex3fv(vertexCos[BMINDEX_GET(ls[1]->v)]); + + glTexCoord2fv(luv[2]->uv); + glColor3ub(lcol[2]->r, lcol[2]->g, lcol[2]->b); + glVertex3fv(vertexCos[BMINDEX_GET(ls[2]->v)]); + } else { + bmdm_get_tri_tex(bm, ls, luv, lcol, has_uv, has_vcol); + + glTexCoord2fv(luv[0]->uv); + glColor3ub(lcol[0]->r, lcol[0]->g, lcol[0]->b); + glVertex3fv(vertexCos[BMINDEX_GET(ls[0]->v)]); + glNormal3fv(vertexNos[BMINDEX_GET(ls[0]->v)]); + + glTexCoord2fv(luv[1]->uv); + glColor3ub(lcol[1]->r, lcol[1]->g, lcol[1]->b); + glVertex3fv(vertexCos[BMINDEX_GET(ls[1]->v)]); + glNormal3fv(vertexNos[BMINDEX_GET(ls[1]->v)]); + + glTexCoord2fv(luv[2]->uv); + glColor3ub(lcol[2]->r, lcol[2]->g, lcol[2]->b); + glVertex3fv(vertexCos[BMINDEX_GET(ls[2]->v)]); + glNormal3fv(vertexNos[BMINDEX_GET(ls[2]->v)]); + } + glEnd(); + } + } + } else { + i = 0; + BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) + BMINDEX_SET(eve, i++); + + for (i=0; i<em->tottri; i++) { + BMLoop **ls = em->looptris[i]; + MTexPoly *tp= CustomData_bmesh_get(&bm->pdata, ls[0]->f->head.data, CD_MTEXPOLY); + MTFace mtf = {0}; + unsigned char *cp= NULL; + int drawSmooth= BM_TestHFlag(ls[0]->f->head.data, BM_SMOOTH); + int flag; - if(tf) glTexCoord2fv(tf->uv[0]); - if(cp) glColor3ub(cp[3], cp[2], cp[1]); - glVertex3fv(vertexCos[(int) efa->v1->tmp.l]); + efa = ls[0]->f; + + if (has_uv) { + mtf.flag = tp->flag; + mtf.tpage = tp->tpage; + mtf.transp = tp->transp; + mtf.mode = tp->mode; + mtf.tile = tp->tile; + mtf.unwrap = tp->unwrap; + } - if(tf) glTexCoord2fv(tf->uv[1]); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); - glVertex3fv(vertexCos[(int) efa->v2->tmp.l]); + if(drawParams) + flag= drawParams(&mtf, has_vcol, efa->mat_nr); + else if(drawParamsMapped) + flag= drawParamsMapped(userData, BMINDEX_GET(efa)); + else + flag= 1; - if(tf) glTexCoord2fv(tf->uv[2]); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); - glVertex3fv(vertexCos[(int) efa->v3->tmp.l]); + if(flag != 0) { /* flag 0 == the face is hidden or invisible */ + + /* we always want smooth here since otherwise vertex colors dont interpolate */ + if (!has_vcol) { + glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT); + } + - if(efa->v4) { - if(tf) glTexCoord2fv(tf->uv[3]); - if(cp) glColor3ub(cp[15], cp[14], cp[13]); - glVertex3fv(vertexCos[(int) efa->v4->tmp.l]); - } + glBegin(GL_TRIANGLES); + if (!drawSmooth) { + glNormal3fv(efa->no); + + bmdm_get_tri_tex(bm, ls, luv, lcol, has_uv, has_vcol); + + glTexCoord2fv(luv[0]->uv); + glColor3ub(lcol[0]->r, lcol[0]->g, lcol[0]->b); + glVertex3fv(ls[0]->v->co); + + glTexCoord2fv(luv[1]->uv); + glColor3ub(lcol[1]->r, lcol[1]->g, lcol[1]->b); + glVertex3fv(ls[1]->v->co); + + glTexCoord2fv(luv[2]->uv); + glColor3ub(lcol[2]->r, lcol[2]->g, lcol[2]->b); + glVertex3fv(ls[2]->v->co); } else { - if(tf) glTexCoord2fv(tf->uv[0]); - if(cp) glColor3ub(cp[3], cp[2], cp[1]); - glNormal3fv(vertexNos[(int) efa->v1->tmp.l]); - glVertex3fv(vertexCos[(int) efa->v1->tmp.l]); - - if(tf) glTexCoord2fv(tf->uv[1]); - if(cp) glColor3ub(cp[7], cp[6], cp[5]); - glNormal3fv(vertexNos[(int) efa->v2->tmp.l]); - glVertex3fv(vertexCos[(int) efa->v2->tmp.l]); - - if(tf) glTexCoord2fv(tf->uv[2]); - if(cp) glColor3ub(cp[11], cp[10], cp[9]); - glNormal3fv(vertexNos[(int) efa->v3->tmp.l]); - glVertex3fv(vertexCos[(int) efa->v3->tmp.l]); - - if(efa->v4) { - if(tf) glTexCoord2fv(tf->uv[3]); - if(cp) glColor3ub(cp[15], cp[14], cp[13]); - glNormal3fv(vertexNos[(int) efa->v4->tmp.l]); - glVertex3fv(vertexCos[(int) efa->v4->tmp.l]); - } + bmdm_get_tri_tex(bm, ls, luv, lcol, has_uv, has_vcol); + + glTexCoord2fv(luv[0]->uv); + glColor3ub(lcol[0]->r, lcol[0]->g, lcol[0]->b); + glVertex3fv(ls[0]->v->co); + glNormal3fv(ls[0]->v->no); + + glTexCoord2fv(luv[1]->uv); + glColor3ub(lcol[1]->r, lcol[1]->g, lcol[1]->b); + glVertex3fv(ls[1]->v->co); + glNormal3fv(ls[1]->v->no); + + glTexCoord2fv(luv[2]->uv); + glColor3ub(lcol[2]->r, lcol[2]->g, lcol[2]->b); + glVertex3fv(ls[2]->v->co); + glNormal3fv(ls[2]->v->no); } glEnd(); } } - } else { + } +#if 0 + else { for (i=0,efa= bm->faces.first; efa; i++,efa= efa->next) { MTFace *tf= CustomData_bm_get(&bm->pdata, efa->data, CD_MTFACE); MCol *mcol= CustomData_bm_get(&bm->pdata, efa->data, CD_MCOL); @@ -835,7 +951,7 @@ static void bmDM_drawFacesTex_common(DerivedMesh *dm, #endif } -static void bmDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr)) +static void bmDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, int has_vcol, int matnr)) { bmDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL); } @@ -1494,7 +1610,7 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em, Object *ob, if(vertexCos) { BMVert *eve; BMIter iter; - int totface = bm->totface; + int totface = bmdm->tc->tottri; int i; eve=BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL); diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c index 0abb2c4f35c..ff0d24173a0 100644 --- a/source/blender/blenkernel/intern/modifiers_bmesh.c +++ b/source/blender/blenkernel/intern/modifiers_bmesh.c @@ -567,6 +567,8 @@ DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd, mtx, mmd->tolerance, axis); BMO_Exec_Op(bm, &op); + + BMO_CallOpf(bm, "reversefaces faces=%s", &op, "newout"); /*handle vgroup stuff*/ if (mmd->flag & MOD_MIR_VGROUP) { diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h index 3c8194ee205..1ef76a03490 100644 --- a/source/blender/bmesh/bmesh.h +++ b/source/blender/bmesh/bmesh.h @@ -244,8 +244,8 @@ struct BMFace *BM_Make_Ngon(struct BMesh *bm, struct BMVert *v1, struct BMVert * #define BM_ClearHFlag(ele, f) (((BMHeader*)ele)->flag = ((BMHeader*)ele)->flag & ~(f)) /*stuff for setting indices in elements.*/ -#define BMINDEX_SET(ele, i) (((BMHeader*)ele)->index = i) -#define BMINDEX_GET(ele) ((BMHeader*)ele)->index +#define BMINDEX_SET(ele, i) (((BMHeader*)(ele))->index = i) +#define BMINDEX_GET(ele) (((BMHeader*)(ele))->index) /*copies loop data from adjacent faces*/ void BM_Face_CopyShared(BMesh *bm, BMFace *f); diff --git a/source/blender/bmesh/operators/removedoubles.c b/source/blender/bmesh/operators/removedoubles.c index a5a4d5b763f..4e66052b787 100644 --- a/source/blender/bmesh/operators/removedoubles.c +++ b/source/blender/bmesh/operators/removedoubles.c @@ -157,7 +157,7 @@ void bmesh_weldverts_exec(BMesh *bm, BMOperator *op) v2 = BMO_Get_MapPointer(bm, op, "targetmap", v2); - f2 = BM_Make_Ngon(bm, v, v2, edges, a, 0); + f2 = BM_Make_Ngon(bm, v2, v, edges, a, 0); if (f2) { BM_Copy_Attributes(bm, bm, f, f2); BMO_SetFlag(bm, f, ELE_DEL); diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c index a04d6d07d24..83f3ec5d3d5 100644 --- a/source/blender/editors/space_view3d/drawmesh.c +++ b/source/blender/editors/space_view3d/drawmesh.c @@ -62,6 +62,7 @@ #include "BKE_object.h" #include "BKE_property.h" #include "BKE_utildefines.h" +#include "BKE_tessmesh.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -398,7 +399,7 @@ static void draw_textured_end() } -static int draw_tface__set_draw(MTFace *tface, MCol *mcol, int matnr) +static int draw_tface__set_draw(MTFace *tface, int has_vcol, int matnr) { if (tface && (tface->mode&TF_INVISIBLE)) return 0; @@ -408,7 +409,7 @@ static int draw_tface__set_draw(MTFace *tface, MCol *mcol, int matnr) } else if (tface && tface->mode&TF_OBCOL) { glColor3ubv(Gtexdraw.obcol); return 2; /* Don't set color */ - } else if (!mcol) { + } else if (!has_vcol) { if (tface) glColor3f(1.0, 1.0, 1.0); else { Material *ma= give_current_material(Gtexdraw.ob, matnr+1); @@ -424,30 +425,50 @@ static int draw_tface__set_draw(MTFace *tface, MCol *mcol, int matnr) static int draw_tface_mapped__set_draw(void *userData, int index) { Mesh *me = (Mesh*)userData; - MTFace *tface = (me->mtface)? &me->mtface[index]: NULL; - MFace *mface = (me->mface)? &me->mface[index]: NULL; - MCol *mcol = (me->mcol)? &me->mcol[index]: NULL; - int matnr = me->mface[index].mat_nr; - if (mface && mface->flag&ME_HIDE) return 0; - return draw_tface__set_draw(tface, mcol, matnr); + MTexPoly *tpoly = (me->mtpoly)? &me->mtpoly[index]: NULL; + MPoly *mpoly = (me->mpoly)? &me->mpoly[index]: NULL; + MTFace mtf; + int matnr = me->mpoly[index].mat_nr; + + if (mpoly && mpoly->flag&ME_HIDE) return 0; + + if (tpoly) { + mtf.flag = tpoly->flag; + mtf.tpage = tpoly->tpage; + mtf.transp = tpoly->transp; + mtf.mode = tpoly->mode; + mtf.tile = tpoly->tile; + mtf.unwrap = tpoly->unwrap; + } + + return draw_tface__set_draw(&mtf, CustomData_has_layer(&me->ldata, CD_MLOOPUV), matnr); } static int draw_em_tf_mapped__set_draw(void *userData, int index) { - EditMesh *em = userData; - EditFace *efa= EM_get_face_for_index(index); - MTFace *tface; - MCol *mcol; - int matnr; + BMEditMesh *em = userData; + BMFace *efa= EDBM_get_face_for_index(em, index); + MTexPoly *tpoly; + MTFace mtf; + int matnr, has_vcol; - if (efa==NULL || efa->h) + if (efa==NULL || BM_TestHFlag(efa, BM_HIDDEN)) return 0; - tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL); + tpoly = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); + has_vcol = CustomData_has_layer(&em->bm->ldata, CD_MLOOPUV); matnr = efa->mat_nr; - return draw_tface__set_draw(tface, mcol, matnr); + if (tpoly) { + mtf.flag = tpoly->flag; + mtf.tpage = tpoly->tpage; + mtf.transp = tpoly->transp; + mtf.mode = tpoly->mode; + mtf.tile = tpoly->tile; + mtf.unwrap = tpoly->unwrap; + } + + return draw_tface__set_draw(&mtf, has_vcol, matnr); } static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r) @@ -550,7 +571,6 @@ void draw_mesh_text(Scene *scene, Object *ob, int glsl) void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int faceselect) { -#if 0 Mesh *me= ob->data; /* correct for negative scale */ @@ -561,7 +581,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o draw_textured_begin(scene, v3d, rv3d, ob); if(ob == scene->obedit) { - dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, me->edit_mesh); + dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, me->edit_btmesh); } else if(faceselect) { if(G.f & G_WEIGHTPAINT) dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1); @@ -587,6 +607,5 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o /* in editmode, the blend mode needs to be set incase it was ADD */ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -#endif } |