Menu v OpenGL
Vytvoření jednoduchého nebo hierarchického menu v OpenGl.
Jednoduché menu
Nejprve si ukážeme, jak vytvořit jednoduché menu a poté hierarchické. Pro oba případy budeme používat model, který je již definován v aplikačním programu.
Pro lepší pochopení jednoduchého menu si vše vysvětlíme na příkladu:
1 2 3 4 5 |
glutCreateMenu(hlavniMenu); glutAddMenuEntry("První polozka", 1); glutAddMenuEntry("Druha polozka", 2); glutAddMenuEntry("Konec", 99); glutAttachMenu(GLUT_RIGHT_BUTTON); |
Přičemž ještě musíme nadefinovat obsluhující funkci hlavniMenu():
1 2 3 4 5 |
void hlavniMenu(int id){ if (id == 1) do_some_stuff(); if (id == 1) do_another_stuff(); if (id == 99) exit(0); } |
Samotné menu se vytváří tak, že si zavoláme funkci glutCreateMenu() a jako její parametr dáme jméno obsluhující funkce. Ta je zavolána kdykoliv je kliknuto na některou položku menu. Položku menu přidáme pomocí glutAddMenuEntry(), kde jejím prvním parametrem je řetězec znaků, který se bude zobrazovat a druhý je hodnota, která se předává obsluhující funkci. Proto musíme ve funkci pro obsluhu zajistit, aby při kliknutí na kteroukoliv položku menu bylo provedeno to, co jsme zamýšleli.
Na konci definování menu ještě přiřadíme klávesu či tlačítko myši, které vyvolá menu. Nejčastěji se přiřazuje k myši a proto se menu objevuje právě u jejího kurzoru.
Námi vytvořené menu vypadá následnovně:
Hierarchické menu
Hierarchické menu je poněkud složitější. Opět si celý postup vysvětlíme na příkladu.
Nejprve musíme nadeklarovat identifikátory jednotlivých podmenu:
1 |
int podmenuSvetel, podmenuBarev; |
Poté jednotlivá podmenu:
1 2 3 4 5 6 7 8 |
podmenuSvetel = glutCreateMenu(menuSvetel); glutAddMenuEntry("Slunce ON/OFF", 1); glutAddMenuEntry("Lampa ON/OFF", 2); podmenuBarev = glutCreateMenu(menuBarev); glutAddMenuEntry("Cervena", 1); glutAddMenuEntry("Modra", 2); glutAddMenuEntry("Zelena", 3); |
Zde přiřazujeme integer hodnotu do námi deklarovaných proměnných, kterou dále použijeme při přidávání do hlavního menu. Viz následující zdrojový kód:
1 2 3 4 5 |
glutCreateMenu(hlavniMenu); glutAddSubMenu("Sprava svetel", podmenuSvetel); glutAddSubMenu("Zmena barvy", podmenuBarev); glutAddMenuEntry("Exit", 99); glutAttachMenu(GLUT_RIGHT_BUTTON); |
Opět zde musíme přiřadit klávesu či tlačítko myši pro vyvolání menu. Ale oběvuje se nám zde nová funkce a tou je glutAddSubMenu(), jejíž první parametr je řetězec znaků zobrazující se v menu a druhý je právě daný identifikátor, který byl vygenerován při vytváření jednotlivých podmenu. Tato funkce přidá podmenu do hlavního menu stejně jako funkce glutAddMenuEntry() přidává jednotlivé položky.
Ještě musíme samozřejmě nadeklarovat jednotlivé funkce pro obsluhu, které by mohly vypadat nějak takhle:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void menuBarev(int id){ switch (id) { case 1: {change_to_red(); break;} case 2: {change_to_blue(); break;} case 3: {change_to_green(); break;} } } void menuSvetel(int id){ if (id == 1) turn_on_off_sun(); if (id == 2) turn_on_off_lamp(); } |
Námi vytvořené menu vypadá takto:
To je pro tentokrát všechno…
Mohl bych dyžtak poprosit o nejaky članek jak vlastně s OpenGl začit od nuly. Javu zvladam obstojne ale s timhle zkušenosti nemam a zatim včechny članky z tohodle blogu bych hodnotil na vybornou.