From 584b28a91c67745030df1482a3ab573063f2f6ad Mon Sep 17 00:00:00 2001 From: Daniel Chappuis Date: Sun, 14 Jan 2018 10:51:38 +0100 Subject: [PATCH] Add Cube stack scene in the testbed application --- testbed/CMakeLists.txt | 2 + testbed/common/AABB.h | 3 - .../CollisionDetectionScene.cpp | 4 +- testbed/scenes/concavemesh/ConcaveMeshScene.h | 8 +- testbed/scenes/cubestack/CubeStackScene.cpp | 146 ++++++++++++++++++ testbed/scenes/cubestack/CubeStackScene.h | 82 ++++++++++ testbed/src/TestbedApplication.cpp | 6 + 7 files changed, 242 insertions(+), 9 deletions(-) create mode 100644 testbed/scenes/cubestack/CubeStackScene.cpp create mode 100644 testbed/scenes/cubestack/CubeStackScene.h diff --git a/testbed/CMakeLists.txt b/testbed/CMakeLists.txt index e5e3b312..818cb026 100644 --- a/testbed/CMakeLists.txt +++ b/testbed/CMakeLists.txt @@ -114,6 +114,8 @@ SET(SCENES_SOURCES scenes/concavemesh/ConcaveMeshScene.cpp scenes/heightfield/HeightFieldScene.h scenes/heightfield/HeightFieldScene.cpp + scenes/cubestack/CubeStackScene.h + scenes/cubestack/CubeStackScene.cpp ) # Add .user file to set debug path in Visual Studio diff --git a/testbed/common/AABB.h b/testbed/common/AABB.h index e73326b5..2e8f82e1 100644 --- a/testbed/common/AABB.h +++ b/testbed/common/AABB.h @@ -37,9 +37,6 @@ class AABB { // -------------------- Attributes -------------------- // - /// Size of each side of the box - float mSize[3]; - /// Scaling matrix (applied to a cube to obtain the correct box dimensions) openglframework::Matrix4 mScalingMatrix; diff --git a/testbed/scenes/collisiondetection/CollisionDetectionScene.cpp b/testbed/scenes/collisiondetection/CollisionDetectionScene.cpp index 6f2c65ae..02e8acc1 100755 --- a/testbed/scenes/collisiondetection/CollisionDetectionScene.cpp +++ b/testbed/scenes/collisiondetection/CollisionDetectionScene.cpp @@ -168,8 +168,8 @@ void CollisionDetectionScene::reset() { mBox1->setTransform(rp3d::Transform(rp3d::Vector3(-4, -7, 0), rp3d::Quaternion::identity())); mBox2->setTransform(rp3d::Transform(rp3d::Vector3(0, 9, 0), rp3d::Quaternion::identity())); mConvexMesh->setTransform(rp3d::Transform(rp3d::Vector3(-5, 0, 0), rp3d::Quaternion::identity())); - mConcaveMesh->setTransform(rp3d::Transform(rp3d::Vector3(0, 0, 0), rp3d::Quaternion::identity())); - mHeightField->setTransform(rp3d::Transform(rp3d::Vector3(0, -12, 0), rp3d::Quaternion::identity())); + mConcaveMesh->setTransform(rp3d::Transform(rp3d::Vector3(0, 15, 0), rp3d::Quaternion::identity())); + mHeightField->setTransform(rp3d::Transform(rp3d::Vector3(0, -22, 0), rp3d::Quaternion::identity())); } // Destructor diff --git a/testbed/scenes/concavemesh/ConcaveMeshScene.h b/testbed/scenes/concavemesh/ConcaveMeshScene.h index a8d566a1..beca8f71 100644 --- a/testbed/scenes/concavemesh/ConcaveMeshScene.h +++ b/testbed/scenes/concavemesh/ConcaveMeshScene.h @@ -42,10 +42,10 @@ namespace trianglemeshscene { // Constants const float SCENE_RADIUS = 70.0f; // Radius of the scene in meters -static const int NB_BOXES = 10; -static const int NB_SPHERES = 5; -static const int NB_CAPSULES = 5; -static const int NB_MESHES = 3; +static const int NB_BOXES = 50; +static const int NB_SPHERES = 40; +static const int NB_CAPSULES = 20; +static const int NB_MESHES = 15; static const int NB_COMPOUND_SHAPES = 3; const openglframework::Vector3 BOX_SIZE(2, 2, 2); const float SPHERE_RADIUS = 1.5f; diff --git a/testbed/scenes/cubestack/CubeStackScene.cpp b/testbed/scenes/cubestack/CubeStackScene.cpp new file mode 100644 index 00000000..e4a0f859 --- /dev/null +++ b/testbed/scenes/cubestack/CubeStackScene.cpp @@ -0,0 +1,146 @@ +/******************************************************************************** +* 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 "CubeStackScene.h" + +// Namespaces +using namespace openglframework; +using namespace cubestackscene; + +// Constructor +CubeStackScene::CubeStackScene(const std::string& name, EngineSettings& settings) + : SceneDemo(name, settings, 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 dynamics world + rp3d::Vector3 gravity(0, rp3d::decimal(-9.81), 0); + + // Create the dynamics world for the physics simulation + mPhysicsWorld = new rp3d::DynamicsWorld(gravity); + +#ifdef IS_PROFILING_ACTIVE + + mPhysicsWorld->setProfilerName(name + "_profiler"); + +#endif + + // Create all the cubes of the scene + for (int i=1; i<=NB_FLOORS; i++) { + + for (int j=0; jsetColor(mDemoColors[i % mNbDemoColors]); + cube->setSleepingColor(mRedColorDemo); + + // Change the material properties of the rigid body + rp3d::Material& material = cube->getRigidBody()->getMaterial(); + material.setBounciness(rp3d::decimal(0.4)); + + // Add the box the list of box in the scene + mBoxes.push_back(cube); + mPhysicsObjects.push_back(cube); + } + } + + // ------------------------- FLOOR ----------------------- // + + // Create the floor + mFloor = new Box(FLOOR_SIZE, FLOOR_MASS, getDynamicsWorld(), mMeshFolderPath); + mFloor->setColor(mGreyColorDemo); + mFloor->setSleepingColor(mGreyColorDemo); + + // The floor must be a static rigid body + mFloor->getRigidBody()->setType(rp3d::BodyType::STATIC); + mPhysicsObjects.push_back(mFloor); + + // Get the physics engine parameters + mEngineSettings.isGravityEnabled = getDynamicsWorld()->isGravityEnabled(); + rp3d::Vector3 gravityVector = getDynamicsWorld()->getGravity(); + mEngineSettings.gravity = openglframework::Vector3(gravityVector.x, gravityVector.y, gravityVector.z); + mEngineSettings.isSleepingEnabled = getDynamicsWorld()->isSleepingEnabled(); + mEngineSettings.sleepLinearVelocity = getDynamicsWorld()->getSleepLinearVelocity(); + mEngineSettings.sleepAngularVelocity = getDynamicsWorld()->getSleepAngularVelocity(); + mEngineSettings.nbPositionSolverIterations = getDynamicsWorld()->getNbIterationsPositionSolver(); + mEngineSettings.nbVelocitySolverIterations = getDynamicsWorld()->getNbIterationsVelocitySolver(); + mEngineSettings.timeBeforeSleep = getDynamicsWorld()->getTimeBeforeSleep(); +} + +// Destructor +CubeStackScene::~CubeStackScene() { + + // Destroy all the cubes of the scene + for (std::vector::iterator it = mBoxes.begin(); it != mBoxes.end(); ++it) { + + // Destroy the corresponding rigid body from the dynamics world + getDynamicsWorld()->destroyRigidBody((*it)->getRigidBody()); + + // Destroy the cube + delete (*it); + } + + // Destroy the rigid body of the floor + getDynamicsWorld()->destroyRigidBody(mFloor->getRigidBody()); + + // Destroy the floor + delete mFloor; + + // Destroy the dynamics world + delete getDynamicsWorld(); +} + +// Reset the scene +void CubeStackScene::reset() { + + int index = 0; + for (int i=NB_FLOORS; i > 0; i--) { + + for (int j=0; jsetTransform(rp3d::Transform(position, rp3d::Quaternion::identity())); + + index++; + } + } + + mFloor->setTransform(rp3d::Transform(rp3d::Vector3::zero(), rp3d::Quaternion::identity())); +} diff --git a/testbed/scenes/cubestack/CubeStackScene.h b/testbed/scenes/cubestack/CubeStackScene.h new file mode 100644 index 00000000..9bbc1c01 --- /dev/null +++ b/testbed/scenes/cubestack/CubeStackScene.h @@ -0,0 +1,82 @@ +/******************************************************************************** +* 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 CUBESTACK_SCENE_H +#define CUBESTACK_SCENE_H + +// Libraries +#include "openglframework.h" +#include "reactphysics3d.h" +#include "Box.h" +#include "SceneDemo.h" + +namespace cubestackscene { + +// Constants +const float SCENE_RADIUS = 30.0f; // Radius of the scene in meters +const int NB_FLOORS = 15; // Number of boxes in the scene +const openglframework::Vector3 BOX_SIZE(2, 2, 2); // Box dimensions in meters +const openglframework::Vector3 FLOOR_SIZE(50, 1, 50); // Floor dimensions in meters +const float BOX_MASS = 1.0f; // Box mass in kilograms +const float FLOOR_MASS = 100.0f; // Floor mass in kilograms + +// Class CubeStackScene +class CubeStackScene : public SceneDemo { + + protected : + + // -------------------- Attributes -------------------- // + + /// All the boxes of the scene + std::vector mBoxes; + + /// Box for the floor + Box* mFloor; + + public: + + // -------------------- Methods -------------------- // + + /// Constructor + CubeStackScene(const std::string& name, EngineSettings& settings); + + /// Destructor + virtual ~CubeStackScene() override; + + /// Reset the scene + virtual void reset() override; + + /// Return all the contact points of the scene + virtual std::vector getContactPoints() const override; +}; + +// Return all the contact points of the scene +inline std::vector CubeStackScene::getContactPoints() const { + return computeContactPointsOfWorld(getDynamicsWorld()); +} + +} + +#endif diff --git a/testbed/src/TestbedApplication.cpp b/testbed/src/TestbedApplication.cpp index f2a43bc1..63230e0c 100644 --- a/testbed/src/TestbedApplication.cpp +++ b/testbed/src/TestbedApplication.cpp @@ -36,6 +36,7 @@ #include "heightfield/HeightFieldScene.h" #include "raycast/RaycastScene.h" #include "concavemesh/ConcaveMeshScene.h" +#include "cubestack/CubeStackScene.h" using namespace openglframework; using namespace jointsscene; @@ -45,6 +46,7 @@ using namespace collisionshapesscene; using namespace trianglemeshscene; using namespace heightfieldscene; using namespace collisiondetectionscene; +using namespace cubestackscene; // Initialization of static variables const float TestbedApplication::SCROLL_SENSITIVITY = 0.08f; @@ -102,6 +104,10 @@ void TestbedApplication::createScenes() { CubesScene* cubeScene = new CubesScene("Cubes", mEngineSettings); mScenes.push_back(cubeScene); + // Cube Stack scene + CubeStackScene* cubeStackScene = new CubeStackScene("Cube Stack", mEngineSettings); + mScenes.push_back(cubeStackScene); + // Joints scene JointsScene* jointsScene = new JointsScene("Joints", mEngineSettings); mScenes.push_back(jointsScene);