diff --git a/sources/demo/Context.cpp b/sources/demo/Context.cpp index 8f7d9144..343914ee 100755 --- a/sources/demo/Context.cpp +++ b/sources/demo/Context.cpp @@ -16,64 +16,64 @@ * You should have received a copy of the GNU Lesser General Public License * * along with ReactPhysics3D. If not, see . * ***************************************************************************/ - -// Libraries -#include "Context.h" -#include "../reactphysics3d/reactphysics3d.h" -#include -#include + +// Libraries +#include "Context.h" +#include "../reactphysics3d/reactphysics3d.h" +#include +#include // We want to use the ReactPhysics3D namespace -using namespace reactphysics3d; - -// Constructor of the class Context -Context::Context() { - - Cube* cube1 = new Cube(Vector3D(11.0,14.0, 4.0), Quaternion(1.0, 1.0, 0.0, 0.0), 4.0, Kilogram(3.0)); +using namespace reactphysics3d; + +// Constructor of the class Context +Context::Context() { + + Cube* cube1 = new Cube(Vector3D(5.0,14.0, 4.0), Quaternion(1.0, 1.0, 0.0, 0.0), 4.0, Kilogram(3.0)); cube1->getRigidBody()->setLinearVelocity(Vector3D(0.0, -5.0, 0.0)); - //Cube* cube2 = new Cube(Vector3D(0.0, 17, 8.0), Quaternion(0.0, 1.0, 0.0, 0.0), 3.0, Kilogram(2.0)); - //Cube* cube3 = new Cube(Vector3D(4.0, 17, -2.0), Quaternion(0.0, 1.0, 0.0, 0.0), 2.0, Kilogram(11.0)); + //Cube* cube2 = new Cube(Vector3D(0.0, 17, 8.0), Quaternion(0.0, 1.0, 0.0, 0.0), 3.0, Kilogram(2.0)); + //Cube* cube3 = new Cube(Vector3D(4.0, 17, -2.0), Quaternion(0.0, 1.0, 0.0, 0.0), 2.0, Kilogram(11.0)); Plane* plane1 = new Plane(Vector3D(0.0, 0.0, 0.0), Quaternion(0.0, 1.0, 0.0, 0.0), 20.0, 30.0, Vector3D(-1.0, 0.0, 0.0), Vector3D(0.0, 0.0, 1.0), Kilogram(10.0)); - - addObject(cube1); - //addObject(cube2); - //addObject(cube3); - addObject(plane1); -} - - -// Destructor of the class Context -Context::~Context() { - // Delete all the objects in vectObjects - for(unsigned int i=0; i. * ***************************************************************************/ - -// Librairies -#include "Scene.h" + +// Librairies +#include "Scene.h" #include "Objects.h" #include -#include - -// Constructor of the class Scene +#include + +// Constructor of the class Scene Scene::Scene(rp3d::PhysicsWorld* world) { this->world = world; - - // 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; -} - -// 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 + + // 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; +} + +// 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 - //glEnable(GL_CULL_FACE); -} - -// 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 + //glEnable(GL_CULL_FACE); +} + +// 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); double x = outsideCamera.getPosition().getX(); double y = outsideCamera.getPosition().getY(); - double z = outsideCamera.getPosition().getZ(); - gluLookAt(x,y,z,0,0,0,0,1,0); - - // Draw all objects in the context - for(int i=0; igetOBB().draw(); - - // Remove the matrix on the top of the matrix stack - glPopMatrix(); + context.getObject(i).getRigidBody()->getOBB()->draw(); + + // Remove the matrix on the top of the matrix stack + glPopMatrix(); } // Draw all the contact points - for (std::vector::const_iterator it = world->getConstraintListStartIterator(); it != world->getConstraintListEndIterator(); ++it) { + for (std::vector::iterator it = world->getConstraintsBeginIterator(); it != world->getConstraintsEndIterator(); ++it) { RigidBody* rigidBody1 = dynamic_cast((*it)->getBody1()); RigidBody* rigidBody2 = dynamic_cast((*it)->getBody2()); rigidBody1->setIsMotionEnabled(false); @@ -125,24 +125,22 @@ void Scene::display(const Context& context) const { assert(contact != 0); // Draw the contact points - for (unsigned int i=0; igetPoints().size(); ++i) { - glPushMatrix(); - glTranslatef(contact->getPoints()[i].getX(), contact->getPoints()[i].getY(), contact->getPoints()[i].getZ()); - contact->draw(); - glPopMatrix(); - } - } - - // Change the buffers - SDL_GL_SwapBuffers(); -} - -// Reshape the window -void Scene::reshape(int width, int height) { - glViewport(0,0,width,height); - glMatrixMode(GL_PROJECTION); // Specify the matrix that will be modified - glLoadIdentity(); // Load the identity matrix before the transformations - gluPerspective(45.0, (float) width/height, 0.1f, 150.0f); - glMatrixMode(GL_MODELVIEW); // Specify the matrix that will be modified - glLoadIdentity(); // Load the identity matrix before the transformations -} + glPushMatrix(); + glTranslatef(contact->getPoint().getX(), contact->getPoint().getY(), contact->getPoint().getZ()); + contact->draw(); + glPopMatrix(); + } + + // Change the buffers + SDL_GL_SwapBuffers(); +} + +// Reshape the window +void Scene::reshape(int width, int height) { + glViewport(0,0,width,height); + glMatrixMode(GL_PROJECTION); // Specify the matrix that will be modified + glLoadIdentity(); // Load the identity matrix before the transformations + gluPerspective(45.0, (float) width/height, 0.1f, 150.0f); + glMatrixMode(GL_MODELVIEW); // Specify the matrix that will be modified + glLoadIdentity(); // Load the identity matrix before the transformations +} diff --git a/sources/demo/Simulation.cpp b/sources/demo/Simulation.cpp index 3e5bf783..6e63fea5 100755 --- a/sources/demo/Simulation.cpp +++ b/sources/demo/Simulation.cpp @@ -16,45 +16,45 @@ * You should have received a copy of the GNU Lesser General Public License * * along with ReactPhysics3D. If not, see . * ***************************************************************************/ - -// Libraries -#include "Simulation.h" -#include "ReactDemo.h" + +// Libraries +#include "Simulation.h" +#include "ReactDemo.h" #include // We want to use the ReactPhysics3D namespace -using namespace reactphysics3d; - -// Constructor of the class Simulation +using namespace reactphysics3d; + +// Constructor of the class Simulation Simulation::Simulation() - :world(new PhysicsWorld(Vector3D(0.0, -0.6, 0.0))), engine(world, Time(0.01)), scene(this->world) { - simRunning = false; + :world(new PhysicsWorld(Vector3D(0.0, -0.6, 0.0))), engine(world, Time(0.01)), scene(this->world) { + simRunning = false; mouseButtonPressed = false; nbFrame = 0; lastFrameTime = 0.0; - fps = 0.0; -} - -// Destructor of the class Simulation -Simulation::~Simulation() { + fps = 0.0; +} + +// Destructor of the class Simulation +Simulation::~Simulation() { // Delete the physics world object - delete world; -} - -// 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 + delete world; +} + +// 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); // Add every rigid body to the dynamic world for (int i=0; iaddBody(context.getObject(i).getRigidBody()); } - - // Activation of the simulation + + // Activation of the simulation simRunning = true; // Get the current time @@ -68,11 +68,11 @@ void Simulation::start() { // Start the physics simulation pEngine->start(); - //double time = 1.0; - - // Main loop of the simulation - while(simRunning) { - // Check if an SDL event occured and make the apropriate actions + //double time = 1.0; + + // Main loop of the simulation + while(simRunning) { + // Check if an SDL event occured and make the apropriate actions checkEvents(); double time = SDL_GetTicks()/1000.0; @@ -84,9 +84,9 @@ void Simulation::start() { pEngine->updateDisplayTime(Time(time)); // Update the physics - pEngine->update(); - - // Display the actual scene + pEngine->updateCollision(); + + // Display the actual scene scene.display(context); // Compute the fps (framerate) @@ -119,7 +119,7 @@ void Simulation::start() { double y2 = state2.getPosition().getY(); double z2 = state2.getPosition().getZ(); std::cout << "Position Cube 2: (" << x2 << ", " << y2 << ", " << z2 << ")" << std::endl; - std::cout << "quaternion orientation 2 : " << velocity2.getX() << ", " << velocity2.getY() << ", " << velocity2.getZ() << ", " << velocity2.getW() << ")" << std::endl;; + std::cout << "quaternion orientation 2 : " << velocity2.getX() << ", " << velocity2.getY() << ", " << velocity2.getZ() << ", " << velocity2.getW() << ")" << std::endl;; */ /* @@ -129,11 +129,11 @@ void Simulation::start() { } */ - } -} - -// This method checks if an events occur and call the apropriate method -void Simulation::checkEvents() { + } +} + +// This method checks if an events occur and call the apropriate method +void Simulation::checkEvents() { SDL_Event event; // An SDL event // Zoom of the outside camera @@ -142,34 +142,34 @@ void Simulation::checkEvents() { } else if(SDL_GetKeyState(NULL)[SDLK_DOWN]) { scene.getOutSideCamera().increaseDistance(fps); - } - - // 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 + } + + // 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)) { // Rotation of the outSideCamera scene.getOutSideCamera().modifyHorizontalAngleRotation(event.motion.xrel, fps); scene.getOutSideCamera().modifyVerticalAngleRotation(event.motion.yrel, fps); - } - } - } + } + } + } } // Compute the framerate (fps) of the application @@ -187,4 +187,4 @@ void Simulation::computeFps() { lastFrameTime = currentTime; nbFrame = 0; } -} +}