diff options
author | Daniel Dunbar <daniel@zuster.org> | 2005-07-17 07:48:29 +0400 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2005-07-17 07:48:29 +0400 |
commit | 80327e675addf423a2db9cb80768c7e327834d04 (patch) | |
tree | 4c1619174cbb37af2956604adf88b75baabc054a | |
parent | b3169b22b8fd503fdddbd41c0aa76d2e590f8eeb (diff) |
- converted draw_tfaces3d and bbs_mesh_solid to use
mesh_get_derived_deform... (whats that? more general AND it uses less
lines? how can that be!!!)
-rw-r--r-- | source/blender/src/drawmesh.c | 176 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 55 |
2 files changed, 84 insertions, 147 deletions
diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c index de97ebc1edb..66be68f7297 100644 --- a/source/blender/src/drawmesh.c +++ b/source/blender/src/drawmesh.c @@ -498,22 +498,23 @@ void spack(unsigned int ucol) void draw_tfaces3D(Object *ob, Mesh *me) { - MFace *mface; + MFace *mface, *activeFace; TFace *tface; - DispList *dl; - float *v1, *v2, *v3, *v4; - float *av1= NULL, *av2= NULL, *av3= NULL, *av4= NULL, *extverts= NULL; + float co[3]; int a, activeFaceInSelection= 0; + DerivedMesh *dm; + int dmNeedsFree; if(me==0 || me->tface==0) return; - dl= find_displist(&ob->disp, DL_VERTS); - if (dl) extverts= dl->verts; + dm = mesh_get_derived_deform(ob, &dmNeedsFree); glEnable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); bglPolygonOffset(1.0); +#define PASSVERT(index) { dm->getVertCo(dm, index, co); glVertex3fv(co); } + /* Draw (Hidden) Edges */ if(G.f & G_DRAWEDGES || G.f & G_HIDDENEDGES){ BIF_ThemeColor(TH_EDGE_FACESEL); @@ -521,30 +522,17 @@ void draw_tfaces3D(Object *ob, Mesh *me) mface= me->mface; tface= me->tface; for(a=me->totface; a>0; a--, mface++, tface++) { - if(mface->v3==0) continue; - if(tface->flag & TF_HIDE) { - if(!(G.f & G_HIDDENEDGES)) continue; - } - else if(!(G.f & G_DRAWEDGES)) continue; + if(mface->v3 && (G.f&G_DRAWEDGES)) { + if ((tface->flag&TF_HIDE) && !(G.f&G_HIDDENEDGES)) + continue; - if(extverts) { - v1= extverts+3*mface->v1; - v2= extverts+3*mface->v2; - v3= extverts+3*mface->v3; - v4= mface->v4?(extverts+3*mface->v4):NULL; - } else { - v1= (me->mvert+mface->v1)->co; - v2= (me->mvert+mface->v2)->co; - v3= (me->mvert+mface->v3)->co; - v4= mface->v4?(me->mvert+mface->v4)->co:NULL; + glBegin(GL_LINE_LOOP); + PASSVERT(mface->v1); + PASSVERT(mface->v2); + PASSVERT(mface->v3); + if(mface->v4) PASSVERT(mface->v4); + glEnd(); } - - glBegin(GL_LINE_LOOP); - glVertex3fv(v1); - glVertex3fv(v2); - glVertex3fv(v3); - if(v4) glVertex3fv(v4); - glEnd(); } } @@ -556,40 +544,26 @@ void draw_tfaces3D(Object *ob, Mesh *me) mface= me->mface; tface= me->tface; for(a=me->totface; a>0; a--, mface++, tface++) { - if(mface->v3==0) continue; - if(tface->flag & TF_HIDE) continue; - - if(extverts) { - v1= extverts+3*mface->v1; - v2= extverts+3*mface->v2; - v3= extverts+3*mface->v3; - v4= mface->v4?(extverts+3*mface->v4):NULL; - } else { - v1= (me->mvert+mface->v1)->co; - v2= (me->mvert+mface->v2)->co; - v3= (me->mvert+mface->v3)->co; - v4= mface->v4?(me->mvert+mface->v4)->co:NULL; - } - - if(tface->unwrap & TF_SEAM1) { - glVertex3fv(v1); - glVertex3fv(v2); - } + if (mface->v3 && !(tface->flag&TF_HIDE)) { + if(tface->unwrap & TF_SEAM1) { + PASSVERT(mface->v1); + PASSVERT(mface->v2); + } - if(tface->unwrap & TF_SEAM2) { - glVertex3fv(v2); - glVertex3fv(v3); - } + if(tface->unwrap & TF_SEAM2) { + PASSVERT(mface->v2); + PASSVERT(mface->v3); + } - if(tface->unwrap & TF_SEAM3) { - glVertex3fv(v3); - if(v4) glVertex3fv(v4); - else glVertex3fv(v1); - } + if(tface->unwrap & TF_SEAM3) { + PASSVERT(mface->v3); + PASSVERT(mface->v4?mface->v4:mface->v1); + } - if(v4 && tface->unwrap & TF_SEAM4) { - glVertex3fv(v4); - glVertex3fv(v1); + if(mface->v4 && (tface->unwrap & TF_SEAM4)) { + PASSVERT(mface->v4); + PASSVERT(mface->v1); + } } } glEnd(); @@ -606,27 +580,12 @@ void draw_tfaces3D(Object *ob, Mesh *me) mface= me->mface; tface= me->tface; for(a=me->totface; a>0; a--, mface++, tface++) { - if(mface->v3==0) continue; - if(tface->flag & TF_HIDE) continue; - - if(tface->flag & TF_SELECT) { - if(extverts) { - v1= extverts+3*mface->v1; - v2= extverts+3*mface->v2; - v3= extverts+3*mface->v3; - v4= mface->v4?(extverts+3*mface->v4):NULL; - } else { - v1= (me->mvert+mface->v1)->co; - v2= (me->mvert+mface->v2)->co; - v3= (me->mvert+mface->v3)->co; - v4= mface->v4?(me->mvert+mface->v4)->co:NULL; - } - - glBegin(v4?GL_QUADS:GL_TRIANGLES); - glVertex3fv( v1 ); - glVertex3fv( v2 ); - glVertex3fv( v3 ); - if(v4) glVertex3fv( v4 ); + if(mface->v3 && !(tface->flag&TF_HIDE) && (tface->flag&TF_SELECT)) { + glBegin(mface->v4?GL_QUADS:GL_TRIANGLES); + PASSVERT(mface->v1); + PASSVERT(mface->v2); + PASSVERT(mface->v3); + if(mface->v4) PASSVERT(mface->v4); glEnd(); } } @@ -634,37 +593,23 @@ void draw_tfaces3D(Object *ob, Mesh *me) } /* Draw Stippled Outline for selected faces */ + activeFace = NULL; mface= me->mface; tface= me->tface; bglPolygonOffset(1.0); for(a=me->totface; a>0; a--, mface++, tface++) { - if(mface->v3==0) continue; - if(tface->flag & TF_HIDE) continue; - - if(tface->flag & (TF_ACTIVE|TF_SELECT) ) { - if(extverts) { - v1= extverts+3*mface->v1; - v2= extverts+3*mface->v2; - v3= extverts+3*mface->v3; - v4= mface->v4?(extverts+3*mface->v4):NULL; - } else { - v1= (me->mvert+mface->v1)->co; - v2= (me->mvert+mface->v2)->co; - v3= (me->mvert+mface->v3)->co; - v4= mface->v4?(me->mvert+mface->v4)->co:NULL; - } - + if(mface->v3 && !(tface->flag&TF_HIDE) && (tface->flag & (TF_ACTIVE|TF_SELECT))) { if(tface->flag & TF_ACTIVE) { + activeFace = mface; activeFaceInSelection= (tface->flag & TF_SELECT); - av1= v1; av2= v2; av3= v3; av4= v4; } else { cpack(0x0); glBegin(GL_LINE_LOOP); - glVertex3fv( v1 ); - glVertex3fv( v2 ); - glVertex3fv( v3 ); - if(v4) glVertex3fv( v4 ); + PASSVERT(mface->v1); + PASSVERT(mface->v2); + PASSVERT(mface->v3); + if(mface->v4) PASSVERT(mface->v4); glEnd(); } @@ -672,10 +617,10 @@ void draw_tfaces3D(Object *ob, Mesh *me) cpack(0xFFFFFF); setlinestyle(1); glBegin(GL_LINE_LOOP); - glVertex3fv( v1 ); - glVertex3fv( v2 ); - glVertex3fv( v3 ); - if(v4) glVertex3fv( v4 ); + PASSVERT(mface->v1); + PASSVERT(mface->v2); + PASSVERT(mface->v3); + if(mface->v4) PASSVERT(mface->v4); glEnd(); setlinestyle(0); } @@ -684,32 +629,35 @@ void draw_tfaces3D(Object *ob, Mesh *me) /* Draw Active Face on top */ /* colors: R=x G=y */ - if(av1) { + if(activeFace) { cpack(0xFF); glBegin(GL_LINE_STRIP); - glVertex3fv(av1); - if(av4) glVertex3fv(av4); - else glVertex3fv(av3); + PASSVERT(activeFace->v1); + PASSVERT(activeFace->v4?activeFace->v4:activeFace->v3); glEnd(); cpack(0xFF00); glBegin(GL_LINE_STRIP); - glVertex3fv(av1); - glVertex3fv(av2); + PASSVERT(activeFace->v1); + PASSVERT(activeFace->v2); glEnd(); if(activeFaceInSelection) cpack(0x00FFFF); else cpack(0xFF00FF); glBegin(GL_LINE_STRIP); - glVertex3fv(av2); - glVertex3fv(av3); - if(av4) glVertex3fv(av4); + PASSVERT(activeFace->v2); + PASSVERT(activeFace->v3); + if(activeFace->v4) PASSVERT(activeFace->v4); glEnd(); setlinestyle(0); } bglPolygonOffset(0.0); // resets correctly now, even after calling accumulated offsets + + if (dmNeedsFree) + dm->release(dm); +#undef PASSVERT } static int set_gl_light(Object *ob) diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 5a38e707864..dc43e14fa12 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -4006,50 +4006,39 @@ static int bbs_mesh_solid(Object *ob, DerivedMesh *dm, int facecol) } else { Mesh *me= ob->data; - MVert *mvert; MFace *mface; TFace *tface; - DispList *dl; - float *extverts=NULL; - int a, totface, hastface; + float co[3]; + int a, dmNeedsFree; + DerivedMesh *dm = mesh_get_derived_deform(ob, &dmNeedsFree); - mvert= me->mvert; mface= me->mface; tface= me->tface; - hastface = (me->tface != NULL); - totface= me->totface; - dl= find_displist(&ob->disp, DL_VERTS); - if(dl) extverts= dl->verts; - - glBegin(GL_QUADS); - glmode= GL_QUADS; - - for(a=0; a<totface; a++, mface++, tface++) { - if(mface->v3) { - if(facecol) { - if(hastface && tface->flag & TF_HIDE) continue; - set_framebuffer_index_color(a+1); - } + glBegin(glmode=GL_QUADS); + for(a=0; a<me->totface; a++, mface++, tface++) { + if(mface->v3 && (!me->tface || !(tface->flag&TF_HIDE))) { + int newmode = mface->v4?GL_QUADS:GL_TRIANGLES; - if(mface->v4) {if(glmode==GL_TRIANGLES) {glmode= GL_QUADS; glEnd(); glBegin(GL_QUADS);}} - else {if(glmode==GL_QUADS) {glmode= GL_TRIANGLES; glEnd(); glBegin(GL_TRIANGLES);}} - - if(extverts) { - glVertex3fv( extverts+3*mface->v1 ); - glVertex3fv( extverts+3*mface->v2 ); - glVertex3fv( extverts+3*mface->v3 ); - if(mface->v4) glVertex3fv( extverts+3*mface->v4 ); - } - else { - glVertex3fv( (mvert+mface->v1)->co ); - glVertex3fv( (mvert+mface->v2)->co ); - glVertex3fv( (mvert+mface->v3)->co ); - if(mface->v4) glVertex3fv( (mvert+mface->v4)->co ); + set_framebuffer_index_color(a+1); + + if (newmode!=glmode) { + glEnd(); + glBegin(glmode=newmode); } + + glVertex3fv( (dm->getVertCo(dm, mface->v1, co),co) ); + glVertex3fv( (dm->getVertCo(dm, mface->v2, co),co) ); + glVertex3fv( (dm->getVertCo(dm, mface->v3, co),co) ); + if(mface->v4) glVertex3fv( (dm->getVertCo(dm, mface->v4, co),co) ); } } glEnd(); + + if (dmNeedsFree) { + dm->release(dm); + } + return 1; } } |