- 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

@@ -3646,162 +3646,61 @@ 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;
return retval;
}
/* two options, edgecolors or black */
static int bbs_mesh_wire(Object *ob, int offset)
static int bbs_mesh_wire(DerivedMesh *dm, 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;
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(dl) dlm= dl->mesh;
a= 0;
if (facecol) {
EditFace *efa, *prevefa;
int b;
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+1; // correct return value, next loop excludes hidden faces
dm->drawMappedFacesEMSelect(dm, set_framebuffer_index_color, 1);
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)) {
// 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;
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();
}
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,14 +3748,15 @@ 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);
glClearDepth(1.0); glClear(GL_DEPTH_BUFFER_BIT);
@@ -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: