Merge branch 'master' of https://github.com/erwincoumans/bullet3
This commit is contained in:
@@ -2843,7 +2843,7 @@ void PhysicsServerCommandProcessor::deleteDynamicsWorld()
|
|||||||
|
|
||||||
bool PhysicsServerCommandProcessor::supportsJointMotor(btMultiBody* mb, int mbLinkIndex)
|
bool PhysicsServerCommandProcessor::supportsJointMotor(btMultiBody* mb, int mbLinkIndex)
|
||||||
{
|
{
|
||||||
bool canHaveMotor = (mb->getLink(mbLinkIndex).m_jointType == btMultibodyLink::eRevolute
|
bool canHaveMotor = (mb->getLink(mbLinkIndex).m_jointType == btMultibodyLink::eRevolute
|
||||||
|| mb->getLink(mbLinkIndex).m_jointType == btMultibodyLink::ePrismatic);
|
|| mb->getLink(mbLinkIndex).m_jointType == btMultibodyLink::ePrismatic);
|
||||||
return canHaveMotor;
|
return canHaveMotor;
|
||||||
}
|
}
|
||||||
@@ -3056,7 +3056,7 @@ bool PhysicsServerCommandProcessor::processImportedObjects(const char* fileName,
|
|||||||
std::string* baseName = new std::string(u2b.getLinkName(u2b.getRootLinkIndex()));
|
std::string* baseName = new std::string(u2b.getLinkName(u2b.getRootLinkIndex()));
|
||||||
m_data->m_strings.push_back(baseName);
|
m_data->m_strings.push_back(baseName);
|
||||||
mb->setBaseName(baseName->c_str());
|
mb->setBaseName(baseName->c_str());
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
btAlignedObjectArray<char> urdf;
|
btAlignedObjectArray<char> urdf;
|
||||||
mb->dumpUrdf(urdf);
|
mb->dumpUrdf(urdf);
|
||||||
@@ -3067,7 +3067,7 @@ bool PhysicsServerCommandProcessor::processImportedObjects(const char* fileName,
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -6320,7 +6320,7 @@ bool PhysicsServerCommandProcessor::processRequestActualStateCommand(const struc
|
|||||||
|
|
||||||
//we store the state details in the shared memory block, to reduce status size
|
//we store the state details in the shared memory block, to reduce status size
|
||||||
SendActualStateSharedMemoryStorage* stateDetails = (SendActualStateSharedMemoryStorage*)bufferServerToClient;
|
SendActualStateSharedMemoryStorage* stateDetails = (SendActualStateSharedMemoryStorage*)bufferServerToClient;
|
||||||
|
|
||||||
//make sure the storage fits, otherwise
|
//make sure the storage fits, otherwise
|
||||||
btAssert(sizeof(SendActualStateSharedMemoryStorage) < bufferSizeInBytes);
|
btAssert(sizeof(SendActualStateSharedMemoryStorage) < bufferSizeInBytes);
|
||||||
if (sizeof(SendActualStateSharedMemoryStorage) > bufferSizeInBytes)
|
if (sizeof(SendActualStateSharedMemoryStorage) > bufferSizeInBytes)
|
||||||
@@ -6332,11 +6332,12 @@ bool PhysicsServerCommandProcessor::processRequestActualStateCommand(const struc
|
|||||||
{
|
{
|
||||||
btMultiBody* mb = body->m_multiBody;
|
btMultiBody* mb = body->m_multiBody;
|
||||||
SharedMemoryStatus& serverCmd = serverStatusOut;
|
SharedMemoryStatus& serverCmd = serverStatusOut;
|
||||||
|
|
||||||
serverStatusOut.m_type = CMD_ACTUAL_STATE_UPDATE_COMPLETED;
|
serverStatusOut.m_type = CMD_ACTUAL_STATE_UPDATE_COMPLETED;
|
||||||
|
|
||||||
serverCmd.m_sendActualStateArgs.m_bodyUniqueId = bodyUniqueId;
|
serverCmd.m_sendActualStateArgs.m_bodyUniqueId = bodyUniqueId;
|
||||||
serverCmd.m_sendActualStateArgs.m_numLinks = body->m_multiBody->getNumLinks();
|
serverCmd.m_sendActualStateArgs.m_numLinks = body->m_multiBody->getNumLinks();
|
||||||
|
serverCmd.m_numDataStreamBytes = sizeof(SendActualStateSharedMemoryStorage);
|
||||||
serverCmd.m_sendActualStateArgs.m_stateDetails = 0;
|
serverCmd.m_sendActualStateArgs.m_stateDetails = 0;
|
||||||
int totalDegreeOfFreedomQ = 0;
|
int totalDegreeOfFreedomQ = 0;
|
||||||
int totalDegreeOfFreedomU = 0;
|
int totalDegreeOfFreedomU = 0;
|
||||||
@@ -6545,9 +6546,10 @@ bool PhysicsServerCommandProcessor::processRequestActualStateCommand(const struc
|
|||||||
btRigidBody* rb = body->m_rigidBody;
|
btRigidBody* rb = body->m_rigidBody;
|
||||||
SharedMemoryStatus& serverCmd = serverStatusOut;
|
SharedMemoryStatus& serverCmd = serverStatusOut;
|
||||||
serverCmd.m_type = CMD_ACTUAL_STATE_UPDATE_COMPLETED;
|
serverCmd.m_type = CMD_ACTUAL_STATE_UPDATE_COMPLETED;
|
||||||
|
|
||||||
serverCmd.m_sendActualStateArgs.m_bodyUniqueId = bodyUniqueId;
|
serverCmd.m_sendActualStateArgs.m_bodyUniqueId = bodyUniqueId;
|
||||||
serverCmd.m_sendActualStateArgs.m_numLinks = 0;
|
serverCmd.m_sendActualStateArgs.m_numLinks = 0;
|
||||||
|
serverCmd.m_numDataStreamBytes = sizeof(SendActualStateSharedMemoryStorage);
|
||||||
serverCmd.m_sendActualStateArgs.m_stateDetails = 0;
|
serverCmd.m_sendActualStateArgs.m_stateDetails = 0;
|
||||||
|
|
||||||
int totalDegreeOfFreedomQ = 0;
|
int totalDegreeOfFreedomQ = 0;
|
||||||
@@ -6590,6 +6592,7 @@ bool PhysicsServerCommandProcessor::processRequestActualStateCommand(const struc
|
|||||||
serverCmd.m_type = CMD_ACTUAL_STATE_UPDATE_COMPLETED;
|
serverCmd.m_type = CMD_ACTUAL_STATE_UPDATE_COMPLETED;
|
||||||
serverCmd.m_sendActualStateArgs.m_bodyUniqueId = bodyUniqueId;
|
serverCmd.m_sendActualStateArgs.m_bodyUniqueId = bodyUniqueId;
|
||||||
serverCmd.m_sendActualStateArgs.m_numLinks = 0;
|
serverCmd.m_sendActualStateArgs.m_numLinks = 0;
|
||||||
|
serverCmd.m_numDataStreamBytes = sizeof(SendActualStateSharedMemoryStorage);
|
||||||
serverCmd.m_sendActualStateArgs.m_stateDetails = 0;
|
serverCmd.m_sendActualStateArgs.m_stateDetails = 0;
|
||||||
|
|
||||||
serverCmd.m_sendActualStateArgs.m_rootLocalInertialFrame[0] =
|
serverCmd.m_sendActualStateArgs.m_rootLocalInertialFrame[0] =
|
||||||
@@ -7204,7 +7207,7 @@ bool PhysicsServerCommandProcessor::processCreateMultiBodyCommandSingle(const st
|
|||||||
m_data->m_sdfRecentLoadedBodies.clear();
|
m_data->m_sdfRecentLoadedBodies.clear();
|
||||||
if (bodyUniqueId >= 0)
|
if (bodyUniqueId >= 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
serverStatusOut.m_type = CMD_CREATE_MULTI_BODY_COMPLETED;
|
serverStatusOut.m_type = CMD_CREATE_MULTI_BODY_COMPLETED;
|
||||||
if (bufferSizeInBytes>0 && serverStatusOut.m_numDataStreamBytes==0)
|
if (bufferSizeInBytes>0 && serverStatusOut.m_numDataStreamBytes==0)
|
||||||
{
|
{
|
||||||
@@ -7212,7 +7215,7 @@ bool PhysicsServerCommandProcessor::processCreateMultiBodyCommandSingle(const st
|
|||||||
BT_PROFILE("autogenerateGraphicsObjects");
|
BT_PROFILE("autogenerateGraphicsObjects");
|
||||||
m_data->m_guiHelper->autogenerateGraphicsObjects(this->m_data->m_dynamicsWorld);
|
m_data->m_guiHelper->autogenerateGraphicsObjects(this->m_data->m_dynamicsWorld);
|
||||||
}
|
}
|
||||||
|
|
||||||
BT_PROFILE("createBodyInfoStream");
|
BT_PROFILE("createBodyInfoStream");
|
||||||
int streamSizeInBytes = createBodyInfoStream(bodyUniqueId, bufferServerToClient, bufferSizeInBytes);
|
int streamSizeInBytes = createBodyInfoStream(bodyUniqueId, bufferServerToClient, bufferSizeInBytes);
|
||||||
serverStatusOut.m_numDataStreamBytes = streamSizeInBytes;
|
serverStatusOut.m_numDataStreamBytes = streamSizeInBytes;
|
||||||
@@ -7675,7 +7678,7 @@ bool PhysicsServerCommandProcessor::processForwardDynamicsCommand(const struct S
|
|||||||
}
|
}
|
||||||
|
|
||||||
btScalar deltaTimeScaled = m_data->m_physicsDeltaTime * simTimeScalingFactor;
|
btScalar deltaTimeScaled = m_data->m_physicsDeltaTime * simTimeScalingFactor;
|
||||||
|
|
||||||
int numSteps = 0;
|
int numSteps = 0;
|
||||||
if (m_data->m_numSimulationSubSteps > 0)
|
if (m_data->m_numSimulationSubSteps > 0)
|
||||||
{
|
{
|
||||||
@@ -7702,7 +7705,7 @@ bool PhysicsServerCommandProcessor::processForwardDynamicsCommand(const struct S
|
|||||||
m_data->m_dynamicsWorld->getAnalyticsData(islandAnalyticsData);
|
m_data->m_dynamicsWorld->getAnalyticsData(islandAnalyticsData);
|
||||||
serverCmd.m_forwardDynamicsAnalyticsArgs.m_numIslands = islandAnalyticsData.size();
|
serverCmd.m_forwardDynamicsAnalyticsArgs.m_numIslands = islandAnalyticsData.size();
|
||||||
int numIslands = btMin(islandAnalyticsData.size(), MAX_ISLANDS_ANALYTICS);
|
int numIslands = btMin(islandAnalyticsData.size(), MAX_ISLANDS_ANALYTICS);
|
||||||
|
|
||||||
for (int i=0;i<numIslands;i++)
|
for (int i=0;i<numIslands;i++)
|
||||||
{
|
{
|
||||||
serverCmd.m_forwardDynamicsAnalyticsArgs.m_numSolverCalls = islandAnalyticsData[i].m_numSolverCalls;
|
serverCmd.m_forwardDynamicsAnalyticsArgs.m_numSolverCalls = islandAnalyticsData[i].m_numSolverCalls;
|
||||||
@@ -7794,7 +7797,7 @@ bool PhysicsServerCommandProcessor::processChangeDynamicsInfoCommand(const struc
|
|||||||
{
|
{
|
||||||
mb->setCanWakeup(false);
|
mb->setCanWakeup(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clientCmd.m_updateFlags & CHANGE_DYNAMICS_INFO_SET_LINEAR_DAMPING)
|
if (clientCmd.m_updateFlags & CHANGE_DYNAMICS_INFO_SET_LINEAR_DAMPING)
|
||||||
@@ -7900,7 +7903,7 @@ bool PhysicsServerCommandProcessor::processChangeDynamicsInfoCommand(const struc
|
|||||||
{
|
{
|
||||||
mb->setMaxCoordinateVelocity(clientCmd.m_changeDynamicsInfoArgs.m_maxJointVelocity);
|
mb->setMaxCoordinateVelocity(clientCmd.m_changeDynamicsInfoArgs.m_maxJointVelocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -7988,7 +7991,7 @@ bool PhysicsServerCommandProcessor::processChangeDynamicsInfoCommand(const struc
|
|||||||
btRigidBody* childRb = &body->m_rigidBodyJoints[linkIndex]->getRigidBodyB();
|
btRigidBody* childRb = &body->m_rigidBodyJoints[linkIndex]->getRigidBodyB();
|
||||||
rb = childRb;
|
rb = childRb;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8079,13 +8082,13 @@ bool PhysicsServerCommandProcessor::processChangeDynamicsInfoCommand(const struc
|
|||||||
{
|
{
|
||||||
rb->setAnisotropicFriction(anisotropicFriction);
|
rb->setAnisotropicFriction(anisotropicFriction);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clientCmd.m_updateFlags & CHANGE_DYNAMICS_INFO_SET_CONTACT_PROCESSING_THRESHOLD)
|
if (clientCmd.m_updateFlags & CHANGE_DYNAMICS_INFO_SET_CONTACT_PROCESSING_THRESHOLD)
|
||||||
{
|
{
|
||||||
rb->setContactProcessingThreshold(clientCmd.m_changeDynamicsInfoArgs.m_contactProcessingThreshold);
|
rb->setContactProcessingThreshold(clientCmd.m_changeDynamicsInfoArgs.m_contactProcessingThreshold);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (clientCmd.m_updateFlags & CHANGE_DYNAMICS_INFO_SET_CCD_SWEPT_SPHERE_RADIUS)
|
if (clientCmd.m_updateFlags & CHANGE_DYNAMICS_INFO_SET_CCD_SWEPT_SPHERE_RADIUS)
|
||||||
{
|
{
|
||||||
@@ -8508,7 +8511,7 @@ bool PhysicsServerCommandProcessor::processSendPhysicsParametersCommand(const st
|
|||||||
{
|
{
|
||||||
m_data->m_dynamicsWorld->getSolverInfo().m_reportSolverAnalytics = clientCmd.m_physSimParamArgs.m_reportSolverAnalytics;
|
m_data->m_dynamicsWorld->getSolverInfo().m_reportSolverAnalytics = clientCmd.m_physSimParamArgs.m_reportSolverAnalytics;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedMemoryStatus& serverCmd = serverStatusOut;
|
SharedMemoryStatus& serverCmd = serverStatusOut;
|
||||||
serverCmd.m_type = CMD_CLIENT_COMMAND_COMPLETED;
|
serverCmd.m_type = CMD_CLIENT_COMMAND_COMPLETED;
|
||||||
return hasStatus;
|
return hasStatus;
|
||||||
@@ -8602,7 +8605,7 @@ bool PhysicsServerCommandProcessor::processInitPoseCommand(const struct SharedMe
|
|||||||
{
|
{
|
||||||
int posVarCount = mb->getLink(i).m_posVarCount;
|
int posVarCount = mb->getLink(i).m_posVarCount;
|
||||||
bool hasPosVar = posVarCount > 0;
|
bool hasPosVar = posVarCount > 0;
|
||||||
|
|
||||||
for (int j = 0; j < posVarCount; j++)
|
for (int j = 0; j < posVarCount; j++)
|
||||||
{
|
{
|
||||||
if (clientCmd.m_initPoseArgs.m_hasInitialStateQ[posVarCountIndex+j] == 0)
|
if (clientCmd.m_initPoseArgs.m_hasInitialStateQ[posVarCountIndex+j] == 0)
|
||||||
@@ -8631,7 +8634,7 @@ bool PhysicsServerCommandProcessor::processInitPoseCommand(const struct SharedMe
|
|||||||
mb->setJointVelMultiDof(i, vel);
|
mb->setJointVelMultiDof(i, vel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasVel = true;
|
bool hasVel = true;
|
||||||
for (int j = 0; j < mb->getLink(i).m_dofCount; j++)
|
for (int j = 0; j < mb->getLink(i).m_dofCount; j++)
|
||||||
{
|
{
|
||||||
@@ -8654,7 +8657,7 @@ bool PhysicsServerCommandProcessor::processInitPoseCommand(const struct SharedMe
|
|||||||
mb->setJointVelMultiDof(i, &clientCmd.m_initPoseArgs.m_initialStateQdot[uDofIndex]);
|
mb->setJointVelMultiDof(i, &clientCmd.m_initPoseArgs.m_initialStateQdot[uDofIndex]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
posVarCountIndex += mb->getLink(i).m_posVarCount;
|
posVarCountIndex += mb->getLink(i).m_posVarCount;
|
||||||
uDofIndex += mb->getLink(i).m_dofCount;
|
uDofIndex += mb->getLink(i).m_dofCount;
|
||||||
}
|
}
|
||||||
@@ -9025,7 +9028,7 @@ bool PhysicsServerCommandProcessor::processInverseDynamicsCommand(const struct S
|
|||||||
{
|
{
|
||||||
#ifdef STATIC_LINK_SPD_PLUGIN
|
#ifdef STATIC_LINK_SPD_PLUGIN
|
||||||
{
|
{
|
||||||
cRBDModel* rbdModel = m_data->findOrCreateRBDModel(bodyHandle->m_multiBody,
|
cRBDModel* rbdModel = m_data->findOrCreateRBDModel(bodyHandle->m_multiBody,
|
||||||
clientCmd.m_calculateInverseDynamicsArguments.m_jointPositionsQ,
|
clientCmd.m_calculateInverseDynamicsArguments.m_jointPositionsQ,
|
||||||
clientCmd.m_calculateInverseDynamicsArguments.m_jointVelocitiesQdot);
|
clientCmd.m_calculateInverseDynamicsArguments.m_jointVelocitiesQdot);
|
||||||
if (rbdModel)
|
if (rbdModel)
|
||||||
@@ -9042,9 +9045,9 @@ bool PhysicsServerCommandProcessor::processInverseDynamicsCommand(const struct S
|
|||||||
}
|
}
|
||||||
serverCmd.m_inverseDynamicsResultArgs.m_bodyUniqueId = clientCmd.m_calculateInverseDynamicsArguments.m_bodyUniqueId;
|
serverCmd.m_inverseDynamicsResultArgs.m_bodyUniqueId = clientCmd.m_calculateInverseDynamicsArguments.m_bodyUniqueId;
|
||||||
serverCmd.m_inverseDynamicsResultArgs.m_dofCount = dof;
|
serverCmd.m_inverseDynamicsResultArgs.m_dofCount = dof;
|
||||||
|
|
||||||
serverCmd.m_type = CMD_CALCULATED_INVERSE_DYNAMICS_COMPLETED;
|
serverCmd.m_type = CMD_CALCULATED_INVERSE_DYNAMICS_COMPLETED;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -9516,7 +9519,7 @@ bool PhysicsServerCommandProcessor::processRemoveBodyCommand(const struct Shared
|
|||||||
int numCollisionObjects = m_data->m_dynamicsWorld->getNumCollisionObjects();
|
int numCollisionObjects = m_data->m_dynamicsWorld->getNumCollisionObjects();
|
||||||
m_data->m_dynamicsWorld->removeMultiBody(bodyHandle->m_multiBody);
|
m_data->m_dynamicsWorld->removeMultiBody(bodyHandle->m_multiBody);
|
||||||
numCollisionObjects = m_data->m_dynamicsWorld->getNumCollisionObjects();
|
numCollisionObjects = m_data->m_dynamicsWorld->getNumCollisionObjects();
|
||||||
|
|
||||||
delete bodyHandle->m_multiBody;
|
delete bodyHandle->m_multiBody;
|
||||||
bodyHandle->m_multiBody = 0;
|
bodyHandle->m_multiBody = 0;
|
||||||
serverCmd.m_type = CMD_REMOVE_BODY_COMPLETED;
|
serverCmd.m_type = CMD_REMOVE_BODY_COMPLETED;
|
||||||
@@ -10943,7 +10946,7 @@ bool PhysicsServerCommandProcessor::processRemoveStateCommand(const struct Share
|
|||||||
bool hasStatus = true;
|
bool hasStatus = true;
|
||||||
SharedMemoryStatus& serverCmd = serverStatusOut;
|
SharedMemoryStatus& serverCmd = serverStatusOut;
|
||||||
serverCmd.m_type = CMD_REMOVE_STATE_FAILED;
|
serverCmd.m_type = CMD_REMOVE_STATE_FAILED;
|
||||||
|
|
||||||
if (clientCmd.m_loadStateArguments.m_stateId >= 0)
|
if (clientCmd.m_loadStateArguments.m_stateId >= 0)
|
||||||
{
|
{
|
||||||
if (clientCmd.m_loadStateArguments.m_stateId < m_data->m_savedStates.size())
|
if (clientCmd.m_loadStateArguments.m_stateId < m_data->m_savedStates.size())
|
||||||
@@ -11283,7 +11286,7 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
|
|||||||
hasStatus = processCreateVisualShapeCommand(clientCmd, serverStatusOut, bufferServerToClient, bufferSizeInBytes);
|
hasStatus = processCreateVisualShapeCommand(clientCmd, serverStatusOut, bufferServerToClient, bufferSizeInBytes);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case CMD_CREATE_MULTI_BODY:
|
case CMD_CREATE_MULTI_BODY:
|
||||||
{
|
{
|
||||||
hasStatus = processCreateMultiBodyCommand(clientCmd, serverStatusOut, bufferServerToClient, bufferSizeInBytes);
|
hasStatus = processCreateMultiBodyCommand(clientCmd, serverStatusOut, bufferServerToClient, bufferSizeInBytes);
|
||||||
|
|||||||
@@ -1413,6 +1413,22 @@ bool convertGRPCToStatus(const PyBulletStatus& grpcReply, SharedMemoryStatus& se
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case CMD_SDF_LOADING_COMPLETED:
|
||||||
|
{
|
||||||
|
converted = true;
|
||||||
|
const ::pybullet_grpc::SdfLoadedStatus* stat = &grpcReply.sdfstatus();
|
||||||
|
int numBodies = stat->bodyuniqueids_size();
|
||||||
|
if (numBodies > MAX_SDF_BODIES)
|
||||||
|
{
|
||||||
|
printf("SDF exceeds body capacity: %d > %d", numBodies, MAX_SDF_BODIES);
|
||||||
|
}
|
||||||
|
serverStatus.m_sdfLoadedArgs.m_numBodies = numBodies;
|
||||||
|
for (int i = 0; i < numBodies; i++)
|
||||||
|
{
|
||||||
|
serverStatus.m_sdfLoadedArgs.m_bodyUniqueIds[i] = stat->bodyuniqueids(i);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case CMD_DESIRED_STATE_RECEIVED_COMPLETED:
|
case CMD_DESIRED_STATE_RECEIVED_COMPLETED:
|
||||||
{
|
{
|
||||||
converted = true;
|
converted = true;
|
||||||
@@ -1681,7 +1697,10 @@ bool convertStatusToGRPC(const SharedMemoryStatus& serverStatus, char* bufferSer
|
|||||||
case CMD_ACTUAL_STATE_UPDATE_COMPLETED:
|
case CMD_ACTUAL_STATE_UPDATE_COMPLETED:
|
||||||
{
|
{
|
||||||
converted = true;
|
converted = true;
|
||||||
b3SharedMemoryStatusHandle statusHandle = (b3SharedMemoryStatusHandle)&serverStatus;
|
SharedMemoryStatus* status = (SharedMemoryStatus*)&serverStatus;
|
||||||
|
status->m_sendActualStateArgs.m_stateDetails = (SendActualStateSharedMemoryStorage*)bufferServerToClient;
|
||||||
|
b3SharedMemoryStatusHandle statusHandle = (b3SharedMemoryStatusHandle)status;
|
||||||
|
|
||||||
int bodyUniqueId;
|
int bodyUniqueId;
|
||||||
int numLinks;
|
int numLinks;
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,9 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
#include <grpc++/grpc++.h>
|
#include <grpc++/grpc++.h>
|
||||||
#include <grpc/support/log.h>
|
#include <grpc/support/log.h>
|
||||||
#include "../../../Utils/b3Clock.h"
|
#include "../../../Utils/b3Clock.h"
|
||||||
@@ -44,6 +47,9 @@ public:
|
|||||||
if (server_)
|
if (server_)
|
||||||
{
|
{
|
||||||
server_->Shutdown();
|
server_->Shutdown();
|
||||||
|
m_requestThreadCancelled = true;
|
||||||
|
m_requestThread->join();
|
||||||
|
delete m_requestThread;
|
||||||
// Always shutdown the completion queue after the server.
|
// Always shutdown the completion queue after the server.
|
||||||
cq_->Shutdown();
|
cq_->Shutdown();
|
||||||
server_ = 0;
|
server_ = 0;
|
||||||
@@ -64,6 +70,10 @@ public:
|
|||||||
server_ = m_builder.BuildAndStart();
|
server_ = m_builder.BuildAndStart();
|
||||||
std::cout << "grpcPlugin Bullet Physics GRPC server listening on " << hostNamePort << std::endl;
|
std::cout << "grpcPlugin Bullet Physics GRPC server listening on " << hostNamePort << std::endl;
|
||||||
|
|
||||||
|
//Start the thread to gather the requests.
|
||||||
|
m_requestThreadCancelled = false;
|
||||||
|
m_requestThread = new std::thread(&ServerImpl::GatherRequests, this);
|
||||||
|
|
||||||
// Proceed to the server's main loop.
|
// Proceed to the server's main loop.
|
||||||
InitRpcs(comProc);
|
InitRpcs(comProc);
|
||||||
}
|
}
|
||||||
@@ -72,25 +82,13 @@ public:
|
|||||||
bool HandleSingleRpc()
|
bool HandleSingleRpc()
|
||||||
{
|
{
|
||||||
CallData::CallStatus status = CallData::CallStatus::CREATE;
|
CallData::CallStatus status = CallData::CallStatus::CREATE;
|
||||||
|
std::lock_guard<std::mutex> guard(m_queueMutex);
|
||||||
|
if (!m_requestQueue.empty()) {
|
||||||
|
void* tag = m_requestQueue.front();
|
||||||
|
m_requestQueue.pop_front();
|
||||||
|
status = static_cast<CallData*>(tag)->Proceed();
|
||||||
|
}
|
||||||
|
|
||||||
{
|
|
||||||
void* tag; // uniquely identifies a request.
|
|
||||||
bool ok;
|
|
||||||
|
|
||||||
// Block waiting to read the next event from the completion queue. The
|
|
||||||
// event is uniquely identified by its tag, which in this case is the
|
|
||||||
// memory address of a CallData instance.
|
|
||||||
// The return value of Next should always be checked. This return value
|
|
||||||
// tells us whether there is any kind of event or cq_ is shutting down.
|
|
||||||
|
|
||||||
grpc::CompletionQueue::NextStatus nextStatus = cq_->AsyncNext(&tag, &ok, gpr_now(GPR_CLOCK_MONOTONIC));
|
|
||||||
if (nextStatus == grpc::CompletionQueue::NextStatus::GOT_EVENT)
|
|
||||||
{
|
|
||||||
//GPR_ASSERT(cq_->Next(&tag, &ok));
|
|
||||||
GPR_ASSERT(ok);
|
|
||||||
status = static_cast<CallData*>(tag)->Proceed();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return status == CallData::CallStatus::TERMINATE;
|
return status == CallData::CallStatus::TERMINATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,6 +250,39 @@ private:
|
|||||||
std::unique_ptr<ServerCompletionQueue> cq_;
|
std::unique_ptr<ServerCompletionQueue> cq_;
|
||||||
PyBulletAPI::AsyncService service_;
|
PyBulletAPI::AsyncService service_;
|
||||||
std::unique_ptr<Server> server_;
|
std::unique_ptr<Server> server_;
|
||||||
|
|
||||||
|
// Mutex to protect access to the request queue variables (m_requestQueue,
|
||||||
|
// m_requestThread, m_requestThreadCancelled).
|
||||||
|
std::mutex m_queueMutex;
|
||||||
|
|
||||||
|
// List of outstanding request tags.
|
||||||
|
std::list<void*> m_requestQueue;
|
||||||
|
|
||||||
|
// Whether or not the gathering thread is cancelled.
|
||||||
|
bool m_requestThreadCancelled;
|
||||||
|
|
||||||
|
// Thread to gather requests from the completion queue.
|
||||||
|
std::thread* m_requestThread;
|
||||||
|
|
||||||
|
void GatherRequests() {
|
||||||
|
void* tag; // uniquely identifies a request.
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
while(!m_requestThreadCancelled) {
|
||||||
|
// Block waiting to read the next event from the completion queue. The
|
||||||
|
// event is uniquely identified by its tag, which in this case is the
|
||||||
|
// memory address of a CallData instance.
|
||||||
|
// The return value of Next should always be checked. This return value
|
||||||
|
// tells us whether there is any kind of event or cq_ is shutting down.
|
||||||
|
grpc::CompletionQueue::NextStatus nextStatus = cq_->AsyncNext(&tag, &ok, gpr_now(GPR_CLOCK_MONOTONIC));
|
||||||
|
if (nextStatus == grpc::CompletionQueue::NextStatus::GOT_EVENT)
|
||||||
|
{
|
||||||
|
GPR_ASSERT(ok);
|
||||||
|
std::lock_guard<std::mutex> guard(m_queueMutex);
|
||||||
|
m_requestQueue.push_back(tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct grpcMyClass
|
struct grpcMyClass
|
||||||
|
|||||||
Reference in New Issue
Block a user