You are on page 1of 21

Solar System

CODE

// Ryan Pridgeon COM2032 rp00091

#include <cmath>

#include <cstdlib>

#ifdef _WIN32

#include <Windows.h>

#endif

#include <gl\gl.h>

#include "Gl\glut.h"

#include <GL\glu.h>

#include "tga.h"

#include "solarsystem.h"

#include "camera.h"

#include "globals.h"

// the screen size

int screenWidth, screenHeight;

// The TGA texture containing the help dialogue and starfield and moon texture

Dept of CS&E,SKIT Page 1


Solar System

TGA* help, *stars, * moon;

// toggles if the help dialogue is enabled

bool helpDialogue = true;

// toggles if orbits are drawn

bool showOrbits = true;

// holds the index of the last planet that was selected with the 1 to 9 number keys

int planetSelected = 1;

// The main instance of the solar system

SolarSystem solarSystem;

// The instance of the camera

Camera camera;

// These control the simulation of time

double time;

double timeSpeed;

// holds the state of the controls for the camera - when true, the key for that control is being
pressed

struct ControlStates

bool forward, backward, left, right, yawLeft, yawRight, pitchUp,

pitchDown, rollLeft, rollRight;

Dept of CS&E,SKIT Page 2


Solar System

} controls;

// timer function called every 10ms or more

void timer(int)

glutPostRedisplay(); // post for display func

glutTimerFunc(10, timer, 0); // limit frame drawing to 100fps

// creates a random number up to the max specified

float random(float max)

return (float)(std::rand() % 1000) * max * 0.001;

// adds a moon to the selected planet

void addMoon()

// make a moon using random values

solarSystem.addMoon(planetSelected,

(500 + random(1500)) * solarSystem.getRadiusOfPlanet(planetSelected),

10 + random(100), 0.5 + random(20),

Dept of CS&E,SKIT Page 3


Solar System

solarSystem.getRadiusOfPlanet(planetSelected) * (0.05f + random(0.2f)),


moon->getTextureHandle());

void init(void)

glClearColor(0.0, 0.0, 0.0, 0.0);

glShadeModel(GL_SMOOTH);

glEnable(GL_TEXTURE_2D);

// set up lighting

glEnable(GL_LIGHTING);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

GLfloat matSpecular[] = { 1.0, 1.0, 1.0, 1.0 };

GLfloat matAmbience[] = { 0.3, 0.3, 0.3, 1.0 };

GLfloat matShininess[] = { 20.0 };

glClearColor (0.0, 0.0, 0.0, 0.0);

glShadeModel (GL_SMOOTH);

glMaterialfv(GL_FRONT, GL_SPECULAR, matSpecular);

glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);

glMaterialfv(GL_FRONT, GL_AMBIENT, matAmbience);

Dept of CS&E,SKIT Page 4


Solar System

GLfloat lightAmbient[] = { 0.3, 0.3, 0.3, 1.0 };

GLfloat lightDiffuse[] = { 1.0, 1.0, 1.0, 1.0 };

GLfloat lightSpecular[] = { 1.0, 1.0, 1.0, 1.0 };

glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);

glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);

glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glDisable(GL_LIGHTING);

// Load all image data

help = new TGA("images/help.tga");

stars = new TGA("images/stars.tga");

moon = new TGA("images/moon.tga");

TGA* sun = new TGA("images/sun.tga");

TGA* mercury = new TGA("images/mercury.tga");

TGA* venus = new TGA("images/venus.tga");

TGA* earth = new TGA("images/earth.tga");

TGA* mars = new TGA("images/mars.tga");

TGA* jupiter = new TGA("images/jupiter.tga");

TGA* saturn = new TGA("images/saturn.tga");

Dept of CS&E,SKIT Page 5


Solar System

TGA* uranus = new TGA("images/uranus.tga");

TGA* neptune = new TGA("images/neptune.tga");

TGA* pluto = new TGA("images/pluto.tga");

// Add all the planets with accurate data. Distance measured in km, time measured in
earth days.

solarSystem.addPlanet(0, 1, 500, 695500, sun->getTextureHandle()); // sun

solarSystem.addPlanet(57910000, 88, 58.6, 2440, mercury->getTextureHandle()); //


mercury

solarSystem.addPlanet(108200000, 224.65, 243, 6052, venus->getTextureHandle()); //


venus

solarSystem.addPlanet(149600000, 365, 1, 6371, earth->getTextureHandle()); // earth

solarSystem.addPlanet(227939100, 686, 1.03f, 3389, mars->getTextureHandle()); //


mars

solarSystem.addPlanet(778500000, 4332, 0.4139, 69911, jupiter->getTextureHandle());


// jupiter

solarSystem.addPlanet(1433000000, 10759, 0.44375, 58232, saturn-


>getTextureHandle()); // saturn

solarSystem.addPlanet(2877000000, 30685, 0.718056, 25362, uranus-


>getTextureHandle()); // uranus

solarSystem.addPlanet(4503000000, 60188, 0.6713, 24622, neptune-


>getTextureHandle()); // neptune

solarSystem.addPlanet(5906380000, 90616, 6.39, 1137, pluto->getTextureHandle()); //


pluto

solarSystem.addMoon(3, 7000000, 27.3, 27.3, 1738, moon->getTextureHandle()); //


test moon for the earth

Dept of CS&E,SKIT Page 6


Solar System

// set up time

time = 2.552f;

timeSpeed = 0.1f;

// reset controls

controls.forward = false;

controls.backward = false;

controls.left = false;

controls.right = false;

controls.rollRight = false;

controls.rollLeft = false;

controls.pitchDown = false;

controls.pitchUp = false;

controls.yawLeft = false;

controls.yawRight = false;

timer(0);

void drawCube(void);

void display(void)

// update the logic and simulation

Dept of CS&E,SKIT Page 7


Solar System

time += timeSpeed;

solarSystem.calculatePositions(time);

if (controls.forward) camera.forward(); if (controls.backward)


camera.backward();

if (controls.left) camera.left(); if (controls.right) camera.right();

if (controls.yawLeft) camera.yawLeft(); if (controls.yawRight)


camera.yawRight();

if (controls.rollLeft) camera.rollLeft(); if (controls.rollRight) camera.rollRight();

if (controls.pitchUp) camera.pitchUp(); if (controls.pitchDown)


camera.pitchDown();

// clear the buffers

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3f(1.0, 1.0, 1.0);

// set up the perspective matrix for rendering the 3d world

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(70.0f, (float)screenWidth / (float)screenHeight, 0.001f, 500.0f);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

Dept of CS&E,SKIT Page 8


Solar System

// perform the camera orientation transform

camera.transformOrientation();

// draw the skybox

glBindTexture(GL_TEXTURE_2D, stars->getTextureHandle());

drawCube();

// perform the camera translation transform

camera.transformTranslation();

GLfloat lightPosition[] = { 0.0, 0.0, 0.0, 1.0 };

glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

// render the solar system

glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHTING);

solarSystem.render();

glDisable(GL_LIGHTING);

// possibly render orbits

if (showOrbits)

Dept of CS&E,SKIT Page 9


Solar System

solarSystem.renderOrbits();

glDisable(GL_DEPTH_TEST);

// set up ortho matrix for showing the UI (help dialogue)

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0, (GLdouble) screenWidth, (GLdouble) screenHeight, 0.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

// draw the help dialogue

if (helpDialogue)

glBindTexture(GL_TEXTURE_2D, help->getTextureHandle());

glBegin(GL_QUADS);

glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);

glTexCoord2f(1.0f, 0.0f); glVertex2f(512.0f, 0.0f);

glTexCoord2f(1.0f, 1.0f); glVertex2f(512.0f, 512.0f);

glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 512.0f);

glEnd();

glFlush();

Dept of CS&E,SKIT Page 10


Solar System

glutSwapBuffers();

void keyDown(unsigned char key, int x, int y)

// check for numerical keys

if (key > '0' && key <= '9')

// point at the specified planet

float vec[3];

solarSystem.getPlanetPosition(key - '0', vec);

camera.pointAt(vec);

// select that planet

planetSelected = key - '0';

switch (key)

case '-':

timeSpeed /= 2.0f; // half the rate of time passing

break;

case '=':

timeSpeed *= 2.0f; // double the rate of time passing

break;

case 'h':

Dept of CS&E,SKIT Page 11


Solar System

helpDialogue = !helpDialogue; // toggle the dialogue

break;

case '[':

planetSizeScale /= 1.2; // make planet scale smaller

break;

case ']':

planetSizeScale *= 1.2; // make planet scale bigger

break;

case 'o':

showOrbits = !showOrbits; // toggle show orbits

break;

case 'm':

addMoon(); // add a moon to the selected planet

break;

case 'r':

planetSizeScale = distanceScale;

break;

case ',':

camera.slowDown(); // slow down camera

break;

case '.':

camera.speedUp(); // speed up camera

break;

// these are all camera controls

Dept of CS&E,SKIT Page 12


Solar System

case 'w':

controls.forward = true;

break;

case 's':

controls.backward = true;

break;

case 'a':

controls.left = true;

break;

case 'd':

controls.right = true;

break;

case 'l':

controls.rollRight = true;

break;

case 'j':

controls.rollLeft = true;

break;

case 'i':

controls.pitchDown = true;

break;

case 'k':

controls.pitchUp = true;

break;

Dept of CS&E,SKIT Page 13


Solar System

case 'q':

controls.yawLeft = true;

break;

case 'e':

controls.yawRight = true;

break;

void keyUp(unsigned char key, int x, int y)

switch (key)

case 'w':

controls.forward = false;

break;

case 's':

controls.backward = false;

break;

case 'a':

controls.left = false;

break;

case 'd':

Dept of CS&E,SKIT Page 14


Solar System

controls.right = false;

break;

case 'l':

controls.rollRight = false;

break;

case 'j':

controls.rollLeft = false;

break;

case 'i':

controls.pitchDown = false;

break;

case 'k':

controls.pitchUp = false;

break;

case 'q':

controls.yawLeft = false;

break;

case 'e':

controls.yawRight = false;

break;

void reshape(int w, int h)

Dept of CS&E,SKIT Page 15


Solar System

screenWidth = w;

screenHeight = h;

glViewport (0, 0, (GLsizei) w, (GLsizei) h);

int main(int argc, char** argv)

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);

glutInitWindowSize(1200, 700);

glutInitWindowPosition(100, 100);

glutCreateWindow(argv[0]);

init();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutKeyboardFunc(keyDown);

glutKeyboardUpFunc(keyUp);

glutMainLoop();

return 0;

void drawCube(void)

Dept of CS&E,SKIT Page 16


Solar System

glBegin(GL_QUADS);

// new face

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

// new face

glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, -1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f);

// new face

glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, -1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);

// new face

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

// new face

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, -1.0f);

Dept of CS&E,SKIT Page 17


Solar System

glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

// new face

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f);

glEnd();

SNAPSHOTS

Dept of CS&E,SKIT Page 18


Solar System

Dept of CS&E,SKIT Page 19


Solar System

Dept of CS&E,SKIT Page 20


Solar System

Dept of CS&E,SKIT Page 21

You might also like