Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 26 XML read e write / Gl Selection e picking

Slides:



Advertisements
Presentazioni simili
Laboratorio di Linguaggi lezione I: "Hello, world!" Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Advertisements

Programmazione object oriented in C++
Differenze tra C e C++ Commenti: Adesso puoi inserire dei commenti tra // e la fine della linea. Usare le librerie C: In C++ puoi anche chiamare una funzione.
Introduzione al linguaggio C
Programmazione Procedurale in Linguaggio C++
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Costruzione di Interfacce Lezione 11 Dal Java al C++ parte 2
11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Xml for dummies Parte 2
Costruzione di Interfacce Lezione 6 Esercitazione Trasformazioni
Costruzione di Interfacce Lezione 4 Sistemi di riferimento e trasformazioni
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Estensioni Opengl, Multitexturing,
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Estensioni Opengl, Multitexturing,
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
Costruzione di Interfacce Lezione 4 Nozioni di geometria per la grafica
Costruzione di Interfacce Lezione 4 Geometria per la grafica
Costruzione di Interfacce Lezione 19 Qt Tutorial Designer
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce Lezione 20 Qt + Opengl
Costruzione di Interfacce Lezione 12 C++STL
22 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Texturing
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 24 Scene Graphs e Xml for dummies
6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 anatomia di uno screen saver
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 30 MMeditor e collision detection
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball
1 Costruzione di Interfacce Primi passi in OpenGL
2 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 23 Scene Graphs, Object Loading
Costruzione di Interfacce Lezione 8 Rasterizzazione
Introduzione al linguaggio C++ 5 lezioni
JAVA C import java.util.*; #include <stdio.h>
Università degli Studi di Roma
INFORMATICA GRAFICA – SSD ING-INF/05 Sistemi di elaborazione delle informazioni a.a. 2007/2008 Esercitazione OpenGL.
Selezione (=scelta) con “if-else”
Java Serialization.
Array Ricerca Ordinamento Fusione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
1 laboratorio di calcolo II AA 2003/04 quinta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 quarta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
AN Fondam98 Sorting Ricerca in un vettore ordinato.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Diagramma di flusso del problema del Supermercato.
I numeri di Fibonacci.
Piero Scotto - C141 C14 SINTASSI DEL C VARIABILI e COSTANTI.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Tipi parametrici Collezioni generiche. Strutture matematiche parametriche.
Corso di Programmazione Grafica e Laboratorio Daniele Marini
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Polimorfismo.
CORSO DI PROGRAMMAZIONE II Lezione 22
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 29 ancora MMeditor,
#include void main() { int a,b,c,; float s, x,x1,x2,delta,alfa,beta; int num[3]; int i; printf("La forma classica dell'equazione di 2° grado è: a*x^2+b*x+c=0\n.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Ereditarietà in C++
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball, Generazione TexCoords
Definizione di algoritmo: Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Architettura dei Sistemi Operativi
Laboratorio di Servizi Web - XML - Ardissono 1 Rappresentazione ad oggetti di documenti XML Parser fanno analisi sintattica di documento XML ma, a meno.
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
03/19/09E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici.
Algoritmi Avanzati a.a.2013/2014 Prof.ssa Rossella Petreschi Somme prefisse Lezione n°2.
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Unità didattica 1: Introduzione al linguaggio Java
ATOMICITÀ Il tipo di atomicità di un programma PL/SQL è stabilito dall’ambiente chiamante oppure dal programma Gestione atomicità: COMMIT SAVEPOINT nome_punto.
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi
Passaggio di parametri per indirizzo
Scandire …...
Corso di programmazione, Simulazione, ROOT, code, ecc. ecc.
Transcript della presentazione:

Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 26 XML read e write / Gl Selection e picking

Costruzione di Interfacce - Paolo Cignoni2 XML writing Ogni classe scrive un elemento e responsabile del contenuto del nodo xml ricorsiva si usa semplicemente gli stream

Costruzione di Interfacce - Paolo Cignoni3 XML Write void CISG::XMLWrite(QTextStream &xstrm) { xstrm \n"; root.XMLWrite(xstrm); xstrm \n"; } void CISGGroup::XMLWrite(QTextStream &xstrm) { xstrm \n"; iterator i; for(i=Sons.begin();i!=Sons.end();++i) (*i)->XMLWrite(xstrm); xstrm \n"; }

Costruzione di Interfacce - Paolo Cignoni4 class CISGRotation :public CISGNode {public: CISGRotation::CISGRotation() :Axis(Point3f(0,0,1)),AngleDeg(0){}; CISGRotation::CISGRotation(float ad, Point3f &v): Axis(v),AngleDeg(ad) {}; Point3f Axis; float AngleDeg; virtual void glDraw(const float ) {glRotatef(AngleDeg,Axis[0],Axis[1],Axis[2]);} virtual void XMLWrite(QTextStream &xstrm); virtual bool XMLRead(QDomElement n, CISG *Base); }; void CISGRotation::XMLWrite(QTextStream &xstrm) { xstrm \n"; xstrm << Axis << " " << AngleDeg ; xstrm \n"; }

Costruzione di Interfacce - Paolo Cignoni5 Overload > QTextStream& operator<< ( QTextStream& os, Point3f& m ) { os<< m[0] << " " << m[1] << " " << m[2] << " " ; return os; } QTextIStream& operator>> ( QTextIStream& os, Point3f& m ) { os >> m[0] >> m[1] >> m[2]; return os; } QTextStream& operator<< ( QTextStream& os, Matrix44f& m ) { for(int i=0; i<4;++i) for(int j=0; j<4;++j) os<< m[i][j]; return os; }

Costruzione di Interfacce - Paolo Cignoni6 XML read lxml salvato e formato da un nodo di tipo CISG che contiene come unico sottoalbero un CISGGroup. Problema principale: creazione dinamica di oggetti in base a stringa se trovo un nodo xml con tag CISGRotation devo istanziare un oggetto di tipo CISGRotation ecc. Delegare lallocazione al SG

Costruzione di Interfacce - Paolo Cignoni7 Lettura SG Lo scene graph deve conoscere tutti I tipi di nodi cio non era necessario per la scrittura Allocate(string) alloca in base al tag. Come si fa ad aggiungere nuovi nodi allo sg e.g. moebius e md2?

Costruzione di Interfacce - Paolo Cignoni8 lettura Scene Graph bool CISG::XMLRead(QIODevice &io) { QDomDocument doc; if ( !doc.setContent( &io ) ) return false; QDomElement docElem = doc.documentElement(); if(docElem.tagName() != "CISG" ) return false; QDomNode xroot = docElem.firstChild(); if(xroot.isNull()) return false; QDomElement xre = xroot.toElement(); // try to convert the node to an element. if( xre.tagName()!= "CISGGroup") return false; return root.XMLRead(xre,this); }

Costruzione di Interfacce - Paolo Cignoni9 lettura gruppo bool CISGGroup::XMLRead(QDomElement en, CISG *Base) { Sons.clear(); if(en.tagName() !="CISGGroup") return false; QDomNode n=en.firstChild(); while( !n.isNull() ) { QDomElement e = n.toElement(); // try to convert the node to an element. if( !e.isNull() ) { CISGNode *np=Base->Allocate(e.tagName()); if(!np) return false; cout << e.tagName().ascii() << endl; // the node really is an element. np->XMLRead(e,Base); Sons.push_back(np); } n = n.nextSibling(); } return true; }

Costruzione di Interfacce - Paolo Cignoni10 lettura nodo generico /********** CISGRotation *************/ void CISGRotation::XMLWrite(QTextStream &xstrm) { xstrm \n"; xstrm << Axis << " " << AngleDeg ; xstrm \n"; } bool CISGRotation::XMLRead(QDomElement n, CISG *) { if(n.tagName() !="CISGRotation" || !n.firstChild().isText() ) return false; cout << n.tagName().ascii() << ":" << n.text().ascii() << endl; QTextIStream(&n.text()) >> Axis >> AngleDeg; return true; }

Costruzione di Interfacce - Paolo Cignoni11 allocate standard CISGNode *CISG::Allocate(const QString &classname) { CISGNode *pt=0; if(classname=="CISGGroup") pt= new CISGGroup; if(classname=="CISGGround") pt= new CISGGround; if(classname=="CISGRotation") pt= new CISGRotation; if(classname=="CISGTranslation") pt= new CISGTranslation; if(classname=="CISGScaling") pt= new CISGScaling; if(classname=="CISGTransformation") pt= new CISGTransformation; if(classname=="CISGAnimRotation") pt= new CISGAnimRotation; if(classname=="CISGAnimZPrecession") pt= new CISGAnimZPrecession; return pt; }

Costruzione di Interfacce - Paolo Cignoni12 allocate derivata Per poter gestire nodi personalizzati basta subclassare la classe principale dello scenegraph, ridefinire la allocate in modo da coprire le allocazioni di nuovi nodi class CISGM : public CISG { public : virtual CISGNode *Allocate(const QString &classname) { CISGNode *ret=CISG::Allocate(classname); if(classname=="CIMoebius") ret=new CIMoebius(); return ret; } };

Costruzione di Interfacce - Paolo Cignoni13 Selezione e picking Per capire quello che si trova sotto il mouse nel mondo 3d Due strategie glselection, ad alto livello, permette di sapere quale oggetto ho cliccato con il mouse gluUnproject dato un punto sullo schermo e la z ad esso associata sullo zbuffer, permette di trovare le coord 3d in nel sistema di riferimento originale

Costruzione di Interfacce - Paolo Cignoni14 glSelection Meccanismo fornito da opengl per capire cosa fa a finire in una data porzione dello schermo. Quindi per capire, con precisione, cosa si trova sotto il mouse Sfrutta la pipeline di rendering Non fa rasterizzazione

Costruzione di Interfacce - Paolo Cignoni15 glSelection In pratica si definisce una nuova matrice di proiezione che inquadra solo la regione scelta Si rimanda tutta la geometria della scena, dando ad ogni entità un nome La geometria attraversa solo la prima parte della pipeline (no rasterization) I nomi di quello non viene clippato tutto fuori dal volume di vista vengono salvati in un buffer.

Costruzione di Interfacce - Paolo Cignoni16 glSelection in pratica Per scoprire cosa passa nel punto x,y occorre: Passare alla modalità di rendering selection glRenderMode(GL_SELECT); Inizializzare lo stack dei nomi glInitNames(); // LoadName() won't work with no names on the stack glLoadName(-1); Preparare un buffer dove opengl metterà i nomi delle entità che cadono nella zona dinteresse static unsigned int selectBuf[16384]; glSelectBuffer(16384, selectBuf);

Costruzione di Interfacce - Paolo Cignoni17 glSelection Modificare la matrice di proiezione in modo che mi clippi quello che mi interessa Occorre PRE-moltiplicarla per una matrice fatta apposta e relativa al punto che vogliamo e al viewport corrente: int viewport[4]; glGetIntegerv(GL_VIEWPORT,viewport); glMatrixMode(GL_PROJECTION); double mp[16]; glGetDoublev(GL_PROJECTION_MATRIX,mp); glPushMatrix(); glLoadIdentity(); gluPickMatrix (x, y, 4, 4, viewport); glMultMatrixd(mp);

Costruzione di Interfacce - Paolo Cignoni18 glSelection Rendering con i nomi per oggetti che voglio scegliere glLoadName(int) Nota è uno stack glPushName() glPopName()

Costruzione di Interfacce - Paolo Cignoni19 glSelect Dopo il rendering si rimette tutto a posto glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); int hits = glRenderMode(GL_RENDER); E nel buffer che avevamo preparato opengl ha messo una serie di record con la seguente struttura: int: Numero nomi nello stack int,int: Minima e max depth int … int Lista nomi sullo stack

Costruzione di Interfacce - Paolo Cignoni20 Parsing del selection buffer Se non abbiamo usato lo stack (se non abbiamo fatto glPushName) i record sono tutti lunghi uguali e parsarli è facile: vector > H; for(int ii=0;ii<hits;ii++){ TRACE("%ui %ui %ui %ui\n", selectBuf[ii*4 ],selectBuf[ii*4+1], selectBuf[ii*4+2],selectBuf[ii*4+3]); H.push_back( make_pair( selectBuf[ii*4+1]/ , selectBuf[ii*4+3]) ); } sort(H.begin(),H.end()); TRACE("\n Closest is %i\n",H[0].second);

Costruzione di Interfacce - Paolo Cignoni21 In pratica Non fare la pick direttamente nellhandler del mouse Nel 90% dei casi va, ma potrebbe non essere disponibile il contesto opengl Salvarsi posizione del mouse;

Costruzione di Interfacce - Paolo Cignoni22 tipico code snip long hits; static unsigned int selectBuf[16384]; glSelectBuffer(16384, sBuf); glRenderMode(GL_SELECT); glInitNames(); glPushName(-1); int viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); double mp[16]; glGetDoublev( GL_PROJECTION_MATRIX,mp); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluPickMatrix(x, viewport[3]-y, 4, 4, viewport); glMultMatrixd(mp); glMatrixMode(GL_MODELVIEW); Draw(); // RENDER all the scene as always loading names before objects glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); hits = glRenderMode(GL_RENDER); if (hits <= 0) return 0; vector > H; for(int ii=0;ii<hits;ii++) H.push_back( make_pair(sBuf[ii*4+1]/ ,sBuf[ii*4+3])); sort(H.begin(),H.end()); return H[0].second;

Costruzione di Interfacce - Paolo Cignoni23 Alternativa gluUproject int gluUnProject( GLdouble winx, GLdouble winy, GLdouble winz, const GLdouble modelMatrix[16], const GLdouble projMatrix[16], const GLint viewport[4], GLdouble *objx, GLdouble *objy, GLdouble *objz ); dove winx e winz sono le coord del mouse winz e la z del pixel presa con glReadPixel(winx,winy,1,1, GL_DEPTH_COMPONENT, GL_FLOAT,&winz); Restituisce la posizione del punto indicato dal mouse nel sistema di riferimento definito al momento in cui sono state prese le matrici model e proj. ATTENZIONE A QUANDO PRENDETE LE MATRICI!!!

Costruzione di Interfacce - Paolo Cignoni24 GlSelection in azione Per provare abbiamo legato, in Moebius8 al ctrl click del mouse la selezione e coloritura in verde di una sezione dellanello.

Costruzione di Interfacce - Paolo Cignoni25 Gestione Animazione Rimane solo da gestire effettivamente lazione di stop e play, ma questo non riguarda linterfaccia ma come è stata strutturata la mia scena… (poco e male) Aggiungo un campo nel doc che tiene quanto tempo è passato CMBDoc::ElapsedSec; Si aggiorna solo tramite una funzione Doc::UpdateTime() da chiamare il più spesso possibilie e che controlla se m_bplay è true; Si chiama UpdateTime() nella onidle e nella mousemove (durante il dragging non lapp non è idle) La vista lo legge, per capire come e dove disegnare tutto.