package com.callumcarmicheal.old.solar.objects;
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.opengl.GL11;
import com.callumcarmicheal.OpenGL.GLUT;
import com.callumcarmicheal.maths.Vector3f;
import com.callumcarmicheal.old.solar.exceptions.ExCause;
import com.callumcarmicheal.old.solar.exceptions.PlanetException;
public class Moon extends IPlanet {
public Moon(String PlanetName, IPlanet bP, Vector3f c, float mM, List<IPlanet> sP) {
this.planetName = PlanetName;
this.BasePlanet = bP;
this.Mass = mM;
this.Color = c;
this.subPlanets = sP;
this.init();
}
/**
*
* Add a sub Planet
*
* @param subPlanet
* The planet to add
* @throws PlanetException
* If Planet is already created, this will be thrown
*/
public void addChildPlanet(IPlanet subPlanet) throws PlanetException {
boolean valid = true;
if (subPlanets != null) {
for (IPlanet moon : this.subPlanets) {
if (moon.planetName.equals(subPlanet.planetName)) {
valid = false;
}
}
} else {
subPlanets = new ArrayList<IPlanet>();
}
if (valid) {
this.subPlanets.add(subPlanet);
} else {
throw new PlanetException(
subPlanet, ExCause.PlanetAlreadyTaken,
"The planet's name was already created and therefore was not added");
}
}
/**
* Get Planet by planet's name.
*
* @param name
* @return
* @throws PlanetException
* If planet is not in array, this will be thrown
*/
public IPlanet getChildPlanet(String name) throws PlanetException {
if (!subPlanets.isEmpty()) {
for (IPlanet moon : this.subPlanets) {
if (moon.planetName.equals(name)) {
return moon;
}
}
}
throw new PlanetException(ExCause.PlanetDoesnotExist,
"The planet specified does not exist in child array.");
}
/**
* Any extra code needed add it in here, for implemations (OVERRIDE)
*/
public void init(){}
public void update(float HourOfDay, float DayOfYear, int NumberOfYear) {
// Render Self
render(HourOfDay, DayOfYear, NumberOfYear);
// Render Sub-planets
if (this.subPlanets != null) {
if (!this.subPlanets.isEmpty()) {
for (IPlanet moon : subPlanets) {
moon.update(HourOfDay, DayOfYear, NumberOfYear);
}
}
}
}
public void render(float HourOfDay, float DayOfYear, int NumberOfYear) {
// Now render the moon according to the basePlanet
GL11.glLoadIdentity();
setToBaseLocation(HourOfDay, DayOfYear, NumberOfYear);
// Now we need to simulate seasons, somehow.
{
if (Color != null) {
GL11.glColor3f(Color.r, Color.g, Color.b);
}
GLUT.WireSphere3F(
1f * (this.Mass / BasePlanet.SizeMultiplier),
5,
5
);
}
}
public void setToBaseLocation(float HourOfDay, float DayOfYear, int NumberOfYear) {
GL11.glTranslatef(0.0f, 0.0f, -8.0f);
GL11.glRotatef(15.0f, 1.0f, 0.0f, 0.0f);
GL11.glRotatef(BasePlanet.getDay(DayOfYear), 0.0f, 1.0f, 0.0f);
GL11.glTranslatef((BasePlanet.DistFromSun * BasePlanet.distanceFromSun), 0.0f, 0.0f);
}
}