Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di...

50
Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006

Transcript of Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di...

Page 1: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Primitive grafiche e interazione

Daniele MariniDavide Gadia

Marco RonchettiDavide Selmo

Corso Di Programmazione Grafica aa2005/2006

Page 2: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 2

Primitive OpenGL - 1

• Supporto per diversi tipi di primitive di base– Punti– Linee– Quadrilateri– Poligoni (convessi)

• Tutte le primitive sono specificate tramite una sequenza di vertici

Page 3: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 3

Primitive OpenGL - 2

• Le primitive vengono dichiarate mediante la coppia di funzioni

glBegin(GLenum mode);

glEnd();

• mode specifica la primitiva che sarà definita tramite la lista di vertici che seguirà

Page 4: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 4

Primitive OpenGL - 3

Page 5: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 5

Esempio

GLfloat pt[2] = {3.0, 4.0};

glBegin(GL_POINTS); glVertex2f(1.0, 2.0);    // x=1, y=2 glVertex2f(2.0, 3.0);    // x=2, y=3 glVertex2fv(pt);         // x=3, y=4 glVertex2i(4,5);         // x=4, y=5

glEnd();

Page 6: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 6

Primitive e oggetti complessi

• Gli oggetti complessi vengono costruiti a partire dagli elementi di base

• Tipicamente OpenGL visualizza gli oggetti definiti per mezzo di strumenti avanzati

Page 7: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 7

Definizione dei vertici

glVertex2fv()

Numero di coordinate del punto (2,3,4) Formato dei dati

(f,d,i,s)

Opzionale:

Indica che le componenti sono memorizzate all’interno di un array

Page 8: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 8

Tipi di dati

• b integer a 8 bit• s short integer 16 bit• i integer 32 bit• f floating point 32 bit• d floating point doppia precisione 64 bit

• ub unsigned integer (char) 8 bit• us unsigned short 16 bit• ui unsigned integer 32 bit

Page 9: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 9

Vertici e Colori

• OpenGL consente di assegnare colori diversi ai vertici di una primitiva (esempio poligono o quadrilatero)

• I colori “intermedi” vengono calcolati per interpolazione in modo automatico

• Il colore è definito secondo il modello R,G,B

Page 10: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 10

Vertici e Colori

glBegin(GL_QUADS);

glColor3f(1,0,0);

glVertex3d(-3, -3, -3);

glColor3f(0,1,0);

glVertex3d(3, -3, -3);

glColor3f(0,0,1);

glVertex3d(3, 3, -3);

glColor3f(1,0,1);

glVertex3d(-3, 3, -3);

glEnd();

Page 11: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 11

Interazione

• L’interazione dipende dalle caratteristiche dei dispositivi fisici e del sistema operativo

• OpenGL si appoggia sul window manager (X-Window, Microsoft Windows, Mac OSX, ..)

• Per interfacciare OpenGL al window manager faremo uso della libreria speciale standard GLUT, indipendente dallo specifico WM

Page 12: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 12

Dispositivi di input

Dispositivi logici e dispositivi fisici: analogo al rapporto indotto da funzioni come: printf, scanf, getchar, putchar:

Si puo’ leggere o scrivere su file, stampante, display, tastiera ecc.

Nella grafica è più complesso: non sono solo caratteri!

Page 13: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 13

Dispositivi di input grafico

• Dispositivi di puntamento: per indicare una posizione su uno schermo, comprende bottoni per inviare interrupt o segnali

• Mouse• Trackball• Tablet• Light pen• Joystick• Spaceball

• Tastiera: invia caratteri

Page 14: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 14

Mouse/trackball

• Non trasmettono posizione ma velocità• I due valori rilevati dal movimento della sferetta sono incrementi relativi, posti in relazione all’intervallo di tempo danno luogo al calcolo di una velocità, la cui integrazione restituisce una posizione relativaposizione relativa

• Permette di ottenere movimenti lenti o veloci del cursore

Page 15: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 15

tablet

• Fornisce posizione assoluta• La posizione viene rilevata con interazione elettromagnetica della punta di una penna speciale con una maglia di fili annegati nella superficie

• Touch screen ha funzioni analoghe

Page 16: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 16

lightpen

• Un sensore ottico rileva la presenza di luce dal display, invia un interrupt all’host, che ricava la posizione conoscendo l’istante di rilevazione dell’interrupt e il tempo di scansione della figura; identifica l’oggetto grafico indicato conoscendo l’intera struttura dati e il modo di attraversamento della struttura

• Limiti dovuti alla complessità e alla soglia di illuminazione: se punta lo sfondo non rileva luce!

Page 17: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 17

Joystick

• Anche il joystick rileva velocità, che vengono integrate per calcolare posizioni relative

• Può avere componenti meccaniche che simulano effetti di resistenza con stimolazione “cinestesica”

Page 18: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 18

Spaceball

• Dotata di sensori di pressione, ha sei gradi di libertà ed è adatta ad input 3D:

•Front-back left-right top-bottom•Rotazioni su tre assi

Page 19: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 19

Dispositivi logici - classificazione GKS e

PHIGS

•Gli standard GKS e PHIGS definiscono sei logical device:

• String - es. tastiera• Locator - fornisce coordinate mondo (WC) es. mouse con conversione da SC (ccordinate schermo) a WC• Pick - restituice l’identificatore di un oggetto• Choice - seleziona una opzione• Dial - input analogico (potenziometri)• Stroke - array di locazioni

Page 20: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 20

Dispositivi logici - OpenGL

• string - supportata dal Window Manager (WM), OGL non distingue tra dispositivo fisico e logico (tastiera)• locator - OGL converte da SC a WC con dati da mouse ecc.• Pick - OGL usa il processo chiamato selectionselection• choice - OGL usa widgets (gadget: (gadget:

congegno, dispositivo; aggeggio, arnese)congegno, dispositivo; aggeggio, arnese) del WM (menu, scrollbar, bottoni ecc.)• dial - OGL usa widgets del WM (sliders)• stroke - OGL simula l’invio di sequenze di valori attivando e terminando lo stream ad es. col bottone del mouse

Page 21: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 21

Menu pull-down e menu pop-up

Page 22: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 22

Misura e trigger• L’input di un dispositivi fisico è caratterizzato da misuramisura e triggertrigger– Misura: è il valore restituito dal dispositivo

– Trigger: è un input fisico con cui l’utente invia un segnale al sistema•String: measure = caratteri battuti, trigger = CR

•Locator: measure = posizione, trigger = click su bottone

• Si può anche considerare un valore di stato (es: il cursore è fuori dalla window …)

Page 23: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 23

Modi di input

• Request mode– La misura viene ritornata al sistema quando il trigger viene attivato

request_locator(device_id, &measure)

• Sample mode– Input immediato, non c’è triggersample_locator(device_id, &measure)

Page 24: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 24

• Request mode - tipico di programmi non grafici, es. input da tastiera con scanf– Oppure per posizionare il cursore in WM e selezionare con click

• Sample mode e request mode non sono adatti ad applicazioni in cui l’utente determina il flusso del programma, è piuttosto il programma che guida l’utente (es. scelte di menu, word processing)

• In un simulatore di volo possono esserci input da moltissimi dispositivi

Page 25: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 25

Event mode• Permette di trattare situazioni complesse

• In ogni istante ogni dispositivo può generare un evento

• Le measure del dispositivo, con identificatore associato, sono poste in una coda di eventi (event queue) indipendentemente da ciò che sta eseguendo il programma - il programma esamina la coda e decide che fare, se la coda è vuota resta idle

Page 26: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 26

Event mode

• Alternativamente si associa a ogni tipo di evento una callbackcallback

• L’approccio con callback è il più usato nei sistemi di WM e in OGL, e si presta a situazioni client-server

Page 27: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 27

Client-server• Servizi distribuiti in LAN (printer, file, graphics, ..)

• Un programma applicativo OGL e’ un processo client che usa un graphics server, i due processi possono risiedere sul medesimo sistema o essere distribuiti

Page 28: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 28

Le librerie di OGL

GLUGLU

GLGL

GLUTGLUT

GLXGLX

ApplicazioneApplicazione

Frame

Buffer

Frame

Buffer

Window SystemWindow System

Page 29: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 29

Librerie principali OGL

Page 30: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 30

Run-Time support (Apple)

Page 31: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 31

GLUT - 1

• Glut – Libreria per la creazione di finestre in cui OpenGL possa disegnare

– Gestisce l'interazione con l'utente su tali finestre.

– Non fornisce dispositivi di interazione sofisticati (bottoni, campi di testo, ecc.).

Page 32: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 32

GLUT –2

• Includes– #include <GL/gl.h> // OpenGL decl.– #include <GL/glut.h> // GUI funcs

• Interfaccia grafica e librerie GLUT– Descrizione degli oggetti forniti da GLUT•Finestre•Menu•Interazione: Mouse, Tastiera, etc…

Page 33: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 33

Inizializzazione di GLUT - 1

int main(int argc, char *argv[]){

glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB );glutInitWindowSize(200, 200);glutCreateWindow(“Window Title");

glutReshapeFunc(reshapeFunc);glutDisplayFunc(displayFunc);

glutMainLoop();return 0;

}

Page 34: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 34

Inizializzazione di GLUT - 2

• Funzioni di Reshape e DisplayglutReshapeFunc(reshapeFunc);glutDisplayFunc(displayFunc);

• Reshape – Gestisce il ridimensionamento della finestra

• Display– Contiene il codice per la visualizzazione

Page 35: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 35

ReshapeFunc

• Imposta la viewportglViewport(0, 0, w, h);

• Imposta la cameraglMatrixMode(GL_PROJECTION) // camera settings ...

glMatrixMode(GL_MODELVIEW);//ritorna alla matrice di modellazione

Page 36: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 36

DisplayFunc

• Disegna la scena (o chiama le display list) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();

// drawing code

glFlush();glutSwapBuffers(); // If double-buffered

Page 37: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 37

Programmazione dell’interazione event

driven• Uso del puntatore• Terminazione programma• Resize della finestra• Gestione della finestra• Menu • Picking

Page 38: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 38

Uso puntatore• Il puntatore può essere usato per la terminazione del programma; distinguiamo tra– move eventmove event: il mouse viene mosso col bottone premuto

– passive move eventpassive move event: mosso con bottone alzatoDopo un move event la “measure” del device (posizione del mouse) è resa disponibile

– mouse eventmouse event - un bottone del mouse è premuto o rilasciato (il bottone mantenuto premuto non genera eventi, è la transizione che conta!)

Page 39: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 39

Terminazione programma

glutMouseFunction(mouse_callback_func);

void mouse_callback_func(int button, int state, int x, int y,);

int x, int y;

{

if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)

exit();

}

Altri bottoni o uno stato differente del mouse non provocano nulla, non ci sono callback registrateregistrate col WM

Page 40: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 40

main

int main(int argc, char **argv){

glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLLUT_RGB);glutCreateWindow(“square”);myinit();glutReshapeFunc(myReshape);glutMouseFunc(mouse);glutDisplayFunc(display);glutMainLoop();

}

Reshape è invocato quando la finestra viene modificata dall’utenteOgni programma deve avere una display callback, anche vuota:void display() {}

Page 41: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 41

Disegnare un quadratino al click del mouse

void mouse(int button, int state, int x, int y);{

if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) drawSquare(x,y);

if(button==GLUT_MIDDLE_BUTTON && state==GLUT_DOWN) exit();

}

La drawSquare si limita a disegnare, gli attributi del disegno vanno definiti altrove, nell’esempio in myinit

Page 42: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 42

myinit

/* globals */

Glsizei wh = 500, ww = 500; /* dim finestra iniziale */Glfloat size = 3.0; /* metà del lato del quadrato */

void myinit(void){

glViewport(0,0,ww,wh);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0.0, (GLdouble) ww , 0.0, (GLdouble) wh , -1.0,

1.0);glMatrixModel(GL_MODELVIEW);glClearColor (0.8, 0.8, 0.8, 1.0);glClear(GL_COLOR_BUFFER_BIT);glFlush();

}

Page 43: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 43

Disegno del quadratoL’origine del sistema di riferimento nel WM è in alto a sinistra, con y verso il basso, in OGL è in basso a sinistra con y verso l’alto - bisogna “flippare” la y ritornata dal mouse:void drawSquare(int x, int y){

y=wh-y; /* flippa y */ glColor3ub( (char) random()%256, (char) random()%256, (char) random()%256); glBegin(GL_POLYGON); glVertex2f(x+size, y+size); glVertex2f(x-size, y+size); glVertex2f(x-size, y-size); glVertex2f(x+size, y-size); glEnd();}

Page 44: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 44

Il programma è completo

• Inizializza una finestra, disegna un quadrato di colore casuale nel punto selezionato dal mouse col tasto di sinistra; termina premendo il tasto di mezzo del mouse

• Non ha menu, se la finestra viene modificata (resizeresize) il programma non sa che fare

Page 45: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 45

Window events

• in caso di resize, che fare?– Ridisegnare tutto?– Che fare se l’aspect ratio cambia?– Si cambiano le dimensioni degli oggetti se la finestra cambia dimensioni?

• Nell’esempio si ridisegna tutto, mantenendo i rapporti degli oggetti (quadrati restano quadrati) e si applica il clipping

• L’evento di resize restituisce altezza e larghezza della window

Page 46: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 46

myReshapevoid myReshape(GLsizei w, GLsizei h){

/* adjust clipping box */

glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();

/* adjust viewport and clear */

glViewport(0,0,w,h); glClearColor (0.8, 0.8, 0.8, 1.0); glClear(GL_COLOR_BUFFER_BIT); display(); glFlush();}

Page 47: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 47

Display callback

La glutDisplayFunc (display) viene eseguita quando GLUT determina che la finestra va ridisegnata, certamente alla prima apertura; in questo caso è utile disegnare le parti statiche della finestraLa display callback può essere usata per animazione, quando cambiano parametri nel programmaPer iconizzare una finestra si usa la glutPostDisplay()Per disabilitare una callback si può settare la sua callback function a NULL

Page 48: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 48

Finestre multiple

id=glutCreateWindow(“second window”);

L’intero ritornato permette di attivare la prima o la seconda finestra:

glutSetWindow(id);

Si possono modificare parametri e proprietà della seconda finestra prima di definirla:

glutInitDisplayMode( …);id=glutCreateWindow(“third window”);

Page 49: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 49

MenuPull-down e pop-up menu

glutCreateMenu(demo_menu);glutAddMenuEntry(“quit”,1);glutAddMenuEntry(“increase square size”,2);glutAddMenuEntry(“decrease square size”,3);glutAttachMenu(GLUT_RIGHT_BUTTON);

void demo_menu(int id);{

if(id==1) exit();else if (id==2) size = 2*size;else if (id==3) size=size/2;glutPostRedisplay();

}

Page 50: Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 50

Menu pull-down gerarchici

sub_menu = glutCreateMenu(size_menu);glutAddMenuEntry(“increase square size”,2);glutAddMenuEntry(“decrease square size”,3);glutCreateMenu(top_menu);glutAddMenuEntry(“quit”,1);alutAddSubMenu(“Resize”, sub_menu);glutAttachMenu(GLUT_RIGHT_BUTTON);

Esercizio: scrivere le callback function di: size_menutop_menu