#include <stdio.h>
#include <stdlib.h>
#include <gl/glut.h>
#include <time.h>
/* Some <math.h> files do not define M_PI... */
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#include "GameView.h"
#ifdef _WIN32
#define drand48() (((float) rand())/((float) RAND_MAX))
#define srand48(x) (srand((x)))
#endif
/** Global Variable storing the current Game Section
It can point either to GS or to GI */
GameView *Game;
/** Global Variable storing the Game Session */
GameView GS;
/** Glut Callback on pression of keys.*/
void Key(unsigned char key, int x, int y)
{
Game->setKey(key);
}
/** Glut Callback on pression of arrow keys.*/
void SpecialKey(int key, int x, int y)
{
Game->setSKey(key);
}
/** Glut Callback on release of arrow keys.
It should stop the (side and back) thrust and the rotation of the ship.
*/
void SpecialKeyUp(int key, int x, int y)
{
Game->setSKeyUp(key);
}
/** Glut Callback on Window Reshape.*/
void Reshape(GLsizei w, GLsizei h)
{
Game->Reshape(w,h);
}
/** Glut Idle Callback .
It is continuously called when events are not
being received. It post a refresh request in order to make the animation
as smoother as possible. It is enabled/disable by the Visible Callback
@see Visible
*/
void Idle(void)
{
glutPostRedisplay();
}
/** Glut Callback on Window visibility.
It is called when the glut window change its visiblitiy status.
When the window is hidden we should stop the idle callback (and viceversa).
*/
void Visible(int vis)
{
if (vis == GLUT_VISIBLE)
glutIdleFunc(Idle);
else
glutIdleFunc(NULL);
}
/** Glut Callback to Draw everything.
It clear the screen, call the GameView
Update(), TargetCamera and Draw() and swap the buffers.
*/
void Display(void)
{
static int lasttime;
int dt;
dt=glutGet(GLUT_ELAPSED_TIME)-lasttime;
lasttime=glutGet(GLUT_ELAPSED_TIME);
Game->Update();
Game->TargetCamera();
Game->Draw();
glutSwapBuffers();
}
/** Glut Callback to Mouse active movement*/
void processMouseActiveMotion(int x, int y)
{
Game->setMouse(x,y);
Game->move();
}
/** Glut Callback to press botton Mouse*/
void Mouse(int button, int state, int x, int y)
{
Game->setMouse(x,y);
switch (button)
{
case GLUT_LEFT_BUTTON:
if (state==GLUT_DOWN) Game->b_left=true;
if (state==GLUT_UP) Game->b_left=false;
break;
case GLUT_RIGHT_BUTTON:
if (state==GLUT_DOWN) Game->b_right=true;
if (state==GLUT_UP) Game->b_right=false;
break;
default: break;
}
}
/** The Classical Main Function
It has to setup all the glut callbacks, initialize Openglstatus
and start the glutMainLoop.
*/
int main(int argc, char** argv)
{
Game=&GS;
glutInit(&argc, argv);
glutInitWindowSize(800, 600);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH );
glutCreateWindow("Marble Game");
glutReshapeFunc(Reshape);
glutDisplayFunc(Display);
glutIdleFunc(Idle);
glutVisibilityFunc(Visible);
glutKeyboardFunc(Key);
glutSpecialFunc(SpecialKey);
glutSpecialUpFunc(SpecialKeyUp);
glutMouseFunc(Mouse);
glutMotionFunc(processMouseActiveMotion);
srand48(time(NULL));
Game->Init(Game->option_materiale);
glutMainLoop();
return 0;
}