Costruzione di Interfacce Lezione 18 MFC e OpenGL

Slides:



Advertisements
Presentazioni simili
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Advertisements

Le gerarchie di tipi.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari
Introduzione al linguaggio C
3 a lezione - laboratorio a.a Corso di Laurea Ingegneria MECCANICA.
Gerarchie di Oggetti Tutti i sistemi avanzati di grafica (PHIGS, OpenGL, DirectDraw, …) permettono di definire un modello come una gerarchia di oggetti.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
[Iriad Kumbuli] OpenGL Framebuffer
Costruzione di Interfacce Lezione 11 Dal Java al C++ parte 2
Costruzione di Interfacce Lezione 6 Esercitazione Trasformazioni
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Laboratorio di Linguaggi lezione V Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
1 Costruzione di Interfacce Primi passi in OpenGL
Laboratorio di Linguaggi lezione VII: puntatori 3/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Costruzione di Interfacce Lezione 12 C++STL
6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 anatomia di uno screen saver
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Costruzione di interfacce Paolo Cignoni
1 Costruzione di Interfacce Primi passi in OpenGL
2 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 23 Scene Graphs, Object Loading
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
INFORMATICA GRAFICA – SSD ING-INF/05 Sistemi di elaborazione delle informazioni a.a. 2007/2008 Esercitazione OpenGL.
CAPITOLO 4 LINGUAGGIO JAVA: COSTRUTTI DI BASE. ALFABETO Java adotta la codifica standard Unicode della società Unicode, Inc. (ftp://ftp.unicode.org) definito.
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
OGGETTI COMPOSTI Una classe può contenere riferimenti a altre classi (o anche a se stessa): public class Orologio { Counter ore, minuti; } Loggetto Orologio.
DBMS ( Database Management System)
Per costruire unapplicazione occorre compilare il file (o i file se più duno) che contengono il testo del programma (file sorgente) Il risultato sono uno.
CODIFICA Da flow-chart a C++.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi
Corso di Programmazione Grafica e Laboratorio Introduzione a OpenGL Prof. Daniele Marini.
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Display list e picking Daniele Marini Corso Di Programmazione Grafica e Laboratorio.
1 Programmazione grafica: l’Interazione Daniele Marini.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Docente: Simone Zambenedetti. Tip and Tricks : Moduli utili (Back to Top, External links, References Dialog, Module Filter)
ARDUINO Duemilanove Parte_4 Arduino e Processing
JAVA Per iniziare. Verificare installazione javac –version java –version Cercare i files e sistemare eventualmente il path.
Programmazione in linguaggio C
Oggetti in C# Lezione 2 Metodi e Static Oggetti in C# - Lezione 2.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball, Generazione TexCoords
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Politecnico di Milano © Domenico Barretta Processi concorrenti in Unix Docente Domenico Barretta Politecnico di Milano
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Specifiche. Scopo e significato delle specifiche (1) Lo scopo di una specifica è di definire il comportamento di un ’ astrazione. Gli utenti si baseranno.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Esercitazione sull’ ordinamento 20 maggio 2003
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
XVRC2 Emanuele Ruffaldi Giugno Tre esperimenti con S3D ► Estensioni del Linguaggio ► Pre-Compilatore ► Esecuzione dentro il Java L C J.
Claudio Rocchini, Visual Computing Group
Transcript della presentazione:

Costruzione di Interfacce Lezione 18 MFC e OpenGL

OpenGL e MFC  In windows tutte le operazioni di disegno sono riferite a Device Context  Per disegnare usando OpenGL abbiamo bisogno anche di un OpenGL Rendering Context  È legato a quel device context  Deve essere adatto al Device Contex della finestra su cui vogliamo disegnare.

Device Context e Rendering Context  Tutti i comandi opengl passano attraverso un rendering context (specificato implicitamente)  Tutti i comandi di grafica in Windows GDI passano attraverso un device context (specificato esplicitamente)  Un rendering context è legato ad un device context e ne condivide lo stesso pixel format (anche se non è detto che sia lo stesso di quando lo abbiamo creato)  Un thread può avere un solo rendering context corrente e un rendering context può essere attivo per un solo thread.

Pixel Format  Ogni device context in windows ha un suo pixel format intrinseco.  Può essere cambiato una sola volta per finestra  In un pixelformat l’utente specifica:  Numero bit colore  Bit z-buffer  Se la finestra è double buffered  Se c’è uno stencil buffer  Ecc.

Pixel Format  Notare che il pixel format è:  Il rendering context che si crea partendo da un dc ne condivide il pixelformat  Non tutti i pixelformat sono possibili  Quello che si può ottenere è abbastanza dipendente dalle caratteristiche del device context (e dalla modalità video corrente)  Non tutti i pixel format sono ammissibili  ChoosePixelFormat  SetPixelFormat  Si sceglie un pixel format dando un indice.  Non tutti I pixel format sono accelerati hw

PixelFormat Step tipici:  Riempire una struttura pixelformat descriptor PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd 1, // version number PFD_DRAW_TO_WINDOW | // support window PFD_SUPPORT_OPENGL | // support OpenGL … };  Chiedere un pixelformat che assomigli a quello chiesto: int iPixelFormat = ChoosePixelFormat(hdc, &pfd);  (opz) controllare cosa è ritornato  Settare il pixelformat ottenuto SetPixelFormat(hdc, iPixelFormat, &pfd);

Esempio PixelFormat PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd 1, // version number PFD_DRAW_TO_WINDOW | // support window PFD_SUPPORT_OPENGL | // support OpenGL PFD_DOUBLEBUFFER, // double buffered PFD_TYPE_RGBA, // RGBA type 24, // 24-bit color depth 0, 0, 0, 0, 0, 0, // color bits ignored 0, // no alpha buffer 0, // shift bit ignored 0, // no accumulation buffer 0, 0, 0, 0, // accum bits ignored 32, // 32-bit z-buffer 0, // no stencil buffer 0, // no auxiliary buffer PFD_MAIN_PLANE, // main layer 0, // reserved 0, 0, 0 // layer masks ignored };

Rendering Context  Una volta che abbiamo una finestra con il pixelformat che ci è appropriato si può creare il rendering context opengl  HGLRC hglrc=wglCreateContext(hdc);  Per settare il rendering context corrente del thread  wglMakeCurrent(hdc, hglrc);

Stili e classe finestre e opengl  Quando in Windows si crea una finestra se ne stabilisce lo stile  Per aver Opengl in una finestra occorre che questa abbia come stile:  WS_CLIPCHILDREN  Quel che si disegna nella finestra padre non influenza i figli  WS_CLIPSIBLINGS  Idem per i fratelli  E non avere  CS_PARENTDC  altrimenti la finestra userebbe il device context del padre

OpenGL e MFC  Dove va tutto cio?  In un’applicazione con architettura doc/view, si aggiunge quel che serve nella classe view.  Alla creazione della finestra ci assicuriamo che la finestra abbia lo stile giusto  Prendiamo un device context per la client area della finestra  Scegliamo e settiamo il pixel format  Creiamo e ci salviamo un handle ad un rendering context opengl

Modifica della classe  Include nel.h della classe view  #include  Opengl rendering context e device context  CClientDC*m_pDC;// DC della finestra  HGLRCm_hrc;// Contesto OpenGL

Stile  Si può cambiare con cui viene create una finestra MFC modificando la PreCreateWindow BOOL MyOpenGLView::PreCreateWindow(CREATESTRUCT& cs) { // An OpenGL window must be created with the following flags and must not // include CS_PARENTDC for the class style. Refer to SetPixelFormat // documentation in the "Comments" section for further information. cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC; if(cs.style&CS_PARENTDC) { AfxMessageBox("Win OpenGL Internal Error!"); return FALSE; } return CView::PreCreateWindow(cs); }

Pixelformat e rendering context  Va fatto subito dopo la creazione della finestra. Override (esplicito) della Create() BOOL MyOpenGLView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { if( ! CView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext)) return false; m_pDC = new CClientDC(this); ASSERT(m_pDC != NULL); // Setta il pixel format if (!SetupPixelFormat(m_pDC)) return FALSE; // Crea e setta il contesto OPENGL m_hrc = wglCreateContext(m_pDC->GetSafeHdc()); if(m_hrc==NULL){ AfxMessageBox("OpenGL contest fail"); return FALSE; }

Pixel Format BOOL SetupPixelFormat( CDC * pDC ) { static PIXELFORMATDESCRIPTOR pfd = { … omissis … }; int pixelformat; if ( (pixelformat = ChoosePixelFormat(pDC->GetSafeHdc(), &pfd)) == 0 ) { AfxMessageBox("ChoosePixelFormat failed"); return FALSE; } if (SetPixelFormat(pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE) { AfxMessageBox("SetPixelFormat failed"); return FALSE; } return TRUE; }

Librerie  Fatto questo se si compila il linker non risolve alcuni simboli  Aggiungere le librerie  Property page->linker->input -> Additional dependencies  Opengl32.lib  Glu32.lib

OnDestroy  Se non si fa pulizia all’uscita si hanno memory leaks…  Gestiamo il messaggio WM_DESTROY mandato alla finestra quando questa viene distrutta void myview::OnDestroy() { CView::OnDestroy(); wglMakeCurrent(m_pDC->GetSafeHdc(),m_hrc); glFinish(); wglMakeCurrent(NULL, NULL); if (m_hrc) ::wglDeleteContext(m_hrc); if (m_pDC) delete m_pDC; }

OnEraseBackGround  Il clear del background non deve piu’essere fatto automaticamente, ma direttamente con una funzione OpenGL.  Si deve intercettare la pulizia automatica del background di una finestra  Handler messaggio WM_ERASEBKGND BOOL myview::OnEraseBkgnd(CDC* pDC) { return true; // lo facciamo noi… }

Finalmente OnDraw  Adesso possiamo disegnare con opengl nella onDraw!! void CMoebius3View::OnDraw(CDC* pDC) { wglMakeCurrent(m_pDC->GetSafeHdc(),m_hrc); glClear(GL_COLOR_BUFFER_BIT); GLfloat triangle[3][2]={{-1.0f,-1.0f},{1.0f,-1.0f},{ 0.0f, 1.0f}}; GLfloat p[2]={0.0, 0.0f}; int i, j; glClear (GL_COLOR_BUFFER_BIT); glBegin(GL_POINTS); for(j=0;j<20000;j++){ glVertex2f(p[0],p[1]); i=rand()%3; p[0]=(p[0]+triangle[i][0])/2.0f; p[1]=(p[1]+triangle[i][1])/2.0f; } glEnd(); glFlush(); SwapBuffers(m_pDC->GetSafeHdc()); }

Riassunto  PreCreateWindow  Lo stile giusto  Create  Pixelformat e wglCreateContext  OnEraseBackgnd  Ritornare true  OnDraw  Classico disegno e swapbuffer  OnDestroy  Distruzione contesti vari

OnSize  Al solito copiamo dal vecchio prog glut void CMoebius3View::OnSize(UINT nType, int cx, int cy) { wglMakeCurrent(m_pDC->GetSafeHdc(),m_hrc); glMatrixMode (GL_PROJECTION); glLoadIdentity (); float ratio=(float)cx/(float)cy; glOrtho(-1,1,-ratio,ratio,-1,1); glViewport (0, 0, (GLsizei) cx, (GLsizei) cy); glMatrixMode (GL_MODELVIEW); /* back to modelview matrix */ }  Non va! perche?

OnSize 2  OnSize viene chiamata prima che ci sia il contesto opengl!  Conviene correggere il costruttore (init m_pDC e m_hrc a 0) e incapsulare la wglMakeCurrent in una funzione che faccia qualche test e togliere tutte le wglMakeCurrent e sostituirle con SetGL (testando se fallisce…) inline BOOL SetGL() { if(!(m_pDC && m_hrc)) return false; if(!wglMakeCurrent(m_pDC->GetSafeHdc(), m_hrc)){ AfxMessageBox("GlMakeCurrent Error"); return FALSE; } return TRUE; }

OnDraw e thread  Nelle MFC il ridisegno è fatto in un thread differente.  Conviene prevedere un meccanismo per evitare di disegnare quando l’app sta modificando il documento  Si aggiunge  nel Doc un campo bool busy  Nella on draw, all’inizio  if(pDoc->busy) return;

Esercizio  Portare l’esempio Moebius2 sotto MFC.  Nel doc ci starà un oggetto della classe mesh e il metodo per costruirlo.  Alla classe mesh si aggiunge un metodo per disegnarsi  Nella view la OnDraw accederà a tale metodo.