tag:blogger.com,1999:blog-9328123154739035972024-02-20T05:18:36.534-08:00Now3DGiuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.comBlogger27125tag:blogger.com,1999:blog-932812315473903597.post-28102672858859280912012-09-11T13:47:00.001-07:002012-09-11T13:47:08.835-07:00Scaricamento gratuito di Now3D v1.30<table border="0"><tr><td><a target="_blank" href="http://www.appup.com/applications/applications-Now3D+1.30"><img align="right" src="http://www.now3d.it/images/appup_on_purple_150.png" align="center" alt="Scarica Now3D 1.30"/></a>Potete scaricare gratuitamente Now3D v1.30 dallo store AppUp della Intel:<br />
</td></tr>
</table>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-37348607794567516742012-03-31T19:55:00.003-07:002012-04-01T10:59:06.405-07:00Nuove scene sul metodo Monte Carlo<a target="_blank" href="http://www.now3d.it/images/N3DCloud.png"><img src="http://www.now3d.it/images/N3DCloud_MC_150.png" border="0" alt="" align="left" style="margin-right:5px;" /></a>
Sono disponibili tre nuove scene per provare l'implementazione su Now3D2 del metodo Monte Carlo.<br />
Le scene diventano più realistiche grazie alla distribuzione di N raggi in caso di riflessione, trasmissione e diffusione.<br />
Più raggi si distribuiscono (attributo dettaglio) e migliore sarà la qualità.
<br /><br />
Vi invito a provarle <a href="http://www.now3d.it/It/N3DCloud.aspx">qui</a>.Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com1tag:blogger.com,1999:blog-932812315473903597.post-17652478706001047952012-01-02T09:53:00.000-08:002012-01-02T09:53:24.204-08:00Rilascio di Now3D Cloud<a target="_blank" href="http://www.now3d.it/images/N3DCloud.png"><img src="http://www.now3d.it/images/N3DCloud_150.png" border="0" alt="" align="right" /></a>
Sono lieto di presentarvi Now3D Cloud, un servizio tramite il quale potrete provare il motore 3D di Now3D direttamente sul web.<br /><br />
Leggete le <a href="http://www.now3d.it/It/N3DCloudInfo.aspx">"info"</a> per saperne di più.Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-84447291234510969502011-11-06T08:39:00.000-08:002011-11-06T08:39:49.302-08:00Now3D Cloud versione alphaIl lavoro di implementazione di Now3D Cloud sta procedendo bene e a breve rilascerò la versione Beta! <a href="http://www.now3d.it/It/N3DCloudInfo.aspx">continua a leggere qui</a><br />
<div style="text-align:center"><a href="http://www.now3d.it/It/N3DCloudInfo.aspx"><img src="http://www.now3d.it/images/N3DCloud_alpha_288.png" style="border: solid 0px black;" /></a></div>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-38311265844477439442011-10-17T12:57:00.000-07:002011-10-17T12:57:11.035-07:00Nuovi StandardIn questo post voglio parlarvi di un particolare tema che ho voluto affrontare in questi ultimi mesi di sviluppo di Now3D2, e cioè la definizione di nuovi standard.<br />
Questi nuovi standard renderanno Now3D2 più potente e flessibile del suo predecessore.<br />
<br />
<div style="clear:both; border: solid 0px black; overflow:hidden;">
<span style="font-size:130%;">Standard PlugIn</span><br />
Comincio parlandovi di uno standard dal quale potranno nascere in futuro molte nuove implementazioni su Now3D2, e cioè lo standard di un particolare tipo di PlugIn, e cioè quelli che io chiamo di tipo "Libreria Esterna".<br/>
Questo tipo di plugin consiste in dll esterne al core di Now3D2, contenenti nodi (es: shader, oggetti, camere, ecc...) sviluppabili anche da terze parti e naturalmente utilizzabili in maniera nativa su Now3D2.<br/>
Ad esempio molti degli attuali Nodi e Shader che utilizzo su Now3D2 li ho voluti spostare su tre librerie esterne così da snellire la dll principale di Now3D2, e sono: <i>N3D2.CompatibilityLib</i>, <i>N3D2.PrimitivesLib</i>, <i>N3D2.ShadersLib</i>.<br/>
Di seguito due finestre di dialogo contenenti alcuni esempi di nodi di librerie esterne:<br/>
<table width="100%" border="0"><tbody>
<tr><td style="text-align:center"><a href="https://picasaweb.google.com/lh/photo/gKXRIMizMNhKajeYoZtQFg?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYQU3Z9-k7QPC0_Dk3BTfg2GsX2al7QVIM0dfeKUslHY-ZKb7hUxZzm4ocvf11D54bjpNe4st4Uh8TojOtpVn0ZuF06u_R4GSOIDTb8EChc0br-BvGrxg1XabZNg1ig988GkTdtRvnKRGo/s144/Node%252520Browser.png" border="0" style="border-width:0px;" /></a></td><td style="text-align:center"><a href="https://picasaweb.google.com/lh/photo/fWsSDOPpTiZcQXKxAPBIJQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF1YoEFyOxHSyPeQABtXxsK4epZhUPeGw6zDEyuxiRvI9UfpeBMGYhImSZ4UA6eLfpBdnxfK4HEAoeRCx5Au-ZCbfq2Mf2Bml7mpY6LzwgSxwyZMW_QkC6qmMlZfmt8aADaIZ11aaGjcRx/s144/Object%252520Browser.png" border="0" style="border-width:0px;" /></a></td></tr>
<tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Browser per Nodi</td><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Browser per Oggetti</td></tr>
</tbody></table>
</div>
<div>
L'utilizzo di questi elementi esterni a Now3D2 si ricollega anche al motivo principale dell'adozione del formato XML. Infatti, al salvataggio di una Scena (o una Istanza o un Materiale o uno Shader) contenente elementi esterni al core di Now3D2, verrà applicato all'interno dell'xml un collegamento alla libreria richiesta.<br/>
Quindi, per poter ricaricare correttamente la stessa scena è richiesta l'installazione sul proprio PC della stessa libreria plugin utilizzata nella creazione della scena stessa o quantomeno una versione compatibile, altrimenti il caricamento verrà interrotto da un errore contenente possibili indicazioni su dove scaricare la libreria.
</div>
<br />
<div style="border: solid 0px black; overflow:hidden;">
<span style="font-size:130%;">Standard Engine AA</span><br />
<a href="https://picasaweb.google.com/lh/photo/XwR3JPydoshNQdYe8Sj6ow?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirzXilez5YhIRdnP1pBOkXP-7j3bEcc2sAJFLmNA7A6zftrXChvykzy_3wjICKTRolTZ1YE_XcJ3JQCae4kcWLk0Q4nDi3WYpUvMy0taUlulJ3fmus55O9ZwabJaZrnPkkpyOqSYmh20HS/s288/AA%252520Engine%252520Browser.png" align="right" border="0" style="border-width:0px;" /></a>
Tramite questo nuovo standard sarà possibile applicare al motore raytracing di Now3D2 anche algoritmi Antialiasing (AA) di terze parti.<br/>
Per ora ho implementato due motori per il calcolo dell'AntiaAliasing: il <i>Simple</i> e l'<i>HaltonAdaptive</i>.<br/>
Il <i>Simple</i> usa semplici medie pesate di pochi (max 5) sub-pixel posizionati intorno al pixel attuale.<br/>
Mentre il motore <i>HaltonAdaptive</i> è basato sulla distribuzione di punti fatta da Halton ed è di tipo adattivo perchè genera il giusto numero di campioni solo quando necessita.<br/>
Rispetto all'algoritmo di AntiAliasing Halton che implementai nel primo Now3D (il tipo adattivo), adesso ho voluto raggiungere quasi la perfezione assoluta, questo grazie a varie ottimizzazioni dell'algoritmo originario e all'uso dei Filtri (funzioni applicabili ai valori di ritorno dei subpixel utili a una ricostruzione più accurata della scena sottesa dal pixel), dove il filtro MitchellNetravali è quello che reputo migliore.<br/>
La qualità è migliorata così come la velocità.<br/>
L'immagine di seguito è stata generata con il nuovo algoritmo in 208 secondi, mentre se passate sopra con il mouse sulla stessa immagine potrete vedere la stessa scena generata con il vecchio algoritmo in 815 secondi.<br/>
<script language="javascript">
function onImgOver(id){
CompHidden('lblAANew_' + id.toString());
CompHidden('imgAANew_' + id.toString());
CompShow('lblAAOld_' + id.toString());
CompShow('imgAAOld_' + id.toString());
}
function onImgOut(id){
CompShow('lblAANew_' + id.toString());
CompShow('imgAANew_' + id.toString());
CompHidden('lblAAOld_' + id.toString());
CompHidden('imgAAOld_' + id.toString());
}
function CompHidden(IDTag){
document.getElementById(IDTag).style.display='none';
document.getElementById(IDTag).style.visibility='hidden';
}
function CompShow(IDTag){
document.getElementById(IDTag).style.display='inline';
document.getElementById(IDTag).style.visibility='visible';
}
</script>
<div style="float:left;position:relative;cursor:pointer;cursor:hand; border: solid 0px green; display: block; "
onmouseover="onImgOver(1);" onmouseout="onImgOut(1);" text-align:center;>
<a href="https://picasaweb.google.com/lh/photo/AA_DKMo0-CDPt5OTtWj7vw?feat=embedwebsite" target="_blank">
<div style='border:solid 0px black;position:absolute;top:50%;width:100%;text-align:center;margin-top:-1.5em; '>
<label id="lblAANew_1" style='cursor:pointer;cursor:hand;color:white;font-size:3em;'>Nuovo AA<label></label></label>
<label id="lblAAOld_1" style='cursor:pointer;cursor:hand;color:white;font-size:3em;'>Vecchio AA</label>
</div>
<div style="border: solid 0px blue; height: 368px;"><img id="imgAANew_1" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7fsZRpm2FlG8NKn5McI1q9cFAaHmrS1UP3JSu3wGdTNsZDq9kS8gsX10VqFnLhPfR1gl3AP_MSUGPyNtegm_1dGAbc69fcIW8ddAxIwdlrTN18VHrASgRtbies9S6nJPOL6RvtORAK_-C/s800/Test%252520new.jpg" style="border:solid 0px black;" /><img id="imgAAOld_1" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTGTQwVEpsh7ZbmmRAhWUvcPcRDYp20Ta5UnMiP1QSV6APX64eIF606sCVD0-aivDD_D8QEKwr0RcSTuECulz-15v8fyvMeV8a3AK7d88IfCp6ktb8ezyKQGXhECXYCrQ9Y-L_We-ilhyphenhyphenA/s800/Test%252520old.jpg" style="border:solid 0px black;" /></div>
</a></div>
<div></div>
<script language="javascript">onImgOut(1);</script>
</div>
<div>
<label style="FONT-SIZE: 11px;">Passa il mouse sopra per vedere la differenza tra il nuovo e il vecchio AA</label><br/>
</div>
<br />
<div style="clear:both; border: solid 0px black; overflow:hidden;">
<span style="font-size:130%;">Standard RayTracing Engines</span><br />
<a href="https://picasaweb.google.com/lh/photo/18kr2twDyeFh5B5pzlsRhQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPCU5b5qaU8Rc-Y3bpAyCfAYVA_BbQxqCxSAEXTpgnH0F1VjyX4FcxMCGM62stuVhsxBdJ-bhtD0vRP9rUbRxUukFsdsW6WEDxp8ZxB6QBGhGWo4wryF8o0BhItgdjvsCazFm87OzsFQIs/s288/RT%252520Engine%252520Browser.png" align="right" border="0" style="border-width:0px;" /></a>
Pensando a quanti algoritmi di RayTracing presenti nel primo Now3D devo ancora convertire (es: riflessi distribuiti, rifrazioni distribuite, illuminazione globale tramite il metodo MonteCarlo, Irradiance Cache, il Final Gathering, ecc...),
ho cercato di sviluppare uno standard che ne faciliti l'implementazione.<br/>
Grazie alla standardizzazione del motore del RayTracing sarà possibile, per uno sviluppatore, implementare motori alternativi di RayTracing per Now3D2.<br/>
Attualmente questo standard non è completamente definito, comunque ho potuto spostare molto del codice di gestione del RayTracing su una classe a parte (Engine RayTracing), e implementare anche una prima versione dei Riflessi Distribuiti (Engine MonteCarlo), di cui avete avuto una dimostrazione in una delle immagini contenute nel Tema di Now3D2.<br/>
<div style="width:auto; text-align:center;">
<a href="https://picasaweb.google.com/lh/photo/iIDjfT5JMF68AFq7ZSisBw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg082hgQVPNm_aDJpJaDHskshLntNc_X_FJvz2bEgiZheHuyD1X53LRXnMv1HduB4p0540s1E0-fgkVbuluqEB9Svx4mNa7AA73Ge1jWHrRSKMimBeMRSeu817D_ur_NmxmgKSpifh95OU9/s288/TemaWin7_VeniceSample.png" border="0" style="border-width:0px;"/></a></div>
</div>
<br />
<div style="clear:both; border: solid 0px black; overflow:hidden;">
<span style="font-size:130%;">Standard Tessellation</span><br />
<a href="https://picasaweb.google.com/lh/photo/MjAXq5tDcayofRpyImM5FA?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrAw-aiRI7xME0v9hv2eo-swN7YZH52w-eLsr-vwRm_pir7ntslHoIsxAiP7t3vw10pMcD7T6j8rbOScDOIARz-sOtolAirJdYsoxYiBR2SDYcrgV4Ag9ODCiWqhggo1JqTL3eShgW3Ddx/s144/Tessellation.png" align="left" border="0" style="border-width:0px;"/></a>
Infine, ho voluto standardizzare le primitive di tipo mesh tramite l'utilizzo di interfacce (di programmazione) standard contenenti le proprietà Details e UVDetails.<br/>
In questo modo sarà possibile, ad esempio, gestire il dettaglio dinamico degli oggetti contenuti in una scena a seconda della distanza degli oggetti stessi dalla telecamera (<a href="http://en.wikipedia.org/wiki/Level_of_detail" target="_blank">LOD o Level of detail</a>), quindi minor dettaglio per oggetti lontanti e maggior dettaglio per quelli vicini.
</div>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-40051188757101912712011-10-12T13:47:00.000-07:002011-10-12T13:47:42.024-07:00Now3D Cloud sta arrivando...<div><img src="http://www.now3d.it/images/N3D_Cloud_131x131.png" width="131" height="131" border="0" style="border:solid 0px black;" align="left" />
<br/><br/><br/><br/><br/><br/><label style="text-align: center;"><a href="http://www.now3d.it/It/N3DCloudInfo.aspx">Clicca qui per info</a></label></div>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-40106298172611664982011-10-08T14:39:00.000-07:002011-10-08T14:54:53.750-07:00VelocizzazioniVoglio rendervi partecipi degli ultimi sviluppi di Now3D2 attraverso le novità che hanno reso possibile il render delle immagini comprese nel tema di Now3D2.<br/><br/>
Comincerò mostrandovi i miglioramenti in termini di velocizzazioni, mentre nel prossimo post vi mostrerò le vere e proprie novità.<br />
<br />
<div style="border: solid 0px black; overflow:hidden;">
<span style="font-size:130%;">Velocizzazione PLY</span><br />
<a href="https://picasaweb.google.com/lh/photo/TAA9Z3Itq1nmYMGokKAdMg?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNuSfczZrs0BkTkyjxiO6inzkWNUCWpIXWtob_Ytx2Dm-Wxaeb1X5cJmChYBKFnKctHkThE9f_SJ9gzzKYWMWkpUCGxxm6VyXHXPrvQcAoTjF68Uyz_1ZQ0fbP98pyF8cvB7F3RSjy7_FY/s144/Dragon_PLY.jpg" align="left" border="0" style="border-width:0px;" /></a>
Ho ottimizzato il caricamento di mesh PLY. Ad esempio la mesh Dragon qui a sinistra contenente 871000 poligoni è stata caricata in soli 5 secondi invece dei 15 minuti della vecchia versione!<br/>
</div>
<br />
<div style="clear:both; border: solid 0px black; overflow:hidden;">
<span style="font-size:130%;">Velocizzazione Nodi</span><br />
Varie ottimizzazioni al codice di gestione dei Nodi hanno portato a una velocizzazione nel reperimento dei valori dei nodi nell'ordine del 1600%!!!<br />
</div>
<br />
<div style="clear:both; border: solid 0px black; overflow:hidden;">
<span style="font-size:130%;">Velocizzazione Raytracing</span><br />
Invece l'algoritmo del Raytracing pur subendo una drastica riorganizzazione (di cui ne parlerò nel prossimo post) che ha aumentato notevolmente la flessibilità, ha comunque avuto un miglioramento di velocità di circa del 90%.<br/>
</div>
<br />
<div style="clear:both; border: solid 0px black; overflow:hidden;">
<span style="font-size:130%;">Velocizzazione Antialiasing</span><br />
Per ultimo anche l'algoritmo di AntiAliasing a seguito di importanti modifiche ha avuto grandi benefici con velocizzazioni dell'ordine del 360%.<br/>
</div>
<br />
<div style="clear:both; border: solid 0px black; overflow:hidden;">
<span style="font-size:130%;">Risultato</span><br />
Questo di seguito è uno screenshot che mostra la finestra di renderizzazione alla conclusione del rendering della prima immagine del tema d Now3D2 per Windows 7.<br />
Il rendering è durato 3733 secondi (circa 1 ora e 2 minuti), su un PC dotato di CPU E8400 a 3.00GHz, e ha generato 136.944.176 raggi in modalità AA high per un'area di 1366x768 pixel.<br/>
<a href="https://picasaweb.google.com/lh/photo/52V-V0uRAFArFX0cy7yySw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEldo0q_tce2FrJiZx13bmZ7Ev4cLqhZrZvTf4PShtz-Q7moNWrbu7uRnNK5SdNUXSUYAjRhIEjQ-0hvaufkC_hpG6L_uyrerudgCs8m2C5UBbs8UPl_coRNLzmIKzNxniQzTtzBvdsesE/s144/Dragon.jpg" border="0" style="border-width:0px;" /></a>
</div>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-66177395452041413852011-09-26T12:55:00.000-07:002011-09-27T10:06:11.636-07:00Now3D2 (Tema per Windows 7)<div>
Potete scaricare il <a target="_blank" href="http://www.now3d.it/files/Now3D2_Theme.zip">tema di Now3D2</a> per Windows 7. Le immagini di questo tema sono state renderizzate interamente grazie all'ultima versione di Now3D2 (nome definitivo dell'ex N3D.Net).
<a target="_blank" href="http://www.now3d.it/files/Now3D2_Theme.zip"><img src="http://www.now3d.it/images/Now3D2_Theme.png" border="0" alt="Scarica Now3D2_Theme.zip (3.5MB)" title="Scarica Now3D2_Theme.zip (3.5MB)" style="padding-right:5px;float:left;border: solid 0px black" /></a><br /><br /><i>Una volta scaricato, aprite il file zip e fate doppio-click sul file "Now3D2.themepack" per installare il tema.</i><br /><br />A breve potrete leggere su questo Blog le ultime novità sugli sviluppi di Now3D2.
</div>
<div style="font-size:10px; clear:both;">Uffizi HDR Image courtesy of Paul Debevec<br/>Venice HDR Image courtesy of USC Institute for Creative Technologies<br/>PLY Meshes courtesy of Stanford University Computer Graphics Laboratory</div>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-77320261346582991552011-08-19T00:27:00.000-07:002011-08-19T03:14:07.105-07:00Now3D 1.30<table><tr><td>Finalmente Now3D (versione VB6) è compatibile con Windows 7 (anche a 64bit)!<a target="_blank" href="http://www.now3d.it/images/Screenshot4.png"><img src="http://www.now3d.it/images/Screenshot4_205.png" align="right" /></a><br />
Potete acquistarlo tramite un piccolo contributo direttamente dallo store AppUp della Intel:<br />
<a target="_blank" href="http://www.appup.com/applications/applications-Now3D+1.30"><img src="http://www.now3d.it/images/appup_on_purple_150.png" align="center" alt="Scarica Now3D 1.30"/></a><br />
</td></tr>
</table>Sul mio <a target="_blank" href="http://www.now3d.it">sito</a> potete leggere le ultime news.Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-17760177760663137252011-03-07T13:40:00.000-08:002011-03-07T13:41:05.309-08:00Il Backstage della Demo Real-TimeCome in un "Dietro le quinte", vi voglio presentare alcune delle novità di questi ultimi mesi che hanno reso possibile la Demo Real-Time. Ve le mostrerò nello stesso ordine cronologico con le quali le ho affrontate e implementate.<br />
<br />
<span style="font-size:130%;">Velocizzazione degli Shader</span><br />
Il primo spunto nel creare una demo in tempo reale l'ho avuto durante una rivisitazione dell'algoritmo di gestione dei nodi.<br />
Infatti, dopo aver scoperto un grave abbassamento delle performance di rendering delle visualizzazioni scanline, anche del 50% rispetto alle prime versioni di questo nuovo Now3D, ho deciso di identificare quale elemento della pipeline di rendering scanline era più pesante, e il colpevole principale era l'algoritmo di gestione dei Nodi.<br />
Così, una riorganizzazione del codice di gestione dello standard dei nodi, mi ha portato all'eliminazione delle SubConnection (oramai entità obsolete), e questo fatto ha avuto l'effetto non proprio indesiderato di velocizzare la resa di molti degli shader implementati, riportando Now3D di nuovo in carreggiata.<br />
<br />
<span style="font-size:130%;">Nuove modalità ScanLine</span><br />
Ma il vero via all'implementazione di una demo Real-Time è iniziato con una riorganizzazione dei tipi di visualizzazioni ScanLine.<br />
<br />
<span style="font-size:120%;">Modalità VertexShade e PixelShade</span><br />
Ho voluto rivedere la nomenclatura delle modalità ScanLine e il gouraud l'ho rinominato VertexShade, dato che effettivamente interpola i valori ai vertici dei poligoni, mentre il Phong l'ho rinominato PixelShade, dato che elabora ogni singolo Pixel.<br />
<table><tr><td><a href="https://picasaweb.google.com/lh/photo/FC1K0vtMVXrU6AneJZuQeg?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn8Xcsedcs9_3LgCFdvIObBFwh7_V0cstYhnJJUwupvkULyJ_LvX9F4lbAq9svmCq_91KNwOaXjoL4R3jjBAuAFwPVkEN88MT769nNmKpJbWTBlyGsaF2ZeaRyfrWWFClQHLrKn96fj7_M/s288/Pixel&VertexShade.jpg" align="left" /></a>Nel contempo, ho trovato un modo di unire la velocità di resa della modalità VertexShade al dettaglio di resa del PixelShade.<br />
Nel vecchio Now3D la modalità scanline Gouraud gestiva le texture con un codice ad hoc rispetto a quello standard del Phong, la restituzione delle texture erano sufficientemente precise ma rallentava notevolmente la resa.<br />
Quindi, per questo nuovo Now3D ho preferito lasciare un motore unico di gestione e delegare la modalità VertexShade alla visualizzazione interpolata tra i valori calcolati sui vertici. Il dettaglio a questo punto sarà legato al numero di poligoni dell'oggetto.</td></tr>
</table><br />
<span style="font-size:120%;">SimpleMaterial</span><br />
Nella ricerca di una modalità veloce di resa, ho voluto implementare una modalità utile alla modellazione degli oggetti, quindi uno shader semplice e veloce, gestito dal Viewer e applicabile agli oggetti esclusivamente in fase di renderizzazione.<br />
<br />
<span style="font-size:120%;">FastShade</span><br />
<table><tr><td><a href="https://picasaweb.google.com/lh/photo/ihWbYVUJ6LQ1ECP17q3ULA?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic5Bc-Scc2my6pNhx63YZVDugT1_mzf4RUAtpLbIIIWNQdNbA6Co1ExYFDGA89KaSfehXpH_vMNzB4J0WVbemsBP-8GWLqLZCtIR-ZourTxyGjhcwoHxAQcYH9KlevmnIpp6EOFFyDkvJ-/s144/20110305_FastShade.jpg" align="right" /></a>A questo punto, una leggera modifica al codice del VertexShade lo ha reso tre volte più veloce, ma ne ha pregiudicato ulteriormente la precisione, creando in alcuni casi risultati disattesi (immagine a destra). Comunque sia, quest'ultima velocizzazione mi ha dato la possibilità di immettere Now3D nella via degli applicativi di visualizzazione in tempo reale (almeno 24 aggiornamenti dello schermo al secondo)!</td></tr>
</table><br />
<span style="font-size:130%;">Visualizzazione Environment in modalità ScanLine</span><br />
L'idea di fare una demo mi ha portato a pensare a cosa mettere in questa demo. Avvolgere un'immagine all'ambiente che circonda la scena era una delle caratteristiche del vecchio Now3D che più mi piacevano ed ero proprio curioso di vederla animare in modo più fluido grazie alla nuova modalità FastShade. Quindi mi sono rimboccato le maniche.<br />
<br />
<span style="font-size:120%;">Velocizzata GeoSphere tramite KDTree</span><br />
Però, per arrivare a questo, dovevo per prima cosa velocizzare la costruzione della GeoSphera, e l'algoritmo KDTree mi è stato tantissimo di aiuto, l'ho standardizzato alle nuove procedure VB.Net e l'ho applicato.<br />
Ora posso generare una Geosphera a dettaglio 8 (327680 poligoni) in soli 3 secondi, prima non sarebbe bastata un'ora.<br />
<br />
<span style="font-size:120%;">Environment per lo ScanLine con GeoSphere</span><br />
<table><tr><td><a href="https://picasaweb.google.com/lh/photo/FHbp6LP-C6k53z-wONEU0A?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq2uw7c3wwsG2SF3BcHzGLHwRqEd-1MR3GVYy8SGfyyLIyk7VcIFdAJtiAgy8RAoqUGc_GxvWr72xWCPr-Z7YPVlTYVWlB2tlF9lShf1kMuaA-0-QdC22mP71QRlARqkFSsy3HYcu_v9H4/s288/Scanline_Environment.jpg" align="left" /></a>Una volta velocizzata la costruzione della GeoSphera, ho dovuto implementare un metodo per visualizzare la faccia nascosta dell'oggetto GeoSphere, e così ho implementato il metodo InvertNormal() dello Shape di tipo Mesh.</td></tr>
</table><br />
Ho anche tolto l'uso dei nodi ReflectBitmap e AmbientBitmap, quindi basterà utilizzare l'EnvironmentBitmap che, a seconda della mappa alla quale sarà connesso, si comporterà come Reflect o Ambient.<br />
<br />
<span style="font-size:130%;">Modalità real-time</span><br />
A questo punto avevo bisogno di implementare una modalità di visualizzazione simile a quella usata negli applicativi che sfruttano le DX, una modalità di refresh automatico della schermata, quindi sempre attiva. In termini tecnici questa nuova modalità sfrutta il tempo di inattività (Idle) di Windows per richiedere il successivo ridisegno della viewer. Unica accortezza è che tutte le azioni sugli oggetti devono avvenire all'interno di questa routine.<br />
<br />
<span style="font-size:130%;">Usare l'HDR per le immagini e l'Ambient Map</span><br />
Un'idea che mi balenò in testa fu quella di mostrare un ambiente che cambiasse illuminazione in tempo reale, simile a un video che ho fatto con il vecchio Now3D (vedi video di seguito).<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/i_VYtrK6YNo?hl=it&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/i_VYtrK6YNo?hl=it&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object><br />
<br />
<span style="font-size:120%;">Cambiare l'esposizione</span><br />
Per prima cosa ho implementato delle funzioni applicate alla camera tramite le quali poter comandare l'espozione (Exposure) e la Gamma dell'immagine finale.<br />
<br />
<span style="font-size:120%;">Immagini HDR</span><br />
Poi, ho implementato il formato di immagini HDR, cioè un formato che contiene una maggiore profondità di illuminazione e che gioca un ruolo importante nell'effetto di cambio d'esposizione.<br />
L'implementazione è stata fatta aggiungendo la possibilità di far caricare anche le immagini in formato "HDR" al nodo Bitmap, e, quindi, per ereditarietà a tutti gli shader che lo utilizzano (SurfaceBitmap, BumpBitmap, EnvironmentBitmap).<br />
<br />
<span style="font-size:120%;">Nodo ProbeToIrradiance</span><br />
Un'altra tecnologia che ho voluto riprendere dal vecchio Now3D è quella della mappa ambientale precalcolata. In pratica, precalcolo un'immagine con mappatura Probe per poter simulare la luce ambientale senza usare pesanti algoritmi (es: MonteCarlo), quindi, ideale per animazioni in tempo reale (questo algoritmo si basa sul lavoro di Ravi Ramamoorthi e Pat Hanrahan. <a href="http://www.graphics.stanford.edu/papers/envmap/" target="_blank">Prefilter Environment Map</a>).<br />
L'algoritmo è stato inserito nello standard dei Nodi, utilizzabile da solo o insieme ad altri nodi a formare un albero di nodi (o shader).<br />
<br />
<table><tr><td><a href="https://picasaweb.google.com/lh/photo/dAU1lu-t1Qxi75Ie6Nc_2g?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidKnCwsWLJ_0wnWJ2sivgE4Pj4Hsu8XKdNGTFRJY84VA381fwtBn9hCrjLTzxS-OOlNYv1pfWD7JnDvzjXqP9AnnI93lkEDaI64HWh9moSx33FB5U1zcxgbS_i1JpIZgmXqXaxeinFS8vL/s144/ProbeToIrradiance.jpg" align="right" /></a><span style="font-size:120%;">Shader AmbientBitmap</span><br />
Una volta implementato il nodo ProbeToIrradiance, l'ho inserito nello shader AmbientMap da usare esclusivamente con la Mappa Ambientale.</td></tr>
</table><br />
<span style="font-size:130%;">Mouse e Tastiera</span><br />
Oramai la demo era quasi pronta, mancavano giusto dei piccoli controlli che ho voluto implementare per darvi la possibilità di attivare funzioni (bottoni) o modificare parametri (slider).<br />
Quindi, ho approfittato dell'occasione per migliorare il ritorno degli eventi del mouse e della tastiera direttamente dall'oggetto.Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-27817169410620296142011-02-27T02:34:00.000-08:002011-02-28T11:46:04.327-08:00Seconda Demo<span style="font-size:130%;">Demo Real-Time</span><br />
L'implementazione del nuovo Now3D anche se a rilento continua.<br />
Finalmente posso mostrarvi un assaggio del nuovo modulo real-time di questo nuovo applicativo.<br />
<table style="WIDTH: auto" border="0"><tbody>
<tr><td align="center"><a href="https://picasaweb.google.com/lh/photo/wYGTNO8K6R8lieHylAKozw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivouS9BFrq6iWiiOm0f65EmFpby_Zs4W-VAs6gnY931_zsw7lWHe1ylFuhP6hGmRl7t1QhUTNo-PIvHYCBna5lyf0-Yy1A4V7w1WzmqEDhy-QXPli3ZfQLt9qa6MoUWRr9HD5TJQLUzBL0/s288/N3DNetRealTimeDemo.jpg" /></a></td></tr>
<tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;"><br />
HDR Images courtesy of Paul Debevec</td></tr>
</tbody></table><br />
Ho rilasciato una <a target="_blank" href="http://www.now3d.it/files/N3DNetRealTimeDemoSetup.msi">demo RealTime</a> che sfrutta il motore 3d realtime del nuovo Now3D che sto sviluppando.<br />
Se siete anche voi appassionati come me di programmazione di grafica 3d, potete modificare a piacimento il <a target="_blank" href="http://www.now3d.it/files/N3DNetRealTimeDemo.zip">sorgente</a> di questa demo.<br />
<br />
Ed ora, buon divertimento!<br />
<br />
Seguirà una serie di post riguardo le molte novità aggiunte in questi ultimi mesi.Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-3362159076593417492010-10-20T13:09:00.000-07:002010-10-20T13:09:27.107-07:00Novità sui nodi<span style="font-size:130%;">Nuovi Nodi</span><br />
In occasione dell'implementazione delle nuove mappe AmbientMap e ReflectMap ho voluto aggiungere i seguenti nuovi nodi:<br />
<br />
<span style="font-size:120%;">SingleToSingleUnit</span><br />
Trasforma la connessione di input di tipo Single in una di output di tipo SingleUnit. Utile per bloccare un valore Single tra 0 e 1.<br />
<br />
<span style="font-size:120%;">RayNormal</span><br />
Restituisce un il vettore normale all'intersezione del raggio.<br />
<br />
<span style="font-size:120%;">RayDirection</span><br />
Restituisce un il vettore direzione del raggio.<br />
<br />
<span style="font-size:120%;">ReflectRay</span><br />
Questo nodo ha come input due connessioni di tipo punto 3d: il vettore normale e la direzione. Il risultato è il vettore riflesso utile come input del nodo XYZ2UV per la mappa riflesso (ReflectMap).<br />
<br />
<span style="font-size:120%;">P3DtoTextureSpace</span><br />
Questo nodo serve a trasformare le coordinate di un oggetto in quelle a una unità per le mappature che si applicano interamente all'estensione dell'oggetto come quella Cylinder o Planar.<br />
<br />
<span style="font-size:130%;">Modifica Nodo XYZ2UV</span><br />
Aggiunto l'attributo "mapping" utile alla scelta dei tipi mappatura: <br />
<br />
<span style="font-size:120%;">Avvolgimento su superficie</span><br />
<table style="WIDTH: auto" border="0"><tbody>
<tr> <td align="center"><a href="http://picasaweb.google.it/lh/photo/NjaoCdJtZqZygteq3_EvZQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsu-UvmET-ja0_8LxYc8HgxSHMw1lBdV57jhSdkOwvVXNJfaKEqcL4H_JDeIABfGABgKyxIUpy10D3O35I2rhh35KoFwRYKOppFUlIdV7Xw3nfL1th_QMyQcni2Ibb5sqZuq-vjfSMgaup/s144/20101018_CylinderMapping.jpg" /></a></td> <td align="center"><a href="http://picasaweb.google.it/lh/photo/Pi0yzesB5DkH0UG9DakpJg?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ZBxEyy4-Vi44egtJiQ66cGtCwmj7BQJrGJBpauBbA530jwTd0RTgvawt-K3KKC8WN0Uh5t9fICZT1eqZV_p5-StRUQRFajHocyrNFLS2KU4oqzCdZ1qMUcwv5V_LEwiCsa_4-gJHJs86/s144/20101018_PlanarMapping.jpg" /></a></td> <td align="center"><a href="http://picasaweb.google.it/lh/photo/qd3CsB7dsuh4gAjxjJRkzQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3AjKZWxkyGxppHZ3DIboL4ng3Ja9CK-NI47uqYaH3RLeu7l6c5dEg2HBwPw3K7U3qYUqVH8pUGqW58fnn51d3d7mIzbPPbCFm5bH9FN2w-THpEPNWg5_7J4ADq2DXKUFCbiyhraiXg_Bs/s144/20101018_SphereMapping.jpg" /></a></td> </tr>
<tr> <td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Cylinder Mapping</td> <td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Planar Mapping</td> <td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Sphere Mapping</td> </tr>
</tbody></table><br />
<span style="font-size:120%;">Environment</span><br />
<table style="WIDTH: auto" border="0"><tbody>
<tr> <td align="center"><a href="http://ict.debevec.org/~debevec/Probes/" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuQ8VG2-1M0SK_IURWASElyzmGO1jkKdxSeGL9tCZXAXfLH1d8e6ZUkbPDoJ7TS_cRh0_9bdfByVEGYUdxdzlQdFZv_3BlREnrKUG1_JIYDt3CqYgw__MLEjQxWBfcLkTgkuENPOqA36H4/s144/uffizi_probe.jpg" /></a></td>
<td align="center"><a href="http://picasaweb.google.it/lh/photo/g41H2Ad4IIO8wZ6eMsgHjA?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1qbJ7GesbncfOOvY27BL7S0UqGGdrQbySZGk7HAFh5bZE6VSrRzzEofIc_06wJLkIRcPbKbh5CiNa3MBEdFI4WPDqp-Q2r4d9Vc48b2GEvZ8iwrP3y5C5j8DsAgK5DLymtktySNu21A3U/s144/20101020_Sphere_Mapping.jpg" /></a></td> <td> </td> </tr>
<tr> <td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Esempio di texture di tipo Probe<br/>Picture courtesy of Paul Debevec.</td> <td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Esempio di texture di tipo Sphere (anche chiamata Spherical)</td> <td> </td> </tr>
</tbody></table><br />
<span style="font-size:130%;">Nuovi Shader di tipo Bitmap</span><br />
Implementati alcuni nuovi nodi shader utili alla semplificazione dell'applicazione di una immagine a una mappa di un materiale o a un ambiente.<br />
<br />
<span style="font-size:120%;">SurfaceBitmap</span><br />
Nodo utile all'applicazione di una immagine alla superficie di un oggetto.<br />
<br />
<span style="font-size:120%;">ReflectionBitmap</span><br />
Grazie a questo nodo si può applicare facilmente una immagine alla mappa riflesso di un materiale.<br />
<br />
<span style="font-size:120%;">EnvironmentBitmap</span><br />
Questo nodo è utile ad applicare una immagine all'ambiente attorno alla Scena (si usa con la mappa Environment della Scena).<br />
<br />
<span style="font-size:120%;">BumpBitmap (ex Bump2D)</span><br />
Standardizzato nel nome e negli attributi.Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com2tag:blogger.com,1999:blog-932812315473903597.post-88259111945175767932010-09-19T14:41:00.000-07:002010-09-19T14:42:57.647-07:00Migliorie sull'Interfaccia<span style="font-size:130%;">Rivisitazione dell'Interfaccia</span><br />
Ho voluto rivedere l'interfaccia per renderla più user-friendly e per donarle un aspetto più definitivo in vista di una prossima demo...e non dico altro! ;)<br />
<br />
<table style="WIDTH: auto"><tbody>
<tr><td align="center"><a href="http://picasaweb.google.it/lh/photo/b47m_S95QUa4J8Ydygq_nQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzz2N_5jCjnYU8Rd54CpBlC-ylErK4_O8BTAA-ZcZX5KRF-TdwznwAKGxQSiCXcZFtV-Eu1RLYzvN4QV6SAldwCe7Ynz0P5xUz3OplxJWee6n3XkNfM5DB9JWCjQqvHdoRGCiX4mFp6gzS/s288/20100919_Interface.jpg" /></a></td></tr>
<tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Nuova Interfaccia</td></tr>
</tbody></table><br />
<span style="font-size:130%;">Una Camera più Viewport</span><br />
Gestita la possibilità di assegnare velocemente una camera a più di una Viewport. Tramite una nuova finestra a comparsa all'interno di ogni vista (accessibile passando sopra col mouse su una barra posta sopra ogni viewport) è possibile scegliere la Camera assegnata.<br />
<br />
<table style="WIDTH: auto"><tbody>
<tr><td align="center"><a href="http://picasaweb.google.it/lh/photo/7SEfthGeJHATfz8TF34Yow?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHWbTqJ889f1iLog8lhfmPCPhNOIp8MfzOYcKym9ssp9X5RGg4WbZfVXmwljxCwe8im9aP5HqzP5lkIlTOkEDlx9SCT6NUPP_IkPNS7mrJHg-DXGVnQRALWsYJrLyp2WF4mFbp2F0T_GX-/s288/20100919_ViewportMenu.jpg" /></a></td></tr>
<tr> <td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Menu a comparsa di una Viewport</td> </tr>
</tbody></table><br />
<span style="font-size:130%;">Nuove ToolBar</span><br />
Aggiunte le barre degli strumenti (toolbar) classiche, utili per accedere velocemente ai comandi principali. Queste, possono essere spostate su qualunque lato della finestra di Now3D.<br />
La prima gestisce le operazioni classiche di un file di progetto (nel nostro caso la scena) con inizializzazione, apertura e salvataggio della scena.<br />
Sempre la prima toolbar contiene anche i pulsanti di gestione dell'Undo e del Redo, con finestra a tendina che visualizza la lista delle azioni da annullare o ripetere.<br />
La seconda toolbar gestisce gli strumenti utili per l'editor, scelta tra le azioni possibili sugli oggetti (spostamento, rotazione, dimensionamento, rotazione tramite quaternion) e scelta tra visualizzazione a una camera o a 4 camere.<br />
L'ultima toolbar gestirà i bottoni di configurazione e avvio del rendering RayTracing.<br />
<br />
<table style="WIDTH: auto" border="0"><tbody>
<tr><td align="center"><a href="http://picasaweb.google.it/lh/photo/yrMje_TisyF_vvzOmGRBpg?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7QWmwFmX40vacmzGBGMv6-rTs0Zwdduy6boi7p9DomQnj8iTOsJ5_B8cwxOBeiAOWK3seveqW2VTSiaCkj3eiA-7c1RwfHaOmHQNnXHl3SId7kXY8k3jQDlw9f3-pOLlcN3LSVOgH4Jdv/s288/20100919_Toolbar.jpg" /></a></td></tr>
<tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">La nuova toolbar</td> </tr>
<tr> <td align="center"><a href="http://picasaweb.google.it/lh/photo/vEq-AmxSAES5SARKBD9o3g?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5RybxCjJ38iyf-iIoA51Y5zfSL24xqKuJA4C-licLSwqzyu9n8iCoI3RxiDwrRNo3CJEAH5nl1FywOB_SNMprDUGNg4PjfjgGjuRIShULJI_tvx7CobbK0K0nv9-wQ5YrAc34mRXjzt0a/s288/20100919_UndoRedo.jpg" /></a></td></tr>
<tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">I bottoni di gestione Undo-Redo incorporati nella toolbar</td></tr>
</tbody></table><br />
<span style="font-size:130%;">Gestione delle Gerarchie da interfaccia</span><br />
Adesso tramite semplici comandi di "Add child to" accessibili all'interno delle finestre di pop-up associate alle istanza, è possibile aggiungere oggetti figli, e quindi creare delle gerarchie.<br />
Per accedere a queste pop-up basta cliccare su una istanze col pulsante destro del mouse, sia sull'icona rappresentante l'istanza dell'albero della scena, che sull'istanza stessa su di una viewport.Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-68331963860861380282010-09-19T07:58:00.000-07:002010-10-19T13:10:50.384-07:00Nuove Mappe<span style="font-size:130%;">Molte novità in arrivo!</span><br />
Eccomi qua dopo tanto tempo, a parlarvi dei lavori in corso per il nuovo Now3D. Cominciamo dalle nuove mappe.<br />
<br />
<span style="font-size:130%;">Nuove mappe: AmbientMap, ReflectMap</span><br />
Implementate le mappe mappe utili alla gestione delle luce ambientale e dei riflessi.<br />
<br />
<span style="font-size:110%;">AmbientMap</span><br />
Utile per applicare velocemente un coefficiente ambientale al materiale oppure per l'applicazione di environment precalcolato di una mappa HDR, in futuro potrebbe essere utile anche per la gestione delle occlusion map.<br />
<br />
<table style="WIDTH: auto" border="0"><tbody>
<tr><td align="center"><a href="http://picasaweb.google.it/lh/photo/cARRkDQow9O-9hZbkEumRw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ53RY-_Ete9clL1VsPewcF9mOZNrrHQaTguL8e5O_nCV_yjHuFoNw5aINC9NyGwKJ-D7A3zVTLB61AvtKYx1GjSThyphenhyphen4e0bjGH1Jl2f6II9DUAF7x35_xySaKT9Dqf7S_C0BXk5qd-5Ncy/s144/20101018_AmbientMap.jpg" /></a></td> <td align="center"><a href="http://picasaweb.google.it/lh/photo/kYwPAbfs6x2hXXPqYzLIZw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHoC1IrSwE9DI2qobCrp0yBUAxoB8A4NpPJtqAwcVq8jY2E6adKB2WHN0fVzRCKp0ZHDJm2ofNl5aMdJR-zus9YOHYVWxcwfQzvTFQzyHii5llNzwcVLzT7sKcsrUD8gHwWp2R7DATwb65/s144/uffizi_probe_Ambient.jpg" /></a></td></tr>
<tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Esempio d'uso dell'AmbientMap</td> <td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Mappa Ambientale</td></tr>
</tbody></table><br />
<span style="font-size:110%;">ReflectMap</span><br />
La mappa riflesso può essere utile per velocizzare il rendering nei casi in cui vogliamo sovrascrivere la mappa environment della scena per singolo oggetto.<br />
<br />
<table style="WIDTH: auto" border="0"><tbody>
<tr><td align="center"><a href="http://picasaweb.google.it/lh/photo/1CZ4Et_oL21_zDAZ-89ldQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivSJsq6o4-MsBmF8qJV6qmGaK0Eea4WL8ZouSrsz3hxHlcy4O-BjvXUCoBV6-6ug9FDMrnfs6bCtrqVylpoVOzAOcO6dkecuq9ecZHEFY9bYRKzKppZennVtXNqrFbtnHZwV9r7AyZeRUv/s144/20100915_ReflectMap.jpg" /></a></td> <td align="center"><a href="http://ict.debevec.org/~debevec/Probes/" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuQ8VG2-1M0SK_IURWASElyzmGO1jkKdxSeGL9tCZXAXfLH1d8e6ZUkbPDoJ7TS_cRh0_9bdfByVEGYUdxdzlQdFZv_3BlREnrKUG1_JIYDt3CqYgw__MLEjQxWBfcLkTgkuENPOqA36H4/s144/uffizi_probe.jpg" /></a></td></tr>
<tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Esempio d'uso della ReflectMap</td> <td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Mappa riflesso.<br />
Picture courtesy of Paul Debevec.</td></tr>
</tbody></table><span style="font-size:100%;">Attivazione automatica dei Riflessi RT</span><br />
Basterà settare un valore di intensità della ReflectMap maggiore di 0 per attivare o meno i riflessi RT (si consiglia comunque di mettere 1)<br />
<br />
<span style="font-size:110%;">Uniamo le due mappe</span><br />
La seguente immagine di esempio combina le mappe ambientmap e reflectmap attraverso un falloff sulla specularmap e il parametro "energy preserve" a Dielectric.<br />
<table style="WIDTH: auto"><tbody>
<tr><td align="center"><a href="http://picasaweb.google.it/lh/photo/aDQCdC9u6rtNP_7q4FSlXA?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGgzfUFZg69U7wVA85OJ9O2ZErscvRRCxhHVKqfF28R9kacCt9wFiWUnj-agD9EC-9xH8_rI6HL9CQ-I_uVdB9gquJhUHp0SYNobgP_l5XXm8FXDmTQ80Tf5e_3U6FUfqTg8BLy_QugcsZ/s288/20101018_Ceramic.jpg" /></a></td></tr>
<tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Materiale di tipo Ceramica</td></tr>
</tbody></table>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-39648058325020964612010-04-18T13:00:00.000-07:002010-09-01T13:36:44.393-07:00Altre News<span style="font-size:130%;">Anteprima del Materiale</span><br />Implementata la preview (o anteprima) del Materiale, per ora è semplicemente una conversione della versione utilizzata su N3D vecchia versione. Comunque, ne immagino una futura implementazione per una veloce anteprima dei file elencati nelle varie Dialog di scelta.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/CMWM5QnCuz1Aq7OyEBPLOw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdDZrZ9UZNKQELmZ8zoKZau1L4qM_mMajk7pOtA72mDlUCo2eRF9JIxZps18DdmwVbqYfceVz6qmhuRN-ghPh6rUg3jVAR6X12Lbrk_DAMv6ozI9-9GI0Z5iJEgOvrsP_S2A-q_E7L0U0w/s288/MaterialPreview_20100416.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Interfaccia per l'anteprima del Materiale</td></tr></tbody></table><br /><br /><span style="font-size:130%;">Mappa Light</span><br />Un altra mappa molto utile nella costruzione di buoni Shader è quella Light (o Luce), utile per esempio per un buon Shader X-Ray oppure per simulare la texture di palazzi visti di notte, come nell'esempio seguente.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/M3g-OF5rMjARkhJk5q1JHQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHa3AimUrKSvepG_KWeXxLKtO4K8sftkHbjXCeUchyphenhyphen-HHVKAAGajb4ouu1KdVzJ6SXElZltN57GgVFhLgpWq69EVDA_m1yD3hktSEUu3n86Z9V18Q0n4eZAbo1nXJbR0ZGzbfgRNeoWPL6/s288/LightMap_20100416.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Esempio di utilizzo della Mappa Light</td></tr></tbody></table><br /><br /><span style="font-size:130%;">Energy Preserve</span><br />Una regola ferma per rendere delle superfici realistiche e che la quantità di luce riflessa non sia maggiore di quella entrante altrimenti il risultato diventa irreale. Se per esempio rendessimo una superficie troppo riflessiva (mappa specular) e contemporaneamente troppo diffusiva (mappa diffuse) avremmo un risultato poco realistico.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/niHYsfG1PhSuJ0QaFWeG8g?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-_Ic1mi4CeITfKWFL62YCrsxfEND46dcavFyR6eWWKMByxr2uHGPibwslWnTRAscX0ZBHaKAm2cx__-P9plidceyioGjk3RnR5uI-yYGmPuZCR9oqbkhq4_30TsEhzwaZPUYOeVfLqGcT/s288/EnergyPreserveBefore_20100416.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Energy Preserve disattivo</td></tr></tbody></table><br /><br />Se invece bloccassimo i valori di diffusione e riflessione in maniera tale che la somma dei coefficienti non superasse mai il valore di 1 allora avremmo un risultato più realistico.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/NfCyZMjw3dEizBGhPA2QYw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4QNUPVIC2L2rM2U4i81oRC7LugoI2zk-VW_ekGXybCqMyNFYgbYLd-XGaBPxk8uWaWxJeQXX9kjB3yn58ydAUKMU2CcBQYWJeUkl47QTwZxg7r7CYi__Tkz7-kHK1XotH5YahJNy7GKHJ/s288/EnergyPreserveAfter_20100416.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Energy Preserve attivo</td></tr></tbody></table><br /><br /><span style="font-size:130%;">Standard Shader a valori da 0 a 1 e l'Invert</span><br />Create delle tipologie di Nodi che gestiscono in maniera standard dei valori di uscita a virgola mobile con range da 0 a 1. Grazie a questa implementazione ho potuto aggiungere l'attributo Invert a questa tipologia di nodi (es: shader bump, falloff, noise).Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-35611617214856217502010-04-18T12:55:00.000-07:002010-09-01T14:03:45.642-07:00Nuovo Standard XML<span style="font-size:130%;">Nuove fondamenta per un nuovo Now3D</span><br />Creare un programma può essere paragonato a creare una casa, se le fondamenta sono solide la casa viene su bene e dura nel tempo, tornando a Now3D le fondamenta di cui parlo riguardano l'inserimento dello standard XML nel codice di Now3D e, avendo trovato delle limitazioni nella flessibilità di programmazione nella struttura che stavo sviluppando, quindi, per risolverle, ho preferito dedicarci la maggior parte del tempo.<br /><br /><span style="font-size:130%;">Sono tutti dei Nodi</span><br />L'esigenza di rivedere ulteriormente lo standard XML è scaturito dal fatto che applicando lo standard di salvataggio (e caricamento) alle istanze, ho avuto la necessità di gestire le associazioni Shape/Istanza, Materiale/Istanza e Istanza/Istanza e, immaginando l'implementazione di una semplice associazione simile a quella BRDF/Materiale e Mappa/Materiale (e cioè dei sottotag a quello principale es: shapes o materials), ne ho notato una scarsa flessibilità.<br />Così ho deciso che la struttura migliore per gestire le associazioni tra gli elementi di N3D fosse quella dei Nodi, in questo modo, per la connessione Shape/Istanza, si potrà, per esempio, associare una connessione di entrata "Shape" di una istanza alla corrispettiva connessione di uscita di uno Shape (per l'appunto la connessione di uscita "Shape").<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/nI5k0iROM3Ue_n6TmlmnAw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5uvAfH9rs7BKx7RmFniV7v8xQ1dPryurUgfHcdLYSaaVm9emdaOMeKdnfskSxMY_-YFJb4p0bONgEuOmJLGwv-BIA7vQ37Yw3G5cJRLvoWRU98_ibGIZrNxCZ4GBMuQESGw_x59HoKTk6/s288/N3DXML_20100416.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Schema del nuovo Standard XML</td></tr></tbody></table><br /><br /><span style="font-size:130%;">Massima flessibilità!</span><br />Naturalmente, anche il codice è stato completamente rivisto per poter gestire questo standard. Così le classi per i Materiali, le Mappe, i BRDF, le Istanze e gli Shape ereditano dalla BaseNode e, quindi, a tutti gli effetti dei Nodi aventi connessioni, con la possibilità di connettersi tra di loro.<br />La flessibilità di questa struttura è assoluta; ad esempio, si può associare un materiale a più oggetti, un nodo Shader a più mappe, uno Shape a più Istanze, una istanza a un altra istanza (creando quindi gerarchie di oggetti), o perfino un Nodo a più Shader (cosa utile in caso di nodi Bitmap associati a immagini di elevata pesantezza).Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-52031518470675682492009-10-31T10:57:00.000-07:002009-10-31T15:07:21.474-07:00Altre News<span style="font-size:130%;">Shader Falloff</span><br />Continuando il lavoro di traduzione del vecchio codice di N3D (versione VB6) nel nuovo N3D (versione dot.net 2.0) ho implementato il filtro FallOff che nella nuova reincarnazione diventa un Nodo perfettamente integrabile in uno Shader.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/JGNjZ28LckUfbmD3h4lUZQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKohnWjoR5dQbmNAXjlj5THwC_ba6gST1s5u98v_R2EKUMmVrhmCJIPgkXfa4W8NTOqgG4Mw5PsIZSXY4MJCy_7PtdqOwG2EHeiCgKDOSWsQ6Hu3e3g2v8TbtWXUE6AEqC0i6OKW1YEdMe/s288/X-Ray.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Applicazione dello Shader Falloff</td></tr></tbody></table><br /><br /><span style="font-size:130%;">Interfaccia</span><br />Migliorato lo standard di alcune interfacce che faranno parte dell'editor definitivo del nuovo N3D: treescene, lista dei materiali.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/iP4U76jWNNK9xgvvsQ7RcQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKHRtSKFjbOB8QZ0posbrawGYvIyBJBWrL2jU2_-zhBzwHbQh-_Tl2G9EJSr-A9hSj5MOE0yvx-yBpjuh3KfW5hkfqEOjVJOw4k-KsQnsyN5LVgxm_1i6VkHRga_seb8kpaybDX40ZR3_Y/s144/InstanceProperties_20091028.jpg" /></a></td><td align="center"><a href="http://picasaweb.google.com/lh/photo/Ei2OazMTMG3wqoMtJmIn-Q?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK2jkvFRtO2buCSZX7QC2qObFF7kFK0FKrxwNFxYV4QxFJnF3XzEcI_dzHo8Hpio0WV1P8eDKewsPNcSh4xizrmqhj7OEjmT8wWkl60A7egb9zhO-k3hyphenhyphenEXhPuf_ZYS5fESGy8wXR6h2Fr/s144/MaterialProperties_20091028.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Interfaccia di gestione delle proprietà delle istanze della Scena</td><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-left:5px;">Interfaccia di gestione delle proprietà dei materiali della Scena</td></tr></tbody></table><br /><br /><span style="font-size:130%;">Finestra di scelta generica</span><br />Continuando l'implementazione delle finestre di scelta anche per le ultime tipologie di istanze finora implementate (luci, camere, oggetti, constraint), ho voluto standardizzarne il codice in modo da poterlo applicare facilmente a future nuove tipologie di istanze e un giorno per poter applicare delle immagini di anteprima.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/k0leiCVPD8mRAR1lWoDxgw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwLdzqPVGw5vofgP9SqJsQCBarup0MpRBc2vnXJhChAtwALLcl5SZl8BKI814kRIVxjQyQGTEeodEBIYobR5OssSXg8LJSvgcTU3IxFU4pmlz7EaahlMuK495OTbg2LrzHzpWcNmEaIGL0/s144/Cameras%20Browser.jpg" /></a></td><td align="center"><a href="http://picasaweb.google.com/lh/photo/-QD15WDff8fqc2TravldSg?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkfyY3O1FO-Qff0F-vgyRwuRBfR5ioZT78NmxSp663SUFeNKaRdZpj9DnH0VDdlxcK6zwWGkj5gaXZb4mogG2RM9Q0Ir2RIhIR4vWlT-3BT6gEv7iASIyIXg9WOzVAQR1VzKNdjQsjG52H/s144/Lights%20Browser.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Finestra di scelta di una Camera</td><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-left:5px;">Finestra di scelta di una Luce</td></tr></tbody></table><br /><br /><span style="font-size:130%;">Caricamento File PLY</span><br />Implementata una nuova primitiva utile al caricamento dei file PLY. Grazie a questo oggetto potrò caricare degli oggetti particolarmente pesanti (>1M Poligoni) così da poter testare al meglio e ottimizzare molti aspetti del motore 3D.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/C8mHC0YJSkZ6SHvdV-YjSg?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip_xpuCIjVq8Z4_PrhdP1-rXtbOssZOtbYU7Z9gyphBWgNLGxV3lNyFpA6n3ePmPw1mcSXmmglZi6TUqIJFkfKgmupJNGrxrWAwtPghBYbj4-I2Ey3XCA-1peT5G5CGhdboJ62XdFIU3mR/s288/Dragon.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Rendering di un oggetto in formato PLY contenente più di 7 milioni di poligoni</td></tr></tbody></table>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-79485426743862153352009-10-30T18:52:00.000-07:002009-11-12T11:52:52.784-08:00Miglioramenti del Codice<span style="font-size:130%;">Shader</span><br />Per un miglioramento sostanziale dello standard di costruzione degli Shader ho deciso di eliminare l'oggetto N3DShader e di utilizzare la sola N3DNode per la gestione completamente di uno shader.<br /><br /><span style="font-size:130%;">Le Primitive</span><br />Nella versione VB6 di N3D lo standard di costruzioni degli oggetti primitivi era basato semplicemente sull'utilizzo di alcune funzioni di una classe (N3DPrimitive), una per ogni primitiva, le quali poi tornavano la rispettiva istanza.<br />Adesso invece grazie alle potenzialità della programmazione OOP ho potuto associare una classe ad ogni primitiva, incorporando le proprietà fondamentali di costruzione (es: il raggio interno del Torus), facilmente modificabili da interfaccia come una qualsiasi proprietà.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/U-aGpM1ChreuePNHDuzqRw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLNHlgEhtpvbGvYD70jhN5aG2OYTkznOgnuIr5yIhoiiRINuObw-o85O6Hcmwq2I-TcekCcfCC0XwB2svQ9DSxS18jMuXaHLxip_M6pMMzpPDrwIvWFG7TxUTsS7BdfgdeJ_NS18J5DhPD/s288/Primitive_20091030.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Interfaccia di inserimento di una Primitiva nella Scena e rispettive proprietà</td></tr></tbody></table>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-50995142363375312462009-10-30T18:42:00.000-07:002009-10-31T13:45:43.454-07:00Finalmente l'Undo!Anche in questi mesi con piccoli ma importanti passi lo sviluppo del nuovo N3D è andato avanti, e tra le ultime novità la più sostansaziale è il completamento dell'implementazione dello standard di gestione dell'Undo/Redo.<br />Questo standard è esclusivamente il frutto di un mio lavoro, dato che sul web non ho trovato del materiale utile a questo scopo.<br /><br /><span style="font-size:130%;">Lo Standard</span><br />Tramite due semplici classi (N3DUndo e N3DUndoManager) si può gestire l'undo/redo di qualsiasi metodo o proprietà o gruppi di essi. Le classi che vogliono utilizzare questo standard devono ereditare dalla N3DUndo e implementare alcuni metodi utili a raccogliere le informazioni principali per poter annullare o ripristinare una azione.<br />Tramite poi l'istanza globale della N3DUndoManager (g_UndoManager) è possibile ottenere la lista delle azioni salvate, e anche annullare o ripristinare una o più azioni.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/Z7tlpZCqZE1Ky9roPSLb0A?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjum3p4ivdtS8lEIJ5xZEHBHbMbNShgbK2k6heQgM7OS_tjkXFFtzc2-GbWKmwKbbLbnZRmnXiAFR54kN_73KCK14E75d8g9End9IxY4J7p26D_N1yhyphenhyphenU-Yoi3iPmvju6UAegCgEstPV5CZ/s400/UndoRedo_Standard_20091031.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Standard Undo/Redo</td></tr></tbody></table><br /><br /><span style="font-size:130%;">Prime applicazioni</span><br />Applicato lo standard Undo/Redo ad alcune proprietà dell'istanza (selezione, rotazione, posizione, scala e colore) e alla gestione dei materiali (aggiunta, caricamento, eliminazione).<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/eFCku4Aek7DzFhpgXGbl-w?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjITBBg4R_-owaAdZEjmrSh-TZdWBid1opXTGI3SKjTdWC3tvbiz6D3LlJBixERQJ47sCnS1TbIWhazf4bi23SvxICFa6vqvkUnPabD_LUWhNBnEd1pk4LXKL8rYa5f_yE4uBk0UBKrFCSO/s288/UndoRedo_20091027.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Interfaccia di Undo/Redo</td></tr></tbody></table>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-5145849613388790832009-07-11T08:31:00.000-07:002009-07-11T11:29:57.163-07:00Finestre di SceltaUn altro passo nella costruzione dell'interfaccia del nuovo Now3D è l'implementazione delle finestre di scelta, utili all'aggiunta di varie tipologie di entità (es: oggetti, materiali, luci, ecc...).<br /><br /><span style="font-size:130%;">Shader e Materiali</span><br />Le prime finestre di scelta implementate sono quelle per gli Shader e per i Materiali.<br />La logica di utilizzo di queste due finestre è molto simile. L'area superiore serve a scegliere tra le librerie di materiali (o shader) caricati in memoria, l'area inferiore serve invece a selezionare e caricare un file di tipo materiale (o shader) precedentemente salvato.<br />Mentre la finestra di scelta dei Materiali mostra tutti i materiali disponibili, la finestra di scelta degli shader mostra solamente gli shader compatibili con la tipologia di connessione richiesta. Quindi se provassimo ad aggiungere uno shader ad una connessione di input di tipo "colore", avremmo la scelta esclusiva tra shader che hanno tra le connessioni di output una connessione di tipo "colore".<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/Avr1mo8Ot1uDe_uK_GHiFg?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPwGy4TPgsaYu_872R5h1AK2B3roLW0RClxsshjWeADnbpt7CDhn2HIt56VHP7oEOwv0zHJhpZTy_QyUqFI5lPdIE13VOBzm90N9sgl2ViwYOu_6xzbtsuq8iQZpsGuHPRlm1AjkM026Sn/s144/MaterialDialog.JPG" /></a></td><td align="center"><a href="http://picasaweb.google.com/lh/photo/MfPSx604PMsXZkRdHzwgDw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH6r6u9TB2X1BJs5vipXHvQjiO9kMVdi_k2eqgvOKj_qcEi3E64qSmsPq-y5MJVpGOcyXW2el4F-j_4N_5anlliq58F97k0KABnjH-_bsEfnA8alciafVWeY-fie8CxZ6V5Z-r14PmKAqP/s144/ShaderDialog.JPG" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Scelta Materiali</td><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-left:5px;">Scelta Shader</td></tr></tbody></table>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-56009782481547516862009-07-09T13:08:00.000-07:002009-07-10T12:03:46.548-07:00File Materiali<span style="font-size:130%;">Nuovo formato File</span><br />Eccomi di nuovo a parlare di XML. Sono passati quasi tre mesi dal mio ultimo post, ma non sono stato certamente rimasto con le mani in mano...anzi!<br />Volevo portare il formato xml anche nel salvataggio dei materiali, ma la difficoltà nell'applicare lo standard xml (ho sinceramente odiato l'xmlreader!), ha fatto allungare i tempi.<br />Però, come dico di solito in questi casi: "Ho vinto io!".<br />Ho dovuto rivedere leggermente il formato dei file introducendo nuovi namespace, una struttura "classes" per dichiarare i namespace utilizzati all'interno del file e una struttura standard "element" al cui interno incapsulare il vero e proprio xml da salvare.<br /><br /><table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/Vuzpf0sgpiHwviJdiWrEtQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7sNKCykHgKSlP-Y8EwsgmtYGs3ESjponezc37l-OB8WHpSOgAPDaW4WwKUiUc-G5qw3lz71ClxEnX1vT3MSQzBmGMJzvs1twwa2EzuCVAsXWc50BG_KbxKTYogQLzE6f60Hyf3RZcfvV9/s144/Nuova%20Struttura%20File%20XML.JPG" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Struttura Standard N3DXML</td></tr></tbody></table><br /><br /><span style="font-size:130%;">File Materiali</span><br />Così, una volta sciolti gli ultimi "nodi", ho potuto implementare il formato per il salvataggio dei materiali, compreso delle strutture utili a definire i BRDF e le Mappe.<br />E come per gli shader, grazie agli schemi associati ad ognuna di queste strutture ho potuto definire in automatico tutte le regole di caricamento del file.Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-68457954312006838262009-05-26T21:30:00.000-07:002009-05-27T00:59:51.331-07:00Altre News<span style="font-size:130%;">Le Rifrazioni RayTracing</span><br />Un altro passo del porting di Now3D vb6 alla piattaforma dot.net, è il calcolo delle rifrazioni tramite l'algoritmo di RayTracing.<br /><table style="WIDTH: auto" cellpadding="10"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/Ye99jfgdOg58U0CiDAE7gg?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghheF3MIlUDthU_slqtopv2RLt9KtHxaV1lUfboPk1PVhaS163HtPOhZJJtJFXjKIq_1l_yo90CMVtRkJA8WlU8EVtfZXA3s1XaP5zisK7_NB1BPyaxzocxrlP5_2uRZSMtr3Rqb9jkyG7/s144/Glass04.jpg" /></a></td><td align="center"><a href="http://picasaweb.google.com/lh/photo/3HjXpryYxcGPVufnr1uMDQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBW1AnfPF6-PP903WJBoPCP1Z_TUk1lcmgJorKesaY5b6xrxdan0dQv86Lld7X_n_Rt6GAUgK3t9pGprRan9dFCEZBDowAD84XSRRY-C4MVFPlmB_Sfp0aYDr6FVNKPV5sBTB_IX7VCwA5/s144/Glass03.jpg" /></a></td></tr><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px">Esempio di rifrazione</td><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px">Altro esempio di rifrazione</td></tr></tbody></table><br /><span style="font-size:130%;">AA SuperHigh</span><br />Ora grazie alla maggiore velocità di rendering ho voluto inserire un nuovo livello di AntiAliasing: il SuperHigh. Grazie all'utilizzo di un numero maggiore di campioni rispetto alla modalità High, si possono ottenere dei risultati ancora più precisi, sempre però a scapito del tempo di rendering.<br /><table style="WIDTH: auto" cellpadding="10"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/c6-LVuaIVNoaO8zjT7nmIQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaxde8nM-NN3Q8edgO4yhSGUzH26iProrm_2V2QVnoYNOe3YV6df6F1zurw1T6pYH3H1ni0qwTeAfp5HpV48hkGii-9LDWUkATFPM8WgK18GsQEiS0wn3CB1aIfXdpSgi4wyZFMjY6cH8b/s288/AA_SuperHigh_20090517.jpg" /></a></td></tr><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px">Interfaccia utile allo studio dell'Antialiasing</td></tr></tbody></table><table style="WIDTH: auto" cellpadding="10"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/p7Kutf6ASdbqA0dxJ8tV2w?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzI1mUaYRkDHqUcoZMLpOoU13dlfXUf8vqLiRe4I13yFigymg23canzYHwzxBTRjmWl1ss9ZGQojk1xnrlA2jnbBmfyIkb8_iE52_GcgGtf03LNdeOb6WY7Azb7ZHUIz1-ZKouxS0tqgir/s144/MeshInstance01.jpg" /></a></td></tr><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px">Esempio di rendering in modalità AA SuperHigh</td></tr></tbody></table><br /><span style="font-size:130%;">Migliorie varie</span><br /><table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/I6bNlcnB9xv-5KPY4N4RBQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlYwG9v1FqPRpLnewBaEkqdZ0xRHJqb3MFOrM4UWm-37xmnKZarPpxsbFHHH5MV06Ot2CzBpOBEGcwxy1dA37_sb4sUG2ybgXhNRgEapSvJmcYubosq8F0qfq_18sswLHWnb_K6PrzsTmY/s144/Mesh_1_6MB_20090523.jpg" align="right"/></a>Migliorato il calcolo del raytracing tramite l'algoritmo Octree per poligoni piccoli, che nella precedente versione rallentava sensibilmente. Nell'esempio qui a fianco un rendering di prova di una mesh contenente 1.6 milioni di poligoni generato in modalità AA High in soli 166 secondi!</td></tr></tbody></table><br /><table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/FiQTwR90Ou6-IIih6xXWKA?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisfN2SU6Hgh8_yU3SfHmOWqxidYYHUw_AzGDAKJ_2nan4V0JPUNwWoQJuINUcTqr26XicqhR5dMDZRHraoEf_bYCvN6uZtxMGqk-4pG9yaj_AuNIa4R9eg6f69_rowuxoIPZ-x1OVD09Vt/s144/ScanlineRefraction_20090516.jpg" align="right"/></a>Migliorata la resa del rendering scanline di un oggetto trasparente.</td></tr></tbody></table><br /><table style="WIDTH: auto; padding-left:30px;"><tbody><tr><td><li>Implementata una struttura standard per la gestione di uno shader da applicare come mappa ambientale (per ora funzionante solo in modalità RayTracing).</li></td></tr><tr><td><li>Migliorato lo standard delle istanze riguardo le gerarchie.</li></td></tr><tr><td><li>Migliorato lo standard Shape di tipo Path.</li></td></tr></tbody></table>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-90051100602005584582009-05-24T21:30:00.000-07:002009-05-26T23:50:36.730-07:00Le ConstraintHo deciso di iniziare a implementare il codice utile a definire lo standard per le Constraint.<br />Nella mia realizzazione, ho creato un struttura standard di classi che possono aggaccianciarsi a delle connessioni (per esempio quelle delle istanze: posizione, rotazione, dimensione, ecc..), con la possibilità di modificarne o bloccarne i valori seguendo le regole scritte nelle Constraint stesse.<br /><br /><span style="font-size:130%;">Prima applicazione: Il Blocker</span><br />La prima Constraint che ho implementato è una funzionalità già presente nel vecchio Now3D versione VB6, e cioè la possibilità di bloccare i seguenti attributi: Posizione, Rotazione, Scala, e Dimensione.<br /><table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/ZzCuCFlIWbKlEyMLjhcYGQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT6iztsPfYGyi_HvHqMjUJMtoKsSlD2vS8AxyjCWG2ebuOx3qpeK20d0KtM8oouNsenzk-h0pK5VP-lWeKGa4OYyejFlncNKbidiM-6rJkTlTL4YmqkKSCggnTREYLmO8CQq0cvWoB7y4p/s288/Contraint_Blocker_20090517.jpg" /></a></td></tr><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px">Proprietà di una Constraint di tipo Blocker</td></tr></tbody></table><br /><br /><span style="font-size:130%;">Prossima applicazione: IK (Inverse Kinematics)</span><br />Ho provato a cimentarmi nell'affascinante mondo delle animazioni implementando una Constraint speciale che funzionasse da catenza di nodi IK. IK o Inverse Kinematics è un metodo tramite il quale poter ad esempio spostare una catena di articolazioni come quella tra la spalla e il braccio e tra il braccio e l'avanbraccio, spostando semplicemente il polso dove si preferisce, sarà l'algoritmo stesso a generare le giuste rotazioni delle due articolazioni in modo da far raggiungere al polso la posizione scelta.<br />La mia implementazione funziona solamente su uno dei tre assi di rotazione (lo Z) , ma spero prossimamente di farla funzionare su tutti e tre gli assi.<br /><table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/psI3MDnM1TWEAh1VF49fQQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4gv89pwQdO6mXaWzDEd6oimD0lPi56Y7hhHWqKBA76jBAeLd0KhGY4DbuQTg0BgOZpjiC9MJwlfev6zIo9hmqV8LwDYRGnq_QeFFvCXxq5mWaln1D3giDM48JlDUCqZwQ0v7a_uBbPqsZ/s288/Constraint_IK_20090515.jpg" /></a></td></tr><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px">Prima versione di una catena IK</td></tr></tbody></table>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-7368894300331433292009-05-22T21:00:00.000-07:002009-05-27T00:03:58.821-07:00L'Interfaccia<span style="font-size:130%;">I nuovi controlli</span><br />Ho iniziato a lavorare sull'interfaccia del nuovo Now3D cominciando con le interfacce per gestire gli elementi della Scena e del Materiale. <table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/T7ghiEhEuQB1_6T21pe2rw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQsYPR0NFT3RkBllRyX60ZjHUGyn7Oos1TSyNLs5PUEYwbz0id6BPUtf7VfOjvCqdMX0L182c1e1umLns26d7oeRN23ljSuGVl5IxmrY1QARjdm1kHqgx5xZjZw9xm0KAcYAGtzNl-IgQE/s288/Shader4_20090517.jpg" /></a></td></tr><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px">La nuova interfaccia.</td></tr></tbody></table><br /><br /><span style="font-size:100%;">L'Albero della Scena</span><br /><table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/oK6IR5SUTo54SsU0dqFbqw?feat=embedwebsite" target="_blank"><img align="right" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp7WToAxxGpOZIblzsIs5t51Ya5WZF18BJkOogymchZzqozCyUtrnIjiLlswf6tygNZ8EXJ_8d0_MNZIT3agG5cZWUGG-v2Hy_02sSuetZrSXzEfGwVg7Rk92GOPqJkyc3l2Wd1wr7yCRt/s144/Shader4_TreeScene_20090517.jpg"/></a>Ho voluto ricalcare lo standard di visualizzazione di Now3D implementando una prima versione dell'albero della Scena. Il quale contiene le varie tipologia di istanze (oggetto, camera, luce, ecc...) e la lista dei materiali.</td></tr></tbody></table><br /><br /><span style="font-size:100%;">Le Proprietà della Scena</span><br /><table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/QMJiXJJy6pD3LG-UvI2NSw?feat=embedwebsite" target="_blank"><img align="left" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTx1EXIFzwU4hG-RqgsetUDTVFPF-v1ocFIifQl33YTF0a91L_kE9fCN-GYW16zoRrQpjjFdpJ74xS8IoHGGT_MmIIvhqU5LGrHmrasdJ6JYsgvMahR1fBn4r-OL964Qh6njmPJ8iPRGyf/s144/Shader4_SceneProperties_20090517.jpg" /></a>Alla selezione di un elemento dell'albero della Scena verrà aggiornata la zona sottostante, che conterrà le rispettive proprietà dell'elemento selezionato.<br />Questa volta per implementare un gestore delle proprietà, più che costruirne uno mio, ho preferito (per una questione di tempi di realizzazione) utilizzare il controllo PropertyGrid contenuto nel framework di Dot.Net 2.0. Anche questo controllo come quello che avevo implementato sul vecchio Now3D vb6 è abbastanza facile da utilizzare, si può navigare tra le sotto-proprietà (pulsantino "+") oppure, selezionando una riga, sarà possibile modificarne il valore.</td></tr></tbody></table><br /><br /><span style="font-size:100%;">Albero dello Shader</span><br /><table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/wLLWDq-JCP4cbluNl9PDpA?feat=embedwebsite" target="_blank"><img align="right" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkc76bt3aWQYGGzoYRdIaYaNOrt8SfckYvS8tGB8bW6KBPIK0i1TpIc4k7uH03bcb34VpbX-Z64kIXm-SD6vfx2ylqIhl9RLP-Nr-YFy7debP2rc8TfiQbu7t97fcxuw-hVMrgM32n9xQR/s144/Shader4_ShaderTree_20090517.jpg" /></a>Questa sezione contiene una visualizzazione ad albero dello Shader applicato a una mappa del materiale selezionato. Potrete facilmente aggiungere (o rimuovere) nodi allo shader selezionato, oppure caricare Shader precedentemente salvati (vedi <a href="http://now3d.blogspot.com/2009/05/file-in-formato-xml.html">file in formato xml</a>).</td></tr></tbody></table><br /><br /><span style="font-size:100%;">Le Proprietà dello Shader</span><br /><table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/MBNF7_TsL3PfK1uvYUZVeQ?feat=embedwebsite" target="_blank"><img align="left" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-QY1ItVnuvpGeIZYFwBn5yeoXrBM4loN4vK6cI6zPr0c8rNlBGgK8AxIYnC0lHX5CEw4W4jD_mLchPR4D0A25rRBK4EeTfQTy1kja19XQMLfoKtGKalnPx_tqtZP6vZn87_MvUokleSIP/s144/Shader4_ShaderProperties_20090517.jpg" /></a>Analogalmente al funzionamento dell'albero della Scena, anche qui, selezionando un nodo dell'albero dello Shader, si potrà accedere alle rispettive proprietà, con la possibilità di modificarne i valori.</td></tr></tbody></table><br /><br /><span style="font-size:130%;">L’Editor Zoom</span><br />In concomitanza al miglioramento del codice dello standard di gestione degli oggetti editor, ho provato l'implementazione di un oggetto speciale associato alla selezione di istanze di tipo Camera: lo Zoom. Tramite questo editor potrete modificare lo zoom della Camera selezionata spostando semplicemente un cubo posto di fronte ad essa. <table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/iykCCGzWmqWGNHqiPxsoLg?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcZH4329FRIGy6YiCo4zneeLeOHrPpWJfjWOpVbs3H0DQ06jYi1fN8gPTSqyKNcxWuCR4Je921rkvc-eVfYrTlzbMUAjPQyvnw5L3-ekmumHN-Xat4oTa3lpWQHnP-uKkjR2fvHaqxcqJT/s288/Editor_Zoom_20090515.jpg" /></a></td></tr><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px">Editor Zoom</td></tr></tbody></table>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0tag:blogger.com,1999:blog-932812315473903597.post-63930267614993394232009-05-20T19:30:00.000-07:002009-05-22T00:43:12.878-07:00File in formato XML<span style="font-size:130%;">L'XML</span><br />Da quando è “nato” l’XML sono rimasto subito affascinato dalla sua semplicità e versatilità, infatti, grazie all’XML è possibile sia gestire flussi di dati che strutturare veri e propri linguaggi di programmazione. Nella sua prima incarnazione in Now3D, ho voluto cominciare con lo standard di salvataggio dei file.<br /><br /><span style="font-size:130%;">File in formato XML</span><br />Ho sempre voluto implementare lo standard XML per il salvataggio e il caricamento delle scene di Now3D, infatti il vecchio formato di salvataggio ci assomigliava molto, ma peccava nell'essere un formato poco standard. Accoppiando file XML a dei file XML Schema (linguaggio descrittivo di file XML) ho potuto gestire in maniera automatica il controllo di validità del file XML stesso. Questo, senza dover scrivere una riga di codice, infatti all'interno del file di schema (anch'esso scritto in XML) sono descritte in maniera dettagliata tutte le strutture del rispettivo file XML.<br />L'implementazione è fatta tramite una classe standard (N3DXML), ereditando la quale è possibile facilmente applicare le operazioni base di salvataggio (write) e di caricamento (read) di frammenti XML.<br />Lo standard di gestione di questi file XML è strutturato in modo tale da rendere facile la gestione della compatibilità nella costruzione delle varie versioni di uno stesso schema, e nell'associazione di una classe ad un file XML e ai suoi rispettivi schemi.<br /><br /><span style="font-size:130%;">File Shader</span><br />Come prima implementazione dello standard di gestione dei file XML ho scelto lo Shader. Ho pensato ad una struttura dinamica che faccia fronte a tutti i tipi di shader/nodi futuri che potrei implementare, quindi ho implementato un elemento base (nodebase) che abbia le caratteristiche basi di un nodo e che possa essere facilmente esteso tramite nuove connessioni (di input o di output) o nuovi attributi.<table style="WIDTH: auto"><tbody><tr><td align="center"><a href="http://picasaweb.google.com/lh/photo/SrJA1B9iufhUabAZkohsgw?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNL1-ajU7JKXvg6bx5VU47Ksm-hpHEPhmDHGKxRGYIWfvhI6NCqjscpT5Ei12fBa0osTDbVYM91sKeeOQSHVE4VVDw_WzRKZV8r-XSVnUA9ueMVCAsouZcpBlRAxS_nLAHXW5XpFO2EwJd/s144/ShaderXML_20090517.jpg" /></a></td><td align="center"><a href="http://picasaweb.google.com/lh/photo/ZZeAexF-IABUNO4WNrsTRQ?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3dS6NiW0-BBa9JJVsyPgf_1QuRMoZAabk3Gas0zckkdNEbajb-1HAv8meki2cVRLvwyGJr6HkGbrXijmaRMt9wnkXWyl7JNRSjo_ntZnhXdGO0Qk3F65IUKluovJmcJ7u7tT7EHbYsq3k/s144/ShaderXSD_20090517.jpg" /></a></td></tr><br /><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-right:5px;">Esempio di file Shader in formato XML</td><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px; padding-left:5px;">Esempio di Schema per uno Shader</td></tr></tbody></table><br /><span style="font-size:130%;">Prossima applicazione: L’Undo</span><br />Una delle tante altre funzionalità con utilizzo intenso dello standard XML è la gestione dell'Annullamento dell'ultima operazione o anche chiamata Undo. L'uso dell'XML riguarderebbe il salvataggio strutturato delle operazioni annullabili. La classe standard che sto finendo di implementare potrà gestire qualsiasi tipologia di operazione annullabile, ad esempio il valore di una proprietà oppure la chiamata ad una routine di elaborazione.<br />Un esempio delle operazioni annullabili sono:<br /><table style="WIDTH: auto; padding-left:30px;"><tbody><tr><td><li>spostamento di un Oggetto</li></td></tr><tr><td><li>modifica di uno Shader</li></td></tr><tr><td><li>eliminazione di una Telecamera</li></td></tr><tr><td><li>e altro ancora...</li></td></tr></tbody></table><br />E' ancora in fase di studio poichè vorrei prima inserire anche il Redo e cioè il ripristino di un operazione annullata, spero di completarlo prossimamente.<table style="WIDTH: auto"><tbody><tr><td><a href="http://picasaweb.google.com/lh/photo/jd1WOVMyov0K7W2T3A7WRA?feat=embedwebsite" target="_blank"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcTO0gRiZK86WKZTRg1K7t2hWXb_lr7rnvivxN9cyA8mWEpgXnsBfGa8DBpFWi19T-7Lt0n5dhE9dY5ka4zqtyNwyg7-V7MnzbhFEGIrJE0UxQ60LGok6NJ8AuY2YNoQaJw7tgIFRbYhuf/s800/Undor_Redo_20090515.jpg" /></a></td></tr><tr><td style="TEXT-ALIGN: center; FONT-FAMILY: arial,sans-serif; FONT-SIZE: 11px">Esempio di funzionalità Undo/Redo</td></tr></tbody></table>Giuliano Cornacchiolahttp://www.blogger.com/profile/01669800635254343861noreply@blogger.com0