PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL Picking & glOrtho


Einfachkrank
2003-12-05, 18:36:38
Hi,

ich bastle gerade an einem grafischen Menü für meinem Editor, welches ich so anzeigen lasse:
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glOrtho(0, 1, 0, 1, 0, 1);

// ...
float border = 0.0025f;

glPolygonMode(GL_FRONT, GL_FILL);
glColor3ub(0, 51, 120);
glBegin(GL_QUADS);
glVertex2f(posx-border, posy+border);
glVertex2f(posx-border, posy-height-border);
glVertex2f(posx+width+border, posy-height-border);
glVertex2f(posx+width+border, posy+border);
glEnd();

glColor3ub(0, 0, 0);
glPolygonMode(GL_FRONT, GL_LINE);
glBegin(GL_QUADS);
glVertex2f(posx, posy);
glVertex2f(posx, posy-height);
glVertex2f(posx+width, posy-height);
glVertex2f(posx+width, posy);
glEnd();

glPolygonMode(GL_FRONT, GL_FILL);
Durch drücken der Maustaste soll jetzt abgefragt werden, ob ein Polygon, die ich dann rendern lasse angeklickt wurde. Das wollte ich circa so machen:
bool Selection(ALLINFO *info)
{
int viewport[16], hits;
unsigned int buffer[512];

MENU *menu;
float border = 0.0025f, width = 0.1f, fstep = 0.007f;

menu = &info->control.Menu;
info->control.Mouse.x = LOWORD(info->message.lparam);
info->control.Mouse.y = HIWORD(info->message.lparam);

glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(512, buffer);

(void)glRenderMode(GL_SELECT);

glInitNames();
glPushName(0);

glMatrixMode(GL_PROJECTION);
// glOrtho(0, 1, 0, 1, 0, 1); ???
glPushMatrix();
glLoadIdentity();

gluPickMatrix((double)info->control.Mouse.x, (double)(viewport[3] - info->control.Mouse.y),
1.0f, 1.0f, viewport);

gluPerspective(45.0f, (float)(viewport[2]-viewport[0])/(float)(viewport[3]-viewport[1]),
0.1f, 100.0f);

glMatrixMode(GL_MODELVIEW);
glBegin(GL_QUADS);
for(int i=0; i < info->control.Menu.MenuEntries[info->control.Menu.Param]; i++)
{
glVertex2f(menu->posx+border, menu->posy+(fstep*(1+2*i)-0.004f));
glVertex2f(menu->posx+width-border, menu->posy+(fstep*(1+2*i)-0.004f));
glVertex2f(menu->posx+width-border, menu->posy+(fstep*(1+2*i)+0.011f));
glVertex2f(menu->posx+border, menu->posy+(fstep*(1+2*i)+0.011f));
}
glEnd();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
hits = glRenderMode(GL_RENDER);

if(hits)
{
int choose = viewport[3];
int depth = viewport[1];

for(int j=1; j < hits; j++)
{
if(buffer[j*4+1] < (unsigned int)depth)
{
choose = buffer[j*4+1];
depth = buffer[j*4+1];
}

info->control.Menu.Choise = choose;
return true;
}
}

return false;
}
Aber noch funktioniert nix. Habt ihr konkrete Vorschläge was ich verbessern muss?

MFG Einfachkrank

Einfachkrank
2003-12-08, 18:12:02
Hat keiner irgendwelche Vorschläge? Mir wäre es auch recht, wenn jemand etwas code posten könnte, wie man im glOrtho Modus das Picking hinbekommt :)