fixes for RemoteGUIHelper

This commit is contained in:
Erwin Coumans
2019-06-14 14:34:56 -07:00
parent ced65ce3e3
commit ee3680765e
11 changed files with 79 additions and 39 deletions

View File

@@ -32,7 +32,7 @@ struct GUIHelperInterface
virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape) = 0; virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape) = 0;
virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld) = 0; virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld) = 0;
virtual void syncPhysicsToGraphics2(const btDiscreteDynamicsWorld* rbWorld) {}
virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions) {} virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions) {}
virtual void render(const btDiscreteDynamicsWorld* rbWorld) = 0; virtual void render(const btDiscreteDynamicsWorld* rbWorld) = 0;

View File

@@ -116,6 +116,15 @@ project "App_BulletExampleBrowser"
"../SharedMemory/SharedMemoryCommandProcessor.cpp", "../SharedMemory/SharedMemoryCommandProcessor.cpp",
"../SharedMemory/SharedMemoryCommandProcessor.h", "../SharedMemory/SharedMemoryCommandProcessor.h",
"../SharedMemory/SharedMemoryInProcessPhysicsC_API.cpp", "../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/PhysicsClient.cpp",
"../SharedMemory/PosixSharedMemory.cpp", "../SharedMemory/PosixSharedMemory.cpp",
"../SharedMemory/Win32SharedMemory.cpp", "../SharedMemory/Win32SharedMemory.cpp",

View File

@@ -7717,7 +7717,7 @@ bool PhysicsServerCommandProcessor::processForwardDynamicsCommand(const struct S
} }
serverCmd.m_type = CMD_STEP_FORWARD_SIMULATION_COMPLETED; serverCmd.m_type = CMD_STEP_FORWARD_SIMULATION_COMPLETED;
syncPhysicsToGraphics(); syncPhysicsToGraphics2();
return hasStatus; return hasStatus;
} }
@@ -11569,6 +11569,13 @@ void PhysicsServerCommandProcessor::syncPhysicsToGraphics()
m_data->m_guiHelper->syncPhysicsToGraphics(m_data->m_dynamicsWorld); 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) void PhysicsServerCommandProcessor::renderScene(int renderFlags)
{ {
if (m_data->m_guiHelper) if (m_data->m_guiHelper)

View File

@@ -138,6 +138,7 @@ public:
virtual void physicsDebugDraw(int debugDrawFlags); virtual void physicsDebugDraw(int debugDrawFlags);
virtual void setGuiHelper(struct GUIHelperInterface* guiHelper); virtual void setGuiHelper(struct GUIHelperInterface* guiHelper);
virtual void syncPhysicsToGraphics(); virtual void syncPhysicsToGraphics();
virtual void syncPhysicsToGraphics2();
//@todo(erwincoumans) Should we have shared memory commands for picking objects? //@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 ///The pickBody method will try to pick the first body along a ray, return true if succeeds, false otherwise

View File

@@ -821,41 +821,11 @@ public:
{ {
m_childGuiHelper->syncPhysicsToGraphics(rbWorld); m_childGuiHelper->syncPhysicsToGraphics(rbWorld);
} }
{
b3AlignedObjectArray<GUISyncPosition> 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()) virtual void syncPhysicsToGraphics2(const btDiscreteDynamicsWorld* rbWorld)
{ {
syncPhysicsToGraphics2(&updatedPositions[0], updatedPositions.size()); m_childGuiHelper->syncPhysicsToGraphics2(rbWorld);
}
}
} }
virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions) virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions)

View File

@@ -12,6 +12,7 @@
#include "BulletCollision/CollisionDispatch/btCollisionObject.h" #include "BulletCollision/CollisionDispatch/btCollisionObject.h"
#include "BulletCollision/CollisionShapes/btCollisionShape.h" #include "BulletCollision/CollisionShapes/btCollisionShape.h"
#include "Bullet3Common/b3AlignedObjectArray.h" #include "Bullet3Common/b3AlignedObjectArray.h"
#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h"
struct RemoteGUIHelperInternalData struct RemoteGUIHelperInternalData
{ {
@@ -282,6 +283,44 @@ void RemoteGUIHelper::syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWor
{ {
} }
void RemoteGUIHelper::syncPhysicsToGraphics2(const btDiscreteDynamicsWorld* rbWorld)
{
b3AlignedObjectArray<GUISyncPosition> 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) void RemoteGUIHelper::syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions)
{ {
uploadData((unsigned char*) positions, numPositions * sizeof(GUISyncPosition), 0); uploadData((unsigned char*) positions, numPositions * sizeof(GUISyncPosition), 0);

View File

@@ -21,6 +21,7 @@ struct RemoteGUIHelper : public GUIHelperInterface
virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape); virtual void createCollisionShapeGraphicsObject(btCollisionShape* collisionShape);
virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld); virtual void syncPhysicsToGraphics(const btDiscreteDynamicsWorld* rbWorld);
virtual void syncPhysicsToGraphics2(const class btDiscreteDynamicsWorld* rbWorld);
virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions); virtual void syncPhysicsToGraphics2(const GUISyncPosition* positions, int numPositions);
virtual void render(const btDiscreteDynamicsWorld* rbWorld); virtual void render(const btDiscreteDynamicsWorld* rbWorld);

View File

@@ -41,6 +41,8 @@ myfiles =
"GraphicsSharedMemoryBlock.h", "GraphicsSharedMemoryBlock.h",
"GraphicsSharedMemoryCommands.h", "GraphicsSharedMemoryCommands.h",
"GraphicsSharedMemoryPublic.h", "GraphicsSharedMemoryPublic.h",
"RemoteGUIHelper.cpp",
"RemoteGUIHelper.h",
"SharedMemoryCommands.h", "SharedMemoryCommands.h",
"SharedMemoryPublic.h", "SharedMemoryPublic.h",
"PhysicsServer.cpp", "PhysicsServer.cpp",

View File

@@ -104,7 +104,7 @@ def drawInertiaBox(parentUid, parentLinkIndex, color):
toeConstraint = True toeConstraint = True
useMaximalCoordinates = False useMaximalCoordinates = False
useRealTime = 1 useRealTime = 0
#the fixedTimeStep and numSolverIterations are the most important parameters to trade-off quality versus performance #the fixedTimeStep and numSolverIterations are the most important parameters to trade-off quality versus performance
fixedTimeStep = 1. / 100 fixedTimeStep = 1. / 100
@@ -123,7 +123,7 @@ kp = 1
kd = .5 kd = .5
maxKneeForce = 1000 maxKneeForce = 1000
physId = p.connect(p.SHARED_MEMORY) physId = p.connect(p.SHARED_MEMORY_GUI)
if (physId < 0): if (physId < 0):
p.connect(p.GUI) p.connect(p.GUI)
#p.resetSimulation() #p.resetSimulation()

View File

@@ -124,6 +124,15 @@ if not _OPTIONS["no-enet"] then
"../../examples/SharedMemory/PhysicsServer.h", "../../examples/SharedMemory/PhysicsServer.h",
"../../examples/SharedMemory/PhysicsServerExample.cpp", "../../examples/SharedMemory/PhysicsServerExample.cpp",
"../../examples/SharedMemory/PhysicsServerExampleBullet2.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/SharedMemoryInProcessPhysicsC_API.cpp",
"../../examples/SharedMemory/PhysicsServerSharedMemory.cpp", "../../examples/SharedMemory/PhysicsServerSharedMemory.cpp",
"../../examples/SharedMemory/PhysicsServerSharedMemory.h", "../../examples/SharedMemory/PhysicsServerSharedMemory.h",

View File

@@ -117,6 +117,8 @@ sources = ["examples/pybullet/pybullet.c"]\
+["examples/SharedMemory/InProcessMemory.cpp"]\ +["examples/SharedMemory/InProcessMemory.cpp"]\
+["examples/SharedMemory/PhysicsClient.cpp"]\ +["examples/SharedMemory/PhysicsClient.cpp"]\
+["examples/SharedMemory/PhysicsServer.cpp"]\ +["examples/SharedMemory/PhysicsServer.cpp"]\
+["examples/SharedMemory/GraphicsClientExample.cpp"]\
+["examples/SharedMemory/RemoteGUIHelper.cpp"]\
+["examples/SharedMemory/PhysicsServerExample.cpp"]\ +["examples/SharedMemory/PhysicsServerExample.cpp"]\
+["examples/SharedMemory/PhysicsServerExampleBullet2.cpp"]\ +["examples/SharedMemory/PhysicsServerExampleBullet2.cpp"]\
+["examples/SharedMemory/SharedMemoryInProcessPhysicsC_API.cpp"]\ +["examples/SharedMemory/SharedMemoryInProcessPhysicsC_API.cpp"]\