Non riesco a capire bene il perche’, ma pare che nell’allegro mondo del 3D sia impossibile trovare qualcuno in grado di scrivere della documentazione (manuali, tutorial, quel che volete) sensata, completa e facile da seguire per chi, come il sottoscritto, dell’argomento e’ un completo novizio. Essendo alla prese con Irrlicht (tra l’altro, proprio in questi giorni e’ stata pubblicata la versione 1.4.2 per Windows), in questo post ho quindi deciso di rivisitare il tutorial ufficiale numero 1, cercando di colmare, o perlomeno di riempire parzialmente, le varie lacune in esso presenti.

La funzione piu’ importante dell’intero engine e’ irr::createDevice(). Questa funzione provvede a creare un oggetto appartenente alla classe irr::IrrlichtDevice, ricevendo in input sette parametri che sono (copio dalla guida):
- deviceType: type of the device. This can currently be video::EDT_NULL, video::EDT_SOFTWARE, video::EDT_BURNINGSVIDEO, video::EDT_DIRECT3D8, video::EDT_DIRECT3D9 and video::EDT_OPENGL.
- windowSize: size of the window or the video mode in fullscreen mode.
- bits: bits per pixel in fullscreen mode. Ignored if windowed mode.
- fullscreen: should be set to true if the device should run in fullscreen. Otherwise the device runs in windowed mode.
- stencilbuffer: specifies if the stencil buffer should be enabled. Set this to true, if you want the engine be able to draw stencil buffer shadows. Note that not all devices are able to use the stencil buffer. If they don’t no shadows will be drawn.
- vsync: specifies vertical syncronisation: If set to true, the driver will wait for the vertical retrace period, otherwise not.
- receiver: a user created event receiver.
- sdk_version_do_not_use: don’t use or change this parameter. Always set it to IRRLICHT_SDK_VERSION, which is done by default. This is needed for sdk version checks.
Un esempio di utilizzo di questa funzione e’ il seguente:
irr::IrrlichtDevice *device = createDevice( video::EDT_OPENGL, dimension2d< s32 >(1024, 768), 16, false, false, false, 0);
il quale va a creare una irr::IrrlichtDevice usando OpenGL e tracciando al tempo stesso una finestra avente dimensioni 1024×768, 16 bit di profondita’ del colore, con stencilbuffer e vsync disabiliti.
E’ prassi abbastanza diffusa, una volta creata una irr::IrllichtDevice, definire alcuni puntatori che consentano di accedere ad alcune delle sue proprieta’ in maniera rapida e semplice. I puntatori possono essere creati (e “fatti puntare”) nel modo che segue:
irr::video::IVideoDriver* driver =device->getVideoDriver();
irr::scene::ISceneManager* smgr = device->getSceneManager();
irr::gui::IGUIEnvironment* guienv = device->getGUIEnvironment();
Nel dettaglio, abbiamo innanzitutto che irr::video::IVideoDriver e’ l’interfaccia al driver che si occupa di mettere in atto le funzioni 2D e 3D. Tutte le operazioni di rendering e di texture manipulation potrebbero, in linea di principio, essere fatte utilizzando soltanto questa classe. irr::scene::ISceneManager si occupa invece di gestire nodi delle scene, mesh, camere e “all the other stuff”. Citando questa volta dalla documentazione delle API, il discorso continua in questo modo: “All Scene nodes can be created only here. There is a always growing list of scene nodes for lots of purposes: Indoor rendering scene nodes like the Octree (addOctTreeSceneNode()) or the terrain renderer (addTerrainSceneNode()), different Camera scene nodes (addCameraSceneNode(), addCameraSceneNodeMaya()), scene nodes for Light (addLightSceneNode()), Billboards (addBillboardSceneNode()) and so on. A scene node is a node in the hierachical scene graph. Every scene node may have children, which are other scene nodes. Children move relative the their parents position. If the parent of a node is not visible, its children won’t be visible, too. In this way, it is for example easily possible to attach a light to a moving car or to place a walking character on a moving platform on a moving ship. The SceneManager is also able to load 3d mesh files of different formats. Take a look at getMesh() to find out what formats are supported. And if these formats are not enough use addExternalMeshLoader() to add new formats to the engine.“. Infine abbiamo irr::gui::IGUIEnvironment, utilizzato come creatore/gestore di tutti gli elementi della GUI che vogliamo utilizzare.
Detto questo, ora, almeno per me, sorge un problema. Che stracazzo e’ uno SceneNode? Documentandomi un po’ ho trovato una definizione che puo’ essere sintetizzata nel seguente modo: “ogni oggetto o entita’ grafica a se’ stante presente all’interno della scena e’ un nodo della scena”. In Irrlicht, per come e’ stato implementato, un nodo generico contiene al suo interno una lista di materiali (una mesh e’ in generale composta da diversi materiali e ad ogni materiale sono associate una o piu’ textures), una bounding box (utile per usufruire delle funzioni di collision detection) e soprattutto un puntatore ad una mesh. Un nodo di scena, in Irrlicht, puo’ essere creato avendo come padre un altro nodo. In questo modo, le operazioni effettuate sul padre (spostamento, scaling, ecc…) si rifletteranno immediatamente anche sui/l figli/o. A questo punto diventa un po’ piu’ chiaro anche il ruolo dello irr::scene::ISceneManager, il quale si occupa di gestire tutto cio’ che riguarda i suoi nodi (i nodi, in fase di creazione, vengono infatti aggiunti allo scene manager), ovvero ne puo’ aggiungere/rimuovere, puo’ gestirne la visualizzazione, associarvi mesh, ecc… Non ho ancora ben capito come funzioni il meccanismo, ma tenete presente che SceneNodes possono essere scaricati facilmente da Internet; si veda ad esempio questo link.
In chiusura di questo post semi-interlocutorio approfitto per linkare Giovanni Santostefano, il quale ha scritto alcuni tutorial su Irrlicht, in italiano, che potete trovare a questo link. Il primo di questi risulta interessante in particolare per la descrizione che viene fatta della funzione irr::createDeviceEx(), la quale permette di specificare parametri aggiuntivi rispetto alla irr::createDevice() discussa qui sopra, quali l’antialiasing (on/off) e l’ID di una eventuale finestra gia’ esistente alla quale collegare il device che si sta creando. Gli altri meritano comunque una lettura e per me e’ doveroso segnalarli perche’ sono quelli che hanno iniziato ad aprirmi leggermente gli occhi sul significato dei nodi di scena.
Nota a pie’ di pagina. Stasera si sperimenta Ubuntu eee. Vedremo come andra’ a finire. Quel povero eeePC, di Windows XP proprio non ne vuole piu’ sapere…