Laboratorio di Grafica Interattiva A.A. 2003-4

Esercizio 2

Argomento

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

Files

Il programma partarea.c apre una finestra divisa in due aree.
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 due diverse aree:

+---------------------------------------------+
|               toolbar  area                 |40 pixel
|                                             |
+---------------------------------------------+
|                 work area                   |          
|                                             |quello che
|                                             |resta
|                                             |
|                                             |
|                                             |
+---------------------------------------------+

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

Seconda tappa

Implementate nella toolbar area una serie di bottoni per la scelta della primitiva grafica da applicare in work area e per la scelta della presenza/assenza degli assi. Nel modo seguente:

Terza 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).

Quarta tappa

Realizzate icone per i "bottoni" della toolbar area e disegnatele nelle aree corrispondenti.
Ogni bottone avra' due icone: una che corrisponde a "tipo di primitiva attivo" / "assi visualizzati" e l'altra corrispondente a "tipo di primitiva non attivo" / "assi non visualizzati".
Usatele alternativamente nella sotto-area bottone realizzata, a seconda dello stato corrente.

Eliminate il disegno provvisorio dell'immagine raster fatto nella terza tappa.

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

Quinta tappa

Permettete all'utente di introdurre i vertici della primitiva cliccando sulla work area.

Si consiglia di definire una classe C++ che implementi il tipo "primitiva" e contenga le coordinate dei vertici in array e il numero di vertici presenti. Implementare:

Compito

Altre funzioni dall'esercizio 1

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