[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21843] branches/bmesh/blender/source/ blender: uv texture (though not glsl) works now.
Joseph Eagar
joeedh at gmail.com
Fri Jul 24 12:43:58 CEST 2009
Revision: 21843
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21843
Author: joeedh
Date: 2009-07-24 12:43:58 +0200 (Fri, 24 Jul 2009)
Log Message:
-----------
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.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.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/modifiers_bmesh.c
branches/bmesh/blender/source/blender/bmesh/bmesh.h
branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c
branches/bmesh/blender/source/blender/editors/space_view3d/drawmesh.c
Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h 2009-07-24 10:00:52 UTC (rev 21842)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h 2009-07-24 10:43:58 UTC (rev 21843)
@@ -316,7 +316,7 @@
*/
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
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2009-07-24 10:00:52 UTC (rev 21842)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2009-07-24 10:43:58 UTC (rev 21843)
@@ -394,7 +394,7 @@
}
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 @@
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) {
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c 2009-07-24 10:00:52 UTC (rev 21842)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c 2009-07-24 10:43:58 UTC (rev 21843)
@@ -417,7 +417,7 @@
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 @@
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 @@
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 @@
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 @@
BMLoop **l = bmdm->tc->looptris[i];
int drawSmooth;
+ efa = l[0]->f;
drawSmooth = (efa->head.flag & BM_SMOOTH);
- efa = l[0]->f;
draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, BMINDEX_GET(efa), &drawSmooth);
if(draw) {
@@ -602,7 +610,7 @@
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 @@
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_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);
+ i = 0;
+ BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL)
+ BMINDEX_SET(efa, i++);
+
if (vertexCos) {
- BMVert *eve;
-
- for (i=0,eve=bm->verts.first; eve; eve= eve->next)
+ 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)]);
- if(tf) glTexCoord2fv(tf->uv[0]);
- if(cp) glColor3ub(cp[3], cp[2], cp[1]);
- glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ glTexCoord2fv(luv[1]->uv);
+ glColor3ub(lcol[1]->r, lcol[1]->g, lcol[1]->b);
+ glVertex3fv(vertexCos[BMINDEX_GET(ls[1]->v)]);
- if(tf) glTexCoord2fv(tf->uv[1]);
- if(cp) glColor3ub(cp[7], cp[6], cp[5]);
- glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ 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)]);
- if(tf) glTexCoord2fv(tf->uv[2]);
- if(cp) glColor3ub(cp[11], cp[10], cp[9]);
- glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ 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)]);
- 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]);
- }
+ 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;
+
+ 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(&mtf, has_vcol, efa->mat_nr);
+ else if(drawParamsMapped)
+ 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 (!has_vcol) {
+ glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+ }
+
+
+ glBegin(GL_TRIANGLES);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list