diff --git a/examples/BulletRobotics/BoxStack.cpp b/examples/BulletRobotics/BoxStack.cpp new file mode 100644 index 000000000..df4056465 --- /dev/null +++ b/examples/BulletRobotics/BoxStack.cpp @@ -0,0 +1,119 @@ + +#include "BoxStack.h" + +#include "../CommonInterfaces/CommonGraphicsAppInterface.h" +#include "Bullet3Common/b3AlignedObjectArray.h" +#include "../CommonInterfaces/CommonRenderInterface.h" +#include "../CommonInterfaces/CommonExampleInterface.h" +#include "../CommonInterfaces/CommonGUIHelperInterface.h" +#include "../SharedMemory/PhysicsServerSharedMemory.h" +#include "../SharedMemory/PhysicsClientC_API.h" +#include "../CommonInterfaces/CommonParameterInterface.h" +#include "../SharedMemory/SharedMemoryPublic.h" +#include + +#include "../RobotSimulator/b3RobotSimulatorClientAPI.h" +#include "../Utils/b3Clock.h" + +class BoxStackExample : public CommonExampleInterface +{ + CommonGraphicsApp* m_app; + GUIHelperInterface* m_guiHelper; + b3RobotSimulatorClientAPI m_robotSim; + int m_options; + +public: + BoxStackExample(GUIHelperInterface* helper, int options) + : m_app(helper->getAppInterface()), + m_guiHelper(helper), + m_options(options) + { + m_app->setUpAxis(2); + } + + virtual ~BoxStackExample() + { + } + + virtual void physicsDebugDraw(int debugDrawMode) + { + m_robotSim.debugDraw(debugDrawMode); + } + virtual void initPhysics() + { + int mode = eCONNECT_EXISTING_EXAMPLE_BROWSER; + m_robotSim.setGuiHelper(m_guiHelper); + bool connected = m_robotSim.connect(mode); + + b3Printf("robotSim connected = %d", connected); + + m_robotSim.configureDebugVisualizer(COV_ENABLE_RGB_BUFFER_PREVIEW, 0); + m_robotSim.configureDebugVisualizer(COV_ENABLE_DEPTH_BUFFER_PREVIEW, 0); + m_robotSim.configureDebugVisualizer(COV_ENABLE_SEGMENTATION_MARK_PREVIEW, 0); + + b3RobotSimulatorLoadUrdfFileArgs args; + b3RobotSimulatorChangeDynamicsArgs dynamicsArgs; + int massRatio = 4; + int mass = 1; + for (int i = 0; i < 8; i++) + { + args.m_startPosition.setValue(0, 0, i * .06); + int boxIdx = m_robotSim.loadURDF("cube_small.urdf", args); + dynamicsArgs.m_mass = mass; + m_robotSim.changeDynamics(boxIdx, -1, dynamicsArgs); + mass *= massRatio; + } + + m_robotSim.loadURDF("plane.urdf"); + m_robotSim.setGravity(btVector3(0, 0, -10)); + } + + virtual void exitPhysics() + { + m_robotSim.disconnect(); + } + virtual void stepSimulation(float deltaTime) + { + m_robotSim.stepSimulation(); + } + virtual void renderScene() + { + m_robotSim.renderScene(); + } + + virtual bool mouseMoveCallback(float x, float y) + { + return m_robotSim.mouseMoveCallback(x, y); + } + virtual bool mouseButtonCallback(int button, int state, float x, float y) + { + return m_robotSim.mouseButtonCallback(button, state, x, y); + } + virtual bool keyboardCallback(int key, int state) + { + return false; + } + + virtual void resetCamera() + { + float dist = 1.5; + float pitch = -10; + float yaw = 18; + float targetPos[3] = {-0.2, 0.8, 0.3}; + + m_guiHelper->resetCamera(dist, yaw, pitch, targetPos[0], targetPos[1], targetPos[2]); + + if (m_app->m_renderer && m_app->m_renderer->getActiveCamera()) + { + m_app->m_renderer->getActiveCamera()->setCameraDistance(dist); + m_app->m_renderer->getActiveCamera()->setCameraPitch(pitch); + m_app->m_renderer->getActiveCamera()->setCameraYaw(yaw); + m_app->m_renderer->getActiveCamera()->setCameraTargetPosition(targetPos[0], targetPos[1], targetPos[2]); + } + } +}; + +class CommonExampleInterface* BoxStackExampleCreateFunc(struct CommonExampleOptions& options) +{ + return new BoxStackExample(options.m_guiHelper, options.m_option); +} diff --git a/examples/BulletRobotics/BoxStack.h b/examples/BulletRobotics/BoxStack.h new file mode 100644 index 000000000..289b4b034 --- /dev/null +++ b/examples/BulletRobotics/BoxStack.h @@ -0,0 +1,21 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2016 Google Inc. http://bulletphysics.org + +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_STACK_EXAMPLE_H +#define BOX_STACK_EXAMPLE_H + +class CommonExampleInterface* BoxStackExampleCreateFunc(struct CommonExampleOptions& options); + +#endif //BOX_STACK_EXAMPLE_H diff --git a/examples/ExampleBrowser/CMakeLists.txt b/examples/ExampleBrowser/CMakeLists.txt index 99dc6fd1d..2b19f4161 100644 --- a/examples/ExampleBrowser/CMakeLists.txt +++ b/examples/ExampleBrowser/CMakeLists.txt @@ -146,6 +146,8 @@ SET(ExtendedTutorialsSources SET(BulletExampleBrowser_SRCS ../BulletRobotics/FixJointBoxes.cpp + ../BulletRobotics/BoxStack.cpp + ../TinyRenderer/geometry.cpp ../TinyRenderer/model.cpp ../TinyRenderer/tgaimage.cpp diff --git a/examples/ExampleBrowser/ExampleEntries.cpp b/examples/ExampleBrowser/ExampleEntries.cpp index 059795646..57c505879 100644 --- a/examples/ExampleBrowser/ExampleEntries.cpp +++ b/examples/ExampleBrowser/ExampleEntries.cpp @@ -130,8 +130,8 @@ static ExampleEntry gDefaultExamples[] = ExampleEntry(1, "Soft Contact", "Using the error correction parameter (ERP) and constraint force mixing (CFM) values for contacts to simulate compliant contact.", RigidBodySoftContactCreateFunc), - ExampleEntry(0, "Bullet Robotics"), + ExampleEntry(1, "Box Stack", "Create a stack of boxes using C API", BoxStackExampleCreateFunc), ExampleEntry(1, "FixJoint Boxes", "FixJoint Boxes", FixJointBoxesCreateFunc), ExampleEntry(0, "MultiBody"),