Irrlicht - from Noob to Pro: Beispielcode5

Aus Wikibooks
//Einbinden der Header-Datei von Irrlicht
#include <irrlicht.h>

//Einbinden der Namespaces
using namespace irr;
using namespace core;
using namespace video;

//Die Hauptprozedur main()
int main()
{
	//Unser Irrlicht-Device erstellen und initialisieren
	IrrlichtDevice *device =
		createDevice( video::EDT_OPENGL, dimension2d<u32>(640, 480), 32,
			false, false, false, 0);

	//Konnte das Device erstellt werden ?
	if (!device)
		return 1; //Falls nicht, Fehlercode zurückgeben und Programm abbrechen

	//Den Text des Hauptfensters festlegen
	device->setWindowCaption(L"Ein Mesh in Irrlicht !");

	//Den Videotreiber erstellen und Zeiger aus dem Device abholen
	IVideoDriver* driver = device->getVideoDriver();	
	
	//Einen Szene-Manager erstellen und Zeiger aus dem Device abholen
	scene::ISceneManager* smgr = device->getSceneManager();
	
	//Erstellen der SceneNode für den Lautsprecher und laden der exportierten Datei
	scene::ISceneNode * Speaker_Node = smgr->addMeshSceneNode(smgr->getMesh("Lautsprecher.obj"));
	
	//Keine Lichtberechnung für den Lautsprecher
	Speaker_Node->setMaterialFlag(EMF_LIGHTING, false);

	//Position korrigieren
	Speaker_Node->setPosition(core::vector3df(0.0, 0.0,3));
	
	//Rotation korrigieren (Objekt steht auf dem Kopf)
	Speaker_Node->setRotation(core::vector3df(0.0,0.0,180));

	//Culling umkehren (falls nötig)
	Speaker_Node->setMaterialFlag(EMF_BACK_FACE_CULLING, true);
	Speaker_Node->setMaterialFlag(EMF_FRONT_FACE_CULLING, false);
	
	//Einen Rotations-Animator für den Lautsprecher erstellen
	scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator(
		core::vector3df(0.0,1.0,0.0)); //Drehung um die Y-Achse

	//Der Lautsprecher-Node den Animator hinzufügen
	Speaker_Node->addAnimator(anim);

	//Den Animator wieder freigeben, da er nicht mehr gebraucht wird
	anim->drop();
	
	//Eine Integer-Variable zum Speichern der letzten FPS
	int lastFPS = -1;

	//Einen GUI_Manager erstellen und Zeiger aus dem Device abholen
	gui::IGUIEnvironment* guienv = device->getGUIEnvironment();

	//Ein Text-Element definieren und an den GUI-Manager übergeben
	gui::IGUIStaticText* GUI_debug_text = guienv->addStaticText
		(L"",rect<s32>(5, 5, 200, 200),false,true,0,-1,false);

	//Eine Kamera erstellen
	smgr->addCameraSceneNode(0, core::vector3df(0,0,-2), core::vector3df(0,0,0));	

	//Während das Device aktiv ist ...
	while(device->run())
	{		
		//Szene beginnen
		driver->beginScene(true, true, SColor(3,150,203,255));
				
		//Dem Szenemanager sagen, dass er alle Nodes zeichnen soll
		smgr->drawAll();
		
		//Die aktuellen Frames per second einholen und merken
		int iFPS = driver->getFPS();
		
		//Wieviel Dreiecke wurden beim letzten Durchlauf gezeichnet ?
		u32 uTrisDrawn = driver->getPrimitiveCountDrawn();
		
		//FPS-Zahl hat sich geändert ?
		if (lastFPS != iFPS)
		{
			//String erstellen
			core::stringw tmp(L"Laden einer Mesh-Datei in Irrlicht\nTreiber : ");
			tmp += driver->getName();
			tmp += L"\n FPS: [";
			tmp += iFPS;
			tmp += "]\n";
			tmp += "Dreiecke gezeichnet : ";
			tmp += uTrisDrawn;
			tmp += "\nGrafikkarte ist von : ";
			tmp += driver->getVendorInfo();

			//String anzeigen
			GUI_debug_text->setText(tmp.c_str());

			//Letzte FPS merken
			lastFPS = iFPS;
		}

		//Dem GUI-Manager sagen, dass er alle GUIs zeichnen soll 
		guienv->drawAll();

		//Szene beenden
		driver->endScene();
	}
	//Das Device freigeben
	device->drop();
	
	//Keinen Fehler zurückgeben
	return 0;
}