GLUI: GLUT-based User Interface La GLUI è una libreria di oggetti C++ costruita utilizzando le GLUT e mette a disposizione tutta una serie di oggetti per rendere l interfaccia di un programma più user-friendly. Le GLUI si permettono di definire: Bottoni; Checkbox, spinner box; Pannelli, separatori, rollout; Campi testuali statici o dinamici; ecc 1
GLUI (2): Grazie al fatto che sia GLUT-based, conferisce alla libreria la proprietà di essere systemindipendent esattamente come le Glut permettendo di creare applicazioni su sistemi Window, SGI, Unix, Linux, Mac. 2
GLUI (3): glui32.lib Ciascun oggetto glui genera degli eventi che dovranno essere gestiti da opportune funzioni. La registrazione delle funzioni avviene, diversamente dalle glut, direttamente in fase di creazione dell oggetto che vogliamo inserire nell interfaccia a parte alcuni casi. È possibile creare interfacce standalone ovvero esterne alla finestra di visualizzazione oppure all interno della finestra stessa (novità inserita nella versione v.2.1). File necessari: glui.h e glui32.lib 3
GLUI (4): Per creare il glui32.lib: Scaricare la libreria dal sito www.unife.it/didattica/amati/gc.html scompattarlo in una directory qualsiasi, e clickare su glui.dsw. Automaticamente si avvia il Visual C++. Ricompilare tutto (Rebuild all). Nella directory in cui avete scompattato la libreria, sarà stata creata una directory Lib che contiene glui32.lib. Prendete quel file e copiatelo nella Lib del Visual C++. Prendete il glui.h e copiatelo nella directory Include del Visual C++. C:\Programmi\Microsoft Visual Studio\VC98\Include (glui.h) C:\Programmi\Microsoft Visual Studio\VC98\Lib (glui32.lib) 4
GLUI: main.cpp Struttura del main.cpp: #include <GL/glut.h> #include <glui.h> CLASSI, VARIABILI, FUNZIONI void InitGLUI(){}; void main(int argc, char *argv[]){ glutinit(&argc, argv); InitGLUT(); InitGLUI(); glutmainloop(); exit(0); } 5
GLUI: main.cpp Tutto ciò che si definisce con la glui viene associato alla current window definita. Questo comporta che subito dopo la creazione di una finestra con glutcreatewindow( ), è necessario specificare l interfaccia glui che si vuole associare a tale finestra. Tale procedimento deve essere eseguito per ogni finestra. current window :::::::Impostazioni INIT c.w. :::::::: mgluiwin = glutcreatewindow( GLUI ); glutdisplayfunc( ); :::::::: registrazioni eventi :::::: specifica interfaccia GLUI per c.w. 6
GLUI: main.cpp Se si vogliono creare più finestre si ripete il codice precedente: ::::::: Impostazioni INIT c.w. N.1 :::::::: mgluiwin1 = glutcreatewindow( GLUI ); glutdisplayfunc( ); :::::::: registrazioni eventi :::::: specifica interfaccia GLUI per c.w. N.1 ::::::: Impostazioni INIT c.w. N.2 :::::::: mgluiwin2 = glutcreatewindow( GLUI2 ); glutdisplayfunc( ); :::::::: registrazioni eventi :::::: specifica interfaccia GLUI per c.w. N.2 7
GLUI v. 2.1 Dà la possibilità di creare un interfaccia GLUI all interno di una finestra di visualizzazione. Migliora la gestione delle live-variables ovvero quelle variabili associate a un controllo GLUI e che ne contengono il valore o lo stato: per esempio a un checkbox è possibile associare una variabile intera che assume 1/0 a seconda che il checkbox sia abilitato o no. Tali variabili sono aggiornate automaticamente da GLUI nel momento in cui l utente interagisce con tali strumenti. Anche GLUI ha delle callback functions che devono essere registrate per realizzare l associazione con i relativi eventi. 8
GLUI: Link In fase di Linking bisogna impostare le proprietà nel menu projects, andare alla voce Settings e selezionare le opzioni di Link. Quindi è necessario specificare le lib da linkare, nel seguente ordine: glui32.lib glut32.lib glu32.lib opengl32.lib Sia per la configurazione di debug, sia per la release cioè è necessario di conseguenza selezionare All Configuration. 9
GLUI (5): creazione Le finestre GLUI possono essere standalone oppure subwindow. Una finestra standalone è più semplice. La subwindows implica che delle modifiche alla definizione della viewport. 10
GLUI *glui_win; int winid; ::::::::::::::: GLUI (6): standalone GLUI winid = glutcreatewindow( GLUT window ); Registrazione delle GLUT callback function. glui = GLUI_Master.create_glui( NOME,flags,x,y); Aggiunta di controlli GLUI. glui->set_main_gfx_window(winid); glutmainloop(); lega la glui alla finestra di visualizzazione 11
GLUI (7): GLUI subwindow GLUI *glui_subwin; ::::::::::::::::::: int winid; winid = glutcreatewindow( GLUI ); FASE DI REGISTRAZIONE glui_subwin = GLUI_Master.create_glui_subwindow( winid, GLUI_SUBWINDOW_RIGHT); Aggiunta di Controlli GLUI glui_subwin->set_main_gfx_window(winid); glutmainloop(); 12
GLUI (8): registrazione GLUT Nel caso in cui si stesse creando una GLUI subwindow è necessario effettuare la registrazione degli eventi associati a Keybord, Special, Mouse, Reshape e Idle utilizzando le seguenti chiamate: GLUI_Master.set_glutKeyboardFunc(myKeyboard); GLUI_Master.set_glutMouseFunc(myMouse); GLUI_Master.set_glutReshapeFunc(myReshape); GLUI_Master.set_glutIdleFunc(myIdle); GLUI_Master.set_glutSpecialFunc(mySpecial); 13
GLUI (9): Reshape Tipicamente il codice della funzione di reshape iniziava con la chiamata alla funzione glviewport(0,0,w,h). Solo nel caso in cui si stia creando una GLUI subwindow è necessario modificare quella linea con il seguente codice, mantenendo il resto inalterato: void Reshape (int w, int h){ int tx, ty,tw, th; GLUI_Master.get_viewport_area(&tx, &ty, &tw, &th); glviewport(tx, ty, tw, th); ::::: SOLITO CODICE standard ::::::: } Oppure in modo più automatico: GLUI_Master.auto_set_viewport(); 14
GLUI (10): le classi principali La GLUI è una libreria C++ le cui classi principali sono: GLUI_Master_Object: è la classe globale. Tutte le finestre GLUI devono essere create tramite l invocazione del relativo metodo; GLUI: descrive l interfaccia GLUI; GLUI_Control: insieme di classi per descrivere diversi controlli da aggiungere all oggetto GLUI creato tramite il Master_Object, ad esempio: GLUI_Panel GLUI_Rollout GLUI_Checkbox. 15
GLUI (11): le classi principali GLUI_Master_Object GLUI_Control class GLUI GLUI_Panel GLUI_Checkbox GLUI_Button GLUI_Rollout 16
GLUI: creazione finestra GLUI *GLUI_Master_Object::create_glui( char *name, stringa titolo dalla finestra int flags=0, int x=-1, posizione iniziale della finestra int y=-1); Crea una finestra standalone GLUI nella quale si potranno aggiungere i controlli. 17
GLUI: creazione finestra GLUI *GLUI_Master_Object::create_glui_subwindow( int windowid, int position); position: GLUI_SUBWINDOW_RIGHT, GLUI_SUBWINDOW_TOP, GLUI_SUBWINDOW_LEFT, GLUI_SUBWINDOW_BOTTOM. crea una finestra GLUI in una finestra GLUT identificata da windowid creato dopo una glutcreatewindow(); position: specifica la posizione dell interfaccia GLUI nella finestra. 18
GLUI: creazione finestra E possibile creare più oggetti glui all interno di una stessa finestra glut. Ciascuno sarà un oggetto GLUI * a sé stante all interno di una comune finestra. GLUI_SUBWINDOW_RIGHT GLUI_SUBWINDOW_BOTTOM 19
GLUI: creazione finestra void GLUI::set_main_gfx_window(int windowid) Indica alla finestra glui quale sia la finestra grafica creata dalla GLUT. Quando un controllo cambia valore, verrà generato un eventdo di redisplay per la finestra indicata con windowid. 20