diff --git a/testbed/CMakeLists.txt b/testbed/CMakeLists.txt index b8438af5..4d88e0ad 100755 --- a/testbed/CMakeLists.txt +++ b/testbed/CMakeLists.txt @@ -151,6 +151,8 @@ set(SCENES_SOURCES scenes/boxtower/BoxTowerScene.cpp scenes/bridge/BridgeScene.h scenes/bridge/BridgeScene.cpp + scenes/fixedjoint/FixedJointScene.h + scenes/fixedjoint/FixedJointScene.cpp ) # Create the executable diff --git a/testbed/scenes/fixedjoint/FixedJointScene.cpp b/testbed/scenes/fixedjoint/FixedJointScene.cpp new file mode 100644 index 00000000..75c6396b --- /dev/null +++ b/testbed/scenes/fixedjoint/FixedJointScene.cpp @@ -0,0 +1,149 @@ +/******************************************************************************** +* ReactPhysics3D physics library, http://www.reactphysics3d.com * +* Copyright (c) 2010-2016 Daniel Chappuis * +********************************************************************************* +* * +* This software is provided 'as-is', without any express or implied warranty. * +* In no event will the authors be held liable for any damages arising from the * +* use of this software. * +* * +* Permission is granted to anyone to use this software for any purpose, * +* including commercial applications, and to alter it and redistribute it * +* freely, subject to the following restrictions: * +* * +* 1. The origin of this software must not be misrepresented; you must not claim * +* that you wrote the original software. If you use this software in a * +* product, an acknowledgment in the product documentation would be * +* appreciated but is not required. * +* * +* 2. Altered source versions must be plainly marked as such, and must not be * +* misrepresented as being the original software. * +* * +* 3. This notice may not be removed or altered from any source distribution. * +* * +********************************************************************************/ + +// Libraries +#include "FixedJointScene.h" +#include + +// Namespaces +using namespace openglframework; +using namespace fixedjointscene; + +// Constructor +FixedJointScene::FixedJointScene(const std::string& name, EngineSettings& settings) + : SceneDemo(name, settings, true, SCENE_RADIUS) { + + // Compute the radius and the center of the scene + openglframework::Vector3 center(0, 5, 0); + + // Set the center of the scene + setScenePosition(center, SCENE_RADIUS); + + // Gravity vector in the physics world + rp3d::Vector3 gravity(0, rp3d::decimal(-9.81), 0); + + rp3d::PhysicsWorld::WorldSettings worldSettings; + worldSettings.worldName = name; + + // Logger + rp3d::DefaultLogger* defaultLogger = mPhysicsCommon.createDefaultLogger(); + uint logLevel = static_cast(rp3d::Logger::Level::Information) | static_cast(rp3d::Logger::Level::Warning) | + static_cast(rp3d::Logger::Level::Error); + defaultLogger->addFileDestination("rp3d_log_" + name + ".html", logLevel, rp3d::DefaultLogger::Format::HTML); + mPhysicsCommon.setLogger(defaultLogger); + + // Create the physics world for the physics simulation + rp3d::PhysicsWorld* physicsWorld = mPhysicsCommon.createPhysicsWorld(worldSettings); + physicsWorld->setEventListener(this); + mPhysicsWorld = physicsWorld; + + // Create the fixed joint + createFixedJoint(); + + // Get the physics engine parameters + mEngineSettings.isGravityEnabled = mPhysicsWorld->isGravityEnabled(); + rp3d::Vector3 gravityVector = mPhysicsWorld->getGravity(); + mEngineSettings.gravity = openglframework::Vector3(gravityVector.x, gravityVector.y, gravityVector.z); + mEngineSettings.isSleepingEnabled = mPhysicsWorld->isSleepingEnabled(); + mEngineSettings.sleepLinearVelocity = mPhysicsWorld->getSleepLinearVelocity(); + mEngineSettings.sleepAngularVelocity = mPhysicsWorld->getSleepAngularVelocity(); + mEngineSettings.nbPositionSolverIterations = mPhysicsWorld->getNbIterationsPositionSolver(); + mEngineSettings.nbVelocitySolverIterations = mPhysicsWorld->getNbIterationsVelocitySolver(); + mEngineSettings.timeBeforeSleep = mPhysicsWorld->getTimeBeforeSleep(); +} + +// Destructor +FixedJointScene::~FixedJointScene() { + + // Destroy the joints + mPhysicsWorld->destroyJoint(mFixedJoint); + + // Destroy all the rigid bodies of the scene + mPhysicsWorld->destroyRigidBody(mBox1->getRigidBody()); + mPhysicsWorld->destroyRigidBody(mBox2->getRigidBody()); + + delete mBox1; + delete mBox2; + + // Destroy the physics world + mPhysicsCommon.destroyPhysicsWorld(mPhysicsWorld); +} + +// Reset the scene +void FixedJointScene::reset() { + + SceneDemo::reset(); + + mBox1->setTransform(rp3d::Transform(rp3d::Vector3(0, 4, 0), rp3d::Quaternion::identity())); + mBox2->setTransform(rp3d::Transform(rp3d::Vector3(4, 8, 4), rp3d::Quaternion::identity())); +} + +/// Create the fixed joint +void FixedJointScene::createFixedJoint() { + + // --------------- Create the first box --------------- // + + // Position of the box + rp3d::Vector3 positionBox1(0, 4, 0); + + // Create a box and a corresponding rigid in the physics world + openglframework::Vector3 boxDimension(4, 4, 4); + mBox1 = new Box(true, boxDimension, mPhysicsCommon, mPhysicsWorld, mMeshFolderPath); + mBox1->setTransform(rp3d::Transform(positionBox1, rp3d::Quaternion::identity())); + mBox1->getRigidBody()->setType(rp3d::BodyType::STATIC); + + // Set the box color + mBox1->setColor(mObjectColorDemo); + mBox1->setSleepingColor(mSleepingColorDemo); + + mPhysicsObjects.push_back(mBox1); + + // --------------- Create the second box --------------- // + + // Position of the box + rp3d::Vector3 positionBox2(4, 8, 4); + + // Create a box and a corresponding rigid in the physics world + mBox2 = new Box(true, boxDimension, mPhysicsCommon, mPhysicsWorld, mMeshFolderPath); + mBox2->setTransform(rp3d::Transform(positionBox2, rp3d::Quaternion::identity())); + + // Set the box color + mBox2->setColor(mObjectColorDemo); + mBox2->setSleepingColor(mSleepingColorDemo); + + mPhysicsObjects.push_back(mBox2); + + // --------------- Create the fixed joint --------------- // + + // Create the joint info object + rp3d::RigidBody* body1 = mBox1->getRigidBody(); + rp3d::RigidBody* body2 = mBox2->getRigidBody(); + const rp3d::Vector3 anchorPointWorldSpace1(5, 7, 0); + rp3d::FixedJointInfo jointInfo1(body1, body2, anchorPointWorldSpace1); + jointInfo1.isCollisionEnabled = false; + + // Create the joint in the physics world + mFixedJoint = dynamic_cast(mPhysicsWorld->createJoint(jointInfo1)); +} diff --git a/testbed/scenes/fixedjoint/FixedJointScene.h b/testbed/scenes/fixedjoint/FixedJointScene.h new file mode 100644 index 00000000..5beb29dc --- /dev/null +++ b/testbed/scenes/fixedjoint/FixedJointScene.h @@ -0,0 +1,81 @@ +/******************************************************************************** +* ReactPhysics3D physics library, http://www.reactphysics3d.com * +* Copyright (c) 2010-2016 Daniel Chappuis * +********************************************************************************* +* * +* This software is provided 'as-is', without any express or implied warranty. * +* In no event will the authors be held liable for any damages arising from the * +* use of this software. * +* * +* Permission is granted to anyone to use this software for any purpose, * +* including commercial applications, and to alter it and redistribute it * +* freely, subject to the following restrictions: * +* * +* 1. The origin of this software must not be misrepresented; you must not claim * +* that you wrote the original software. If you use this software in a * +* product, an acknowledgment in the product documentation would be * +* appreciated but is not required. * +* * +* 2. Altered source versions must be plainly marked as such, and must not be * +* misrepresented as being the original software. * +* * +* 3. This notice may not be removed or altered from any source distribution. * +* * +********************************************************************************/ + +#ifndef FIXED_JOINT_SCENE_H +#define FIXED_JOINT_SCENE_H + +// Libraries +#include "openglframework.h" +#include +#include "Box.h" +#include "SceneDemo.h" + +namespace fixedjointscene { + +// Constants +const float SCENE_RADIUS = 30.0f; +const openglframework::Vector3 BOX_SIZE(2, 2, 2); // Box dimensions in meters +const openglframework::Vector3 FLOOR_SIZE(50, 0.5f, 50); // Floor dimensions in meters +const int NB_BALLSOCKETJOINT_BOXES = 7; // Number of Ball-And-Socket chain boxes +const int NB_HINGE_BOXES = 7; // Number of Hinge chain boxes + +// Class FixedJointScene +class FixedJointScene : public SceneDemo { + + protected : + + // -------------------- Attributes -------------------- // + + /// First box + Box* mBox1; + + /// Second box + Box* mBox2; + + /// Fixed joint + rp3d::FixedJoint* mFixedJoint; + + // -------------------- Methods -------------------- // + + /// Create the fixed joint + void createFixedJoint(); + + public: + + // -------------------- Methods -------------------- // + + /// Constructor + FixedJointScene(const std::string& name, EngineSettings& settings); + + /// Destructor + virtual ~FixedJointScene() override ; + + /// Reset the scene + virtual void reset() override; +}; + +} + +#endif diff --git a/testbed/src/TestbedApplication.cpp b/testbed/src/TestbedApplication.cpp index b9534bd9..6e39d859 100755 --- a/testbed/src/TestbedApplication.cpp +++ b/testbed/src/TestbedApplication.cpp @@ -43,6 +43,7 @@ #include "ballandsocketjointschain/BallAndSocketJointsChainScene.h" #include "hingejointschain/HingeJointsChainScene.h" #include "bridge/BridgeScene.h" +#include "fixedjoint/FixedJointScene.h" using namespace openglframework; using namespace jointsscene; @@ -59,6 +60,7 @@ using namespace ballandsocketjointsnetscene; using namespace ballandsocketjointschainscene; using namespace hingejointschainscene; using namespace bridgescene; +using namespace fixedjointscene; // Initialization of static variables const float TestbedApplication::SCROLL_SENSITIVITY = 0.08f; @@ -177,6 +179,9 @@ void TestbedApplication::createScenes() { BridgeScene* bridgeScene = new BridgeScene("Bridge", mEngineSettings); mScenes.push_back(bridgeScene); + // Fixed joint scene + FixedJointScene* fixedJointScene = new FixedJointScene("Fixed joint", mEngineSettings); + mScenes.push_back(fixedJointScene); assert(mScenes.size() > 0); const int firstSceneIndex = 0;