- 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)
This commit is contained in:
2005-07-23 07:45:39 +00:00
parent e125ed5958
commit 32255b65df
4 changed files with 172 additions and 46 deletions

View File

@@ -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);
};

View File

@@ -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 */

View File

@@ -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);

View File

@@ -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))