BodyJointInfoUtility.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #ifndef BODY_JOINT_INFO_UTILITY_H
  2. #define BODY_JOINT_INFO_UTILITY_H
  3. #include "Bullet3Common/b3Logging.h"
  4. namespace Bullet
  5. {
  6. class btMultiBodyDoubleData;
  7. class btMultiBodyFloatData;
  8. };
  9. inline char* strDup(const char* const str)
  10. {
  11. #ifdef _WIN32
  12. return _strdup(str);
  13. #else
  14. return strdup(str);
  15. #endif
  16. }
  17. template <typename T, typename U> void addJointInfoFromMultiBodyData(const T* mb, U* bodyJoints, bool verboseOutput)
  18. {
  19. if (mb->m_baseName)
  20. {
  21. if (verboseOutput)
  22. {
  23. b3Printf("mb->m_baseName = %s\n", mb->m_baseName);
  24. }
  25. }
  26. int qOffset = 7;
  27. int uOffset = 6;
  28. for (int link = 0; link < mb->m_numLinks; link++)
  29. {
  30. {
  31. b3JointInfo info;
  32. info.m_flags = 0;
  33. info.m_jointIndex = link;
  34. info.m_qIndex =
  35. (0 < mb->m_links[link].m_posVarCount) ? qOffset : -1;
  36. info.m_uIndex =
  37. (0 < mb->m_links[link].m_dofCount) ? uOffset : -1;
  38. if (mb->m_links[link].m_linkName) {
  39. if (verboseOutput) {
  40. b3Printf("mb->m_links[%d].m_linkName = %s\n", link,
  41. mb->m_links[link].m_linkName);
  42. }
  43. info.m_linkName = strDup(mb->m_links[link].m_linkName);
  44. }
  45. if (mb->m_links[link].m_jointName) {
  46. if (verboseOutput) {
  47. b3Printf("mb->m_links[%d].m_jointName = %s\n", link,
  48. mb->m_links[link].m_jointName);
  49. }
  50. info.m_jointName = strDup(mb->m_links[link].m_jointName);
  51. }
  52. info.m_jointType = mb->m_links[link].m_jointType;
  53. info.m_jointDamping = mb->m_links[link].m_jointDamping;
  54. info.m_jointFriction = mb->m_links[link].m_jointFriction;
  55. if ((mb->m_links[link].m_jointType == eRevoluteType) ||
  56. (mb->m_links[link].m_jointType == ePrismaticType)) {
  57. info.m_flags |= JOINT_HAS_MOTORIZED_POWER;
  58. }
  59. bodyJoints->m_jointInfo.push_back(info);
  60. }
  61. qOffset += mb->m_links[link].m_posVarCount;
  62. uOffset += mb->m_links[link].m_dofCount;
  63. }
  64. }
  65. #endif //BODY_JOINT_INFO_UTILITY_H