- 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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user