From ee3680765edd987314d44413f84d5f8283936850 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Fri, 14 Jun 2019 14:34:56 -0700 Subject: [PATCH] fixes for RemoteGUIHelper --- .../CommonGUIHelperInterface.h | 2 +- examples/ExampleBrowser/premake4.lua | 9 +++++ .../PhysicsServerCommandProcessor.cpp | 9 ++++- .../PhysicsServerCommandProcessor.h | 1 + .../SharedMemory/PhysicsServerExample.cpp | 40 +++---------------- examples/SharedMemory/RemoteGUIHelper.cpp | 39 ++++++++++++++++++ examples/SharedMemory/RemoteGUIHelper.h | 1 + examples/SharedMemory/premake4.lua | 2 + examples/pybullet/examples/quadruped.py | 4 +- examples/pybullet/premake4.lua | 9 +++++ setup.py | 2 + 11 files changed, 79 insertions(+), 39 deletions(-) diff --git a/examples/CommonInterfaces/CommonGUIHelperInterface.h b/examples/CommonInterfaces/CommonGUIHelperInterface.h index fd56f879e..d29928e47 100644 --- a/examples/CommonInterfaces/CommonGUIHelperInterface.h +++ b/examples/CommonInterfaces/CommonGUIHelperInterface.h @@ -32,7 +32,7 @@ struct GUIHelperInterface virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape) = 0; virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld) = 0; - + virtual void syncPhysicsToGraphics2(const btDiscreteDynamicsWorld* rbWorld) {} virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions) {} virtual void render(const btDiscreteDynamicsWorld* rbWorld) = 0; diff --git a/examples/ExampleBrowser/premake4.lua b/examples/ExampleBrowser/premake4.lua index d23c782e5..b976136df 100644 --- a/examples/ExampleBrowser/premake4.lua +++ b/examples/ExampleBrowser/premake4.lua @@ -116,6 +116,15 @@ project "App_BulletExampleBrowser" "../SharedMemory/SharedMemoryCommandProcessor.cpp", "../SharedMemory/SharedMemoryCommandProcessor.h", "../SharedMemory/SharedMemoryInProcessPhysicsC_API.cpp", + "../SharedMemory/GraphicsClientExample.cpp", + "../SharedMemory/GraphicsClientExample.h", + "../SharedMemory/GraphicsServerExample.cpp", + "../SharedMemory/GraphicsServerExample.h", + "../SharedMemory/GraphicsSharedMemoryBlock.h", + "../SharedMemory/GraphicsSharedMemoryCommands.h", + "../SharedMemory/GraphicsSharedMemoryPublic.h", + "../SharedMemory/RemoteGUIHelper.cpp", + "../SharedMemory/RemoteGUIHelper.h", "../SharedMemory/PhysicsClient.cpp", "../SharedMemory/PosixSharedMemory.cpp", "../SharedMemory/Win32SharedMemory.cpp", diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index 3c2f3aa73..26746dfb4 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -7717,7 +7717,7 @@ bool PhysicsServerCommandProcessor::processForwardDynamicsCommand(const struct S } serverCmd.m_type = CMD_STEP_FORWARD_SIMULATION_COMPLETED; - syncPhysicsToGraphics(); + syncPhysicsToGraphics2(); return hasStatus; } @@ -11569,6 +11569,13 @@ void PhysicsServerCommandProcessor::syncPhysicsToGraphics() m_data->m_guiHelper->syncPhysicsToGraphics(m_data->m_dynamicsWorld); } + +void PhysicsServerCommandProcessor::syncPhysicsToGraphics2() +{ + m_data->m_guiHelper->syncPhysicsToGraphics2(m_data->m_dynamicsWorld); +} + + void PhysicsServerCommandProcessor::renderScene(int renderFlags) { if (m_data->m_guiHelper) diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.h b/examples/SharedMemory/PhysicsServerCommandProcessor.h index 1b00a8af7..b770e246a 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.h +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.h @@ -138,6 +138,7 @@ public: virtual void physicsDebugDraw(int debugDrawFlags); virtual void setGuiHelper(struct GUIHelperInterface* guiHelper); virtual void syncPhysicsToGraphics(); + virtual void syncPhysicsToGraphics2(); //@todo(erwincoumans) Should we have shared memory commands for picking objects? ///The pickBody method will try to pick the first body along a ray, return true if succeeds, false otherwise diff --git a/examples/SharedMemory/PhysicsServerExample.cpp b/examples/SharedMemory/PhysicsServerExample.cpp index 95d54955c..eadded409 100644 --- a/examples/SharedMemory/PhysicsServerExample.cpp +++ b/examples/SharedMemory/PhysicsServerExample.cpp @@ -821,41 +821,11 @@ public: { m_childGuiHelper->syncPhysicsToGraphics(rbWorld); } - { - - b3AlignedObjectArray updatedPositions; - - int numCollisionObjects = rbWorld->getNumCollisionObjects(); - { - B3_PROFILE("write all InstanceTransformToCPU2"); - for (int i = 0; i < numCollisionObjects; i++) - { - //B3_PROFILE("writeSingleInstanceTransformToCPU"); - btCollisionObject* colObj = rbWorld->getCollisionObjectArray()[i]; - btCollisionShape* collisionShape = colObj->getCollisionShape(); - - btVector3 pos = colObj->getWorldTransform().getOrigin(); - btQuaternion orn = colObj->getWorldTransform().getRotation(); - int index = colObj->getUserIndex(); - if (index >= 0) - { - GUISyncPosition p; - p.m_graphicsInstanceId = index; - for (int q = 0; q < 4; q++) - { - p.m_pos[q] = pos[q]; - p.m_orn[q] = orn[q]; - } - updatedPositions.push_back(p); - } - } - } - - if (updatedPositions.size()) - { - syncPhysicsToGraphics2(&updatedPositions[0], updatedPositions.size()); - } - } + } + + virtual void syncPhysicsToGraphics2(const btDiscreteDynamicsWorld* rbWorld) + { + m_childGuiHelper->syncPhysicsToGraphics2(rbWorld); } virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions) diff --git a/examples/SharedMemory/RemoteGUIHelper.cpp b/examples/SharedMemory/RemoteGUIHelper.cpp index 80d1062a9..079bee2f6 100644 --- a/examples/SharedMemory/RemoteGUIHelper.cpp +++ b/examples/SharedMemory/RemoteGUIHelper.cpp @@ -12,6 +12,7 @@ #include "BulletCollision/CollisionDispatch/btCollisionObject.h" #include "BulletCollision/CollisionShapes/btCollisionShape.h" #include "Bullet3Common/b3AlignedObjectArray.h" +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" struct RemoteGUIHelperInternalData { @@ -282,6 +283,44 @@ void RemoteGUIHelper::syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWor { } +void RemoteGUIHelper::syncPhysicsToGraphics2(const btDiscreteDynamicsWorld* rbWorld) +{ + b3AlignedObjectArray updatedPositions; + + int numCollisionObjects = rbWorld->getNumCollisionObjects(); + { + B3_PROFILE("write all InstanceTransformToCPU2"); + for (int i = 0; i < numCollisionObjects; i++) + { + //B3_PROFILE("writeSingleInstanceTransformToCPU"); + btCollisionObject* colObj = rbWorld->getCollisionObjectArray()[i]; + btCollisionShape* collisionShape = colObj->getCollisionShape(); + + btVector3 pos = colObj->getWorldTransform().getOrigin(); + btQuaternion orn = colObj->getWorldTransform().getRotation(); + int index = colObj->getUserIndex(); + if (index >= 0) + { + GUISyncPosition p; + p.m_graphicsInstanceId = index; + for (int q = 0; q < 4; q++) + { + p.m_pos[q] = pos[q]; + p.m_orn[q] = orn[q]; + } + updatedPositions.push_back(p); + } + } + } + + if (updatedPositions.size()) + { + syncPhysicsToGraphics2(&updatedPositions[0], updatedPositions.size()); + } +} + + + void RemoteGUIHelper::syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions) { uploadData((unsigned char*) positions, numPositions * sizeof(GUISyncPosition), 0); diff --git a/examples/SharedMemory/RemoteGUIHelper.h b/examples/SharedMemory/RemoteGUIHelper.h index 2acaaf007..5e87f1d5c 100644 --- a/examples/SharedMemory/RemoteGUIHelper.h +++ b/examples/SharedMemory/RemoteGUIHelper.h @@ -21,6 +21,7 @@ struct RemoteGUIHelper : public GUIHelperInterface virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape); virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld); + virtual void syncPhysicsToGraphics2(const class btDiscreteDynamicsWorld* rbWorld); virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions); virtual void render(const btDiscreteDynamicsWorld* rbWorld); diff --git a/examples/SharedMemory/premake4.lua b/examples/SharedMemory/premake4.lua index cfa0d3aa1..1be7f957f 100644 --- a/examples/SharedMemory/premake4.lua +++ b/examples/SharedMemory/premake4.lua @@ -41,6 +41,8 @@ myfiles = "GraphicsSharedMemoryBlock.h", "GraphicsSharedMemoryCommands.h", "GraphicsSharedMemoryPublic.h", + "RemoteGUIHelper.cpp", + "RemoteGUIHelper.h", "SharedMemoryCommands.h", "SharedMemoryPublic.h", "PhysicsServer.cpp", diff --git a/examples/pybullet/examples/quadruped.py b/examples/pybullet/examples/quadruped.py index a9352fd08..6d72abb86 100644 --- a/examples/pybullet/examples/quadruped.py +++ b/examples/pybullet/examples/quadruped.py @@ -104,7 +104,7 @@ def drawInertiaBox(parentUid, parentLinkIndex, color): toeConstraint = True useMaximalCoordinates = False -useRealTime = 1 +useRealTime = 0 #the fixedTimeStep and numSolverIterations are the most important parameters to trade-off quality versus performance fixedTimeStep = 1. / 100 @@ -123,7 +123,7 @@ kp = 1 kd = .5 maxKneeForce = 1000 -physId = p.connect(p.SHARED_MEMORY) +physId = p.connect(p.SHARED_MEMORY_GUI) if (physId < 0): p.connect(p.GUI) #p.resetSimulation() diff --git a/examples/pybullet/premake4.lua b/examples/pybullet/premake4.lua index 1832dd205..3939dfc85 100644 --- a/examples/pybullet/premake4.lua +++ b/examples/pybullet/premake4.lua @@ -124,6 +124,15 @@ if not _OPTIONS["no-enet"] then "../../examples/SharedMemory/PhysicsServer.h", "../../examples/SharedMemory/PhysicsServerExample.cpp", "../../examples/SharedMemory/PhysicsServerExampleBullet2.cpp", + "../SharedMemory/GraphicsClientExample.cpp", + "../SharedMemory/GraphicsClientExample.h", + "../SharedMemory/GraphicsServerExample.cpp", + "../SharedMemory/GraphicsServerExample.h", + "../SharedMemory/GraphicsSharedMemoryBlock.h", + "../SharedMemory/GraphicsSharedMemoryCommands.h", + "../SharedMemory/GraphicsSharedMemoryPublic.h", + "../SharedMemory/RemoteGUIHelper.cpp", + "../SharedMemory/RemoteGUIHelper.h", "../../examples/SharedMemory/SharedMemoryInProcessPhysicsC_API.cpp", "../../examples/SharedMemory/PhysicsServerSharedMemory.cpp", "../../examples/SharedMemory/PhysicsServerSharedMemory.h", diff --git a/setup.py b/setup.py index 190b7a1e1..0d194520f 100644 --- a/setup.py +++ b/setup.py @@ -117,6 +117,8 @@ sources = ["examples/pybullet/pybullet.c"]\ +["examples/SharedMemory/InProcessMemory.cpp"]\ +["examples/SharedMemory/PhysicsClient.cpp"]\ +["examples/SharedMemory/PhysicsServer.cpp"]\ ++["examples/SharedMemory/GraphicsClientExample.cpp"]\ ++["examples/SharedMemory/RemoteGUIHelper.cpp"]\ +["examples/SharedMemory/PhysicsServerExample.cpp"]\ +["examples/SharedMemory/PhysicsServerExampleBullet2.cpp"]\ +["examples/SharedMemory/SharedMemoryInProcessPhysicsC_API.cpp"]\