diff --git a/sources/demo/Context.cpp b/sources/demo/Context.cpp new file mode 100755 index 00000000..a067eba2 --- /dev/null +++ b/sources/demo/Context.cpp @@ -0,0 +1,58 @@ + +// Libraries +#include "Context.h" + +#include +#include + + +// Constructor of the class Context +Context::Context() { + + // We add some objects in the context at the beginning ---> THESE THINGS WILL BE STORE IN A TEXT FILE + Cube * cube1 = new Cube(Object::Position(-2.0, 1.0, -6.0), 2.0); + Cube * cube2 = new Cube(Object::Position(0.0, 1.5, 6.0), 3.0); + Cube * cube3 = new Cube(Object::Position(4.0, 4.0, -2.0), 2.0); + Plane * plane1 = new Plane(Object::Position(0.0, 0.0, 0.0), 20.0, 30.0, Vector(-1.0, 0.0, 0.0), Vector(0.0, 0.0, 1.0)); + + addObject(cube1); + addObject(cube2); + addObject(cube3); + addObject(plane1); +} + + +// Destructor of the class Context +Context::~Context() { + // Delete all the objects in vectObjects + for(int i=0; i + +// Class Context +class Context { + private : + std::vector vectObjects; // Vector of Objects in the simulation + + public : + Context(); // Constructor of the class + ~Context(); // Destructor of the class + int getNbObjects() const; // Return the number of objects in the context + Object& getObject(int objectIndex) const; // Get an object from the context + void addObject(Object* object); // Add an object into the context + void removeObject(int objectIndex); // Remove an object from the context +}; + +// Method (inline) to get the number of objects in the context +inline int Context::getNbObjects() const { + return vectObjects.size(); +} + +#endif diff --git a/sources/demo/Objects.cpp b/sources/demo/Objects.cpp new file mode 100755 index 00000000..c811a088 --- /dev/null +++ b/sources/demo/Objects.cpp @@ -0,0 +1,128 @@ + +// Libraries +#include "Objects.h" + +//#include // To avoid an error due to the #include +#include +#include + + +// ----- Structure Vector ----- // + +// Constructor without arguments of the structure Vector +Vector::Vector() { + x = 0.0; + y = 0.0; + z = 0.0; +} + +// Constructor of the structure Vector +Vector::Vector(double x, double y, double z) { + this->x = x; + this->y = y; + this->z = z; +}; + +// ----- Class Object ----- // + +// Constructor of the class Object +Object::Object(const Position& position) { + this->position = position; +} + +// Destructor of the class Object +Object::~Object() { + +} + +// ----- Structure Position ----- // + +// Constructor without arguments of the structure Position +Object::Position::Position() { + x = 0.0; + y = 0.0; + z = 0.0; +} + +// Constructor of the structure Position +Object::Position::Position(double x, double y, double z) { + this->x = x; + this->y = y; + this->z = z; +}; + +// ----- Class Cube ----- // + +// Constructor of the class Cube +Cube::Cube(const Position& position, float size) + :Object(position) { + this->size = size; +} + +// Destructor of the classe Cube +Cube::~Cube() { + +} + +// Method to draw the cube +void Cube::draw() const { + // Translation of the cube to its position + glTranslatef(position.x, position.y, position.z); + + // Draw the cube + glutSolidCube(size); +} + + +// ----- Class Plane ----- // + +// Constructor of the class Plane +Plane::Plane(const Position& position, float width, float height, const Vector& d1, const Vector& d2) + :Object(position) { + this->width = width; + this->height = height; + this->d1 = d1; + this->d2 = d2; + + // Compute the unit normal vector of the plane by a cross product + normalVector.x = d1.y * d2.z - d1.z * d2.y; + normalVector.y = d1.z * d2.x - d1.x * d2.z; + normalVector.z = d1.x * d2.y - d1.y * d2.x; + float length = sqrt(normalVector.x * normalVector.x + normalVector.y * normalVector.y + normalVector.z * normalVector.z); + normalVector.x = normalVector.x / length; + normalVector.y = normalVector.y / length; + normalVector.z = normalVector.z / length; +} + +// Destructor of the class Plane +Plane::~Plane() { + +} + +// Method used to draw the plane +void Plane::draw() const { + // Translation of the cube to its position + glTranslatef(position.x, position.y, position.z); + + float halfWidth = width / 2.0; + float halfHeight = height / 2.0; + + // Draw the plane + glBegin(GL_POLYGON); + glColor3f(1.0, 1.0, 1.0); + glVertex3f(position.x + d1.x * halfWidth + d2.x * halfHeight , position.y + d1.y * halfWidth + d2.y * halfHeight + , position.z + d1.z * halfWidth + d2.z * halfHeight); + glNormal3f(normalVector.x, normalVector.y, normalVector.z); + glVertex3f(position.x + d1.x * halfWidth - d2.x * halfHeight , position.y + d1.y * halfWidth - d2.y * halfHeight + , position.z + d1.z * halfWidth - d2.z * halfHeight); + glNormal3f(normalVector.x, normalVector.y, normalVector.z); + glVertex3f(position.x - d1.x * halfWidth - d2.x * halfHeight , position.y - d1.y * halfWidth - d2.y * halfHeight + , position.z - d1.z * halfWidth - d2.z * halfHeight); + glNormal3f(normalVector.x, normalVector.y, normalVector.z); + glVertex3f(position.x - d1.x * halfWidth + d2.x * halfHeight , position.y - d1.y * halfWidth + d2.y * halfHeight + , position.z - d1.z * halfWidth + d2.z * halfHeight); + glEnd(); +} + + + diff --git a/sources/demo/Objects.h b/sources/demo/Objects.h new file mode 100755 index 00000000..3c588d43 --- /dev/null +++ b/sources/demo/Objects.h @@ -0,0 +1,64 @@ +#ifndef OBJECTS_H +#define OBJECTS_H + +/* + Here we define all the objects that can appear in the simulation like cube, sphere, plane, ... +*/ + +struct Vector { + double x; // x component + double y; // y component + double z; // z component + + // Methods + Vector(); // Constructor without arguments of the structure Vector + Vector(double x, double y, double z); // Constructor of the structure Vector +}; + +// ----- Class Object (abstract) ----- // +// Represent an object of the simulation +class Object { + public : + // Structure Object::Position + struct Position { + double x; // x coordinate + double y; // y coordinate + double z; // z coordinate + + // Methods + Position(); // Constructor without arguments of the structure Position + Position(double x, double y, double z); // Constructor of the structure Position + } position; // Position of the object + Object(const Position& position); // Constructor of the class Object + virtual ~Object(); // Destructor of the class Object + virtual void draw() const =0; // pure virtual method to draw the object +}; + +// ----- Class Cube ----- // +// Represente a Cube in the simulation +class Cube : public Object { + private : + float size; // Size of a side in the cube + + public : + Cube(const Position& position, float size); // Constructor of the class cube + virtual ~Cube(); // Destructor of the class cube + virtual void draw() const; // Method to draw the cube +}; + + +// ----- Class Plane ---- // +// Represent a plane in the simulation +class Plane : public Object { + public : + float width; // Width of the plane + float height; // Height of the plane + Vector d1; // Unit vector in the plane + Vector d2; // Unit vector in the plane + Vector normalVector; // Unit normal vector of the plane + Plane(const Position& position, float width, float height, const Vector& d1, const Vector& d2); // Constructor of the class Plane + virtual ~Plane(); // Destructor of the class Plane + virtual void draw() const; // Method to draw the plane +}; + +#endif diff --git a/sources/demo/ReactDemo.h b/sources/demo/ReactDemo.h new file mode 100755 index 00000000..25120535 --- /dev/null +++ b/sources/demo/ReactDemo.h @@ -0,0 +1,8 @@ +#ifndef REACT_DEMO_H +#define REACT_DEMO_H + +// Constants +const int WINWIDTH = 640; // Width of the OpenGL windows +const int WINHEIGHT = 480; // Height of the OpenGL windows + +#endif diff --git a/sources/demo/Scene.cpp b/sources/demo/Scene.cpp new file mode 100755 index 00000000..8e836e95 --- /dev/null +++ b/sources/demo/Scene.cpp @@ -0,0 +1,103 @@ + +// Librairies +#include "Scene.h" +#include "Objects.h" + +// Constructor of the class Scene +Scene::Scene() { + // Initialise the material specular color + mat_specular[0] = 1.0; + mat_specular[1] = 1.0; + mat_specular[2] = 1.0; + mat_specular[3] = 1.0; + + // Initialize the material shininess + mat_shininess[0] = 50.0; + + // Initialise the light source position + light_position[0] = 20.0; + light_position[1] = 9.0; + light_position[2] = 15.0; + light_position[3] = 0.0; + + // Initialise the ambient color of the light + ambient_color[0] = 1.0; + ambient_color[1] = 1.0; + ambient_color[2] = 1.0; + ambient_color[3] = 0.7; + + // Initialise the diffuse light color + white_light[0] = 1.0; + white_light[1] = 1.0; + white_light[2] = 1.0; + white_light[3] = 1.0; + + // Initialise the camera angles + camera_angle1 = 0.0; + camera_angle2 = 0.0; +} + +// Destructor of the class Scene +Scene::~Scene() { + +} + +// Init method +void Scene::init() { + glClearColor(0.0, 0.0, 0.0, 0.0); // Select the color for the background + glShadeModel(GL_SMOOTH); + glClearDepth(1.0); + + // Lighting settings + glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); // Specular color of the material + glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); // Shininess of the material + glLightfv(GL_LIGHT0, GL_POSITION, light_position); // Position of the light source + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_color); // Ambient color of the light + glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); // Diffuse color of the light + glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); // Specular color of the light + + glEnable(GL_LIGHTING); // Activate the lighting + glEnable(GL_LIGHT0); // Activate a light source + glEnable(GL_DEPTH_TEST); // Activate the Depth buffer +} + +// Display method +void Scene::display(const Context& context) const { + glClearColor(0,0,0,0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + // Define the position and the direction of the camera + gluLookAt(30,10,0,0,0,0,0,1,0); + + // Rotation of the camera due to the mouse mouvement + glRotatef(camera_angle2, 0.0, 0.0, 1.0); + glRotatef(camera_angle1, 0.0, 1.0, 0.0); + + // Draw all objects in the context + for(int i=0; i +#include // Used only to draw cubes +#include +#include + + +// Scene class +class Scene { + private : + GLfloat mat_specular[4]; // Material specular light color + GLfloat mat_shininess[1]; // Material shininess + GLfloat light_position[4]; // Position of the light source + GLfloat ambient_color[4]; // Ambient color of the light + GLfloat white_light[4]; // White light color + float camera_angle1; // Camera angle + float camera_angle2; // Camera angle + + public : + Scene(); // constructor of the class + ~Scene(); // Destructor of the class + void init(); // Initialize the values of OpenGL + void display(const Context& context) const; // display the scene + void reshape(int width, int height); // Reshape the window + float getCameraAngle1() const; // Return the angle of the camera + float getCameraAngle2() const; // Return the angle of the camera + void setCameraAngle1(float angle); // Set the angle of the camera + void setCameraAngle2(float angle); // Set the angle of the camera +}; + +// Return the angle of the camera (inline) +inline float Scene::getCameraAngle1() const { + return camera_angle1; +} + +// Return the angle of the camera (inline) +inline float Scene::getCameraAngle2() const { + return camera_angle2; +} + +// Set the angle of the camera (inline) +inline void Scene::setCameraAngle1(float angle) { + camera_angle1 = angle; +} + +// Set the angle of the camera (inline) +inline void Scene::setCameraAngle2(float angle) { + camera_angle2 = angle; +} + +#endif diff --git a/sources/demo/Simulation.cpp b/sources/demo/Simulation.cpp new file mode 100755 index 00000000..36a290df --- /dev/null +++ b/sources/demo/Simulation.cpp @@ -0,0 +1,70 @@ + +// Libraries +#include "Simulation.h" +#include "ReactDemo.h" + + +// Constructor of the class Simulation +Simulation::Simulation() { + simRunning = false; + mouseButtonPressed = false; +} + +// Destructor of the class Simulation +Simulation::~Simulation() { + +} + +// Method to start the simulation +void Simulation::start() { + // Initialisation of the OpenGL settings for the scene + scene.init(); + + // Reshape the windows for the first time + scene.reshape(WINWIDTH, WINHEIGHT); + + // Activation of the simulation + simRunning = true; + + // Main loop of the simulation + while(simRunning) { + // Check if an SDL event occured and make the apropriate actions + checkEvents(); + + // Display the actual scene + scene.display(context); + } +} + +// This method checks if an events occur and call the apropriate method +void Simulation::checkEvents() { + SDL_Event event; // An SDL event + + // Check in the stack of events + while(SDL_PollEvent(&event)) { + // Check an event + switch(event.type) { + // An QUIT event occur + case SDL_QUIT: simRunning = false; + break; + + // A keyboard key has been pushed + case SDL_KEYDOWN: // The Esc key has been pushed then we end the simulation + if (event.key.keysym.sym == SDLK_ESCAPE) + simRunning = false; + break; + + // The size of the windows changed then we reshape the windows + case SDL_VIDEORESIZE: scene.reshape(event.resize.w, event.resize.h); + break; + + // If the mouse moved + case SDL_MOUSEMOTION: if(SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1)) { + // If the left mouse button is pressed then change the angle + scene.setCameraAngle1(scene.getCameraAngle1() + event.motion.xrel % 360); + scene.setCameraAngle2(scene.getCameraAngle2() + event.motion.yrel % 360); + } + break; + } + } +} diff --git a/sources/demo/Simulation.h b/sources/demo/Simulation.h new file mode 100755 index 00000000..678993c1 --- /dev/null +++ b/sources/demo/Simulation.h @@ -0,0 +1,24 @@ +#ifndef SIMULATION_H +#define SIMULATION_H + +// Librairies +#include "Context.h" +#include "Scene.h" + +// Class Simulation +class Simulation { + private : + Scene scene; // Scene object for displaying the simulation + Context context; // Context of the simulation + bool simRunning; // True if the simulation is running and false otherwise + bool mouseButtonPressed; // True if the left mouse button is pressed + + public : + Simulation(); // Constructor of the class + ~Simulation(); // Destructor of the class + void start(); // Start the simulation + void checkEvents(); // Check if SDL events occured and make the apropriate actions +}; + + +#endif SIMULATION_H diff --git a/sources/demo/main.cpp b/sources/demo/main.cpp new file mode 100755 index 00000000..e04ac727 --- /dev/null +++ b/sources/demo/main.cpp @@ -0,0 +1,87 @@ + +// Libraries +#include "Simulation.h" +#include "ReactDemo.h" + +#include +#include + + +// Prototypes +int initSDL(); + +// global variables +SDL_Surface * pScreen; // Pointer to the SDL windows + +// Main function +int main(int argc, char** argv) { + + if(initSDL() > 0) { + // If initSDL return an error then we exit the program + return EXIT_FAILURE; + } + + // Initialize the glut library. We will use glut only to display shapes like cube or sphere + glutInit(&argc, argv); + + // Create a Simulation object used to simulate a physic world + Simulation simulation; + + // Start the simulation + simulation.start(); + + std::cerr << "Fin normale du programme" << std::endl; + + // To avoid warnings notifying that argc et argv aren't used + (argc); + (argv); + + return (EXIT_SUCCESS); + + return 0; +} + +// Methode to initialise the SDL and the windows +int initSDL() { + // Initialisation of SDL + if( SDL_Init(SDL_INIT_VIDEO) < 0) { + std::cerr << "Echec SDL_Init : " << SDL_GetError() << std::endl; + return 1; + } + + // Select the method to exit + atexit( SDL_Quit ); + + // Active double buffer mode + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + + // Select the Depth Buffer size + SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16); + + // Activation of displaying in windows mode + SDL_Surface* pScreen = SDL_SetVideoMode(WINWIDTH, WINHEIGHT, 32, SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_RESIZABLE | SDL_SWSURFACE); + + // Check that displaying is activated + if( !pScreen ) { + std::cerr << "Echec de creation de la fenetre en 640x480 : " << SDL_GetError() << std::endl; + return 1; + } + + // Define the window title and the window icon + SDL_WM_SetCaption("React Demo 0.0.1", NULL); + + // Get the state of the Double Buffer parameter + int nValue; + if( SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &nValue) < 0) { + std::cerr << "Echec de recuperation du parametre SDL_GL_DOUBLEBUFFER : " << SDL_GetError() << std::endl; + return 1; + } + + // Check that Double Buffer mode is activated + if(nValue != 1) { + std::cerr << "Erreur : SDL_GL_DOUBLEBUFFER inactif" << std::endl; + return 1; + } + + return 0; +}