Rescue Mission

567 views

Published on

The objective of this project is to implement an application that can define and display the rescue mission path and the areas of interest visible from the different points of view (car, plane, ship) of the rescue team.

Published in: Education, Spiritual, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
567
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Rescue Mission

  1. 1. Rescue Mission Antonio Dallapè – 115401 Gabriele Baronti – 113188 Principles of Computer Graphics 2008 - 2009 Relazione esplicativa del codice
  2. 2. Layers <ul><li>RescueMission.Buttons.ButtonBaseLayer </li></ul>ButtonNewLayer RescueMission.WorldWind.CompassLayer RescueMission.WorldWind.ScaleBarLayer RescueMission.WorldWind.WorldMapLayer ButtonsBgLayer ButtonPathLayer ButtonAnimateLayer ButtonLOSLayer ButtonVisualLayer
  3. 3. Package Buttons <ul><li>Le classi in RescueMission.Buttons sono dei layers che per la maggior parte hanno funzione di bottoni </li></ul><ul><li>Estendono quasi tutti da ButtonBaseLayer tranne ButtonsBgLayer </li></ul><ul><li>ButtonNewLayer ButtonPathLayer ButtonLOSLayer e ButtonAnimateLayer sono bottoni molto simili che fondamentalmente hanno uno stato ‘premuto’ e uno ‘non premuto’ </li></ul><ul><li>ButtonVisualLayer ha 4 stati possibili che vengono ciclati cliccandoci sopra (dallo stato 0 si passa all’1, dall’1 al 2, ecc...) </li></ul><ul><li>ButtonsBgLayer scrive i suggerimenti e il Flare selezionato </li></ul>
  4. 4. ButtonBaseLayer <ul><li>Disegna un bottone e la parte di barra di sfondo sottostante alla posizione desiderata </li></ul><ul><ul><li>position determina la posizione sull’asse delle y: </li></ul></ul><ul><ul><ul><li>ALIGN_TOP - lo disegna in alto </li></ul></ul></ul><ul><ul><ul><li>ALIGN_CENTER - lo disegna in centro </li></ul></ul></ul><ul><ul><ul><li>ALIGN_BOTTOM - lo disegna in basso </li></ul></ul></ul><ul><ul><li>btnNumber determina la posizione sull’asse delle x: </li></ul></ul><ul><ul><ul><li>0, 1, 2, … - moltiplicato per la larghezza totale di un bottone (considerando bordi, la scala, ecc…) mi da l’offset sulle x per poter disegnare un bottone al posto prestabilito </li></ul></ul></ul><ul><ul><li>Per disegnare correttamente il bottone in base alla scala desiderata e alla finestra vengono usate le funzioni: computeScale(...) getScaledButtonWidth(...) getScaledButtonHeight(...) computeLocation(...) </li></ul></ul>
  5. 5. ButtonBaseLayer <ul><ul><li>Viene disegnato nella funzione drawIcon(...) </li></ul></ul><ul><ul><ul><li>Nella fase di picking viene controllata la posizione del mouse e viene stabilito se si trova o meno sopra il bottone. </li></ul></ul></ul><ul><ul><ul><li>Quindi viene settata la texture corretta a seconda se il mouse è sopra al bottone o meno, se il bottone è premuto o meno, o se il bottone è disattivato </li></ul></ul></ul><ul><ul><li>mouseExited(...) </li></ul></ul><ul><ul><ul><li>(Il mouse sicuramente non è sul bottone) </li></ul></ul></ul><ul><ul><ul><li>Viene aggiornata la texture a seconda se il bottone è disattivato o meno </li></ul></ul></ul>
  6. 6. ButtonBaseLayer <ul><ul><li>Per mantenere lo stato di un bottone si usano le variabili: </li></ul></ul><ul><ul><ul><li>isBtnPressed – se il bottone è premuto o meno </li></ul></ul></ul><ul><ul><ul><li>isBtnOver – se il mouse è sopra il bottone </li></ul></ul></ul><ul><ul><ul><li>isBtnEnabled – se il bottone è abilitato o meno </li></ul></ul></ul><ul><ul><ul><li>mousePressed(...) – si setta isBtnPressed nel caso il mouse sia sopra il bottone, e si chiama buttonClicked(...) </li></ul></ul></ul><ul><ul><ul><li>setEnabled(...) – si setta isBtnEnabled true o false </li></ul></ul></ul><ul><ul><ul><li>setOnOff(...) – si setta isBtnPressed true o false e isBtnEnabled a true </li></ul></ul></ul>
  7. 7. ButtonNewLayer <ul><li>Estende ButtonBaseLayer </li></ul><ul><ul><li>Nel creatore vengono settate le variabili per posizionare il bottone e per trovare le textures </li></ul></ul><ul><li>buttonClicked(...) </li></ul><ul><ul><li>Set RescueMissionApplication.isNewPressed a true se era false e viceversa </li></ul></ul><ul><ul><li>(sostanzialmente se non era premuto diventa premuto e se era premuto non lo è più) </li></ul></ul>
  8. 8. ButtonPathLayer <ul><li>Estende ButtonBaseLayer </li></ul><ul><ul><li>Nel creatore vengono settate le variabili per posizionare il bottone e per trovare le textures </li></ul></ul><ul><li>buttonClicked(...) </li></ul><ul><ul><li>Setta, nel Flare selezionato, isArmed a true se era false e viceversa </li></ul></ul><ul><ul><li>isArmed viene usata per sapere quando si sta disegnando i percorso </li></ul></ul><ul><ul><li>(sostanzialmente se non era premuto diventa premuto e se era premuto non lo è più) </li></ul></ul>
  9. 9. ButtonLOSLayer <ul><li>Estende ButtonBaseLayer </li></ul><ul><ul><li>Nel creatore vengono settate le variabili per posizionare il bottone e per trovare le textures </li></ul></ul><ul><li>buttonClicked(...) </li></ul><ul><ul><li>Setta, nel Flare selezionato, isOn a true se era false e viceversa </li></ul></ul><ul><ul><li>isOn viene usata per sapere se è abilitato il Line Of Sight del Flare </li></ul></ul><ul><ul><li>(sostanzialmente se non era premuto diventa premuto e se era premuto non lo è più) </li></ul></ul>
  10. 10. ButtonLOSLayer <ul><li>Estende ButtonBaseLayer </li></ul><ul><ul><li>Nel creatore vengono settate le variabili per posizionare il bottone e per trovare le textures </li></ul></ul><ul><li>buttonClicked(...) </li></ul><ul><ul><li>Setta, nel Flare selezionato, isOn a true se era false e viceversa </li></ul></ul><ul><ul><li>isOn viene usata per sapere se è abilitato il Line Of Sight del Flare </li></ul></ul><ul><ul><li>Se viene abilitato lo si disegna (si setta isTimeToDo a true) altrimenti lo si cancella (deleteLineOfSight()) </li></ul></ul><ul><ul><li>(sostanzialmente se non era premuto diventa premuto e se era premuto non lo è più) </li></ul></ul>
  11. 11. ButtonAnimateLayer <ul><li>Estende ButtonBaseLayer </li></ul><ul><ul><li>Nel creatore vengono settate le variabili per posizionare il bottone e per trovare le textures </li></ul></ul><ul><li>buttonClicked(...) </li></ul><ul><ul><li>Chiama, nel Flare selezionato, setAnimate che fa partire o interrompe l’animazione a seconda se isAnimating era true o false </li></ul></ul><ul><ul><li>(sostanzialmente se non era premuto diventa premuto e se era premuto non lo è più) </li></ul></ul>
  12. 12. ButtonVisualLayer <ul><li>Estende ButtonBaseLayer </li></ul><ul><ul><li>Nel creatore vengono settate le variabili per posizionare il bottone e per trovare le textures </li></ul></ul><ul><ul><li>In drawIcon(...) e mousePressed(...) viene implementata la logica per far funzionare il bottone come una sorta di lista che seleziona la voce seguente quando viene cliccata </li></ul></ul><ul><ul><ul><li>whatVisual – rappresenta la visuale selezionata </li></ul></ul></ul><ul><ul><ul><ul><li>0 – la visuale libera </li></ul></ul></ul></ul><ul><ul><ul><ul><li>1 – la visuale dalla macchina della polizia (car) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>2 – la visuale dall’F-117 (plane) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>3 – la visuale dall’astronave (spaceshio) </li></ul></ul></ul></ul>
  13. 13. ButtonVisualLayer <ul><li>buttonClicked(...) </li></ul><ul><ul><li>Setta, nel Flare selezionato, whatVisual al valore di visualSelected </li></ul></ul><ul><li>setEnabled(...) </li></ul><ul><ul><li>Abilita/disabilita il bottone e resetta visualSelected e whatVisual del Flare selezionato (vengono settate a 0) </li></ul></ul>
  14. 14. ButtonsBgLayer <ul><li>Disegna la parte di barra sotto i suggerimenti, un cerchietto col colore del Flare selezionato e il nome di tale Flare </li></ul><ul><li>Simile a ButtonBaseLayer ma non implementa MouseListener ed è più semplice </li></ul><ul><li>Viene disegnato nella funzione drawIcon(...) </li></ul><ul><ul><li>Scrive suggerimenti diversi nel caso sia selezionato il bottone ‘New’, ‘Path’, o altro </li></ul></ul><ul><ul><li>Disegna un cerchietto con il colore del flare selezionato con drawCircle(...) o una cerchietto vuoto se non è selezionato nulla con drawCirconference(...) </li></ul></ul><ul><ul><li>Scrive il nome del file selezionato o ‘none selected’ </li></ul></ul>
  15. 15. Package WorldWind <ul><li>Le classi in RescueMission.WorldWind sono dei layers e altre classi di JWW che non sono state molto modificate </li></ul><ul><ul><li>CompassLayer – è il compass layer ma visualizzato in basso </li></ul></ul><ul><ul><li>WorldMapLayer – è l’omonimo layer visualizzato in basso e ora importa MouseListener per far selezionare il luogo desiderato, dove ci si vuol spostare, direttamente da lì </li></ul></ul><ul><ul><li>ScalebarLayer – è l’omonimo layer visualizzato in basso, in centro </li></ul></ul><ul><ul><li>Configuration – è l’omonima classe che però legge i layer da caricare dal Configworldwind.properties locale, il quale farà caricare i layer stabiliti </li></ul></ul><ul><ul><li>Polyline – è l’omonima classe che non implementa movable </li></ul></ul><ul><ul><li>RayCastingSupport – è la classe che viene usata per calcolare e disegnare il Line Of Sight di un Flare </li></ul></ul>
  16. 16. Colors <ul><li>Questa classe offre delle funzioni per ottenere dei colori univoci </li></ul><ul><ul><li>dispatchColor() – per ottenere un colore univoco </li></ul></ul><ul><ul><li>isUsed(...) – per sapere se il colore è stato già usato </li></ul></ul><ul><ul><li>La classe ha un array di 1024 elementi per memorizzare i colori già utilizzati, supponendo che nell’applicazione non saranno mai posizionati così tanti Flares </li></ul></ul>
  17. 17. FlareGFXLoader <ul><li>Questa classe viene usata per caricare in RescueMissionApplication i modelli e le textures che saranno poi utilizzati dai flare </li></ul><ul><ul><li>Viene creata in RescueMissionApplication </li></ul></ul><ul><ul><li>Estende Renderable e GLEventListener </li></ul></ul><ul><ul><ul><li>Inizialmente il caricamento dei modelli veniva eseguito all’inizializzazione di ogni Flare ma con alcune schede video dava errori al caricamento delle textures, inoltre essendo eseguito una volta sola rende il codice più ottimizzato </li></ul></ul></ul>
  18. 18. FlareDragger <ul><li>Questa classe estende SelectListener e permette di draggare i Flare </li></ul><ul><li>Permette di selezionare un Flare cliccandoci sopra col tasto sinistro e di eliminarlo cliccandolo col destro </li></ul><ul><li>Nel caso si stia disegnando il percorso di un Flare (se isArmed del Flare selezionato è true), le funzioni di selezione, cancellazione e dragging sono inibite </li></ul>
  19. 19. Flare <ul><li>Viene disegnato nella doRender(...), che viene chiamata all’interno della render(...) dopo l’inizializzazione avvenuta chiamando la initialize(...) </li></ul><ul><ul><li>Initialize(...) viene chiamata una sola volta e crea delle glCallList contenenti le informazioni per disegnare i modelli 3d e le sfere che compongono un Flare </li></ul></ul><ul><ul><li>doRender(...) viene chiamata dalla render(...) disegnando il contenuto delle glCallList nella posizione attuale del Flare, pos, settando l’orientamento dei modelli 3d in base alla direzione del Flare (quando viene draggato o durante le animazioni) e l’inclinazione in base alla curva terrestre </li></ul></ul><ul><ul><ul><li>L’angolo della direzione viene salvato nella variabile globale angle </li></ul></ul></ul><ul><ul><ul><li>Se isTimeToDo è true chiama la update() che aggiornerà il LOS </li></ul></ul></ul><ul><ul><ul><li>La direzione viene calcolata usando pos e oldPos </li></ul></ul></ul>
  20. 20. Flare <ul><li>moveTo(…) aggiorna la posizione pos e oldPos e, se isAnimating è false, modifica il primo punto del percorso facendolo combaciare con la posizione attuale </li></ul><ul><li>update(), se isOn è true, chiama la computeLineOfSight() </li></ul><ul><li>computeLineOfSight(), se isComputing è false, lo setta a true, calcola nuovamente il LOS e lo disegna, una volta finito setta nuovamente isComputing a false </li></ul><ul><li>deleteLineOfSight() cancella il LOS disegnato </li></ul><ul><li>mouseReleased(...) e mouseWheelMoved(...) settano isTimeToDo a true, dato che corrispondono ad azioni del mouse che, cambiando posizione o vicinanza alla terra e conseguente aggiornamento delle altitudini, devono far ricalcolare il LOS </li></ul>
  21. 21. Flare <ul><li>addPosition() aggiunge un nodo al percorso e aggiorna la linea </li></ul><ul><li>replacePosition() modifica l’ultimo nodo inserito e aggiorna la linea </li></ul><ul><li>removePosition() cancella l’ultimo nodo inserito e aggiorna la linea </li></ul><ul><li>setAnimate() utilizzando un thread anima il Flare, che segue il percorso stabilito, se isAnimating è true, altrimenti interrompe l’animazione </li></ul><ul><ul><li>Vengono calcolate lunghezza e posizioni intermedie per rendere la velocità del Flare uniforme </li></ul></ul><ul><ul><li>Vengono utilizzate le varie visuali (car, plane, spaceship) a seconda della variabile whatVisual </li></ul></ul><ul><ul><li>I modelli 3d vengono orientati in base alla variabile globale angle che è aggiornata alla direzione attuale </li></ul></ul><ul><li>Alla creazione del flare viene impostato un numero univoco che viene salvato in number </li></ul>
  22. 22. RescueMissionApplication <ul><li>La classe che contiene il main </li></ul><ul><li>Contiene la classe AppFrame che estende JFrame, che alla creazione inizializza tutto l’ambiente sul quale si basa l’applicazione </li></ul><ul><li>In variabili globali statiche, sono memorizzati </li></ul><ul><ul><li>I modelli 3d (model_spaceship, ...) </li></ul></ul><ul><ul><li>Le textures (texture_plane, texture_car) </li></ul></ul><ul><ul><li>I layer dei bottoni (bottonNewLayer, ...) </li></ul></ul><ul><ul><li>Il numero del Flare selezionato (selectedFlare) </li></ul></ul><ul><ul><li>Il layer su cui si disegnano i Flare (layer) </li></ul></ul><ul><ul><li>Un’arraylist contenente i Flare (flares) </li></ul></ul><ul><ul><li>Lo stato del bottone ‘NEW’ (isNewPressed) </li></ul></ul><ul><li>getFlareFromNumber(...) restituisce, dato il number di un Flare, l’indice del Flare all’interno di flares </li></ul>
  23. 23. RescueMissionApplication <ul><li>selectFlare(...) seleziona il Flare, settando in selectedFlare il number del Flare, e settando lo stato dei vari bottoni a seconda dello stato delle variabili nel Flare </li></ul><ul><li>selectNone(...) deseleziona il Flare, settando selectedFlare a -1 e disabilitando tutti i bottoni tranne il ‘NEW’ </li></ul><ul><li>initialize(...) </li></ul><ul><ul><li>Inizializza gran parte delle variabili globali statiche </li></ul></ul><ul><ul><li>Aggiunge a layer la renderizzazione di un’istanza di FlareGFXLoader </li></ul></ul><ul><ul><li>Abilita layer e lo aggiunge ai layers di wwd </li></ul></ul><ul><ul><li>Aggiunge il SelectListener FlareDragger a wwd </li></ul></ul><ul><ul><li>Aggiunge MouseListener MouseMotionListener PositionListener KeyListener </li></ul></ul>
  24. 24. RescueMissionApplication <ul><li>mousePressed </li></ul><ul><ul><li>Se la posizione è ‘off globe’ esce </li></ul></ul><ul><ul><li>Se era premuto ‘NEW’ crea un Flare alla posizione specificata </li></ul></ul><ul><ul><ul><li>Se era premuto anche il tasto SHIFT permette l’inserimento del nome </li></ul></ul></ul><ul><ul><ul><li>Se era premuto anche il tasto CTRL mantiene il bottone ‘NEW’ premuto e permette di creare, di seguito, altri Flare </li></ul></ul></ul><ul><ul><li>Se isArmed del Flare selezionato è true (cioè si sta definendo il percorso) </li></ul></ul><ul><ul><ul><li>Aggiunge un nodo chiamando la addPosition() </li></ul></ul></ul><ul><ul><ul><li>Modifica l’ultimo nodo con la replacePosition() premendo SHIFT </li></ul></ul></ul><ul><ul><ul><li>Cancella l’ultimo nodo con la removePosition() premendo CTRL </li></ul></ul></ul><ul><ul><ul><li>Se si aggiunge o modifica viene settato isArmed del Flare selezionato a true </li></ul></ul></ul>
  25. 25. RescueMissionApplication <ul><li>mouseReleased </li></ul><ul><ul><li>Se isArmed del Flare selezionato è true (cioè si sta definendo il percorso) </li></ul></ul><ul><ul><ul><li>Viene settato isArmed del Flare selezionato a false </li></ul></ul></ul><ul><li>keyPressed </li></ul><ul><ul><li>S – saveToFile(...) – salva i Flare </li></ul></ul><ul><ul><li>L – loadFromFile(...) – carica i Flare </li></ul></ul><ul><ul><li>1 – visualizza solo la ‘car’ Flare selezionato </li></ul></ul><ul><ul><li>2 – visualizza solo il ‘plane’ del Flare selezionato </li></ul></ul><ul><ul><li>3 – visualizza solo la ‘spaceship’ del Flare selezionato </li></ul></ul><ul><ul><li>0 – visualizza tutti i modelli del Flare selezionato </li></ul></ul>
  26. 26. FlareSerializable <ul><li>Questa classe viene utilizzata per salvare in un file delle variabili dalle quali è possibile ricostruire un Flare </li></ul><ul><ul><li>Le variabili di tipo Position sono salvate sotto forma di tre double (latitudine, longitudine, altezza) </li></ul></ul><ul><li>Nella classe Flare è possibile creare un nuovo Flare passando come parametro un FlareSerializable, in questo modo le variabili standard vengono inizializzate come di consueto mentre quelle specifiche che caratterizzano il Flare vengono inizializzate utilizzando le variabili del FlareSerializable </li></ul>

×