- added drawMapped{Verts,Edges,Faces}EMSelect calls to DerivedMesh with

implementations
 - updated drawobject selection code to use DerivedMesh (last DispListMesh
   usage in drawobject.c that needs to be replaced! Woot!)
 - interface could still be a lot cleaner, mostly calculating indices for
   the various things to pass to selection color routine is hacky.
This commit is contained in:
2005-03-28 06:46:21 +00:00
parent 09596b04a5
commit 8acfd730cf
4 changed files with 167 additions and 165 deletions

View File

@@ -105,6 +105,14 @@ struct DerivedMesh {
*/
void (*drawFacesEM)(DerivedMesh *dm, int useColor, unsigned char *baseCol, unsigned char *selCol);
/* Draw mapped verts as bgl points
* o Call setColor(offset+index) for each vert, where index is the
* vert's index in the EditMesh. Return offset+count where count
* is the total number of mapped verts.
* o Only if mapped EditVert->h==0
*/
int (*drawMappedVertsEMSelect)(DerivedMesh *dm, void (*setColor)(int index), int offset);
/* Draw mapped edges as lines
* o Call setColor(offset+index) for each edge, where index is the
* edge's index in the EditMesh. Return offset+count where count
@@ -113,6 +121,14 @@ struct DerivedMesh {
*/
int (*drawMappedEdgesEMSelect)(DerivedMesh *dm, void (*setColor)(int index), int offset);
/* Draw mapped faces
* o Call setColor(offset+index) for each face, where index is the
* face's index in the EditMesh. Return offset+count where count
* is the total number of mapped faces.
* o Only if mapped EditFace->h==0
*/
int (*drawMappedFacesEMSelect)(DerivedMesh *dm, void (*setColor)(int index), int offset);
void (*release)(DerivedMesh *dm);
};

View File

@@ -393,12 +393,15 @@ static DerivedMesh *getMeshDerivedMesh(Object *ob, float *extverts, float *nors)
mdm->dm.drawVerts = meshDM_drawVerts;
mdm->dm.drawMappedVertsEM = NULL;
mdm->dm.drawMappedVertsEMSelect = NULL;
mdm->dm.drawEdges = meshDM_drawEdges;
mdm->dm.drawMappedEdges = meshDM_drawEdges;
mdm->dm.drawLooseEdges = meshDM_drawLooseEdges;
mdm->dm.drawMappedEdgeEM = NULL;
mdm->dm.drawMappedEdgesEM = NULL;
mdm->dm.drawMappedEdgesEMSelect = NULL;
mdm->dm.drawMappedFacesEMSelect = NULL;
mdm->dm.drawFacesSolid = meshDM_drawFacesSolid;
mdm->dm.drawFacesColored = meshDM_drawFacesColored;
@@ -433,6 +436,23 @@ static void emDM_drawMappedVertsEM(DerivedMesh *dm, int sel)
}
bglEnd();
}
static int emDM_drawMappedVertsEMSelect(DerivedMesh *dm, void (*setColor)(int index), int offset)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
EditVert *eve;
int i = offset;
bglBegin(GL_POINTS);
for(eve= emdm->em->verts.first; eve; eve= eve->next, i++) {
if(eve->h==0) {
setColor(i);
bglVertex3fv(eve->co);
}
}
bglEnd();
return i;
}
static void emDM_drawMappedEdgeEM(DerivedMesh *dm, void *edge)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
@@ -465,6 +485,25 @@ static void emDM_drawMappedEdgesEM(DerivedMesh *dm, int useColor, char *baseCol,
}
glEnd();
}
static int emDM_drawMappedEdgesEMSelect(DerivedMesh *dm, void (*setColor)(int index), int offset)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
EditEdge *eed;
int i;
i = offset;
glBegin(GL_LINES);
for(eed= emdm->em->edges.first; eed; eed= eed->next, i++) {
if (eed->h==0) {
setColor(i);
glVertex3fv(eed->v1->co);
glVertex3fv(eed->v2->co);
}
}
glEnd();
return i;
}
static void emDM_drawFacesEM(DerivedMesh *dm, int useColor, unsigned char *baseCol, unsigned char *selCol)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
@@ -485,25 +524,6 @@ static void emDM_drawFacesEM(DerivedMesh *dm, int useColor, unsigned char *baseC
}
}
}
static int emDM_drawMappedEdgesEMSelect(DerivedMesh *dm, void (*setColor)(int index), int offset)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
EditEdge *eed;
int i;
i = offset;
glBegin(GL_LINES);
for(eed= emdm->em->edges.first; eed; eed= eed->next, i++) {
if (eed->h==0) {
setColor(i);
glVertex3fv(eed->v1->co);
glVertex3fv(eed->v2->co);
}
}
glEnd();
return i;
}
static void emDM_drawFacesSolid(DerivedMesh *dm, void (*setMaterial)(int))
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
@@ -523,6 +543,27 @@ static void emDM_drawFacesSolid(DerivedMesh *dm, void (*setMaterial)(int))
}
}
}
static int emDM_drawMappedFacesEMSelect(DerivedMesh *dm, void (*setColor)(int index), int offset)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
EditFace *efa;
int i = offset;
for (efa= emdm->em->faces.first; efa; efa= efa->next, i++) {
if (efa->h==0) {
setColor(i);
glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
glVertex3fv(efa->v1->co);
glVertex3fv(efa->v2->co);
glVertex3fv(efa->v3->co);
if(efa->v4) glVertex3fv(efa->v4->co);
glEnd();
}
}
return i;
}
static int emDM_getNumVerts(DerivedMesh *dm)
{
@@ -554,6 +595,7 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em)
emdm->dm.drawVerts = NULL;
emdm->dm.drawMappedVertsEM = emDM_drawMappedVertsEM;
emdm->dm.drawMappedVertsEMSelect = emDM_drawMappedVertsEMSelect;
emdm->dm.drawEdges = NULL;
emdm->dm.drawMappedEdges = NULL;
@@ -561,6 +603,7 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em)
emdm->dm.drawMappedEdgeEM = emDM_drawMappedEdgeEM;
emdm->dm.drawMappedEdgesEM = emDM_drawMappedEdgesEM;
emdm->dm.drawMappedEdgesEMSelect = emDM_drawMappedEdgesEMSelect;
emdm->dm.drawMappedFacesEMSelect = emDM_drawMappedFacesEMSelect;
emdm->dm.drawFacesSolid = emDM_drawFacesSolid;
emdm->dm.drawFacesColored = NULL;
@@ -595,6 +638,23 @@ static void ssDM_drawMappedVertsEM(DerivedMesh *dm, int sel)
}
bglEnd();
}
static int ssDM_drawMappedVertsEMSelect(DerivedMesh *dm, void (*setColor)(int index), int offset)
{
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
EditVert *eve;
int i = offset;
bglBegin(GL_POINTS);
for(eve= ssdm->em->verts.first; eve; eve= eve->next, i++) {
if(eve->h==0 && eve->ssco) {
setColor(i);
bglVertex3fv(eve->ssco);
}
}
bglEnd();
return i;
}
static void ssDM_drawMappedEdges(DerivedMesh *dm)
{
@@ -868,6 +928,36 @@ static void ssDM_drawFacesEM(DerivedMesh *dm, int useColor, unsigned char *baseC
}
}
}
static int ssDM_drawMappedFacesEMSelect(DerivedMesh *dm, void (*setColor)(int index), int offset)
{
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
DispListMesh *dlm = ssdm->dlm;
MFace *mface= dlm->mface;
int i, endOffset;
EditFace *prevefa, *efa;
for (i=offset, efa=ssdm->em->faces.first; efa; efa= efa->next, i++)
efa->prev = (EditFace*) i;
endOffset = i;
for(i=0; i<dlm->totface; i++, mface++) {
if(mface->v3 && dlm->editface[i]->h==0) {
setColor((int) dlm->editface[i]->prev);
glBegin(mface->v4?GL_QUADS:GL_TRIANGLES);
glVertex3fv(dlm->mvert[mface->v1].co);
glVertex3fv(dlm->mvert[mface->v2].co);
glVertex3fv(dlm->mvert[mface->v3].co);
if (mface->v4) glVertex3fv(dlm->mvert[mface->v4].co);
glEnd();
}
}
for (prevefa= NULL, efa= ssdm->em->faces.first; efa; prevefa= efa, efa= efa->next)
efa->prev= prevefa;
return endOffset;
}
static int ssDM_getNumVerts(DerivedMesh *dm)
{
@@ -899,6 +989,7 @@ static DerivedMesh *getSSDerivedMesh(EditMesh *em, DispListMesh *dlm, float *nor
ssdm->dm.drawVerts = ssDM_drawVerts;
ssdm->dm.drawMappedVertsEM = ssDM_drawMappedVertsEM;
ssdm->dm.drawMappedVertsEMSelect = ssDM_drawMappedVertsEMSelect;
ssdm->dm.drawEdges = ssDM_drawEdges;
ssdm->dm.drawMappedEdges = ssDM_drawMappedEdges;
@@ -906,6 +997,7 @@ static DerivedMesh *getSSDerivedMesh(EditMesh *em, DispListMesh *dlm, float *nor
ssdm->dm.drawMappedEdgeEM = ssDM_drawMappedEdgeEM;
ssdm->dm.drawMappedEdgesEM = ssDM_drawMappedEdgesEM;
ssdm->dm.drawMappedEdgesEMSelect = ssDM_drawMappedEdgesEMSelect;
ssdm->dm.drawMappedFacesEMSelect = ssDM_drawMappedFacesEMSelect;
ssdm->dm.drawFacesSolid = ssDM_drawFacesSolid;
ssdm->dm.drawFacesColored = ssDM_drawFacesColored;
@@ -984,7 +1076,7 @@ DerivedMesh *mesh_get_base_derived(Object *ob)
DerivedMesh *mesh_get_cage_derived(struct Object *ob)
{
Mesh *me= ob->data;
DerivedMesh *dm;
DerivedMesh *dm = NULL;
if (me->flag&ME_OPT_EDGES) {
dm = mesh_get_derived(ob);

View File

@@ -3646,132 +3646,49 @@ void draw_object_ext(Base *base)
/* ***************** BACKBUF SEL (BBS) ********* */
static int bbs_mesh_verts(Object *ob, int offset)
static int bbs_mesh_verts(DerivedMesh *dm, int offset)
{
EditVert *eve;
int a= offset, optimal= subsurf_optimal(ob);
int retval;
glPointSize( BIF_GetThemeValuef(TH_VERTEX_SIZE) );
bglBegin(GL_POINTS);
for(eve= G.editMesh->verts.first; eve; eve= eve->next, a++) {
if(eve->h==0) {
set_framebuffer_index_color(a);
if(optimal && eve->ssco) bglVertex3fv(eve->ssco);
else bglVertex3fv(eve->co);
}
}
bglEnd();
retval = dm->drawMappedVertsEMSelect(dm, set_framebuffer_index_color, offset);
glPointSize(1.0);
return a;
}
/* two options, edgecolors or black */
static int bbs_mesh_wire(Object *ob, int offset)
{
EditEdge *eed;
Mesh *me= ob->data;
DispList *dl= find_displist(&me->disp, DL_MESH);
DispListMesh *dlm= NULL; // DISPLISTKILL
int index, b, retval, optimal=0;
if(dl) dlm= dl->mesh;
optimal= subsurf_optimal(ob);
if(dlm && optimal) {
MEdge *medge= dlm->medge;
MVert *mvert= dlm->mvert;
// tuck original indices in vn
for(b=0, eed= G.editMesh->edges.first; eed; eed= eed->next, b++) eed->vn= (EditVert *)(b+offset);
retval= b+offset;
glBegin(GL_LINES);
for (b=0; b<dlm->totedge; b++, medge++) {
if(medge->flag & ME_EDGEDRAW) {
eed= dlm->editedge[b];
if(eed && eed->h==0) {
set_framebuffer_index_color((int)eed->vn);
glVertex3fv(mvert[medge->v1].co);
glVertex3fv(mvert[medge->v2].co);
}
}
}
glEnd();
}
else {
index= offset;
cpack(0);
glBegin(GL_LINES);
for(eed= G.editMesh->edges.first; eed; eed= eed->next, index++) {
if(eed->h==0) {
set_framebuffer_index_color(index);
glVertex3fv(eed->v1->co);
glVertex3fv(eed->v2->co);
}
}
glEnd();
retval= index;
}
return retval;
}
static int bbs_mesh_wire(DerivedMesh *dm, int offset)
{
return dm->drawMappedEdgesEMSelect(dm, set_framebuffer_index_color, offset);
}
/* two options, facecolors or black */
static int bbs_mesh_solid(Object *ob, int facecol)
static int bbs_mesh_solid(Object *ob, DerivedMesh *dm, int facecol)
{
int glmode, a;
cpack(0);
if(ob==G.obedit) {
Mesh *me= ob->data;
EditFace *efa;
DispList *dl= find_displist(&me->disp, DL_MESH);
DispListMesh *dlm= NULL; // DISPLISTKILL
int b;
if (facecol) {
EditFace *efa, *prevefa;
int b;
if(dl) dlm= dl->mesh;
a= 0;
dm->drawMappedFacesEMSelect(dm, set_framebuffer_index_color, 1);
if(dlm && dlm->editface) {
EditFace *prevefa;
MFace *mface;
efa= NULL;
// tuck original indices in efa->prev
for(b=1, efa= G.editMesh->faces.first; efa; efa= efa->next, b++)
efa->prev= (EditFace *)(b);
a = b;
// tuck original indices in efa->prev
for(b=1, efa= G.editMesh->faces.first; efa; efa= efa->next, b++) efa->prev= (EditFace *)(b);
a= b+1; // correct return value, next loop excludes hidden faces
for(b=0, mface= dlm->mface; b<dlm->totface; b++, mface++) {
if(mface->v3) {
if(facecol) {
efa= dlm->editface[b];
set_framebuffer_index_color((int)efa->prev);
}
glBegin(mface->v4?GL_QUADS:GL_TRIANGLES);
glVertex3fv(dlm->mvert[mface->v1].co);
glVertex3fv(dlm->mvert[mface->v2].co);
glVertex3fv(dlm->mvert[mface->v3].co);
if (mface->v4) glVertex3fv(dlm->mvert[mface->v4].co);
glEnd();
}
}
if(facecol && (G.scene->selectmode & SCE_SELECT_FACE)) {
if(G.scene->selectmode & SCE_SELECT_FACE) {
glPointSize(BIF_GetThemeValuef(TH_FACEDOT_SIZE));
bglBegin(GL_POINTS);
for(efa= G.editMesh->faces.first; efa; efa= efa->next) {
if(efa->h==0) {
if(efa->fgonf==EM_FGON);
else {
set_framebuffer_index_color((int)efa->prev);
bglVertex3fv(efa->cent);
}
if(efa->h==0 && efa->fgonf!=EM_FGON) {
set_framebuffer_index_color((int)efa->prev);
bglVertex3fv(efa->cent);
}
}
bglEnd();
@@ -3779,29 +3696,11 @@ static int bbs_mesh_solid(Object *ob, int facecol)
for (prevefa= NULL, efa= G.editMesh->faces.first; efa; prevefa= efa, efa= efa->next)
efa->prev= prevefa;
return a;
} else {
dm->drawFacesEM(dm, 0, NULL, NULL);
return 1;
}
else {
a= 1;
glBegin(GL_QUADS);
glmode= GL_QUADS;
for(efa= G.editMesh->faces.first; efa; efa= efa->next, a++) {
if(efa->h==0) {
if(efa->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(facecol) {
set_framebuffer_index_color(a);
}
glVertex3fv(efa->v1->co);
glVertex3fv(efa->v2->co);
glVertex3fv(efa->v3->co);
if(efa->v4) glVertex3fv(efa->v4->co);
}
}
glEnd();
}
if(facecol) return a;
}
else {
Mesh *me= ob->data;
@@ -3810,7 +3709,7 @@ static int bbs_mesh_solid(Object *ob, int facecol)
TFace *tface;
DispList *dl;
float *extverts=NULL;
int a, totface, hastface, i;
int a, totface, hastface;
mvert= me->mvert;
mface= me->mface;
@@ -3849,13 +3748,14 @@ static int bbs_mesh_solid(Object *ob, int facecol)
}
}
glEnd();
return 1;
}
return 1;
}
void draw_object_backbufsel(Object *ob)
{
extern int em_solidoffs, em_wireoffs, em_vertoffs; // let linker solve it... from editmesh_mods.c
DerivedMesh *dm;
mymultmatrix(ob->obmat);
@@ -3864,23 +3764,25 @@ void draw_object_backbufsel(Object *ob)
switch( ob->type) {
case OB_MESH:
if(G.obedit) {
dm = mesh_get_cage_derived(ob);
em_solidoffs= bbs_mesh_solid(ob, G.scene->selectmode & SCE_SELECT_FACE);
if(G.obedit) {
em_solidoffs= bbs_mesh_solid(ob, dm, G.scene->selectmode & SCE_SELECT_FACE);
bglPolygonOffset(1.0);
// we draw edges always, for loop (select) tools
em_wireoffs= bbs_mesh_wire(ob, em_solidoffs);
em_wireoffs= bbs_mesh_wire(dm, em_solidoffs);
if(G.scene->selectmode & SCE_SELECT_VERTEX)
em_vertoffs= bbs_mesh_verts(ob, em_wireoffs);
em_vertoffs= bbs_mesh_verts(dm, em_wireoffs);
else em_vertoffs= em_wireoffs;
bglPolygonOffset(0.0);
}
else bbs_mesh_solid(ob, 1); // 1= facecol, faceselect
else bbs_mesh_solid(ob, dm, 1); // 1= facecol, faceselect
dm->release(dm);
break;
case OB_CURVE:
case OB_SURF:

View File

@@ -629,15 +629,7 @@ static EditFace *findnearestface(short *dist)
static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
{
int optimal= subsurf_optimal(G.obedit);
DerivedMesh *dm = NULL;
Mesh *me = G.obedit->data;
if (me->flag&ME_OPT_EDGES) {
dm = mesh_get_derived(G.obedit);
}
if (!dm) {
dm = mesh_get_base_derived(G.obedit);
}
DerivedMesh *dm = mesh_get_cage_derived(G.obedit);
glDrawBuffer(GL_FRONT);