Laboratorio di Grafica Interattiva A.A. 2002-3

Esercizio 2

Argomento

Meccanismi per simulare ripartizione in sotto-aree della finestra Glut, primitive raster in OpenGL.

Files

Il programma partarea.c apre una finestra divisa in tre aree, solo su una e' attivo un menu'.
Si compila con lo stesso makefile che e' stato usato nell'esercizio precedente. Per compilare un programma chiamato xxx.c digitare make PROG=xxx.

Un'immagine RGB di esempio: casetta.rgb.

Il file pixmap.h definisce le classi Pixmap e PixmapReader
I file rgb_read.h e rgb_read.c definiscono la classe RGBreader
Per spiegazioni su queste classi vedere le dispense "Introduzione al C++" e piu' avanti in questo file.

Esercitazione guidata

Prima tappa

Provate a compilare ed eseguire. Il programma simula la ripartizione della finestra Glut in tre diverse aree:

+---------------------------------------------+
|                 menu area                   |40 pixel
|                                             |
+---------------------------------------------+
|              input/output area              |20 pixel
+---------------------------------------------+
|                 work area                   |          
|                                             |quello che
|                                             |resta
|                                             |
|                                             |
|                                             |
+---------------------------------------------+

Guardate il codice. Il programma contiene, oltre al main, le seguenti funzioni:

Seconda tappa

Implementate nella menu area le stesse funzionalita' del menu' realizzato per l'esercizio 1 (quinta tappa), nel modo seguente:

Trasferite in questo file l'esecuzione sulla scena delle modifiche introdotte dall'utente (cambiamento della primitiva, degli attributi, assi), dall'esercizio 1.

Gestite sulla input/output area l'"eco" delle modifiche apportate. Per esempio quando l'utente seleziona point size = 3 fate stampare che il point size e' stato impostato a 3.

Terza tappa

NOTA: la quarta e quinta tappa sono indipendenti dalla terza, si possono anche svolgere prima.

Gestite l'immissione di point size e line width da tastiera.
La voce "point size" non chiama piu' un sottomenu', ma provoca la stampa nella input/output area di un messaggio del tipo "point size corrente e' ... immettere nuovo point size", la disattivazione dei menu' e l'attivazione di una keyboard callback.
A questo punto se l'utente digita un carattere cifra, la keyboard callback lo assegna come nuovo point size, stampa un messaggio opportuno nella input/output area, disabilita se stessa e riabilita i menu'.
Se l'utente digita un altro tasto, la keyboard callback lascia il point size invariato, stampa nella input/output area che l'operazione e' stata annullata, disabilita se stessa e riabilita i menu'.
Per la line width vale un discorso analogo.

Consiglio: tenete una variabile globale che dica se stiamo attendendo un point size o una line width (oppure nulla). Questa variabile sara' assegnata nella funzione di gestione del menu' quando viene selezionata la voce point size o line width e letta dalla keyboard callback per decidere che cosa fare del valore introdotto dall'utente.

Quarta tappa

Fate disegnare ad OpenGL una primitiva raster. Per adesso potete farla disegnare dove volete, anche nella work area.

Occorre caricare un'immagine raster da file, memorizzarla, prima di passarla ad OpenGL per il disegno.

La spiegazione di queste classi si trova nelle dispense "Introduzione al C++" e nei commenti all'interno dei file sorgenti.

Per caricare un'immagine:

Esempio:
  class Pixmap * my_image;
  my_image = new Pixmap();
  class PixmapReader * my_reader;
  my_reader = new RGBreader();
  my_reader->readPixmap("casetta.rgb",my_image);
oppure prima aprire il file (fd = fopen(...)) e poi chiamare my_reader->readPixmap(fd,my_image);.

Per disegnare l'immagine caricata:

Esempio:
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  glPixelZoom(2.0,2.0); /* se la vogliamo doppia */
  glRasterPos2i(0,0); /* se la vogliamo agganciare nell'origine */
  glDrawPixels(my_image->w,my_image->h,
               GL_RGB, GL_UNSIGNED_BYTE, my_image->pixels);

Il vostro programma dovra' portare in testa le inclusioni dei file "pixmap.h" e "rgb_read.h" ed essere compilato linkandolo assieme a rgb_read.c, nel makefile occorre aggiungere:

xxxx: rgb_read.c rgb_read.h pixmap.h xxxx.c
	$(CC) -g $(INCLUDE) rgb_read.c xxxx.c $(FLAGS) $(LIBS) -o xxxx
con al posto di xxxx il nome del vostro file.
IMPORTANTE: quelli che appaiono come spazi multipli (a inizio linea) devono essere un solo carattere tabulazione!
Allora per compilare digitare make xxxx (se il file e' xxxx.c).

Quinta tappa

Realizzate icone per le aree "primitiva", "attributi", "assi" in cui e' stata ripartita la menu area. Disegnate le icone nelle aree corrispondenti. Eliminate il disegno provvisorio dell'immagine raster fatto nella quarta tappa.

Per creare un file RGB con una nuova immagine sotto Linux sono forniti alcuni tool un po' rudimentali ma utili allo scopo:

Compito

Altre funzioni dall'esercizio 1

Reintegrate qui le altre funzioni realizzate per l'esercizio 1: