(ITA) Octree di Sudi: Uso avanzato

Are you looking for the english version of this tutorial? ( http://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Flag_of_the_United_Kingdom.svg/20px-Flag_of_the_United_Kingdom.svg.png )

 

http://upload.wikimedia.org/wikipedia/commons/thumb/0/03/Flag_of_Italy.svg/200px-Flag_of_Italy.svg.png


http://i.creativecommons.org/l/by/2.5/it/80x15.png Licenzed under Creative Commons shareAlike noncommercial 2.5 by Dario "Demone Rosso".

 

Per prima cosa scaricate il codice di Sudi, l'ho linkato in questo articolo.

 

Questo codice di esempio spiega come usare l'Octree di Sudi creandone istanze multiple. Il tutoral spiega come creare un manager dell'Octree, popolarlo con dei nodi figlio e rimuovere il tutto dalla memoria per poter ripetere l'operazione.

In questo modo chiunque volesse farne un utilizzo avanzato ha una reference illustrativa che non si limita al suo impiego base.

I nodi figlio non sono nient'altro che cubi aggiunti in posizioni casuali.


 

#include <irrlicht.h>                     //scarica il dev-kit di irrlicht per avere questo
#include <iostream>          //includo questo per avere la funzione rand()
#include "COcttreeManager.h" //Ho linkato questo codice da questo articolo

#include "ImprovedCOttreeManager.h"  //Verrà rilasciato assieme al mio gioco
#include "driverChoice.h"    //scarica il dev-kit di irrlicht per avere questo


using namespace irr;                       //usiamo i namespace di irrlicht
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;


int main() // main
{

 

    //Una variabile per decidere se usare l'Octree normale o potenziato. 

    //Attualmente non ho ancora rilasciato la versione potenziata

    bool useImprovedOctree = false;

 

 

    // Chiede all'utente quale driver di rendering utilizzare
    E_DRIVER_TYPE driverType = driverChoiceConsole();
          if ( driverType == EDT_COUNT )
                return 1;

    // crea il device di irrlicht in cui girerà il gioco
    IrrlichtDevice *device = createDevice( driverType,
                        dimension2d<u32>(640, 480), 32, false);
   
    if (!device)
        return 2;

 

    //ottiene il controllo del scene manager

    ISceneManager* smgr = device->getSceneManager();

 

 

    //dichiaro la variabile che mi serve 

    array<ISceneNode *>  managerList; //an array of Sudi's OctreeManagers.

    array<ISceneNode *>  childList;  

    ISceneNode*          node=0;

 

    //Alloca gli arrays.

    u16 aSize = 256;

    managerList.reallocate( aSize );

    childList.reallocate( aSize );

 

 

    for (u16 i=0; i<aSize; i++)

    {

        if( useImprovedOctree ) //per ora uso la versione non potenziata

            managerList[i] = new COcttreeManager(smgr->getRootSceneNode(),  smgr,

                                    irr::core::aabbox3d<irr::f32>

                                    (-1000,-1000,-1000,1000,1000,1000)  );

        else

            managerList[i] = new COcttreeManager(smgr->getRootSceneNode(),  smgr,

                                    irr::core::aabbox3d<irr::f32>

                                    (-1000,-1000,-1000,1000,1000,1000)  );

 

        //ora che abbiamo creato il scenemanager lo popoliamo con nodi figlio

 

        for(u16 j=0; j<aSize; j++)

        {

            node = smgr->addCubeSceneNode(5.0f, managerList[i],i*aSize+j+1001,

                                   vector3df( (f32)(rand()%1800-900),

                                              (f32)(rand()%1800-900),

                                              (f32)(rand()%1800-900) )

                                          ); //crea un cubo..

 

            node->setParent(managerList[i]); //e lo aggiunge al scene manager

 

        }

 

        device->run(); //disegna tutta la scena una volta.

       driver->beginScene(true, true, SColor(0,130,130,130));

       smgr->drawAll();

       driver->endScene();

 

       managerList[i]->setParent(0); //rimuove l'octree dal scene manager

       managerList[i]->drop();  //eliminiamo l'octree e i suoi figli

    }

 

    device->closeDevice();

    device->run();

    device->drop();

 

    return 0;  //fine del programma

}


Pubblicità
Per essere informato degli ultimi articoli, iscriviti: