Este tutorial muestra como setear el IDE para usar el engine Irrlicht y como escribir un simple programa HolaMundo con el. El programa mostrara como usar lo basico del VideoDriver, el GUIEnvironment y el SceneManager.
El resultado de este ejemplo lucira asi:

Imágen


Seteando el IDE


Para usar el engine, necesitaremos incluir el archivo de cabecera <irrlicht.h>, el cual puede ser encontrado en el directorio \include dentro del SDK del engine Irrlicht. Para permitir al compilador encontrar este archivo de cabecera, el archivo en el que esta ubicado debe ser especificado en algun lugar. Esto es diferente para cada IDE y compilador. Yo voy a explicar como hacerlo en Visual Studio C++ 6.0 y .Net:

  • Si usas la version 6.0, selecciona el menu Extras -> Options. Selecciona la solapa directories , y luego el item "Include" en el combo box. Agrega el directorio \include de la carpeta del engine Irrlicht a la lista de directorios. Ahora el compilador encontrara el archivo de cabecera Irrlicht.h. Tambien necesitamos que sea listada la ubicación de irrlicht.lib, asi que selecciona la solapa Libraries y agrega el directorio \lib\VisualStudio.

Imágen
Imágen


  • Si tu IDE es VisualStudio? .Net, selecciona Tools -> Options. Selecciona Proyects y luego Vc++ directories. Selecciona "show directories for include files" en el combo box, y agrega el directorio \include de la carpeta del Engine Irrlicht a la lista de directorios, asi el compilador podra encontrar el archivo de cabecera Irrlicht.h . Tambien necesitamos que el archivo Irrlicht.lib sea encontrado, por lo tanto selecciona "show directories for Library files" y agrega el directorio \lib\VisualStudio.

Imágen


Empecemos!


Despues de que hayamos seteado el IDE, el compilador sabra donde encontrar los archivos de cabecera del Engine Irrlicht y por lo tanto podremos incluirlos en el codigo.

 #include <irrlicht.h> 



En el Engine Irrlicht todo puede ser encontrado en el namespace "irr" .
Por lo tanto, si queres usar una clase del engine tendras que tipear "irr::" antes del nombre de la clase. Por ejemplo, para usar el IrrlichtDevice? escribi: irr::IrrlichtDevice. Para evitar tener que poner "irr::" antes del nombre de cada clase, le decimos al compilador que usaremos ese namespace.

 using namespace irr; 


Hay 5 sub-namespaces en el Engine Irrlicht. Dales una mirada: podes leer una descripcion detallada de ellos en la documentacion, haciendo un click en el item "Namespace List" del menu superior. Para mantener el ejemplo simple, no queremos tener que especificar los namespaces, asi que:

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;


Para ser capaces de usar el archivo Irrlicht.lib, necesitamos linkear con Irrlicht.lib. Podemos setear esta opcion en las opciones del proyecto (proyect settings), pero para hacerlo facil usamos un pragma comment:

#pragma comment(lib, "Irrlicht.lib")


Ahora el metodo main: Para mantener el ejemplo simple usamos void main(), lo cual puede ser usado en cualquier plataforma. Sin embargo, en la plataforma Windows tambien podemos usar el metodo WinMain? si quisieramos deshacernos de la ventana de consola que aparece cuando iniciamos el programa con main().
int main()
{

La funcion mas importante del engine es la funcion "CreateDevice". El Irrlicht Device, el objeto raiz para hacer todo con el engine, puede ser creado con ella. CreateDevice() tiene 7 parametros:

  • deviceType: Typo de device. Puede llegar a ser Null, Software device, DirectX8?, DirectX9? u OpenGL. En este ejemplo usamos EDT_SOFTWARE pero, para probarlos, podrias querer cambiarlo a EDT_NULL, EDT_DIRECTX8 o EDT_OPENGL.
  • WindowSize: Tamaño de la ventana a ser creada o modo full screen. En este ejemplo usamos 512 x 384.
  • Bits: Numero de bits por pixel en modo full screen. Debe ser 16 o 32. Este parametro se ignora al ejecutar en modo ventana (¿??).
  • Fullscreen: Especifica si queremos que el device se ejecute en modo full screen o no.
  • Stencilbuffer: Especifica si queremos usar el stencil buffer para dibujar sombras.
  • Vsync: Especifica si queremos tener vsync habilitado. Solo es util en modo full screen.
  • EventReceiver: Un objeto para recibir eventos. Nosotros no queremos usar este parametro y lo seteamos a 0.

 
IrrlichtDevice *device =
		createDevice(EDT_SOFTWARE, dimension2d<s32>(512, 384), 16,
			false, false, false, 0);


Ahora seteamos el caption de la ventana con algun texto lindo. Nota que hay una "L" al frente del string: el Engine Irrlicht usa cadenas wide character al mostrar texto.

device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");


Ahora guardamos un puntero al driver de video, al SceneManager, y al GUI environment, asi no tendremos que escribir siempre device->getVideoDriver(), device->getSceneManager(), y device->getGUIEnvironment().

IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();


Agregamos una etiqueta "Hola mundo" a la ventana usando el GUI environment. El texto es colocado en la posicion (10,10) como esquina superior izquierda y (200,22) como esquina inferior derecha.

 
guienv->addStaticText(L"Hello World! This is the Irrlicht Software engine!",
	 rect <int>(10,10,200,22), true);


Para mostrar algo interesante, cargamos un modelo Quake 2 y lo mostramos. Solo tenemos que obtener el Mesh del Scene Manager con getMesh() y agregar un SceneNode para mostrar el mesh con addAnimatedMeshSceneNode(). En vez de cargar un archivo Quake 2 (.md2), tambien es posible cargar un archivo objeto maya (.obj), un mapa Quake 3 completo (.bsp), o un archivo Milshape (.ms3d).
Por cierto, este modelo Quake 2 llamado sydney.md2 fue modelado por Brian Collins.

 
IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2");
IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );


Para hacer que el mesh luzca un poquito mas lindo, cambiamos un poco su material: deshabilitamos la iluminacion porque no tenemos una luz dinamica y el mesh seria totalmente negro. Luego seteamos el frame loop para que la animacion sea loopeada entre los frames 0 y 310. Luego, por ultimo, le aplicamos al mesh una textura. Si ella el mesh seria dibujado usando solo un color solido.

 
if (node)
{
	node->setMaterialFlag(EMF_LIGHTING, false);
	node->setFrameLoop(0, 310);	
	node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );
}


Para mirar hacia el mesh, colocamos una camara dentro del espacio 3d en la posicion ( 0, 10, -40 ). La camara mira desde ahí hacia ( 0, 5, 0 ).

 
smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));


Bien. Ahora que hemos creado la escena, dibujemos todo: ejecutamos el device dentro de un loop while() hasta que el device no quiera ejecutarse mas. Eso sucedera cuando el usuario cierre la ventana o presione ALT + F4 en Windows.

 
while(device->run())
{


Todo debe ser dibujado entre las llamadas beginScene() y endScene(). BeginScene() borra la pantalla con un color y tambien el buffer de profundidad (depth buffer) si se lo desea. Luego dejamos que el Scene Manager y el GUI Environment dibujen su contenido. Con la llamada a endScene() se presenta todo en la pantalla.

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

	smgr->drawAll();
	guienv->drawAll();

	driver->endScene();
}


Una vez que hayamos terminado, tenemos que borrar el Irrlicht Device que creamos antes con createDevice(). Con el Engine Irrlicht debes borrar todos los objetos que creaste con los metodos o funciones que empiezan con "create". El objeto es borrado simplemente mediante una llamada a ->drop(). Mira la documentacion (documentation) para mas informacion.

 
	device->drop();
 return 0;
}


Eso es todo. Compilá y ejecutá.