- 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:
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user