From 56ad6536bae5c5256796b98b694d18bb31b42a4a Mon Sep 17 00:00:00 2001 From: Daniel Chappuis Date: Sat, 27 Jun 2020 23:51:42 +0200 Subject: [PATCH] Add BoxTower demo in testbed application --- testbed/CMakeLists.txt | 2 + testbed/scenes/boxtower/BoxTowerScene.cpp | 160 ++++++++++++++++++++++ testbed/scenes/boxtower/BoxTowerScene.h | 88 ++++++++++++ testbed/src/TestbedApplication.cpp | 9 +- 4 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 testbed/scenes/boxtower/BoxTowerScene.cpp create mode 100644 testbed/scenes/boxtower/BoxTowerScene.h diff --git a/testbed/CMakeLists.txt b/testbed/CMakeLists.txt index ffb813c5..29459aaf 100755 --- a/testbed/CMakeLists.txt +++ b/testbed/CMakeLists.txt @@ -141,6 +141,8 @@ set(SCENES_SOURCES scenes/cubestack/CubeStackScene.cpp scenes/pile/PileScene.h scenes/pile/PileScene.cpp + scenes/boxtower/BoxTowerScene.h + scenes/boxtower/BoxTowerScene.cpp ) # Create the executable diff --git a/testbed/scenes/boxtower/BoxTowerScene.cpp b/testbed/scenes/boxtower/BoxTowerScene.cpp new file mode 100644 index 00000000..0aa30e08 --- /dev/null +++ b/testbed/scenes/boxtower/BoxTowerScene.cpp @@ -0,0 +1,160 @@ +/******************************************************************************** +* 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 "BoxTowerScene.h" + +// Namespaces +using namespace openglframework; +using namespace boxtowerscene; + +// Constructor +BoxTowerScene::BoxTowerScene(const std::string& name, EngineSettings& settings) + : SceneDemo(name, settings, true, SCENE_RADIUS) { + + std::string meshFolderPath("meshes/"); + + // 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, -9.81f, 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 all the boxes of the scene + for (int i=0; isetColor(mObjectColorDemo); + box->setSleepingColor(mSleepingColorDemo); + + // Change the material properties of the rigid body + rp3d::Material& material = box->getCollider()->getMaterial(); + material.setBounciness(rp3d::decimal(0.2)); + + // Add the sphere the list of boxes in the scene + mBoxes.push_back(box); + mPhysicsObjects.push_back(box); + } + + // ---------- Create the floor --------- + + mFloor = new Box(true, FLOOR_SIZE, mPhysicsCommon, mPhysicsWorld, mMeshFolderPath); + mPhysicsObjects.push_back(mFloor); + + // Set the box color + mFloor->setColor(mFloorColorDemo); + mFloor->setSleepingColor(mFloorColorDemo); + + // The floor must be a static rigid body + mFloor->getRigidBody()->setType(rp3d::BodyType::STATIC); + + // Change the material properties of the rigid body + rp3d::Material& material = mFloor->getCollider()->getMaterial(); + material.setBounciness(rp3d::decimal(0.2)); + + // 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 +BoxTowerScene::~BoxTowerScene() { + + // Destroy all the physics objects of the scene + for (std::vector::iterator it = mPhysicsObjects.begin(); it != mPhysicsObjects.end(); ++it) { + + // Destroy the corresponding rigid body from the physics world + mPhysicsWorld->destroyRigidBody((*it)->getRigidBody()); + + // Destroy the object + delete (*it); + } + + // Destroy the physics world + mPhysicsCommon.destroyPhysicsWorld(static_cast(mPhysicsWorld)); +} + +/// Reset the scene +void BoxTowerScene::reset() { + + SceneDemo::reset(); + + float distFromCenter = 4.0f; + + bool rotated = false; + int floorIndex = 0; + + // Create all the boxes of the scene + for (uint i = 0; isetTransform(rp3d::Transform(position, orientation)); + + if (i % 2 == 1) { + rotated = !rotated; + floorIndex++; + } + } + + // ---------- Create the triangular mesh ---------- // + + mFloor->setTransform(rp3d::Transform::identity()); +} diff --git a/testbed/scenes/boxtower/BoxTowerScene.h b/testbed/scenes/boxtower/BoxTowerScene.h new file mode 100644 index 00000000..2af03415 --- /dev/null +++ b/testbed/scenes/boxtower/BoxTowerScene.h @@ -0,0 +1,88 @@ +/******************************************************************************** +* 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 BOX_TOWER_SCENE_H +#define BOX_TOWER_SCENE_H + +// Libraries +#include "openglframework.h" +#include +#include "SceneDemo.h" +#include "Sphere.h" +#include "Box.h" +#include "Capsule.h" +#include "ConvexMesh.h" +#include "ConcaveMesh.h" +#include "Dumbbell.h" +#include "VisualContactPoint.h" + +namespace boxtowerscene { + +// Constants +const float SCENE_RADIUS = 30.0f; +const int NB_BOXES = 16; +const openglframework::Vector3 BOX_SIZE(2, 2, 16); +const openglframework::Vector3 FLOOR_SIZE(50, 0.5f, 50); // Floor dimensions in meters + +// Class BoxTowerScene +class BoxTowerScene : public SceneDemo { + + private : + + // -------------------- Attributes -------------------- // + + /// All the boxes of the scene + std::vector mBoxes; + + std::vector mSpheres; + + std::vector mCapsules; + + /// All the convex meshes of the scene + std::vector mConvexMeshes; + + /// All the dumbbell of the scene + std::vector mDumbbells; + + /// Box for the floor + Box* mFloor; + + public: + + // -------------------- Methods -------------------- // + + /// Constructor + BoxTowerScene(const std::string& name, EngineSettings& settings); + + /// Destructor + virtual ~BoxTowerScene() override; + + /// Reset the scene + virtual void reset() override; +}; + +} + +#endif diff --git a/testbed/src/TestbedApplication.cpp b/testbed/src/TestbedApplication.cpp index 8ed8fa90..b5d1dcd4 100755 --- a/testbed/src/TestbedApplication.cpp +++ b/testbed/src/TestbedApplication.cpp @@ -38,6 +38,7 @@ #include "concavemesh/ConcaveMeshScene.h" #include "cubestack/CubeStackScene.h" #include "pile/PileScene.h" +#include "boxtower/BoxTowerScene.h" using namespace openglframework; using namespace jointsscene; @@ -49,6 +50,7 @@ using namespace heightfieldscene; using namespace collisiondetectionscene; using namespace cubestackscene; using namespace pilescene; +using namespace boxtowerscene; // Initialization of static variables const float TestbedApplication::SCROLL_SENSITIVITY = 0.08f; @@ -117,7 +119,7 @@ void TestbedApplication::createScenes() { mScenes.push_back(cubeStackScene); // Joints scene - JointsScene* jointsScene = new JointsScene("HingeJoint - Bridge", mEngineSettings); + JointsScene* jointsScene = new JointsScene("Joints", mEngineSettings); mScenes.push_back(jointsScene); // Collision shapes scene @@ -145,6 +147,11 @@ void TestbedApplication::createScenes() { mScenes.push_back(pileScene); assert(mScenes.size() > 0); + // Box Tower scene + BoxTowerScene* boxTowerScene = new BoxTowerScene("Box Tower", mEngineSettings); + mScenes.push_back(boxTowerScene); + assert(mScenes.size() > 0); + const int firstSceneIndex = 0; switchScene(mScenes[firstSceneIndex]);