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
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