From 32255b65df00897ea9f5ec960eec0040edd946be Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Sat, 23 Jul 2005 07:45:39 +0000 Subject: [PATCH] - added DerivedMesh.drawMapped{VertNormals,FaceNormals,FaceCenters}EM functions and implementation for EditmeshDerivedMesh - switch drawobject to drawing normals/centers through the DerivedMesh - added G_DRAW_VNORMALS flag and button, implementation is not yet complete because editmesh normals are not updated regularly - switch editmesh draw buttons to use uiDefButBit (can't we get some monkey to convert all of the uiDefBut calls with TOG|BIT type? It makes grepping the source much nicer) --- source/blender/blenkernel/BKE_DerivedMesh.h | 15 +++ source/blender/blenkernel/BKE_global.h | 38 +++--- .../blender/blenkernel/intern/DerivedMesh.c | 115 +++++++++++++++++- source/blender/src/drawobject.c | 50 ++++---- 4 files changed, 172 insertions(+), 46 deletions(-) diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 080c21c5d5e..e1e2b1e9681 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -153,6 +153,21 @@ struct DerivedMesh { */ void (*drawMappedFacesEM)(DerivedMesh *dm, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData); + /* Draw vert normals + * o Only if !setDrawOptions or setDrawOptions(userData, mapped-vert) returns true + */ + void (*drawMappedVertNormalsEM)(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditVert *eve), void *userData); + + /* Draw face normals + * o Only if !setDrawOptions or setDrawOptions(userData, mapped-face) returns true + */ + void (*drawMappedFaceNormalsEM)(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData); + + /* Draw face centers as bgl points + * o Only if !setDrawOptions or setDrawOptions(userData, mapped-face) returns true + */ + void (*drawMappedFaceCentersEM)(DerivedMesh *dm, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData); + void (*release)(DerivedMesh *dm); }; diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h index 24b555e3cce..fff57d969b3 100644 --- a/source/blender/blenkernel/BKE_global.h +++ b/source/blender/blenkernel/BKE_global.h @@ -140,35 +140,35 @@ typedef struct Global { /* **************** GLOBAL ********************* */ /* G.f */ -#define G_DISABLE_OK 1 -#define G_PLAYANIM 2 -#define G_TEST_DUPLI 4 -#define G_SIMULATION 8 -#define G_BACKBUFSEL 16 -#define G_PICKSEL 32 -#define G_DRAWNORMALS 64 -#define G_DRAWFACES 128 -#define G_FACESELECT 256 -#define G_DRAW_EXT 512 -#define G_VERTEXPAINT 1024 -#define G_ALLEDGES 2048 -#define G_DEBUG 4096 +#define G_DISABLE_OK (1 << 0) +#define G_PLAYANIM (1 << 1) +#define G_TEST_DUPLI (1 << 2) +#define G_SIMULATION (1 << 3) +#define G_BACKBUFSEL (1 << 4) +#define G_PICKSEL (1 << 5) +#define G_DRAWNORMALS (1 << 6) +#define G_DRAWFACES (1 << 7) +#define G_FACESELECT (1 << 8) +#define G_DRAW_EXT (1 << 9) +#define G_VERTEXPAINT (1 << 10) +#define G_ALLEDGES (1 << 11) +#define G_DEBUG (1 << 12) #define G_DOSCRIPTLINKS (1 << 13) -/* #define G_PROPORTIONAL 16384 removed! so can be used later for other stuff */ -#define G_WEIGHTPAINT 32768 -#define G_TEXTUREPAINT 65536 +#define G_DRAW_VNORMALS (1 << 14) +#define G_WEIGHTPAINT (1 << 15) +#define G_TEXTUREPAINT (1 << 16) /* #define G_NOFROZEN (1 << 17) also removed */ -#define G_DRAWEDGES (1 << 18) +#define G_DRAWEDGES (1 << 18) #define G_DRAWCREASES (1 << 19) #define G_DRAWSEAMS (1 << 20) #define G_HIDDENEDGES (1 << 21) /* Measurement info Drawing */ -#define G_DRAW_EDGELEN (1 << 22) +#define G_DRAW_EDGELEN (1 << 22) #define G_DRAW_FACEAREA (1 << 23) #define G_DRAW_EDGEANG (1 << 24) -#define G_RECORDKEYS (1 << 25) +#define G_RECORDKEYS (1 << 25) /* G.fileflags */ diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 041499bcdcd..598a8ae9ac4 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -638,6 +638,114 @@ static void emDM_drawMappedEdgesInterpEM(DerivedMesh *dm, int (*setDrawOptions)( glEnd(); } } +static void emDM__calcFaceCent(EditFace *efa, float cent[3], float (*vertexCos)[3]) +{ + if (vertexCos) { + VECCOPY(cent, vertexCos[(int) efa->v1->prev]); + VecAddf(cent, cent, vertexCos[(int) efa->v2->prev]); + VecAddf(cent, cent, vertexCos[(int) efa->v3->prev]); + if (efa->v4) VecAddf(cent, cent, vertexCos[(int) efa->v4->prev]); + } else { + VECCOPY(cent, efa->v1->co); + VecAddf(cent, cent, efa->v2->co); + VecAddf(cent, cent, efa->v3->co); + if (efa->v4) VecAddf(cent, cent, efa->v4->co); + } + + if (efa->v4) { + cent[0] *= 0.25f; + cent[1] *= 0.25f; + cent[2] *= 0.25f; + } else { + cent[0] *= 0.33333333333f; + cent[1] *= 0.33333333333f; + cent[2] *= 0.33333333333f; + } +} +static void emDM_drawMappedFaceCentersEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData) +{ + EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm; + EditVert *eve, *preveve; + EditFace *efa; + float cent[3]; + int i; + + if (emdm->vertexCos) { + for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next) + eve->prev = (EditVert*) i++; + } + + bglBegin(GL_POINTS); + for(efa= emdm->em->faces.first; efa; efa= efa->next) { + if(!setDrawOptions || setDrawOptions(userData, efa)) { + emDM__calcFaceCent(efa, cent, emdm->vertexCos); + bglVertex3fv(cent); + } + } + bglEnd(); + + if (emdm->vertexCos) { + for (preveve=NULL, eve=emdm->em->verts.first; eve; preveve=eve, eve= eve->next) + eve->prev = preveve; + } +} +static void emDM_drawMappedFaceNormalsEM(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData) +{ + EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm; + EditVert *eve, *preveve; + EditFace *efa; + float cent[3]; + int i; + + glBegin(GL_LINES); + if (emdm->vertexCos) { + for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next) + eve->prev = (EditVert*) i++; + } + + + for (efa= emdm->em->faces.first; efa; efa= efa->next) { + if(!setDrawOptions || setDrawOptions(userData, efa)) { + emDM__calcFaceCent(efa, cent, emdm->vertexCos); + + glVertex3fv(efa->cent); + glVertex3f( efa->cent[0] + length*efa->n[0], + efa->cent[1] + length*efa->n[1], + efa->cent[2] + length*efa->n[2]); + } + } + + if (emdm->vertexCos) { + for (preveve=NULL, eve=emdm->em->verts.first; eve; preveve=eve, eve= eve->next) + eve->prev = preveve; + } + + glEnd(); +} +static void emDM_drawMappedVertNormalsEM(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditVert *eve), void *userData) +{ + EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm; + EditVert *eve; + int i; + + glBegin(GL_LINES); + for (i=0,eve= emdm->em->verts.first; eve; i++,eve= eve->next) { + if(!setDrawOptions || setDrawOptions(userData, eve)) { + if (emdm->vertexCos) { + glVertex3fv(emdm->vertexCos[i]); + glVertex3f( emdm->vertexCos[i][0] + length*eve->no[0], + emdm->vertexCos[i][1] + length*eve->no[1], + emdm->vertexCos[i][2] + length*eve->no[2]); + } else { + glVertex3fv(eve->co); + glVertex3f( eve->co[0] + length*eve->no[0], + eve->co[1] + length*eve->no[1], + eve->co[2] + length*eve->no[2]); + } + } + } + glEnd(); +} static void emDM_drawMappedFacesEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditFace *face), void *userData) { EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm; @@ -763,6 +871,7 @@ static void emDM_release(DerivedMesh *dm) MEM_freeN(emdm); } + // XXX face and vertex normals are wrong with vertexcos static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, float (*vertexCos)[3]) { EditMeshDerivedMesh *emdm = MEM_callocN(sizeof(*emdm), "emdm"); @@ -780,6 +889,10 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, float (*vertexCos)[3]) emdm->dm.drawMappedEdgesEM = emDM_drawMappedEdgesEM; emdm->dm.drawMappedEdgesInterpEM = emDM_drawMappedEdgesInterpEM; + emdm->dm.drawMappedVertNormalsEM = emDM_drawMappedVertNormalsEM; + emdm->dm.drawMappedFaceNormalsEM = emDM_drawMappedFaceNormalsEM; + emdm->dm.drawMappedFaceCentersEM = emDM_drawMappedFaceCentersEM; + emdm->dm.drawFacesSolid = emDM_drawFacesSolid; emdm->dm.drawMappedFacesEM = emDM_drawMappedFacesEM; @@ -1382,7 +1495,7 @@ static void mesh_build_data(Object *ob) clear_mesh_caches(ob); mesh_calc_modifiers(ob, NULL, &ob->derivedDeform, &ob->derivedFinal, 0, 1); - + INIT_MINMAX(min, max); ob->derivedFinal->getMinMax(ob->derivedFinal, min, max); diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 20a6bb1df3a..391a1acb248 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -1237,36 +1237,30 @@ static unsigned char *calc_weightpaint_colors(Object *ob) * logic!!! */ -static void draw_em_face_normals(EditMesh *em, float normalLength) +static int ef_nonhiddenAndFgon__setDrawOptions(void *userData, EditFace *efa) { - EditFace *efa; - - glBegin(GL_LINES); - for(efa= em->faces.first; efa; efa= efa->next) { - if(efa->h==0 && efa->fgonf!=EM_FGON) { - glVertex3fv(efa->cent); - glVertex3f( efa->cent[0] + normalLength*efa->n[0], - efa->cent[1] + normalLength*efa->n[1], - efa->cent[2] + normalLength*efa->n[2]); - - } + if (userData) { + int sel = ((int) userData) - 1; + return (efa->h==0 && efa->fgonf!=EM_FGON && (efa->f&SELECT)==sel); + } else { + return (efa->h==0 && efa->fgonf!=EM_FGON); } - glEnd(); +} +static int ev_nonhidden__setDrawOptions(void *userData, EditVert *eve) +{ + return (eve->h==0); +} +static void draw_dm_face_normals(DerivedMesh *dm) { + dm->drawMappedFaceNormalsEM(dm, G.scene->editbutsize, ef_nonhiddenAndFgon__setDrawOptions, 0); +} +static void draw_dm_face_centers(DerivedMesh *dm, int sel) { + dm->drawMappedFaceCentersEM(dm, ef_nonhiddenAndFgon__setDrawOptions, (void*) (sel+1)); } -static void draw_em_face_centers(EditMesh *em, int sel) { - EditFace *efa; - - bglBegin(GL_POINTS); - for(efa= em->faces.first; efa; efa= efa->next) { - if(efa->h==0 && efa->fgonf!=EM_FGON && (efa->f&SELECT)==sel) { - bglVertex3fv(efa->cent); - } - } - bglEnd(); +static void draw_dm_vert_normals(DerivedMesh *dm) { + dm->drawMappedVertNormalsEM(dm, G.scene->editbutsize, ev_nonhidden__setDrawOptions, 0); } - /* Draw verts with color set based on selection */ static int draw_dm_verts__setDrawOptions(void *userData, EditVert *eve) { @@ -1415,7 +1409,7 @@ static void draw_em_fancy_verts(EditMesh *em, DerivedMesh *cageDM) if(G.scene->selectmode & SCE_SELECT_FACE) { glPointSize(fsize); glColor4ubv(fcol); - draw_em_face_centers(em, sel); + draw_dm_face_centers(cageDM, sel); } if (pass==0) { @@ -1728,7 +1722,11 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, Derived if(G.f & G_DRAWNORMALS) { BIF_ThemeColor(TH_NORMAL); - draw_em_face_normals(em, G.scene->editbutsize); + draw_dm_face_normals(cageDM); + } + if(G.f & G_DRAW_VNORMALS) { + BIF_ThemeColor(TH_NORMAL); + draw_dm_vert_normals(cageDM); } if(G.f & (G_DRAW_EDGELEN|G_DRAW_FACEAREA|G_DRAW_EDGEANG))