11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Xml for dummies Parte 2

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

1 La Standard Template Library vettori, liste, mappe, …. find, replace, reverse, sort, …. puntatori intelligenti La libreria standard STL e una libreria.
Estendere i linguaggi: i tipi di dato astratti
Informatica Recupero debito quarto anno Terzo incontro.
Type Checking (1° parte)
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Le gerarchie di tipi.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Introduzione al linguaggio C
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
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 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,
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 - Paolo Cignoni1 Costruzione di Interfacce Lezione 26 XML read e write / Gl Selection e picking
Costruzione di Interfacce Lezione 7 Shading
Costruzione di Interfacce Lezione 19 Qt Tutorial Designer
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce Lezione 20 Qt + 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
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
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 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
Costruzione di Interfacce Lezione 15 Rendering Locale e Globale
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball
Laboratorio di Linguaggi lezione XI: I/O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
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
Algoritmi e Strutture Dati
Approfondimento delle classi
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,
memoria gestita staticamente:
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Lezione IX Laboratorio di Programmazione. Le Classi Una classe C++ è definita come segue: class Nomeclasse { private: // metodi e attrib. visibili solo.
Importanza DTD La DTD (Document Type Definition) consente di dichiarare in maniera univoca la struttura di markup mediante la definizione dello schema.
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.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
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,
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.
Allievi Elettrici - AA Le funzioni ricorsive in C
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
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Compitino del 2004 Alberi Generici. Idea Si vuole un tipo di dato astratto che definisca una struttura ad albero in cui nodi e foglie hanno associato.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Introduzione alle Classi e agli Oggetti in Java 1.
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Xml for dummies Parte 2

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni2 Introduzione XML read e write Scene Graph design Adattare lo scene graph

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni3 Vcg/Xml Due classi: XmlDoc Rappresenta tutto un documento xml dopo che è stato parsato da un file XmlDoc xd; xd.read(myfile.xml); La radice dellalbero xml è in Xd.start; Xml nodo dellalbero; Ogni nodo contiene: string id; // il tag string content; map attr; vector children;

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni4 Memory leaks Nota: la classe xml quando parsa un file fa dei memory leaks… Colpa del parser che usa una serie di variabili globali (buffers) che non vengono deallocate alla fine. Non pericoloso.

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni5 CSG La scena la assumo strutturata come un albero Assumo che ogni nodo sia riferito solo una volta. Due classi principali CSG: contiene lintero scene graph (la radice) CSGNode: generico nodo dello scene graph, lo faccio come classe astratta;

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni6 Usiamo lo SceneGraph Nel doc aggiungiamo un membro: CSG Scene; OnNewDocument: aggiungiamo la costruzione dello scene graph Scene.root.Sons.push_back(new CSGAnimZPrecession()); MoebiusStrip *ms=new MoebiusStrip(); ms->Generate(); Scene.root.Sons.push_back(ms);\ Notare come si crei apposta un oggetto MoebiusStrip con la new anziché passargli lindirizzo del membro del doc. Questo per evitare che poi il distruttore del gruppo faccia pasticci cercando di disallocare qualcosa non allocato con la new

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni7 Usiamo lo SceneGraph Nella OnDraw della classe GLView buttiamo via tutto quello dopo la trasf della trackball e aggiungiamo: pd->Scene.root.glDraw(pd->ElapsedSec); Si dovrebbe fare la stessa cosa con tutto il resto (omini, pallina ecc)

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni8 Vcg/xml Dopo che si è parsato un file xml, occorre fare a mano la creazione delle classi corrispondenti ai vari nodi Molto facile se si fa tutto con la stessa interfaccia. Per ogni classe che si vuole rendere persistente si aggiunge due funzioni XMLWrite(FILE *fp) XMLRead(Xml& xml); E si usa tutto ricorsivamente

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni9 Salviamo in XML Seguiamo la via del praticone: Aggiungiamo al nodo base virtual void XMLWrite(FILE *fp)=0; Che ci obbliga ad implementare tale metodo in TUTTI gli altri nodi da esso derivati void CSGGroup::XMLWrite(FILE *fp) { fprintf(fp," \n"); for(iterator i=Sons.begin();i!=Sons.end();++i) (*i)->XMLWrite(fp); fprintf(fp," \n"); }

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni10 XMLWrite void CSGAnimZPrecession::XMLWrite(FILE *fp) { fprintf(fp,"<CSGAnimZPrecession\n"); fprintf(fp," DeclinationDeg = \"%f\\n, DeclinationDeg); fprintf(fp," AngularSpeedDPS = \"%f\\n, AngularSpeedDPS ); fprintf(fp," StartAngleDeg = \"%f\\n, StartAngleDeg); fprintf(fp,"/>\n"); } void MoebiusStrip::XMLWrite(FILE *fp) { fprintf(fp,"<MoebiusStrip\n"); fprintf(fp," BlockNum = \"%i\"\n",BlockNum); fprintf(fp,"/>\n"); } Il parsing alla prossima puntata!

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni11 XMLRead Il meccanismo di base è che un si passa ad un oggetto un elemento xml da cui loggetto pesca tutto quello che gli serve (simmetrico della write) Difficoltà gestione puntatori funzioni virtuali… Qui abbiamo entrambe… In più dobbiamo riuscire a mappare tutto quello che avevamo nella nostra app come nodi dello scene graph.

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni12 Virtuali Nel nodo del gruppo cè una lista di puntatori a generici list Sons; I meccanismi di inheritance e polimorfismo del c++ ci aiutano a far si che ogni nodo sappia come comportarsi: Come disegnarsi Come salvarsi

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni13 Read La lettura è più problematica perchè in realtà facciamo due cose: Creazione della struttura dello scene graph Settaggio dei parametri dei vari nodi Il meccanismo Virtual void myClass::XMLRead(Xmlelem& xml) Funziona bene se ho già la struttura dellalbero Ogni nodo non standard sa come leggersi perchè lo scrivo io

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni14 Read Schema base: Lettura fatta tramite funzione virtuale pura Ogni classe ha la propria funzione XMLRead Controllo che il tag dellelemento che mi è stato passato sia compatibile con me. Per ogni membro della classe cerco lattributo corrispondente e se non cè metto un valore di default

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni15 Creazione della struttura Nel progettare lo scene graph voglio che sia estendibile. Deve essere possibile definire nuovi classi di nodi (e.g. md2 models) senza dover cambiare nulla nelle strutture di base Nel ricostruire lalbero dello scene graph il problema è che la creazione dei nodi viene fatta dal nodo gruppo. Il nodo gruppo non può conoscere tutti i possibili nodi futuri.

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni16 Incapsulare Una soluzione ragionevole consiste nellincapsulare la conoscenza di tutti i nodi possibili invece che nel gruppo, nello scene graph stesso Assunzione ragionevole lo scene graph conosce tutti I possibili tipi di nodi Chi definisce nuovi tipi di nodi deve subclassare lo scene graph Perchè non subclassare il gruppo? Perchè non è una classe finale. Posso immaginare classi derivate da group (e.g. switch).

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni17 Creazione di nodi Per rendere flessibile la creazione aggiungo allo scene graph una funzione che mi crea dinamicamente un nuovo nodo di un tipo specificato a runtime CSGNode *CSG::Allocate(const string &classname) Se voglio nuovi nodi basta subclassare CSG e ridefinire Allocate per gestire nuovi nomi di classi Secondo vantaggio: la scene può sapere tutto della vita dei suoi figli

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni18 Allocate base CSGNode *CSG::Allocate(const string &classname) { CSGNode *pt=0; if(classname=="CSGGroup") pt= new CSGGroup; if(classname=="CSGTransformation") pt = new CSGTransformation; if(classname=="CSGAnimRotation") pt = new CSGAnimRotation; if(classname=="CSGAnimZPrecession") pt = new CSGAnimZPrecession; return pt; }

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni19 Specializzazione Scene Graph A questo punto iniziamo a specializzare il nostro scene graph. Deve gestire nuovi tipi di nodi È vincolato ad avere un solo nodo di tipo Moebius che voglio riferire facilmente. Mi tengo un membro puntatore a Moebius strip class CSGMb : public CSG { public: CSGMb() {m=0;} virtual CSGNode *Allocate(const string &classname); MoebiusStrip *m; };

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni20 Specializzazione Scene Graph CSGNode *CSGMb::Allocate(const string &classname) { if(classname=="MoebiusStrip") { assert(m==0); m=new MoebiusStrip; return m; } CSGNode *nn=CSG::Allocate(classname); if(nn) return nn; return 0; } Il membro puntatore a moebius è quello che uso nel doc

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni21 Picking Cosicome abbiamo ristrutturato ora non funziona più. Perché? Il Picking era membro di moebius e per funzionare assumeva che venisse fatto partire con la matrice di modellazione come durante il rendering Adesso abbiamo una popmatrix alla fine che toglie il moto di precessione Ogni gruppo è isolato.

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni22 Picking Il picking è una feature dello scene graph. Ogni nodo che disegna qualcosa è responsabile di mettere il suo nome allinizio lasciare sullo stack dei nomi alla fine qualcosa di sensato (-1). Problema: possibili collisioni di nomi. Si dovrebbe usare anche lo stack dei nomi Insieme dei nomi locale al gruppo.

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni23 Picking int CSG::Pick(int x, int y, const float &DocTime) Notare che: Ha bisogno del tempo Funziona purché sia fatta partire nello stesso stato di quando si fa partire glDraw della scena intera

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni24 Aggiungiamo la pallina Facciamo una classe derivata da CIMesh e da CSGNode class CSGSphereMesh : public CSGNode, CIMesh { public: float Radius; int Parallel; int Meridian; CSGSphereMesh(){}; virtual~CSGSphereMesh(void){}; virtual void glDraw(const float DocTime); virtual void XMLWrite(FILE *fp); virtual void XMLRead(Xml &xml, CSG *Base); };

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni25 CSGSphereMesh CSGSphereMesh(float r,int p,int m) { Radius=r; Parallel=p; Meridian=m; CIShape::Sphere(*this,r,p,m); };

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni26 void CSGSphereMesh::glDraw(const float DocTime){ Draw (); } void CSGSphereMesh:: XMLWrite(FILE *fp) { fprintf(fp,"<CSGSphereMesh\n"); fprintf(fp," Radius = \"%f\" Parallel = \"%i\" Meridian= \"%i\"\n", Radius,Parallel,Meridian); fprintf(fp,"/>\n"); } void CSGSphereMesh::XMLRead(Xml &xml, CSG *Base) { assert(xml.id == "CSGSphereMesh"); Radius = (float)atof(xml["Radius"].c_str()); Parallel = atoi(xml["Parallel"].c_str()); Meridian = atoi(xml["Meridian"].c_str()); CIShape::Sphere(*this,Radius,Parallel,Meridian); }

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni27 Allocate Avendo aggiunto al un nuovo nodo allo scene graph devo ricordarmi di gestirlo nella allocate CSGNode *CSGMb::Allocate(const string &classname) { if(classname=="MoebiusStrip") { assert(m==0); m=new MoebiusStrip; return m; } if(classname=="CSGSphereMesh") { return new CSGSphereMesh; } CSGNode *nn=CSG::Allocate(classname); if(nn) return nn; return 0; }

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni28 Movimento sul nastro Aggiungiamo un nuovo nodo che gestisca il movimento di un oggetto Avevamo una classe MoebiusStrip::pos che faceva gran parte del lavoro sporco Tipico uso: MoebiusStrip::Pos pp; pp.CurSide=0; pp.ThetaDeg=45+CurAngleDeg/2; pd->m.Transform(pp);

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni29 MoebiusStrip::Transform void MoebiusStrip::Transform(const MoebiusStrip::Pos &p) { // di quanto si gira per ogni turn (e.g. float TurnStepDeg = (360.0f/SideNum); // di quanto si avvolge per ogni degree float TwistPerDeg = (TurnStepDeg * Turns )/360.0f; float HalfFilletAngleDeg=(TurnStepDeg*FilletRatio)/2; float BaseAngleDeg = StartTwistDeg-TurnStepDeg/2.0f; // Rotazione Intorno all'asse principale glRotatef(p.ThetaDeg, 0,0,1); glTranslatef(Radius,0,0); // Avvolgimento della striscia. glRotatef(TurnStepDeg*p.CurSide+p.ThetaDeg*TwistPerDeg, 0,1,0); // Spostamento verso la superficie delnastro glTranslatef(Cos(ToRad(BaseAngleDeg+HalfFilletAngleDeg))*InnerRadius,0,0); }

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni30 Incapsuliamo Al solito class CSGAnimMoebiusTransf : public CSGNode { public: CSGMb *b; virtual~CSGAnimMoebiusTransf(void){}; float AngularSpeedDPS; //Degree Per Sec; float StartAngleDeg; int StartSide; virtual void glDraw(const float DocTime); virtual void XMLWrite(FILE *fp); virtual void XMLRead(Xml &xml, CSG *Base); };

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni31 Notate come sia usato il puntatore alla scene dentro a questo nodo per recuperare la moebius strip; Non tutti I nodi hanno bisogno di sapere qualè lo scene graph cui appartengono Un nodo può appartenere a più scene graphs? void CSGAnimMoebiusTransf::glDraw(const float DocTime) { MoebiusStrip::Pos pp; float CurAngleDeg = StartAngleDeg + DocTime*AngularSpeedDPS; pp.CurSide=StartSide; pp.ThetaDeg=CurAngleDeg; b->m->Transform(pp); }

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni32 void CSGAnimMoebiusTransf:: XMLWrite(FILE *fp) { fprintf(fp,"<CSGAnimMoebiusTransf\n"); fprintf(fp," AngularSpeedDPS = \"%f\" " " StartAngleDeg = \"%f \" " " StartSide = \"%f\"\n", AngularSpeedDPS, StartAngleDeg, StartSide); fprintf(fp,"/>\n"); } void CSGAnimMoebiusTransf::XMLRead(Xml &xml, CSG *Base) { assert(xml.id == "CSGAnimMoebiusTransf"); AngularSpeedDPS = (float)atof(xml["AngularSpeedDPS"].c_str()); StartAngleDeg = (float)atof(xml["StartAngleDeg"].c_str()); StartSide = atoi(xml["StartSide"].c_str()); b=(CSGMb *)Base; }

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni33 OnNewDocument BOOL CMBDoc::OnNewDocument() { … Scene.root.Sons.push_back(new CSGAnimZPrecession()); Scene.m=new MoebiusStrip(); m=Scene.m; m->Generate(); Scene.root.Sons.push_back(m); CSGAnimMoebiusTransf *ma=new CSGAnimMoebiusTransf; ma->b=&Scene; ma->StartAngleDeg=0; ma->AngularSpeedDPS=40; Scene.root.Sons.push_back(ma); Scene.root.Sons.push_back(new CSGSphereMesh(.5f,20,40)); ` return TRUE; }

11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni34 Esempio di xml <CSGAnimZPrecession DeclinationDeg = "30.0" AngularSpeedDPS = "10.0" StartAngleDeg= "0.0" /> <MoebiusStrip SideNum = "2" Turns = "1.0" Radius = "4.0" BlockNum = "12" InnerRadius = " " FilletRatio = " " StartTwistDeg = "0.0" StepNum = "4" /> <CSGAnimMoebiusTransf AngularSpeedDPS = "40.0" StartAngleDeg = "0" StartSide="1"/> <CSGAnimRotation AxisX = "0.0" AxisY = "0.0" AxisZ = "1.0" AngularSpeedDPS = "720.0" StartAngleDeg= "20.0" /> <CSGSphereMesh Radius = " " Parallel = "20" Meridian= "40" /> <CSGAnimMoebiusTransf AngularSpeedDPS = "40.0" StartAngleDeg = "80" StartSide="0" /> <CSGSphereMesh Radius = " " Parallel = "20" Meridian= "40" />