Irrlicht - from Noob to Pro: Sonnensystem.cpp

Aus Wikibooks
// Sonnensystem.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
// Diese Konsolenanwendung verwendet vorkompilierte Header, um die Dauer des
// Kompiliervorgangs zu reduzieren

#include "stdafx.h"
#include "GUI.hpp"
#include "DatenSonnenSystem.h"
#include "Funktionen.hpp"

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

int _tmain(int argc, _TCHAR* argv[])
{
	// Ein Null-Device zum Auslesen der Desktop-Größe erstellen
	IrrlichtDevice *NullDevice = createDevice(video::EDT_NULL);
	// Auslesen der Größe des Desktops
	core::dimension2d<u32> DeskTopRes = NullDevice->getVideoModeList()->getDesktopResolution();
	// Das Null-Device wieder freigeben
	NullDevice -> drop();

	//Unser Irrlicht-Device erstellen und initialisieren
	IrrlichtDevice *device = createDevice( video::EDT_OPENGL, DeskTopRes, 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"Das aktuelle Sonnensystem");

	//Die Fenstergröße soll veränderbar sein
	device->setResizable(true);

	//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();
	
	//Eine Kamera erstellen
	scene::ICameraSceneNode* Kamera = smgr->addCameraSceneNodeMaya();
	Kamera->setFarValue(50000.0f); //Bis zum 50000 Einheiten Sichtweite
	Kamera->setPosition(vector3df(0.0f, 100.0f, -100.0f)); //Neben dem Mittelpunkt platzieren (Sonne)
	Kamera->setTarget(vector3df(0.0f, 0.0f, 0.0f)); //Auf die Sonne blicken

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

	//Unseren Context für das GUI erstellen
	SAppContext context;	
	context.device = device;
		
	//Unser Event-Receiver (Klasse definiert in GUI.hpp)
	MyEventReceiver receiver(context);	

	//Erstellen der GUI
	Erstelle_GUI(guienv);

	//Dem Device den Event-Receiver mitteilen
	device->setEventReceiver(&receiver);

	//Aktuellen Zeitpunkt speichern
	SpeichereZeit();

	//Julianisches Datum errechnen
	fJulianischesDatum = Berechne_Julianisches_Datum(LokalZeit);

	//Vermerken der Startzeit
	uZuletztGestoppt = device->getTimer()->getTime();

	//Erstellen der einzelnen Planeten
	ErstellePlaneten(smgr, driver);

	//Erstellen der Arrays zum Nachzeichnen des Orbits
	Erstelle_Orbit_Arrays();

	//Erstelle Skybox
	driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);	
	SkyBox = smgr->addSkyDomeSceneNode(driver->getTexture("SkyDome.png"));
	driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);

	//Das Umbegungslicht ("Ambient Light") einstellen
	smgr->setAmbientLight(video::SColorf(0.2f,0.2f,0.2f));
	//Eine starke Lichtquelle in der Sonne platzieren
	Lightnode = smgr->addLightSceneNode(0, core::vector3df(0, 0, 0), video::SColorf(1.0f, 1.0f, 1.0f, 1.0f), 150000.0f);

	while(device->run())
	{	
		//Szene beginnen
		driver->beginScene(true, true, SColor(3,150,203,255));	

		//Errechnen der Positionen anhand des julianischen Datums
		BerechnePlanetenPositionen();

		//Planeten an die errechneten Positionen setzen
		PositionierePlaneten();						
		
		//Dem Szenemanager sagen, dass er alle Nodes zeichnen soll
		smgr->drawAll();	

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

		//Nach Ablauf von Delta Time
		if (device->getTimer()->getTime() > (uZuletztGestoppt + uDeltaTime))
		{
			//Neuen Zeitpunkt der Messung merken
			uZuletztGestoppt = device->getTimer()->getTime();
			//Addieren der eingestellten Zeitspanne
			Zeit += uZuAddierendeZeit;
			//Zerlegen des neuen Zeitwertes
			LokalZeit = localtime(&Zeit);
			//Berechnen des julianischen Datums
			fJulianischesDatum = Berechne_Julianisches_Datum(LokalZeit);
			//Ausgeben des Info-Texts im Info-Fenster
			Erstelle_Info_Text(fJulianischesDatum, LokalZeit);
		}
		//Den selektierten Planeten mit der Kamera verfolgen
		Verfolge_gewaehlten_Planeten(device);

		//Hat sich die Position im Orbit geändert ?
		Pruefe_Orbit_Pos();

		//Den Orbit anhand der Planetenposition zeichnen
		Zeichne_tatsaechlichen_Orbit(driver);
		
		//Szene beenden
		driver->endScene();
	}
	//Das Device freigeben
	device->drop();

	return EXIT_SUCCESS;
}