pybullet/shared memory API: add some more check for out-of-bounds indices when setting up a command.
avoid many run-time memory allocations in btCompoundCompoundCollisionAlgorithm
This commit is contained in:
@@ -444,10 +444,12 @@ int b3JointControlSetDesiredPosition(b3SharedMemoryCommandHandle commandHandle,
|
|||||||
{
|
{
|
||||||
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
||||||
b3Assert(command);
|
b3Assert(command);
|
||||||
command->m_sendDesiredStateCommandArgument.m_desiredStateQ[qIndex] = value;
|
if ((qIndex>=0) && (qIndex < MAX_DEGREE_OF_FREEDOM))
|
||||||
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_Q;
|
{
|
||||||
command->m_sendDesiredStateCommandArgument.m_hasDesiredStateFlags[qIndex] |= SIM_DESIRED_STATE_HAS_Q;
|
command->m_sendDesiredStateCommandArgument.m_desiredStateQ[qIndex] = value;
|
||||||
|
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_Q;
|
||||||
|
command->m_sendDesiredStateCommandArgument.m_hasDesiredStateFlags[qIndex] |= SIM_DESIRED_STATE_HAS_Q;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,8 +457,7 @@ int b3JointControlSetKp(b3SharedMemoryCommandHandle commandHandle, int dofIndex,
|
|||||||
{
|
{
|
||||||
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
||||||
b3Assert(command);
|
b3Assert(command);
|
||||||
b3Assert(dofIndex>=0);
|
if ((dofIndex>=0) && (dofIndex < MAX_DEGREE_OF_FREEDOM))
|
||||||
if (dofIndex>=0)
|
|
||||||
{
|
{
|
||||||
command->m_sendDesiredStateCommandArgument.m_Kp[dofIndex] = value;
|
command->m_sendDesiredStateCommandArgument.m_Kp[dofIndex] = value;
|
||||||
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_KP;
|
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_KP;
|
||||||
@@ -469,8 +470,7 @@ int b3JointControlSetKd(b3SharedMemoryCommandHandle commandHandle, int dofIndex,
|
|||||||
{
|
{
|
||||||
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
||||||
b3Assert(command);
|
b3Assert(command);
|
||||||
b3Assert(dofIndex>=0);
|
if ((dofIndex>=0) && (dofIndex < MAX_DEGREE_OF_FREEDOM))
|
||||||
if (dofIndex>=0)
|
|
||||||
{
|
{
|
||||||
command->m_sendDesiredStateCommandArgument.m_Kd[dofIndex] = value;
|
command->m_sendDesiredStateCommandArgument.m_Kd[dofIndex] = value;
|
||||||
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_KD;
|
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_KD;
|
||||||
@@ -483,8 +483,7 @@ int b3JointControlSetDesiredVelocity(b3SharedMemoryCommandHandle commandHandle,
|
|||||||
{
|
{
|
||||||
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
||||||
b3Assert(command);
|
b3Assert(command);
|
||||||
b3Assert(dofIndex>=0);
|
if ((dofIndex>=0) && (dofIndex < MAX_DEGREE_OF_FREEDOM))
|
||||||
if (dofIndex>=0)
|
|
||||||
{
|
{
|
||||||
command->m_sendDesiredStateCommandArgument.m_desiredStateQdot[dofIndex] = value;
|
command->m_sendDesiredStateCommandArgument.m_desiredStateQdot[dofIndex] = value;
|
||||||
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_QDOT;
|
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_QDOT;
|
||||||
@@ -498,8 +497,7 @@ int b3JointControlSetMaximumForce(b3SharedMemoryCommandHandle commandHandle, int
|
|||||||
{
|
{
|
||||||
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
||||||
b3Assert(command);
|
b3Assert(command);
|
||||||
b3Assert(dofIndex>=0);
|
if ((dofIndex>=0) && (dofIndex < MAX_DEGREE_OF_FREEDOM))
|
||||||
if (dofIndex>=0)
|
|
||||||
{
|
{
|
||||||
command->m_sendDesiredStateCommandArgument.m_desiredStateForceTorque[dofIndex] = value;
|
command->m_sendDesiredStateCommandArgument.m_desiredStateForceTorque[dofIndex] = value;
|
||||||
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_MAX_FORCE;
|
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_MAX_FORCE;
|
||||||
@@ -512,8 +510,7 @@ int b3JointControlSetDesiredForceTorque(b3SharedMemoryCommandHandle commandHandl
|
|||||||
{
|
{
|
||||||
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
||||||
b3Assert(command);
|
b3Assert(command);
|
||||||
b3Assert(dofIndex>=0);
|
if ((dofIndex>=0) && (dofIndex < MAX_DEGREE_OF_FREEDOM))
|
||||||
if (dofIndex>=0)
|
|
||||||
{
|
{
|
||||||
command->m_sendDesiredStateCommandArgument.m_desiredStateForceTorque[dofIndex] = value;
|
command->m_sendDesiredStateCommandArgument.m_desiredStateForceTorque[dofIndex] = value;
|
||||||
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_MAX_FORCE;
|
command->m_updateFlags |= SIM_DESIRED_STATE_HAS_MAX_FORCE;
|
||||||
@@ -547,13 +544,16 @@ int b3GetJointState(b3PhysicsClientHandle physClient, b3SharedMemoryStatusHandle
|
|||||||
bool result = b3GetJointInfo(physClient, bodyIndex,jointIndex, &info);
|
bool result = b3GetJointInfo(physClient, bodyIndex,jointIndex, &info);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
state->m_jointPosition = status->m_sendActualStateArgs.m_actualStateQ[info.m_qIndex];
|
if ((info.m_qIndex>=0) && (info.m_uIndex>=0) && (info.m_qIndex < MAX_DEGREE_OF_FREEDOM) && (info.m_uIndex < MAX_DEGREE_OF_FREEDOM))
|
||||||
state->m_jointVelocity = status->m_sendActualStateArgs.m_actualStateQdot[info.m_uIndex];
|
{
|
||||||
for (int ii(0); ii < 6; ++ii) {
|
state->m_jointPosition = status->m_sendActualStateArgs.m_actualStateQ[info.m_qIndex];
|
||||||
state->m_jointForceTorque[ii] = status->m_sendActualStateArgs.m_jointReactionForces[6 * jointIndex + ii];
|
state->m_jointVelocity = status->m_sendActualStateArgs.m_actualStateQdot[info.m_uIndex];
|
||||||
|
for (int ii(0); ii < 6; ++ii) {
|
||||||
|
state->m_jointForceTorque[ii] = status->m_sendActualStateArgs.m_jointReactionForces[6 * jointIndex + ii];
|
||||||
|
}
|
||||||
|
state->m_jointMotorTorque = status->m_sendActualStateArgs.m_jointMotorForce[jointIndex];
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
state->m_jointMotorTorque = status->m_sendActualStateArgs.m_jointMotorForce[jointIndex];
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ subject to the following restrictions:
|
|||||||
#include "BulletCollision/CollisionDispatch/btManifoldResult.h"
|
#include "BulletCollision/CollisionDispatch/btManifoldResult.h"
|
||||||
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
|
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
|
||||||
|
|
||||||
|
//USE_LOCAL_STACK will avoid most (often all) dynamic memory allocations due to resizing in processCollision and MycollideTT
|
||||||
|
#define USE_LOCAL_STACK 1
|
||||||
|
|
||||||
btShapePairCallback gCompoundCompoundChildShapePairCallback = 0;
|
btShapePairCallback gCompoundCompoundChildShapePairCallback = 0;
|
||||||
|
|
||||||
@@ -251,7 +253,12 @@ static inline void MycollideTT( const btDbvtNode* root0,
|
|||||||
int depth=1;
|
int depth=1;
|
||||||
int treshold=btDbvt::DOUBLE_STACKSIZE-4;
|
int treshold=btDbvt::DOUBLE_STACKSIZE-4;
|
||||||
btAlignedObjectArray<btDbvt::sStkNN> stkStack;
|
btAlignedObjectArray<btDbvt::sStkNN> stkStack;
|
||||||
|
#ifdef USE_LOCAL_STACK
|
||||||
|
ATTRIBUTE_ALIGNED16(btDbvt::sStkNN localStack[btDbvt::DOUBLE_STACKSIZE]);
|
||||||
|
stkStack.initializeFromBuffer(&localStack,btDbvt::DOUBLE_STACKSIZE,btDbvt::DOUBLE_STACKSIZE);
|
||||||
|
#else
|
||||||
stkStack.resize(btDbvt::DOUBLE_STACKSIZE);
|
stkStack.resize(btDbvt::DOUBLE_STACKSIZE);
|
||||||
|
#endif
|
||||||
stkStack[0]=btDbvt::sStkNN(root0,root1);
|
stkStack[0]=btDbvt::sStkNN(root0,root1);
|
||||||
do {
|
do {
|
||||||
btDbvt::sStkNN p=stkStack[--depth];
|
btDbvt::sStkNN p=stkStack[--depth];
|
||||||
@@ -329,6 +336,10 @@ void btCompoundCompoundCollisionAlgorithm::processCollision (const btCollisionOb
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
btManifoldArray manifoldArray;
|
btManifoldArray manifoldArray;
|
||||||
|
#ifdef USE_LOCAL_STACK
|
||||||
|
btPersistentManifold localManifolds[4];
|
||||||
|
manifoldArray.initializeFromBuffer(&localManifolds,0,4);
|
||||||
|
#endif
|
||||||
btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
|
btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
|
||||||
for (i=0;i<pairs.size();i++)
|
for (i=0;i<pairs.size();i++)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user