• Non ci sono risultati.

Nella VRLib la gestione delle stringhe di testo visualizzate all'interno della scena tri- dimensionale avviene grazie alla classe VRText. L'implementazione di questa classe è molto semplice nella vecchia libreria, perché sfrutta i servizi messi a disposizione dall'interfaccia WGL (o Wiggle) che rappresenta l'API verso le funzioni necessarie per l'utilizzo di OpenGL su una piattaforma Windows.

L'interfaccia WGL è fortemente legata al sistema operativo Windows. L'utiliz- zo della stessa è obbligatorio almeno per la creazione del contesto OpenGL sotto Windows (anche utilizzando una libreria cross-platform per questa operazione, le chiamate WGL verranno incapsulate nel codice della libreria se si lavora sotto Win- dows). Una API simile a WGL esiste per piattaforme che lavorano con il sistema X11 (o semplicemente X ) per la gestione delle nestre (come Unix): si tratta del- l'interfaccia GLX (OpenGL Extension to the X Window System). Come anche la precedente libreria VRLib, la VR3Lib è attualmente disponibile solamente per si- stemi Windows; si è cercato però di rendere agevole una sua futura estensione a piattaforme diverse (come Linux) sfruttando dei ag di compilazione condizionale basati anche sul sistema operativo e lavorando solamente con librerie disponibili anche per sistemi Unix-like (eccetto PhysX).

Per renderizzare stringhe di testo nel modo più essibile possibile, purtroppo, è necessario ricorrere a funzioni esterne all'API OpenGL come quelle fornite da WGL nel caso di sistemi Windows. Queste consentono di disegnare stringhe scegliendo

CAPITOLO 5. STRUTTURA E FUNZIONAMENTO DELLA VR3LIB 169 tra svariati font e aggiungendo anche gli eetti tipici degli avanzati editor di te- sto. I servizi oerti da WGL si appoggiano sull'interfaccia GDI (Graphics Device Interface), un componente fondamentale di Windows che si occupa degli aspetti di interazione con l'adattatore graco. GDI viene utilizzato sotto Windows in tutte le applicazioni che devono disegnare qualcosa a schermo, ma fornisce anche un insieme di funzionalità aggiuntive per svariate situazioni.

Quando si deve fare rendering di caratteri tramite una libreria graca come OpenGL, possiamo identicare diversi tipi di font che si possono ottenere:

• Bitmap fonts

Ogni carattere viene rappresentato mediante un'immagine che viene applicata come texture ad un piano renderizzato per produrre il carattere nell'ambiente virtuale. Questi font sono molto ecienti, ma visto che si usano delle immagini possiamo ottenere dei caratteri visibilmente `frastagliati' quando si usa una risoluzione troppo bassa (dunque per aumentare le dimensioni della stringa senza rendere l'artefatto troppo evidente è necessario utilizzare una nuova immagine a maggiore risoluzione).

• Outline fonts

Si usano formule matematiche per descrivere la forma di ogni carattere. Per renderizzare in OpenGL un carattere di questo tipo possiamo associargli una mesh che approssima la forma esatta ottenuta mediante le formule matemati- che (con un certo numero di poligoni). Questi font possono essere facilmente modellati (ingranditi o ristretti) senza perdere qualità.

• Stroke fonts

Si usano una serie di vertici per denire i singoli tratti usati per tracciare i caratteri. Manipolare questi font è molto più semplice che nel caso degli outline fonts e si ha comunque libertà di scalare e trasformare i caratteri senza perdere qualità.

Sfruttando i servizi oerti da WGL è possibile costruire delle display list per il disegno di stringhe sfruttando bitmap fonts o outline fonts. Queste display list possono dunque essere usate direttamente per ottenere il risultato desiderato, data la stringa da renderizzare.

Un problema che quindi si nota è che con le ultime versioni di OpenGL (a partire dalla 3.1) non è più possibile utilizzare le display list in quanto questi oggetti

sono stati rimossi dalla specica delle funzioni incluse nel core OpenGL23. Per la

realizzazione del servizio di disegno di testo all'interno della scena nella VR3Lib si deve ricorrere perciò ad un nuovo approccio.

Figura 5.8: VR3Text Si potrebbe pensare di abbandonare completamente l'in-

terfaccia propria del sistema operativo Windows che si ba- sa su GDI e WGL cercando una soluzione completamente cross-platform. A tal proposito esistono svariate librerie che consentono il disegno di testo su diverse piattaforme die- renziando le procedure eseguite nei vari casi, ma queste si basano ancora sul concetto di display list che è stato ab- bandonato da OpenGL nel prolo core. Implementare al- l'interno della VR3Lib una soluzione cross-platform senza utilizzare funzioni dipendenti dal sistema operativo è possi- bile (ad esempio sfruttando solo bitmap fonts e distribuendo con la libreria alcune immagini da cui recuperare le textu- re necessarie per il disegno delle stringhe); tuttavia si ot- terrebbe poca essibilità nei caratteri usati per il testo e bisognerebbe occuparci della distribuzione delle immagini aggiuntive. La soluzione migliore risulta quindi quella di sfruttare i servizi che ci vengono messi a disposizione dal sistema operativo, diversicando la soluzione per le diverse piattaforme. Nella versione attuale della nuova libreria il rendering di testo è supportato solamente sotto Windows tramite i servizi oerti dall'interfaccia GDI. Un'estensione a sistemi basati su X11 potrà essere aggiunta in futuro.

Visto che i servizi per il rendering di caratteri oerti da WGL non possono più essere utilizzati perché basati su display list, nella nuova classe VR3Text si sfruttano diretta- mente le funzioni dell'interfaccia GDI di Windows. Tramite queste funzioni è possibile generare delle immagini per i sin-

goli caratteri utilizzati e poi renderizzarle nella scena applicandole come texture su piani creati appositamente lavorando con semplici shader (ottenendo dunque font di tipo bitmap). Le immagini ottenute da GDI possono contenere caratteri di diver- si font con diversi eetti applicati ad essi; inoltre è possibile ottenere immagini di

23 Naturalmente questo non vale quando si usa OpenGL con un prolo compatibility (il cui supporto da parte delle implementazioni ricordiamo essere opzionale).

CAPITOLO 5. STRUTTURA E FUNZIONAMENTO DELLA VR3LIB 171 diversa risoluzione sulla base della precisione richiesta. Nella classe VR3Text sostan- zialmente si ha quindi un dialogo con l'interfaccia GDI, che ci fornisce le texture da utilizzare per il rendering.

Nella vecchia VRLib una stringa di testo (oggetto VRText) poteva essere dise- gnata come un oggetto virtuale qualsiasi, e veniva infatti posizionata a piacere nella scena. Nella nuova libreria si è estesa l'interfaccia consentendo trasformazioni com- plesse simili a quelle possibili per gli oggetti virtuali, e si è inoltre inserita una nuova modalità di disegno del testo aggiuntiva a quella tradizionale:

• Disegno tradizionale (VR3Text::Draw3D())

Il testo viene disegnato come un oggetto qualsiasi. Tutte le trasformazioni specicate vengono applicate in modo simile a quanto avviene nel disegno di un oggetto VR3Obj (senza vincoli di parentela). Questa modalità serve quando si vuole disegnare il testo all'interno della scena come se fosse un oggetto virtuale.

• Disegno bidimensionale (VR3Text::Draw2D())

Si considerano solamente le trasformazioni di traslazione e cambiamento di scala per disegnare il testo in un punto preciso della nestra specicato in nu- mero di pixel dall'angolo in basso a sinistra. Questa modalità facilita l'utilizzo della classe VR3Text per scrivere messaggi di notica all'interno della nestra OpenGL.

La struttura della classe VR3Text è illustrata nel diagramma UML in g 5.8. Volendo estendere il servizio di rendering di stringhe di testo anche a sistemi basati su X11, possiamo diversicare le operazioni di VR3Text per sfruttare funzioni proprie di tali sistemi simili a quelle che ci mette a disposizione l'interfaccia GDI di Windows. Notiamo inoltre che con le nuove versioni di OpenGL e l'abbandono delle display list è comunque probabile che le note librerie cross-platform per il ren- dering di testo verranno presto rinnovate utilizzando i vertex buer objects durante il disegno24; in futuro si potrebbe pertanto pensare di delegare l'intera gestione del

disegno di stringhe di testo ad una di queste librerie.

24 Esempi di queste librerie sono OGLFT (OpenGL-FreeType) e FTGL, attualmente basate su display list.