// 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;
}