Irrlicht - from Noob to Pro: Funktionen.hpp

Aus Wikibooks
#ifndef FUNKTIONEN_H_INCLUDED
#define FUNKTIONEN_H_INCLUDED
using namespace irr;
using namespace core;
using namespace video;

time_t Zeit;
struct tm *LokalZeit;
f32 fJulianischesDatum;

core::vector3df EarthPos; //Positionsvektor unserer Erde
core::vector3df MoonPos; //Positionsvektor unseres Monds
core::vector3df MercuryPos; //Positionsvektor des Merkur
core::vector3df VenusPos; //Positionsvektor der Venus
core::vector3df MarsPos; //Positionsvektor des Mars
core::vector3df JupiterPos; //Positionsvektor des Jupiter
core::vector3df SaturnPos; //Positionsvektor des Saturn
core::vector3df UranusPos; //Positionsvektor des Uranus
core::vector3df NeptunPos; //Positionsvektor des Neptun
core::vector3df PlutoPos; //Positionsvektor des Pluto

scene::IAnimatedMesh* SaturnRingMesh;
scene::ISceneNode * Saturn_Ringe;

scene::ISceneNode * Sonne;
scene::ISceneNode * Erde;
scene::ISceneNode * Mond;
scene::ISceneNode * Merkur;
scene::ISceneNode * Venus;
scene::ISceneNode * Mars;
scene::ISceneNode * Jupiter;
scene::ISceneNode * Saturn;
scene::ISceneNode * Uranus;
scene::ISceneNode * Neptun;
scene::ISceneNode * Pluto;

scene::ISceneNode * SkyBox;
scene::ISceneNode * Lightnode;
////////////////////////////////////
// Unsere Arrays zum Nachzeichnen //
// des zurückgelegten Orbits	  //
////////////////////////////////////
const int max_array = 50000; //Maximale Anzahl an Werten im Array
//Merkur
core::vector3df *v3dfMerkur; //Das Array mit den Orbit-Vektoren
u32 uiPosArrayMerkur = 0; //Aktuelle Position im Array
core::vector3df *v3dfVenus; u32 uiPosArrayVenus = 0;//Venus
core::vector3df *v3dfErde; u32 uiPosArrayErde = 0; //Erde
core::vector3df *v3dfMars; u32 uiPosArrayMars = 0; //Mars
core::vector3df *v3dfJupiter; u32 uiPosArrayJupiter = 0; //Jupiter
core::vector3df *v3dfSaturn; u32 uiPosArraySaturn = 0; //Saturn
core::vector3df *v3dfUranus; u32 uiPosArrayUranus = 0; //Uranus
core::vector3df *v3dfNeptun; u32 uiPosArrayNeptun = 0; //Neptun
core::vector3df *v3dfPluto; u32 uiPosArrayPluto = 0; //Pluto

void ErstellePlaneten(scene::ISceneManager* smgr, IVideoDriver* driver)
{
	const f32 fTemp = 10; //Planeten um Faktor 10 i.V. zum Masstab vergrößern
	
	//Erstellen der SceneNodes	
	Sonne = smgr->addSphereSceneNode(Info_Sonne.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1001); //Sonne
	Erde = smgr->addSphereSceneNode(Info_Erde.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1002);  //Erde
	Mond = smgr->addSphereSceneNode(Info_Mond.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1003);  //Mond
	Merkur = smgr->addSphereSceneNode(Info_Merkur.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1004);  //Merkur
	Venus = smgr->addSphereSceneNode(Info_Venus.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1005);  //Venus
	Mars = smgr->addSphereSceneNode(Info_Venus.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1006);  //Mars
	Jupiter = smgr->addSphereSceneNode(Info_Jupiter.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1007);  //Jupiter
	Saturn = smgr->addSphereSceneNode(Info_Saturn.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1008);  //Saturn
	Uranus = smgr->addSphereSceneNode(Info_Uranus.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1009);  //Uranus
	Neptun = smgr->addSphereSceneNode(Info_Neptun.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1010);  //Neptun
	Pluto = smgr->addSphereSceneNode(Info_Pluto.f_Durchmesser / (fMassstab / fTemp), 32, 0, 1011);  //Pluto
	
	SaturnRingMesh = smgr->addHillPlaneMesh( "SaturnRings", //param name
					core::dimension2d<f32>(2,2), //param tileSize
					core::dimension2d<u32>(40,40), //param tileCount
					0, //param material
					0, //param hillHeight
					core::dimension2d<f32>(0,0), //param countHills
					core::dimension2d<f32>(1,1)); //param textureRepeatCount
	
	Saturn_Ringe = smgr->addMeshSceneNode(
						SaturnRingMesh, Saturn);
	Saturn_Ringe->setMaterialTexture(0, driver->getTexture("Saturn_Rings.tga"));
	Saturn_Ringe->getMaterial(0).MaterialType = EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
	Saturn_Ringe->getMaterial(0).BackfaceCulling = false;
	

	//Einstellen des Materials
	Sonne->setMaterialTexture(0, driver->getTexture("Sun.png"));
	Erde->setMaterialTexture(0, driver->getTexture("Earth.jpg"));
	Mond->setMaterialTexture(0, driver->getTexture("Moon.jpg"));
	Merkur->setMaterialTexture(0, driver->getTexture("Merkur.jpg"));
	Venus->setMaterialTexture(0, driver->getTexture("Venus.jpg"));
	Mars->setMaterialTexture(0, driver->getTexture("Mars.jpg"));
	Jupiter->setMaterialTexture(0, driver->getTexture("Jupiter.jpg"));
	Saturn->setMaterialTexture(0, driver->getTexture("Saturn.jpg"));
	Uranus->setMaterialTexture(0, driver->getTexture("Uranus.jpg"));
	Neptun->setMaterialTexture(0, driver->getTexture("Neptun.jpg"));
	Pluto->setMaterialTexture(0, driver->getTexture("Pluto.jpg"));
	
	//Keine Lichtberechnung für die Sonne
	Sonne->setMaterialFlag(EMF_LIGHTING, false);
};

void BerechnePlanetenPositionen()
{
	//Errechnen der Position des Merkur
	MercuryPos = BerechnePosition_Planet(fJulianischesDatum, 1);
	//Errechnen der Position der Venus
	VenusPos = BerechnePosition_Planet(fJulianischesDatum, 2);
	//Errechnen der Position der Erde
	EarthPos = BerechnePosition_Planet(fJulianischesDatum, 3);			
	//Errechnen der Position des Mars
	MarsPos = BerechnePosition_Planet(fJulianischesDatum, 4);
	//Errechnen der Position des Jupiter
	JupiterPos = BerechnePosition_Planet(fJulianischesDatum, 5);			
	//Errechnen der Position des Saturn
	SaturnPos = BerechnePosition_Planet(fJulianischesDatum, 6);
	//Errechnen der Position des Uranus
	UranusPos = BerechnePosition_Planet(fJulianischesDatum, 7);
	//Errechnen der Position des Neptun
	NeptunPos = BerechnePosition_Planet(fJulianischesDatum, 8);
	//Errechnen der Position des Pluto
	PlutoPos = BerechnePosition_Planet(fJulianischesDatum, 9);
	
	//Errechnen der Position des Monds
	MoonPos = core::vector3df(
		EarthPos.X + ((Info_Mond.f_Periphel / fMassstab) * sinf(fJulianischesDatum)),
		0,
		EarthPos.Z + ((Info_Mond.f_Aphel / fMassstab) * cosf(fJulianischesDatum))
		);
};

void PositionierePlaneten()
{
	Erde->setPosition(EarthPos);	
	Mond->setPosition(MoonPos);
	Merkur->setPosition(MercuryPos);	
	Venus->setPosition(VenusPos);
	Mars->setPosition(MarsPos);
	Jupiter->setPosition(JupiterPos);
	Saturn->setPosition(SaturnPos);
	Uranus->setPosition(UranusPos);
	Neptun->setPosition(NeptunPos);
	Pluto->setPosition(PlutoPos);
};

void SpeichereZeit()
{
	time(&Zeit); //Die aktuelle Systemzeit auslesen
	#pragma warning(disable : 4996) //Compilerwarnung ausschalten
	LokalZeit = localtime(&Zeit); //Zeitwert zerlegen
};

f32 Berechne_Julianisches_Datum(struct tm *LokalZeit)
{
	f32 JulianischesDatum = 0.0f;
	s32 Jahr = 0;
	s32 Monat = 0;
	s32 Tag = 0;
	s32 Stunde = 0;
	s32 Minute = 0;
	s32 Sekunde = 0;
	s32 Hilfswert_B = 0;
	f32 fUhrzeit = 0.0f; //Die Uhrzeit als Gleitkommazahl

	if (LokalZeit->tm_mon <= 1) //Monat <= Februar ?
	{
		Jahr = ((LokalZeit->tm_year + 1900) - 1); //Ein Jahr abziehen
		Monat = ((LokalZeit->tm_mon + 1) + 12); //12 Monate hinzuaddieren
	} else
	{
		Jahr = (LokalZeit->tm_year + 1900); //Jahr speichern
		Monat = (LokalZeit->tm_mon + 1); //Monat speichern
	}
	Tag = LokalZeit->tm_mday; //Tag speichern
	Stunde = LokalZeit->tm_hour; //Stunde speichern
	Minute = LokalZeit->tm_min; //Minute speichern
	Sekunde = LokalZeit->tm_sec; //Sekunde speichern
	Hilfswert_B = (int(Jahr / 400) - int(Jahr / 100)); //Hilfswert B berechnen
	fUhrzeit = (Stunde + 
			   (Minute * (1.0f / 60.0f)) +		//1 Min. = 60 Sek.
			   (Sekunde * (1.0f / 3600.0f))		//1 Min. = 3600 Sek.
			   ); //Uhrzeit als Gleitkommazahl
	JulianischesDatum = int(365.25f * Jahr) + 
						int(30.6001f * (Monat + 1)) + 
						Hilfswert_B +
						1720996.5f + Tag + (fUhrzeit / 24.0f);
	
	return JulianischesDatum;
};

void Verfolge_gewaehlten_Planeten(IrrlichtDevice *device)
{
	scene::ICameraSceneNode* Kamera = device->getSceneManager()->getActiveCamera();
	switch(uAktuellerPlanet)
	{
	case 0: Kamera->setPosition(vector3df(0.0f, 10000.0f, -10000.0f));
			Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1001)->getAbsolutePosition()); //Sonne			
		break;
	case 1: Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1004)->getAbsolutePosition()); //Merkur
		break;
	case 2: Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1005)->getAbsolutePosition()); //Venus
		break;
	case 3: Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1002)->getAbsolutePosition()); //Erde
		break;
	case 4: Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1006)->getAbsolutePosition()); //Mars
		break;
	case 5: Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1007)->getAbsolutePosition()); //Jupiter
		break;
	case 6: Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1008)->getAbsolutePosition()); //Saturn
		break;
	case 7: Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1009)->getAbsolutePosition()); //Uranus
		break;
	case 8: Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1010)->getAbsolutePosition()); //Neptun
		break;
	case 9: Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1011)->getAbsolutePosition()); //Pluto
		break;
	case 10: Kamera->setTarget(device->getSceneManager()->getSceneNodeFromId(1012)->getAbsolutePosition()); //Eris
		break;	
	}
};

void Erstelle_Orbit_Arrays()
{	
	//Erstellen des Arrays (0...max_array)
	//Erde
	v3dfErde = (core::vector3df *)malloc(max_array*sizeof(core::vector3df));	
	v3dfErde[uiPosArrayErde] = EarthPos;	//Letzte Position als ersten Array-Eintrag speichern
	//Merkur
	v3dfMerkur = (core::vector3df *)malloc(max_array*sizeof(core::vector3df));	
	v3dfMerkur[uiPosArrayMerkur] = MercuryPos;	//Letzte Position als ersten Array-Eintrag speichern
	//Venus
	v3dfVenus = (core::vector3df *)malloc(max_array*sizeof(core::vector3df));	
	v3dfVenus[uiPosArrayVenus] = VenusPos;	//Letzte Position als ersten Array-Eintrag speichern
	//Mars
	v3dfMars = (core::vector3df *)malloc(max_array*sizeof(core::vector3df));	
	v3dfMars[uiPosArrayMars] = MarsPos;	//Letzte Position als ersten Array-Eintrag speichern
	//Jupiter
	v3dfJupiter = (core::vector3df *)malloc(max_array*sizeof(core::vector3df));	
	v3dfJupiter[uiPosArrayJupiter] = JupiterPos;	//Letzte Position als ersten Array-Eintrag speichern
	//Saturn
	v3dfSaturn = (core::vector3df *)malloc(max_array*sizeof(core::vector3df));	
	v3dfSaturn[uiPosArraySaturn] = SaturnPos;	//Letzte Position als ersten Array-Eintrag speichern
	//Uranus
	v3dfUranus = (core::vector3df *)malloc(max_array*sizeof(core::vector3df));	
	v3dfUranus[uiPosArrayUranus] = UranusPos;	//Letzte Position als ersten Array-Eintrag speichern
	//Neptun
	v3dfNeptun = (core::vector3df *)malloc(max_array*sizeof(core::vector3df));	
	v3dfNeptun[uiPosArrayNeptun] = NeptunPos;	//Letzte Position als ersten Array-Eintrag speichern
	//Pluto
	v3dfPluto = (core::vector3df *)malloc(max_array*sizeof(core::vector3df));	
	v3dfPluto[uiPosArrayPluto] = PlutoPos;	//Letzte Position als ersten Array-Eintrag speichern
};

void Pruefe_Orbit_Pos()
{
	//Hat sich die Erde bewegt ?
	if ((v3dfErde[uiPosArrayErde].X != EarthPos.X) &&
	   (v3dfErde[uiPosArrayErde].Y != EarthPos.Y) &&
	   (v3dfErde[uiPosArrayErde].Z != EarthPos.Z))
	{
		if (uiPosArrayErde <= max_array) uiPosArrayErde++; //Nächsten Array-Eintrag
		v3dfErde[uiPosArrayErde] = EarthPos;	
	}
	//Hat sich der Merkur bewegt ?
	if ((v3dfMerkur[uiPosArrayMerkur].X != MercuryPos.X) &&
	   (v3dfMerkur[uiPosArrayMerkur].Y != MercuryPos.Y) &&
	   (v3dfMerkur[uiPosArrayMerkur].Z != MercuryPos.Z))
	{
		if (uiPosArrayMerkur <= max_array) uiPosArrayMerkur++; //Nächsten Array-Eintrag
		v3dfMerkur[uiPosArrayMerkur] = MercuryPos;	
	}
	//Hat sich die Venus bewegt ?
	if ((v3dfVenus[uiPosArrayVenus].X != VenusPos.X) &&
	   (v3dfVenus[uiPosArrayVenus].Y != VenusPos.Y) &&
	   (v3dfVenus[uiPosArrayVenus].Z != VenusPos.Z))
	{
		if (uiPosArrayVenus <= max_array) uiPosArrayVenus++; //Nächsten Array-Eintrag
		v3dfVenus[uiPosArrayVenus] = VenusPos;	
	}
	//Hat sich der Mars bewegt ?
	if ((v3dfMars[uiPosArrayMars].X != MarsPos.X) &&
	   (v3dfMars[uiPosArrayMars].Y != MarsPos.Y) &&
	   (v3dfMars[uiPosArrayMars].Z != MarsPos.Z))
	{
		if (uiPosArrayMars <= max_array) uiPosArrayMars++; //Nächsten Array-Eintrag
		v3dfMars[uiPosArrayMars] = MarsPos;	
	}
	//Hat sich der Jupiter bewegt ?
	if ((v3dfJupiter[uiPosArrayJupiter].X != JupiterPos.X) &&
	   (v3dfJupiter[uiPosArrayJupiter].Y != JupiterPos.Y) &&
	   (v3dfJupiter[uiPosArrayJupiter].Z != JupiterPos.Z))
	{
		if (uiPosArrayJupiter <= max_array) uiPosArrayJupiter++; //Nächsten Array-Eintrag
		v3dfJupiter[uiPosArrayJupiter] = JupiterPos;	
	}
	//Hat sich der Saturn bewegt ?
	if ((v3dfSaturn[uiPosArraySaturn].X != SaturnPos.X) &&
	   (v3dfSaturn[uiPosArraySaturn].Y != SaturnPos.Y) &&
	   (v3dfSaturn[uiPosArraySaturn].Z != SaturnPos.Z))
	{
		if (uiPosArraySaturn <= max_array) uiPosArraySaturn++; //Nächsten Array-Eintrag
		v3dfSaturn[uiPosArraySaturn] = SaturnPos;	
	}
	//Hat sich der Uranus bewegt ?
	if ((v3dfUranus[uiPosArrayUranus].X != UranusPos.X) &&
	   (v3dfUranus[uiPosArrayUranus].Y != UranusPos.Y) &&
	   (v3dfUranus[uiPosArrayUranus].Z != UranusPos.Z))
	{
		if (uiPosArrayUranus <= max_array) uiPosArrayUranus++; //Nächsten Array-Eintrag
		v3dfUranus[uiPosArrayUranus] = UranusPos;	
	}
	//Hat sich der Neptun bewegt ?
	if ((v3dfNeptun[uiPosArrayNeptun].X != NeptunPos.X) &&
	   (v3dfNeptun[uiPosArrayNeptun].Y != NeptunPos.Y) &&
	   (v3dfNeptun[uiPosArrayNeptun].Z != NeptunPos.Z))
	{
		if (uiPosArrayNeptun <= max_array) uiPosArrayNeptun++; //Nächsten Array-Eintrag
		v3dfNeptun[uiPosArrayNeptun] = NeptunPos;	
	}
	//Hat sich der Pluto bewegt ?
	if ((v3dfPluto[uiPosArrayPluto].X != PlutoPos.X) &&
	   (v3dfPluto[uiPosArrayPluto].Y != PlutoPos.Y) &&
	   (v3dfPluto[uiPosArrayPluto].Z != PlutoPos.Z))
	{
		if (uiPosArrayPluto <= max_array) uiPosArrayPluto++; //Nächsten Array-Eintrag
		v3dfPluto[uiPosArrayPluto] = PlutoPos;	
	}
};

void Zeichne_tatsaechlichen_Orbit(IVideoDriver *driver)
{
	video::SMaterial mat;
	mat.Lighting = false;
	driver->setMaterial(mat);

	//Weltkoordinaten verwenden (keine lokalen Koordinaten)
	driver->setTransform(video::ETS_WORLD, core::matrix4());
	//Erde
	for(unsigned int i = 0; i <= uiPosArrayErde; i++)
	{
		if (uiPosArrayErde >2) driver->draw3DLine(v3dfErde[i-1],v3dfErde[i],SColor(255,255,255,0));
	}
	//Merkur
	for(unsigned int i = 0; i <= uiPosArrayMerkur; i++)
	{
		if (uiPosArrayMerkur >2) driver->draw3DLine(v3dfMerkur[i-1],v3dfMerkur[i],SColor(255,125,255,100));
	}
	//Venus
	for(unsigned int i = 0; i <= uiPosArrayVenus; i++)
	{
		if (uiPosArrayVenus >2) driver->draw3DLine(v3dfVenus[i-1],v3dfVenus[i],SColor(200,0,255,125));
	}
	//Mars
	for(unsigned int i = 0; i <= uiPosArrayMars; i++)
	{
		if (uiPosArrayMars >2) driver->draw3DLine(v3dfMars[i-1],v3dfMars[i],SColor(200,0,255,125));
	}
	//Jupiter
	for(unsigned int i = 0; i <= uiPosArrayJupiter; i++)
	{
		if (uiPosArrayJupiter >2) driver->draw3DLine(v3dfJupiter[i-1],v3dfJupiter[i],SColor(200,255,100,70));
	}
	//Saturn
	for(unsigned int i = 0; i <= uiPosArraySaturn; i++)
	{
		if (uiPosArraySaturn >2) driver->draw3DLine(v3dfSaturn[i-1],v3dfSaturn[i],SColor(125,125,255,125));
	}
	//Uranus
	for(unsigned int i = 0; i <= uiPosArrayUranus; i++)
	{
		if (uiPosArrayUranus >2) driver->draw3DLine(v3dfUranus[i-1],v3dfUranus[i],SColor(175,0,100,70));
	}
	//Neptun
	for(unsigned int i = 0; i <= uiPosArrayNeptun; i++)
	{
		if (uiPosArrayNeptun >2) driver->draw3DLine(v3dfNeptun[i-1],v3dfNeptun[i],SColor(125,125,255,125));
	}
	//Pluto
	for(unsigned int i = 0; i <= uiPosArrayPluto; i++)
	{
		if (uiPosArrayPluto >2) driver->draw3DLine(v3dfPluto[i-1],v3dfPluto[i],SColor(255,255,255,255));
	}
};
#endif