PhysicsDirect.cpp 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849
  1. #include "PhysicsDirect.h"
  2. #include "PhysicsClientSharedMemory.h"
  3. #include "../CommonInterfaces/CommonGUIHelperInterface.h"
  4. #include "SharedMemoryCommands.h"
  5. #include "PhysicsCommandProcessorInterface.h"
  6. #include "../Utils/b3Clock.h"
  7. #include "LinearMath/btHashMap.h"
  8. #include "LinearMath/btAlignedObjectArray.h"
  9. #include "../../Extras/Serialize/BulletFileLoader/btBulletFile.h"
  10. #include "../../Extras/Serialize/BulletFileLoader/autogenerated/bullet.h"
  11. #include "BodyJointInfoUtility.h"
  12. #include <string>
  13. #include "SharedMemoryUserData.h"
  14. #include "LinearMath/btQuickprof.h"
  15. struct BodyJointInfoCache2
  16. {
  17. std::string m_baseName;
  18. btAlignedObjectArray<b3JointInfo> m_jointInfo;
  19. std::string m_bodyName;
  20. btAlignedObjectArray<int> m_userDataIds;
  21. int m_numDofs;
  22. ~BodyJointInfoCache2()
  23. {
  24. }
  25. };
  26. struct PhysicsDirectInternalData
  27. {
  28. DummyGUIHelper m_noGfx;
  29. btAlignedObjectArray<char> m_serverDNA;
  30. SharedMemoryCommand m_command;
  31. SharedMemoryStatus m_serverStatus;
  32. SharedMemoryCommand m_tmpInfoRequestCommand;
  33. SharedMemoryStatus m_tmpInfoStatus;
  34. bool m_hasStatus;
  35. bool m_verboseOutput;
  36. btAlignedObjectArray<TmpFloat3> m_debugLinesFrom;
  37. btAlignedObjectArray<TmpFloat3> m_debugLinesTo;
  38. btAlignedObjectArray<TmpFloat3> m_debugLinesColor;
  39. btHashMap<btHashInt, BodyJointInfoCache2*> m_bodyJointMap;
  40. btHashMap<btHashInt, b3UserConstraint> m_userConstraintInfoMap;
  41. btAlignedObjectArray<CProfileSample*> m_profileTimings;
  42. btHashMap<btHashString, std::string*> m_profileTimingStringArray;
  43. char m_bulletStreamDataServerToClient[SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE];
  44. btAlignedObjectArray<double> m_cachedMassMatrix;
  45. int m_cachedCameraPixelsWidth;
  46. int m_cachedCameraPixelsHeight;
  47. btAlignedObjectArray<unsigned char> m_cachedCameraPixelsRGBA;
  48. btAlignedObjectArray<float> m_cachedCameraDepthBuffer;
  49. btAlignedObjectArray<int> m_cachedSegmentationMask;
  50. btAlignedObjectArray<b3ContactPointData> m_cachedContactPoints;
  51. btAlignedObjectArray<b3OverlappingObject> m_cachedOverlappingObjects;
  52. btAlignedObjectArray<b3VisualShapeData> m_cachedVisualShapes;
  53. btAlignedObjectArray<b3CollisionShapeData> m_cachedCollisionShapes;
  54. b3MeshData m_cachedMeshData;
  55. btAlignedObjectArray<b3MeshVertex> m_cachedVertexPositions;
  56. btAlignedObjectArray<b3VRControllerEvent> m_cachedVREvents;
  57. btAlignedObjectArray<b3KeyboardEvent> m_cachedKeyboardEvents;
  58. btAlignedObjectArray<b3MouseEvent> m_cachedMouseEvents;
  59. btAlignedObjectArray<b3RayHitInfo> m_raycastHits;
  60. btHashMap<btHashInt, SharedMemoryUserData> m_userDataMap;
  61. btHashMap<SharedMemoryUserDataHashKey, int> m_userDataHandleLookup;
  62. btAlignedObjectArray<char> m_cachedReturnData;
  63. b3UserDataValue m_cachedReturnDataValue;
  64. PhysicsCommandProcessorInterface* m_commandProcessor;
  65. bool m_ownsCommandProcessor;
  66. double m_timeOutInSeconds;
  67. SendActualStateSharedMemoryStorage m_cachedState;
  68. PhysicsDirectInternalData()
  69. : m_hasStatus(false),
  70. m_verboseOutput(false),
  71. m_cachedCameraPixelsWidth(0),
  72. m_cachedCameraPixelsHeight(0),
  73. m_commandProcessor(NULL),
  74. m_ownsCommandProcessor(false),
  75. m_timeOutInSeconds(1e30)
  76. {
  77. memset(&m_cachedMeshData.m_numVertices, 0, sizeof(b3MeshData));
  78. memset(&m_command, 0, sizeof(m_command));
  79. memset(&m_serverStatus, 0, sizeof(m_serverStatus));
  80. memset(m_bulletStreamDataServerToClient, 0, sizeof(m_bulletStreamDataServerToClient));
  81. }
  82. };
  83. PhysicsDirect::PhysicsDirect(PhysicsCommandProcessorInterface* physSdk, bool passSdkOwnership)
  84. {
  85. int sz = sizeof(SharedMemoryCommand);
  86. int sz2 = sizeof(SharedMemoryStatus);
  87. m_data = new PhysicsDirectInternalData;
  88. m_data->m_commandProcessor = physSdk;
  89. m_data->m_ownsCommandProcessor = passSdkOwnership;
  90. }
  91. PhysicsDirect::~PhysicsDirect()
  92. {
  93. for (int i = 0; i < m_data->m_profileTimingStringArray.size(); i++)
  94. {
  95. std::string** str = m_data->m_profileTimingStringArray.getAtIndex(i);
  96. if (str)
  97. {
  98. delete *str;
  99. }
  100. }
  101. m_data->m_profileTimingStringArray.clear();
  102. if (m_data->m_commandProcessor->isConnected())
  103. {
  104. m_data->m_commandProcessor->disconnect();
  105. }
  106. if (m_data->m_ownsCommandProcessor)
  107. {
  108. delete m_data->m_commandProcessor;
  109. }
  110. resetData();
  111. delete m_data;
  112. }
  113. void PhysicsDirect::resetData()
  114. {
  115. m_data->m_debugLinesFrom.clear();
  116. m_data->m_debugLinesTo.clear();
  117. m_data->m_debugLinesColor.clear();
  118. m_data->m_userConstraintInfoMap.clear();
  119. m_data->m_userDataMap.clear();
  120. m_data->m_userDataHandleLookup.clear();
  121. clearCachedBodies();
  122. }
  123. void PhysicsDirect::clearCachedBodies()
  124. {
  125. for (int i = 0; i < m_data->m_bodyJointMap.size(); i++)
  126. {
  127. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap.getAtIndex(i);
  128. if (bodyJointsPtr && *bodyJointsPtr)
  129. {
  130. delete (*bodyJointsPtr);
  131. }
  132. }
  133. m_data->m_bodyJointMap.clear();
  134. }
  135. // return true if connection succesfull, can also check 'isConnected'
  136. bool PhysicsDirect::connect()
  137. {
  138. bool connected = m_data->m_commandProcessor->connect();
  139. m_data->m_commandProcessor->setGuiHelper(&m_data->m_noGfx);
  140. if (connected)
  141. //also request serialization data
  142. {
  143. SharedMemoryCommand command;
  144. command.m_type = CMD_REQUEST_INTERNAL_DATA;
  145. bool hasStatus = m_data->m_commandProcessor->processCommand(command, m_data->m_serverStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  146. if (hasStatus)
  147. {
  148. postProcessStatus(m_data->m_serverStatus);
  149. }
  150. else
  151. {
  152. b3Clock clock;
  153. double timeSec = clock.getTimeInSeconds();
  154. while ((!hasStatus) && (clock.getTimeInSeconds() - timeSec < 10))
  155. {
  156. const SharedMemoryStatus* stat = processServerStatus();
  157. if (stat)
  158. {
  159. hasStatus = true;
  160. }
  161. }
  162. }
  163. }
  164. return connected;
  165. }
  166. // return true if connection succesfull, can also check 'isConnected'
  167. bool PhysicsDirect::connect(struct GUIHelperInterface* guiHelper)
  168. {
  169. bool connected = m_data->m_commandProcessor->connect();
  170. m_data->m_commandProcessor->setGuiHelper(guiHelper);
  171. return connected;
  172. }
  173. void PhysicsDirect::renderScene()
  174. {
  175. int renderFlags = 0;
  176. m_data->m_commandProcessor->renderScene(renderFlags);
  177. }
  178. void PhysicsDirect::debugDraw(int debugDrawMode)
  179. {
  180. m_data->m_commandProcessor->physicsDebugDraw(debugDrawMode);
  181. }
  182. ////todo: rename to 'disconnect'
  183. void PhysicsDirect::disconnectSharedMemory()
  184. {
  185. m_data->m_commandProcessor->disconnect();
  186. m_data->m_commandProcessor->setGuiHelper(0);
  187. }
  188. bool PhysicsDirect::isConnected() const
  189. {
  190. return m_data->m_commandProcessor->isConnected();
  191. }
  192. // return non-null if there is a status, nullptr otherwise
  193. const SharedMemoryStatus* PhysicsDirect::processServerStatus()
  194. {
  195. if (!m_data->m_hasStatus)
  196. {
  197. m_data->m_hasStatus = m_data->m_commandProcessor->receiveStatus(m_data->m_serverStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  198. }
  199. SharedMemoryStatus* stat = 0;
  200. if (m_data->m_hasStatus)
  201. {
  202. stat = &m_data->m_serverStatus;
  203. postProcessStatus(m_data->m_serverStatus);
  204. m_data->m_hasStatus = false;
  205. }
  206. return stat;
  207. }
  208. SharedMemoryCommand* PhysicsDirect::getAvailableSharedMemoryCommand()
  209. {
  210. return &m_data->m_command;
  211. }
  212. bool PhysicsDirect::canSubmitCommand() const
  213. {
  214. return m_data->m_commandProcessor->isConnected();
  215. }
  216. bool PhysicsDirect::processDebugLines(const struct SharedMemoryCommand& orgCommand)
  217. {
  218. SharedMemoryCommand command = orgCommand;
  219. const SharedMemoryStatus& serverCmd = m_data->m_serverStatus;
  220. do
  221. {
  222. bool hasStatus = m_data->m_commandProcessor->processCommand(command, m_data->m_serverStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  223. b3Clock clock;
  224. double startTime = clock.getTimeInSeconds();
  225. double timeOutInSeconds = m_data->m_timeOutInSeconds;
  226. while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
  227. {
  228. const SharedMemoryStatus* stat = processServerStatus();
  229. if (stat)
  230. {
  231. hasStatus = true;
  232. }
  233. }
  234. m_data->m_hasStatus = hasStatus;
  235. if (hasStatus)
  236. {
  237. btAssert(m_data->m_serverStatus.m_type == CMD_DEBUG_LINES_COMPLETED);
  238. if (m_data->m_verboseOutput)
  239. {
  240. b3Printf("Success receiving %d debug lines",
  241. serverCmd.m_sendDebugLinesArgs.m_numDebugLines);
  242. }
  243. int numLines = serverCmd.m_sendDebugLinesArgs.m_numDebugLines;
  244. float* linesFrom =
  245. (float*)&m_data->m_bulletStreamDataServerToClient[0];
  246. float* linesTo =
  247. (float*)(&m_data->m_bulletStreamDataServerToClient[0] +
  248. numLines * 3 * sizeof(float));
  249. float* linesColor =
  250. (float*)(&m_data->m_bulletStreamDataServerToClient[0] +
  251. 2 * numLines * 3 * sizeof(float));
  252. m_data->m_debugLinesFrom.resize(serverCmd.m_sendDebugLinesArgs.m_startingLineIndex +
  253. numLines);
  254. m_data->m_debugLinesTo.resize(serverCmd.m_sendDebugLinesArgs.m_startingLineIndex +
  255. numLines);
  256. m_data->m_debugLinesColor.resize(
  257. serverCmd.m_sendDebugLinesArgs.m_startingLineIndex + numLines);
  258. for (int i = 0; i < numLines; i++)
  259. {
  260. TmpFloat3 from = CreateTmpFloat3(linesFrom[i * 3], linesFrom[i * 3 + 1],
  261. linesFrom[i * 3 + 2]);
  262. TmpFloat3 to =
  263. CreateTmpFloat3(linesTo[i * 3], linesTo[i * 3 + 1], linesTo[i * 3 + 2]);
  264. TmpFloat3 color = CreateTmpFloat3(linesColor[i * 3], linesColor[i * 3 + 1],
  265. linesColor[i * 3 + 2]);
  266. m_data
  267. ->m_debugLinesFrom[serverCmd.m_sendDebugLinesArgs.m_startingLineIndex + i] =
  268. from;
  269. m_data->m_debugLinesTo[serverCmd.m_sendDebugLinesArgs.m_startingLineIndex + i] =
  270. to;
  271. m_data->m_debugLinesColor[serverCmd.m_sendDebugLinesArgs.m_startingLineIndex +
  272. i] = color;
  273. }
  274. if (serverCmd.m_sendDebugLinesArgs.m_numRemainingDebugLines > 0)
  275. {
  276. m_data->m_hasStatus = false;
  277. command.m_type = CMD_REQUEST_DEBUG_LINES;
  278. command.m_requestDebugLinesArguments.m_startingLineIndex =
  279. serverCmd.m_sendDebugLinesArgs.m_numDebugLines +
  280. serverCmd.m_sendDebugLinesArgs.m_startingLineIndex;
  281. }
  282. }
  283. } while (serverCmd.m_sendDebugLinesArgs.m_numRemainingDebugLines > 0);
  284. return m_data->m_hasStatus;
  285. }
  286. bool PhysicsDirect::processVisualShapeData(const struct SharedMemoryCommand& orgCommand)
  287. {
  288. SharedMemoryCommand command = orgCommand;
  289. const SharedMemoryStatus& serverCmd = m_data->m_serverStatus;
  290. do
  291. {
  292. bool hasStatus = m_data->m_commandProcessor->processCommand(command, m_data->m_serverStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  293. b3Clock clock;
  294. double startTime = clock.getTimeInSeconds();
  295. double timeOutInSeconds = m_data->m_timeOutInSeconds;
  296. while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
  297. {
  298. const SharedMemoryStatus* stat = processServerStatus();
  299. if (stat)
  300. {
  301. hasStatus = true;
  302. }
  303. }
  304. m_data->m_hasStatus = hasStatus;
  305. if (hasStatus)
  306. {
  307. if (m_data->m_verboseOutput)
  308. {
  309. b3Printf("Visual Shape Information Request OK\n");
  310. }
  311. int startVisualShapeIndex = serverCmd.m_sendVisualShapeArgs.m_startingVisualShapeIndex;
  312. int numVisualShapesCopied = serverCmd.m_sendVisualShapeArgs.m_numVisualShapesCopied;
  313. m_data->m_cachedVisualShapes.resize(startVisualShapeIndex + numVisualShapesCopied);
  314. b3VisualShapeData* shapeData = (b3VisualShapeData*)&m_data->m_bulletStreamDataServerToClient[0];
  315. for (int i = 0; i < numVisualShapesCopied; i++)
  316. {
  317. m_data->m_cachedVisualShapes[startVisualShapeIndex + i] = shapeData[i];
  318. }
  319. if (serverCmd.m_sendVisualShapeArgs.m_numRemainingVisualShapes > 0 && serverCmd.m_sendVisualShapeArgs.m_numVisualShapesCopied)
  320. {
  321. m_data->m_hasStatus = false;
  322. command.m_type = CMD_REQUEST_VISUAL_SHAPE_INFO;
  323. command.m_requestVisualShapeDataArguments.m_startingVisualShapeIndex = serverCmd.m_sendVisualShapeArgs.m_startingVisualShapeIndex + serverCmd.m_sendVisualShapeArgs.m_numVisualShapesCopied;
  324. command.m_requestVisualShapeDataArguments.m_bodyUniqueId = serverCmd.m_sendVisualShapeArgs.m_bodyUniqueId;
  325. }
  326. }
  327. } while (serverCmd.m_sendVisualShapeArgs.m_numRemainingVisualShapes > 0 && serverCmd.m_sendVisualShapeArgs.m_numVisualShapesCopied);
  328. return m_data->m_hasStatus;
  329. }
  330. bool PhysicsDirect::processOverlappingObjects(const struct SharedMemoryCommand& orgCommand)
  331. {
  332. SharedMemoryCommand command = orgCommand;
  333. const SharedMemoryStatus& serverCmd = m_data->m_serverStatus;
  334. do
  335. {
  336. bool hasStatus = m_data->m_commandProcessor->processCommand(command, m_data->m_serverStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  337. b3Clock clock;
  338. double startTime = clock.getTimeInSeconds();
  339. double timeOutInSeconds = m_data->m_timeOutInSeconds;
  340. while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
  341. {
  342. const SharedMemoryStatus* stat = processServerStatus();
  343. if (stat)
  344. {
  345. hasStatus = true;
  346. }
  347. }
  348. m_data->m_hasStatus = hasStatus;
  349. if (hasStatus)
  350. {
  351. if (m_data->m_verboseOutput)
  352. {
  353. b3Printf("Overlapping Objects Request OK\n");
  354. }
  355. int startOverlapIndex = serverCmd.m_sendOverlappingObjectsArgs.m_startingOverlappingObjectIndex;
  356. int numOverlapCopied = serverCmd.m_sendOverlappingObjectsArgs.m_numOverlappingObjectsCopied;
  357. m_data->m_cachedOverlappingObjects.resize(startOverlapIndex + numOverlapCopied);
  358. b3OverlappingObject* objects = (b3OverlappingObject*)&m_data->m_bulletStreamDataServerToClient[0];
  359. for (int i = 0; i < numOverlapCopied; i++)
  360. {
  361. m_data->m_cachedOverlappingObjects[startOverlapIndex + i] = objects[i];
  362. }
  363. if (serverCmd.m_sendOverlappingObjectsArgs.m_numRemainingOverlappingObjects > 0 && serverCmd.m_sendOverlappingObjectsArgs.m_numOverlappingObjectsCopied)
  364. {
  365. m_data->m_hasStatus = false;
  366. command.m_type = CMD_REQUEST_AABB_OVERLAP;
  367. command.m_requestOverlappingObjectsArgs.m_startingOverlappingObjectIndex = serverCmd.m_sendOverlappingObjectsArgs.m_startingOverlappingObjectIndex + serverCmd.m_sendOverlappingObjectsArgs.m_numOverlappingObjectsCopied;
  368. }
  369. }
  370. } while (serverCmd.m_sendOverlappingObjectsArgs.m_numRemainingOverlappingObjects > 0 && serverCmd.m_sendOverlappingObjectsArgs.m_numOverlappingObjectsCopied);
  371. return m_data->m_hasStatus;
  372. }
  373. bool PhysicsDirect::processContactPointData(const struct SharedMemoryCommand& orgCommand)
  374. {
  375. SharedMemoryCommand command = orgCommand;
  376. const SharedMemoryStatus& serverCmd = m_data->m_serverStatus;
  377. do
  378. {
  379. bool hasStatus = m_data->m_commandProcessor->processCommand(command, m_data->m_serverStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  380. b3Clock clock;
  381. double startTime = clock.getTimeInSeconds();
  382. double timeOutInSeconds = m_data->m_timeOutInSeconds;
  383. while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
  384. {
  385. const SharedMemoryStatus* stat = processServerStatus();
  386. if (stat)
  387. {
  388. hasStatus = true;
  389. }
  390. }
  391. m_data->m_hasStatus = hasStatus;
  392. if (hasStatus)
  393. {
  394. if (m_data->m_verboseOutput)
  395. {
  396. b3Printf("Contact Point Information Request OK\n");
  397. }
  398. int startContactIndex = serverCmd.m_sendContactPointArgs.m_startingContactPointIndex;
  399. int numContactsCopied = serverCmd.m_sendContactPointArgs.m_numContactPointsCopied;
  400. m_data->m_cachedContactPoints.resize(startContactIndex + numContactsCopied);
  401. b3ContactPointData* contactData = (b3ContactPointData*)&m_data->m_bulletStreamDataServerToClient[0];
  402. for (int i = 0; i < numContactsCopied; i++)
  403. {
  404. m_data->m_cachedContactPoints[startContactIndex + i] = contactData[i];
  405. }
  406. if (serverCmd.m_sendContactPointArgs.m_numRemainingContactPoints > 0 && serverCmd.m_sendContactPointArgs.m_numContactPointsCopied)
  407. {
  408. m_data->m_hasStatus = false;
  409. command.m_type = CMD_REQUEST_CONTACT_POINT_INFORMATION;
  410. command.m_requestContactPointArguments.m_startingContactPointIndex = serverCmd.m_sendContactPointArgs.m_startingContactPointIndex + serverCmd.m_sendContactPointArgs.m_numContactPointsCopied;
  411. command.m_requestContactPointArguments.m_objectAIndexFilter = -1;
  412. command.m_requestContactPointArguments.m_objectBIndexFilter = -1;
  413. }
  414. }
  415. } while (serverCmd.m_sendContactPointArgs.m_numRemainingContactPoints > 0 && serverCmd.m_sendContactPointArgs.m_numContactPointsCopied);
  416. return m_data->m_hasStatus;
  417. }
  418. bool PhysicsDirect::processCamera(const struct SharedMemoryCommand& orgCommand)
  419. {
  420. SharedMemoryCommand command = orgCommand;
  421. const SharedMemoryStatus& serverCmd = m_data->m_serverStatus;
  422. do
  423. {
  424. bool hasStatus = m_data->m_commandProcessor->processCommand(command, m_data->m_serverStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  425. b3Clock clock;
  426. double startTime = clock.getTimeInSeconds();
  427. double timeOutInSeconds = m_data->m_timeOutInSeconds;
  428. while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
  429. {
  430. const SharedMemoryStatus* stat = processServerStatus();
  431. if (stat)
  432. {
  433. hasStatus = true;
  434. }
  435. }
  436. m_data->m_hasStatus = hasStatus;
  437. if (hasStatus)
  438. {
  439. btAssert(m_data->m_serverStatus.m_type == CMD_CAMERA_IMAGE_COMPLETED);
  440. if (m_data->m_verboseOutput)
  441. {
  442. b3Printf("Camera image OK\n");
  443. }
  444. int numBytesPerPixel = 4; //RGBA
  445. int numTotalPixels = serverCmd.m_sendPixelDataArguments.m_startingPixelIndex +
  446. serverCmd.m_sendPixelDataArguments.m_numPixelsCopied +
  447. serverCmd.m_sendPixelDataArguments.m_numRemainingPixels;
  448. m_data->m_cachedCameraPixelsWidth = 0;
  449. m_data->m_cachedCameraPixelsHeight = 0;
  450. int numPixels = serverCmd.m_sendPixelDataArguments.m_imageWidth * serverCmd.m_sendPixelDataArguments.m_imageHeight;
  451. m_data->m_cachedCameraPixelsRGBA.reserve(numPixels * numBytesPerPixel);
  452. m_data->m_cachedCameraDepthBuffer.resize(numTotalPixels);
  453. m_data->m_cachedSegmentationMask.resize(numTotalPixels);
  454. m_data->m_cachedCameraPixelsRGBA.resize(numTotalPixels * numBytesPerPixel);
  455. unsigned char* rgbaPixelsReceived =
  456. (unsigned char*)&m_data->m_bulletStreamDataServerToClient[0];
  457. float* depthBuffer = (float*)&(m_data->m_bulletStreamDataServerToClient[serverCmd.m_sendPixelDataArguments.m_numPixelsCopied * 4]);
  458. int* segmentationMaskBuffer = (int*)&(m_data->m_bulletStreamDataServerToClient[serverCmd.m_sendPixelDataArguments.m_numPixelsCopied * 8]);
  459. // printf("pixel = %d\n", rgbaPixelsReceived[0]);
  460. for (int i = 0; i < serverCmd.m_sendPixelDataArguments.m_numPixelsCopied; i++)
  461. {
  462. m_data->m_cachedCameraDepthBuffer[i + serverCmd.m_sendPixelDataArguments.m_startingPixelIndex] = depthBuffer[i];
  463. }
  464. for (int i = 0; i < serverCmd.m_sendPixelDataArguments.m_numPixelsCopied; i++)
  465. {
  466. m_data->m_cachedSegmentationMask[i + serverCmd.m_sendPixelDataArguments.m_startingPixelIndex] = segmentationMaskBuffer[i];
  467. }
  468. for (int i = 0; i < serverCmd.m_sendPixelDataArguments.m_numPixelsCopied * numBytesPerPixel; i++)
  469. {
  470. m_data->m_cachedCameraPixelsRGBA[i + serverCmd.m_sendPixelDataArguments.m_startingPixelIndex * numBytesPerPixel] = rgbaPixelsReceived[i];
  471. }
  472. if (serverCmd.m_sendPixelDataArguments.m_numRemainingPixels > 0 && serverCmd.m_sendPixelDataArguments.m_numPixelsCopied)
  473. {
  474. m_data->m_hasStatus = false;
  475. // continue requesting remaining pixels
  476. command.m_type = CMD_REQUEST_CAMERA_IMAGE_DATA;
  477. command.m_requestPixelDataArguments.m_startPixelIndex =
  478. serverCmd.m_sendPixelDataArguments.m_startingPixelIndex +
  479. serverCmd.m_sendPixelDataArguments.m_numPixelsCopied;
  480. }
  481. else
  482. {
  483. m_data->m_cachedCameraPixelsWidth = serverCmd.m_sendPixelDataArguments.m_imageWidth;
  484. m_data->m_cachedCameraPixelsHeight = serverCmd.m_sendPixelDataArguments.m_imageHeight;
  485. }
  486. }
  487. } while (serverCmd.m_sendPixelDataArguments.m_numRemainingPixels > 0 && serverCmd.m_sendPixelDataArguments.m_numPixelsCopied);
  488. return m_data->m_hasStatus;
  489. }
  490. bool PhysicsDirect::processMeshData(const struct SharedMemoryCommand& orgCommand)
  491. {
  492. SharedMemoryCommand command = orgCommand;
  493. const SharedMemoryStatus& serverCmd = m_data->m_serverStatus;
  494. do
  495. {
  496. bool hasStatus = m_data->m_commandProcessor->processCommand(command, m_data->m_serverStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  497. b3Clock clock;
  498. double startTime = clock.getTimeInSeconds();
  499. double timeOutInSeconds = m_data->m_timeOutInSeconds;
  500. while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
  501. {
  502. const SharedMemoryStatus* stat = processServerStatus();
  503. if (stat)
  504. {
  505. hasStatus = true;
  506. }
  507. }
  508. m_data->m_hasStatus = hasStatus;
  509. if (hasStatus)
  510. {
  511. btAssert(m_data->m_serverStatus.m_type == CMD_REQUEST_MESH_DATA_COMPLETED);
  512. if (m_data->m_verboseOutput)
  513. {
  514. b3Printf("Mesh data OK\n");
  515. }
  516. const b3SendMeshDataArgs& args = serverCmd.m_sendMeshDataArgs;
  517. int numTotalPixels = args.m_startingVertex +
  518. args.m_numVerticesCopied + args.m_numVerticesRemaining;
  519. btVector3* verticesReceived =
  520. (btVector3*)&m_data->m_bulletStreamDataServerToClient[0];
  521. m_data->m_cachedVertexPositions.resize(args.m_startingVertex +
  522. args.m_numVerticesCopied);
  523. for (int i = 0; i < args.m_numVerticesCopied; i++)
  524. {
  525. m_data->m_cachedVertexPositions[i + args.m_startingVertex].x = verticesReceived[i].x();
  526. m_data->m_cachedVertexPositions[i + args.m_startingVertex].y = verticesReceived[i].y();
  527. m_data->m_cachedVertexPositions[i + args.m_startingVertex].z = verticesReceived[i].z();
  528. m_data->m_cachedVertexPositions[i + args.m_startingVertex].w = verticesReceived[i].w();
  529. }
  530. if (args.m_numVerticesRemaining > 0 && args.m_numVerticesCopied)
  531. {
  532. m_data->m_hasStatus = false;
  533. // continue requesting remaining vertices
  534. command.m_type = CMD_REQUEST_MESH_DATA;
  535. command.m_requestMeshDataArgs.m_startingVertex =
  536. args.m_startingVertex + args.m_numVerticesCopied;
  537. }
  538. else
  539. {
  540. m_data->m_cachedMeshData.m_numVertices = args.m_startingVertex +
  541. args.m_numVerticesCopied;
  542. }
  543. }
  544. } while (serverCmd.m_sendMeshDataArgs.m_numVerticesRemaining > 0 && serverCmd.m_sendMeshDataArgs.m_numVerticesCopied);
  545. return m_data->m_hasStatus;
  546. }
  547. void PhysicsDirect::processBodyJointInfo(int bodyUniqueId, const SharedMemoryStatus& serverCmd)
  548. {
  549. BodyJointInfoCache2** cachePtr = m_data->m_bodyJointMap[bodyUniqueId];
  550. //don't process same bodyUniqueId multiple times
  551. if (cachePtr)
  552. {
  553. return;
  554. }
  555. bParse::btBulletFile bf(
  556. &m_data->m_bulletStreamDataServerToClient[0],
  557. serverCmd.m_numDataStreamBytes);
  558. if (m_data->m_serverDNA.size())
  559. {
  560. bf.setFileDNA(false, &m_data->m_serverDNA[0], m_data->m_serverDNA.size());
  561. }
  562. else
  563. {
  564. bf.setFileDNAisMemoryDNA();
  565. }
  566. {
  567. BT_PROFILE("bf.parse");
  568. bf.parse(false);
  569. }
  570. BodyJointInfoCache2* bodyJoints = new BodyJointInfoCache2;
  571. m_data->m_bodyJointMap.insert(bodyUniqueId, bodyJoints);
  572. bodyJoints->m_bodyName = serverCmd.m_dataStreamArguments.m_bodyName;
  573. for (int i = 0; i < bf.m_multiBodies.size(); i++)
  574. {
  575. int flag = bf.getFlags();
  576. if ((flag & bParse::FD_DOUBLE_PRECISION) != 0)
  577. {
  578. Bullet::btMultiBodyDoubleData* mb =
  579. (Bullet::btMultiBodyDoubleData*)bf.m_multiBodies[i];
  580. if (mb->m_baseName)
  581. {
  582. bodyJoints->m_baseName = mb->m_baseName;
  583. }
  584. addJointInfoFromMultiBodyData(mb, bodyJoints, m_data->m_verboseOutput);
  585. }
  586. else
  587. {
  588. Bullet::btMultiBodyFloatData* mb =
  589. (Bullet::btMultiBodyFloatData*)bf.m_multiBodies[i];
  590. if (mb->m_baseName)
  591. {
  592. bodyJoints->m_baseName = mb->m_baseName;
  593. }
  594. addJointInfoFromMultiBodyData(mb, bodyJoints, m_data->m_verboseOutput);
  595. }
  596. }
  597. if (bf.ok())
  598. {
  599. if (m_data->m_verboseOutput)
  600. {
  601. b3Printf("Received robot description ok!\n");
  602. }
  603. }
  604. else
  605. {
  606. b3Warning("Robot description not received");
  607. }
  608. }
  609. void PhysicsDirect::processAddUserData(const struct SharedMemoryStatus& serverCmd)
  610. {
  611. const UserDataResponseArgs response = serverCmd.m_userDataResponseArgs;
  612. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap[response.m_bodyUniqueId];
  613. if (bodyJointsPtr && *bodyJointsPtr)
  614. {
  615. const char* dataStream = m_data->m_bulletStreamDataServerToClient;
  616. SharedMemoryUserData* userData = m_data->m_userDataMap[response.m_userDataId];
  617. if (userData)
  618. {
  619. // Only replace the value.
  620. userData->replaceValue(dataStream, response.m_valueLength, response.m_valueType);
  621. }
  622. else
  623. {
  624. // Add a new user data entry.
  625. const char* key = response.m_key;
  626. m_data->m_userDataMap.insert(response.m_userDataId, SharedMemoryUserData(key, response.m_bodyUniqueId, response.m_linkIndex, response.m_visualShapeIndex));
  627. userData = m_data->m_userDataMap[response.m_userDataId];
  628. userData->replaceValue(dataStream, response.m_valueLength, response.m_valueType);
  629. m_data->m_userDataHandleLookup.insert(SharedMemoryUserDataHashKey(userData), response.m_userDataId);
  630. (*bodyJointsPtr)->m_userDataIds.push_back(response.m_userDataId);
  631. }
  632. }
  633. }
  634. void PhysicsDirect::postProcessStatus(const struct SharedMemoryStatus& serverCmd)
  635. {
  636. switch (serverCmd.m_type)
  637. {
  638. case CMD_REQUEST_RAY_CAST_INTERSECTIONS_COMPLETED:
  639. {
  640. if (m_data->m_verboseOutput)
  641. {
  642. b3Printf("Raycast completed");
  643. }
  644. m_data->m_raycastHits.clear();
  645. b3RayHitInfo* rayHits = (b3RayHitInfo*)m_data->m_bulletStreamDataServerToClient;
  646. for (int i = 0; i < serverCmd.m_raycastHits.m_numRaycastHits; i++)
  647. {
  648. m_data->m_raycastHits.push_back(rayHits[i]);
  649. }
  650. break;
  651. }
  652. case CMD_REQUEST_VR_EVENTS_DATA_COMPLETED:
  653. {
  654. if (m_data->m_verboseOutput)
  655. {
  656. b3Printf("Request VR Events completed");
  657. }
  658. m_data->m_cachedVREvents.resize(serverCmd.m_sendVREvents.m_numVRControllerEvents);
  659. for (int i = 0; i < serverCmd.m_sendVREvents.m_numVRControllerEvents; i++)
  660. {
  661. m_data->m_cachedVREvents[i] = serverCmd.m_sendVREvents.m_controllerEvents[i];
  662. }
  663. break;
  664. }
  665. case CMD_REQUEST_KEYBOARD_EVENTS_DATA_COMPLETED:
  666. {
  667. if (m_data->m_verboseOutput)
  668. {
  669. b3Printf("Request keyboard events completed");
  670. }
  671. m_data->m_cachedKeyboardEvents.resize(serverCmd.m_sendKeyboardEvents.m_numKeyboardEvents);
  672. for (int i = 0; i < serverCmd.m_sendKeyboardEvents.m_numKeyboardEvents; i++)
  673. {
  674. m_data->m_cachedKeyboardEvents[i] = serverCmd.m_sendKeyboardEvents.m_keyboardEvents[i];
  675. }
  676. break;
  677. }
  678. case CMD_REQUEST_MOUSE_EVENTS_DATA_COMPLETED:
  679. {
  680. B3_PROFILE("CMD_REQUEST_MOUSE_EVENTS_DATA_COMPLETED");
  681. if (m_data->m_verboseOutput)
  682. {
  683. b3Printf("Request mouse events completed");
  684. }
  685. m_data->m_cachedMouseEvents.resize(serverCmd.m_sendMouseEvents.m_numMouseEvents);
  686. for (int i = 0; i < serverCmd.m_sendMouseEvents.m_numMouseEvents; i++)
  687. {
  688. m_data->m_cachedMouseEvents[i] = serverCmd.m_sendMouseEvents.m_mouseEvents[i];
  689. }
  690. break;
  691. }
  692. case CMD_REQUEST_INTERNAL_DATA_COMPLETED:
  693. {
  694. if (serverCmd.m_numDataStreamBytes)
  695. {
  696. int numStreamBytes = serverCmd.m_numDataStreamBytes;
  697. m_data->m_serverDNA.resize(numStreamBytes);
  698. for (int i = 0; i < numStreamBytes; i++)
  699. {
  700. m_data->m_serverDNA[i] = m_data->m_bulletStreamDataServerToClient[i];
  701. }
  702. }
  703. break;
  704. }
  705. case CMD_RESET_SIMULATION_COMPLETED:
  706. {
  707. resetData();
  708. break;
  709. }
  710. case CMD_USER_CONSTRAINT_INFO_COMPLETED:
  711. case CMD_USER_CONSTRAINT_COMPLETED:
  712. {
  713. int cid = serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId;
  714. m_data->m_userConstraintInfoMap.insert(cid, serverCmd.m_userConstraintResultArgs);
  715. break;
  716. }
  717. case CMD_REMOVE_USER_CONSTRAINT_COMPLETED:
  718. {
  719. int cid = serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId;
  720. m_data->m_userConstraintInfoMap.remove(cid);
  721. break;
  722. }
  723. case CMD_REMOVE_BODY_FAILED:
  724. {
  725. b3Warning("Remove body failed\n");
  726. break;
  727. }
  728. case CMD_REMOVE_BODY_COMPLETED:
  729. {
  730. for (int i = 0; i < serverCmd.m_removeObjectArgs.m_numBodies; i++)
  731. {
  732. int bodyUniqueId = serverCmd.m_removeObjectArgs.m_bodyUniqueIds[i];
  733. removeCachedBody(bodyUniqueId);
  734. }
  735. for (int i = 0; i < serverCmd.m_removeObjectArgs.m_numUserConstraints; i++)
  736. {
  737. int key = serverCmd.m_removeObjectArgs.m_userConstraintUniqueIds[i];
  738. m_data->m_userConstraintInfoMap.remove(key);
  739. }
  740. break;
  741. }
  742. case CMD_CHANGE_USER_CONSTRAINT_COMPLETED:
  743. {
  744. int cid = serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId;
  745. b3UserConstraint* userConstraintPtr = m_data->m_userConstraintInfoMap[cid];
  746. if (userConstraintPtr)
  747. {
  748. const b3UserConstraint* serverConstraint = &serverCmd.m_userConstraintResultArgs;
  749. if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_PIVOT_IN_B)
  750. {
  751. userConstraintPtr->m_childFrame[0] = serverConstraint->m_childFrame[0];
  752. userConstraintPtr->m_childFrame[1] = serverConstraint->m_childFrame[1];
  753. userConstraintPtr->m_childFrame[2] = serverConstraint->m_childFrame[2];
  754. }
  755. if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_FRAME_ORN_IN_B)
  756. {
  757. userConstraintPtr->m_childFrame[3] = serverConstraint->m_childFrame[3];
  758. userConstraintPtr->m_childFrame[4] = serverConstraint->m_childFrame[4];
  759. userConstraintPtr->m_childFrame[5] = serverConstraint->m_childFrame[5];
  760. userConstraintPtr->m_childFrame[6] = serverConstraint->m_childFrame[6];
  761. }
  762. if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_MAX_FORCE)
  763. {
  764. userConstraintPtr->m_maxAppliedForce = serverConstraint->m_maxAppliedForce;
  765. }
  766. if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_GEAR_RATIO)
  767. {
  768. userConstraintPtr->m_gearRatio = serverConstraint->m_gearRatio;
  769. }
  770. if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_RELATIVE_POSITION_TARGET)
  771. {
  772. userConstraintPtr->m_relativePositionTarget = serverConstraint->m_relativePositionTarget;
  773. }
  774. if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_ERP)
  775. {
  776. userConstraintPtr->m_erp = serverConstraint->m_erp;
  777. }
  778. if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_GEAR_AUX_LINK)
  779. {
  780. userConstraintPtr->m_gearAuxLink = serverConstraint->m_gearAuxLink;
  781. }
  782. }
  783. break;
  784. }
  785. case CMD_USER_CONSTRAINT_REQUEST_STATE_COMPLETED:
  786. {
  787. break;
  788. }
  789. case CMD_SYNC_BODY_INFO_COMPLETED:
  790. case CMD_MJCF_LOADING_COMPLETED:
  791. case CMD_SDF_LOADING_COMPLETED:
  792. {
  793. //we'll stream further info from the physics server
  794. //so serverCmd will be invalid, make a copy
  795. btAlignedObjectArray<int> bodyIdArray;
  796. btAlignedObjectArray<int> constraintIdArray;
  797. int numConstraints = serverCmd.m_sdfLoadedArgs.m_numUserConstraints;
  798. int numBodies = serverCmd.m_sdfLoadedArgs.m_numBodies;
  799. bodyIdArray.reserve(numBodies);
  800. constraintIdArray.reserve(numConstraints);
  801. if (serverCmd.m_type == CMD_SYNC_BODY_INFO_COMPLETED)
  802. {
  803. clearCachedBodies();
  804. const int* bodyIds = (int*)m_data->m_bulletStreamDataServerToClient;
  805. const int* constaintIds = bodyIds + numBodies;
  806. for (int i = 0; i < numConstraints; i++)
  807. {
  808. int constraintUid = constaintIds[i];
  809. constraintIdArray.push_back(constraintUid);
  810. }
  811. for (int i = 0; i < numBodies; i++)
  812. {
  813. int bodyUid = bodyIds[i];
  814. bodyIdArray.push_back(bodyUid);
  815. }
  816. }
  817. else
  818. {
  819. for (int i = 0; i < numConstraints; i++)
  820. {
  821. int constraintUid = serverCmd.m_sdfLoadedArgs.m_userConstraintUniqueIds[i];
  822. constraintIdArray.push_back(constraintUid);
  823. }
  824. for (int i = 0; i < numBodies; i++)
  825. {
  826. int bodyUid = serverCmd.m_sdfLoadedArgs.m_bodyUniqueIds[i];
  827. bodyIdArray.push_back(bodyUid);
  828. }
  829. }
  830. for (int i = 0; i < numConstraints; i++)
  831. {
  832. int constraintUid = constraintIdArray[i];
  833. m_data->m_tmpInfoRequestCommand.m_type = CMD_USER_CONSTRAINT;
  834. m_data->m_tmpInfoRequestCommand.m_updateFlags = USER_CONSTRAINT_REQUEST_INFO;
  835. m_data->m_tmpInfoRequestCommand.m_userConstraintArguments.m_userConstraintUniqueId = constraintUid;
  836. bool hasStatus = m_data->m_commandProcessor->processCommand(m_data->m_tmpInfoRequestCommand, m_data->m_tmpInfoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  837. b3Clock clock;
  838. double startTime = clock.getTimeInSeconds();
  839. double timeOutInSeconds = m_data->m_timeOutInSeconds;
  840. while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
  841. {
  842. hasStatus = m_data->m_commandProcessor->receiveStatus(m_data->m_tmpInfoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  843. }
  844. if (hasStatus)
  845. {
  846. int cid = m_data->m_tmpInfoStatus.m_userConstraintResultArgs.m_userConstraintUniqueId;
  847. m_data->m_userConstraintInfoMap.insert(cid, m_data->m_tmpInfoStatus.m_userConstraintResultArgs);
  848. }
  849. }
  850. for (int i = 0; i < numBodies; i++)
  851. {
  852. int bodyUniqueId = bodyIdArray[i];
  853. m_data->m_tmpInfoRequestCommand.m_type = CMD_REQUEST_BODY_INFO;
  854. m_data->m_tmpInfoRequestCommand.m_sdfRequestInfoArgs.m_bodyUniqueId = bodyUniqueId;
  855. processRequestBodyInfo(m_data->m_tmpInfoRequestCommand, m_data->m_tmpInfoStatus);
  856. }
  857. break;
  858. }
  859. case CMD_CREATE_MULTI_BODY_COMPLETED:
  860. case CMD_URDF_LOADING_COMPLETED:
  861. {
  862. if (serverCmd.m_numDataStreamBytes > 0)
  863. {
  864. int bodyIndex = serverCmd.m_dataStreamArguments.m_bodyUniqueId;
  865. processBodyJointInfo(bodyIndex, serverCmd);
  866. }
  867. break;
  868. }
  869. case CMD_BULLET_LOADING_FAILED:
  870. {
  871. b3Warning("Couldn't load .bullet file");
  872. break;
  873. }
  874. case CMD_BULLET_LOADING_COMPLETED:
  875. {
  876. break;
  877. }
  878. case CMD_REQUEST_OPENGL_VISUALIZER_CAMERA_COMPLETED:
  879. {
  880. break;
  881. }
  882. case CMD_REQUEST_OPENGL_VISUALIZER_CAMERA_FAILED:
  883. {
  884. //b3Warning("requestOpenGLVisualizeCamera failed");
  885. break;
  886. }
  887. case CMD_REMOVE_USER_CONSTRAINT_FAILED:
  888. {
  889. b3Warning("removeConstraint failed");
  890. break;
  891. }
  892. case CMD_CHANGE_USER_CONSTRAINT_FAILED:
  893. {
  894. //b3Warning("changeConstraint failed");
  895. break;
  896. }
  897. case CMD_USER_CONSTRAINT_FAILED:
  898. {
  899. b3Warning("createConstraint failed");
  900. break;
  901. }
  902. case CMD_CREATE_COLLISION_SHAPE_FAILED:
  903. {
  904. b3Warning("createCollisionShape failed");
  905. break;
  906. }
  907. case CMD_CREATE_COLLISION_SHAPE_COMPLETED:
  908. {
  909. break;
  910. }
  911. case CMD_CREATE_VISUAL_SHAPE_FAILED:
  912. {
  913. b3Warning("createVisualShape failed");
  914. break;
  915. }
  916. case CMD_CREATE_VISUAL_SHAPE_COMPLETED:
  917. {
  918. break;
  919. }
  920. case CMD_CREATE_MULTI_BODY_FAILED:
  921. {
  922. b3Warning("createMultiBody failed");
  923. break;
  924. }
  925. case CMD_REQUEST_COLLISION_INFO_COMPLETED:
  926. {
  927. break;
  928. }
  929. case CMD_REQUEST_COLLISION_INFO_FAILED:
  930. {
  931. b3Warning("Request getCollisionInfo failed");
  932. break;
  933. }
  934. case CMD_REQUEST_MESH_DATA_COMPLETED:
  935. {
  936. break;
  937. }
  938. case CMD_REQUEST_MESH_DATA_FAILED:
  939. {
  940. b3Warning("Request mesh data failed");
  941. break;
  942. }
  943. case CMD_CUSTOM_COMMAND_FAILED:
  944. {
  945. b3Warning("custom plugin command failed");
  946. break;
  947. }
  948. case CMD_CLIENT_COMMAND_COMPLETED:
  949. {
  950. break;
  951. }
  952. case CMD_CALCULATED_JACOBIAN_COMPLETED:
  953. {
  954. break;
  955. }
  956. case CMD_CALCULATED_JACOBIAN_FAILED:
  957. {
  958. b3Warning("jacobian calculation failed");
  959. break;
  960. }
  961. case CMD_CALCULATED_MASS_MATRIX_FAILED:
  962. {
  963. b3Warning("calculate mass matrix failed");
  964. break;
  965. }
  966. case CMD_CALCULATED_MASS_MATRIX_COMPLETED:
  967. {
  968. double* matrixData = (double*)&m_data->m_bulletStreamDataServerToClient[0];
  969. m_data->m_cachedMassMatrix.resize(serverCmd.m_massMatrixResultArgs.m_dofCount * serverCmd.m_massMatrixResultArgs.m_dofCount);
  970. for (int i = 0; i < serverCmd.m_massMatrixResultArgs.m_dofCount * serverCmd.m_massMatrixResultArgs.m_dofCount; i++)
  971. {
  972. m_data->m_cachedMassMatrix[i] = matrixData[i];
  973. }
  974. break;
  975. }
  976. case CMD_ACTUAL_STATE_UPDATE_COMPLETED:
  977. {
  978. SendActualStateSharedMemoryStorage* serverState = (SendActualStateSharedMemoryStorage*)&m_data->m_bulletStreamDataServerToClient[0];
  979. m_data->m_cachedState = *serverState;
  980. m_data->m_serverStatus.m_sendActualStateArgs.m_stateDetails = &m_data->m_cachedState;
  981. break;
  982. }
  983. case CMD_DESIRED_STATE_RECEIVED_COMPLETED:
  984. {
  985. break;
  986. }
  987. case CMD_STEP_FORWARD_SIMULATION_COMPLETED:
  988. {
  989. break;
  990. }
  991. case CMD_PERFORM_COLLISION_DETECTION_COMPLETED:
  992. {
  993. break;
  994. }
  995. case CMD_REQUEST_PHYSICS_SIMULATION_PARAMETERS_COMPLETED:
  996. {
  997. break;
  998. }
  999. case CMD_SAVE_STATE_COMPLETED:
  1000. {
  1001. break;
  1002. }
  1003. case CMD_COLLISION_SHAPE_INFO_FAILED:
  1004. {
  1005. b3Warning("getCollisionShapeData failed");
  1006. break;
  1007. }
  1008. case CMD_COLLISION_SHAPE_INFO_COMPLETED:
  1009. {
  1010. B3_PROFILE("CMD_COLLISION_SHAPE_INFO_COMPLETED");
  1011. if (m_data->m_verboseOutput)
  1012. {
  1013. b3Printf("Collision Shape Information Request OK\n");
  1014. }
  1015. int numCollisionShapesCopied = serverCmd.m_sendCollisionShapeArgs.m_numCollisionShapes;
  1016. m_data->m_cachedCollisionShapes.resize(numCollisionShapesCopied);
  1017. b3CollisionShapeData* shapeData = (b3CollisionShapeData*)&m_data->m_bulletStreamDataServerToClient[0];
  1018. for (int i = 0; i < numCollisionShapesCopied; i++)
  1019. {
  1020. m_data->m_cachedCollisionShapes[i] = shapeData[i];
  1021. }
  1022. break;
  1023. }
  1024. case CMD_RESTORE_STATE_FAILED:
  1025. {
  1026. b3Warning("restoreState failed");
  1027. break;
  1028. }
  1029. case CMD_RESTORE_STATE_COMPLETED:
  1030. {
  1031. break;
  1032. }
  1033. case CMD_BULLET_SAVING_COMPLETED:
  1034. {
  1035. break;
  1036. }
  1037. case CMD_LOAD_SOFT_BODY_FAILED:
  1038. {
  1039. b3Warning("loadSoftBody failed");
  1040. break;
  1041. }
  1042. case CMD_LOAD_SOFT_BODY_COMPLETED:
  1043. {
  1044. int bodyUniqueId = serverCmd.m_loadSoftBodyResultArguments.m_objectUniqueId;
  1045. BodyJointInfoCache2* bodyJoints = new BodyJointInfoCache2;
  1046. m_data->m_bodyJointMap.insert(bodyUniqueId, bodyJoints);
  1047. bodyJoints->m_bodyName = serverCmd.m_dataStreamArguments.m_bodyName;
  1048. bodyJoints->m_baseName = serverCmd.m_dataStreamArguments.m_bodyName;
  1049. break;
  1050. }
  1051. case CMD_SYNC_USER_DATA_FAILED:
  1052. {
  1053. b3Warning("Synchronizing user data failed.");
  1054. break;
  1055. }
  1056. case CMD_ADD_USER_DATA_FAILED:
  1057. {
  1058. b3Warning("Adding user data failed (do the specified body and link exist?)");
  1059. break;
  1060. }
  1061. case CMD_REMOVE_USER_DATA_FAILED:
  1062. {
  1063. b3Warning("Removing user data failed");
  1064. break;
  1065. }
  1066. case CMD_ADD_USER_DATA_COMPLETED:
  1067. {
  1068. processAddUserData(serverCmd);
  1069. break;
  1070. }
  1071. case CMD_SYNC_USER_DATA_COMPLETED:
  1072. {
  1073. B3_PROFILE("CMD_SYNC_USER_DATA_COMPLETED");
  1074. if (serverCmd.m_syncUserDataArgs.m_clearCachedUserDataEntries) {
  1075. // Remove all cached user data entries.
  1076. m_data->m_userDataMap.clear();
  1077. m_data->m_userDataHandleLookup.clear();
  1078. for (int i = 0; i < m_data->m_bodyJointMap.size(); i++)
  1079. {
  1080. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap.getAtIndex(i);
  1081. if (bodyJointsPtr && *bodyJointsPtr)
  1082. {
  1083. (*bodyJointsPtr)->m_userDataIds.clear();
  1084. }
  1085. }
  1086. }
  1087. const int numIdentifiers = serverCmd.m_syncUserDataArgs.m_numUserDataIdentifiers;
  1088. int* identifiers = new int[numIdentifiers];
  1089. memcpy(identifiers, &m_data->m_bulletStreamDataServerToClient[0], numIdentifiers * sizeof(int));
  1090. for (int i = 0; i < numIdentifiers; i++)
  1091. {
  1092. m_data->m_tmpInfoRequestCommand.m_type = CMD_REQUEST_USER_DATA;
  1093. m_data->m_tmpInfoRequestCommand.m_userDataRequestArgs.m_userDataId = identifiers[i];
  1094. bool hasStatus = m_data->m_commandProcessor->processCommand(m_data->m_tmpInfoRequestCommand, m_data->m_tmpInfoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  1095. b3Clock clock;
  1096. double startTime = clock.getTimeInSeconds();
  1097. double timeOutInSeconds = m_data->m_timeOutInSeconds;
  1098. while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
  1099. {
  1100. hasStatus = m_data->m_commandProcessor->receiveStatus(m_data->m_tmpInfoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  1101. }
  1102. if (hasStatus)
  1103. {
  1104. processAddUserData(m_data->m_tmpInfoStatus);
  1105. }
  1106. }
  1107. delete[] identifiers;
  1108. break;
  1109. }
  1110. case CMD_REMOVE_USER_DATA_COMPLETED:
  1111. {
  1112. const int userDataId = serverCmd.m_removeUserDataResponseArgs.m_userDataId;
  1113. SharedMemoryUserData* userData = m_data->m_userDataMap[userDataId];
  1114. if (userData)
  1115. {
  1116. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap[userData->m_bodyUniqueId];
  1117. if (bodyJointsPtr && *bodyJointsPtr)
  1118. {
  1119. (*bodyJointsPtr)->m_userDataIds.remove(userDataId);
  1120. }
  1121. m_data->m_userDataHandleLookup.remove(SharedMemoryUserDataHashKey(userData));
  1122. m_data->m_userDataMap.remove(userDataId);
  1123. }
  1124. break;
  1125. }
  1126. case CMD_RESET_MESH_DATA_COMPLETED:
  1127. {
  1128. break;
  1129. }
  1130. case CMD_RESET_MESH_DATA_FAILED:
  1131. {
  1132. break;
  1133. }
  1134. case CMD_REMOVE_STATE_FAILED:
  1135. {
  1136. break;
  1137. }
  1138. case CMD_REMOVE_STATE_COMPLETED:
  1139. {
  1140. break;
  1141. }
  1142. case CMD_CUSTOM_COMMAND_COMPLETED:
  1143. {
  1144. break;
  1145. }
  1146. default:
  1147. {
  1148. //b3Warning("Unknown server status type");
  1149. }
  1150. };
  1151. }
  1152. bool PhysicsDirect::processCustomCommand(const struct SharedMemoryCommand& orgCommand)
  1153. {
  1154. SharedMemoryCommand command = orgCommand;
  1155. const SharedMemoryStatus& serverCmd = m_data->m_serverStatus;
  1156. int remaining = 0;
  1157. do
  1158. {
  1159. bool hasStatus = m_data->m_commandProcessor->processCommand(command, m_data->m_serverStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  1160. b3Clock clock;
  1161. double startTime = clock.getTimeInSeconds();
  1162. double timeOutInSeconds = m_data->m_timeOutInSeconds;
  1163. while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
  1164. {
  1165. const SharedMemoryStatus* stat = processServerStatus();
  1166. if (stat)
  1167. {
  1168. hasStatus = true;
  1169. }
  1170. }
  1171. m_data->m_hasStatus = hasStatus;
  1172. if (hasStatus)
  1173. {
  1174. if (m_data->m_verboseOutput)
  1175. {
  1176. b3Printf("Success receiving %d return data\n",
  1177. serverCmd.m_numDataStreamBytes);
  1178. }
  1179. btAssert(m_data->m_serverStatus.m_type == CMD_CUSTOM_COMMAND_COMPLETED);
  1180. if (m_data->m_serverStatus.m_type == CMD_CUSTOM_COMMAND_COMPLETED)
  1181. {
  1182. m_data->m_cachedReturnData.resize(serverCmd.m_customCommandResultArgs.m_returnDataSizeInBytes);
  1183. m_data->m_cachedReturnDataValue.m_length = serverCmd.m_customCommandResultArgs.m_returnDataSizeInBytes;
  1184. if (serverCmd.m_customCommandResultArgs.m_returnDataSizeInBytes)
  1185. {
  1186. m_data->m_cachedReturnDataValue.m_type = serverCmd.m_customCommandResultArgs.m_returnDataType;
  1187. m_data->m_cachedReturnDataValue.m_data1 = &m_data->m_cachedReturnData[0];
  1188. for (int i = 0; i < serverCmd.m_numDataStreamBytes; i++)
  1189. {
  1190. m_data->m_cachedReturnData[i+ serverCmd.m_customCommandResultArgs.m_returnDataStart] = m_data->m_bulletStreamDataServerToClient[i];
  1191. }
  1192. }
  1193. int totalReceived = serverCmd.m_numDataStreamBytes + serverCmd.m_customCommandResultArgs.m_returnDataStart;
  1194. remaining = serverCmd.m_customCommandResultArgs.m_returnDataSizeInBytes - totalReceived;
  1195. if (remaining > 0)
  1196. {
  1197. m_data->m_hasStatus = false;
  1198. command.m_type = CMD_CUSTOM_COMMAND;
  1199. command.m_customCommandArgs.m_startingReturnBytes =
  1200. totalReceived;
  1201. }
  1202. }
  1203. }
  1204. } while (remaining > 0);
  1205. return m_data->m_hasStatus;
  1206. }
  1207. bool PhysicsDirect::processRequestBodyInfo(const struct SharedMemoryCommand& command, SharedMemoryStatus& status) {
  1208. bool hasStatus = m_data->m_commandProcessor->processCommand(command, status, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  1209. b3Clock clock;
  1210. double startTime = clock.getTimeInSeconds();
  1211. double timeOutInSeconds = m_data->m_timeOutInSeconds;
  1212. while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
  1213. {
  1214. hasStatus = m_data->m_commandProcessor->receiveStatus(status, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  1215. }
  1216. if (hasStatus) {
  1217. processBodyJointInfo(command.m_sdfRequestInfoArgs.m_bodyUniqueId, status);
  1218. }
  1219. m_data->m_hasStatus = hasStatus;
  1220. return m_data->m_hasStatus;
  1221. }
  1222. bool PhysicsDirect::submitClientCommand(const struct SharedMemoryCommand& command)
  1223. {
  1224. if (command.m_type == CMD_CUSTOM_COMMAND)
  1225. {
  1226. return processCustomCommand(command);
  1227. }
  1228. if (command.m_type == CMD_REQUEST_DEBUG_LINES)
  1229. {
  1230. return processDebugLines(command);
  1231. }
  1232. if (command.m_type == CMD_REQUEST_CAMERA_IMAGE_DATA)
  1233. {
  1234. return processCamera(command);
  1235. }
  1236. if (command.m_type == CMD_REQUEST_CONTACT_POINT_INFORMATION)
  1237. {
  1238. return processContactPointData(command);
  1239. }
  1240. if (command.m_type == CMD_REQUEST_VISUAL_SHAPE_INFO)
  1241. {
  1242. return processVisualShapeData(command);
  1243. }
  1244. if (command.m_type == CMD_REQUEST_AABB_OVERLAP)
  1245. {
  1246. return processOverlappingObjects(command);
  1247. }
  1248. if (command.m_type == CMD_REQUEST_MESH_DATA)
  1249. {
  1250. return processMeshData(command);
  1251. }
  1252. if (command.m_type == CMD_REQUEST_BODY_INFO)
  1253. {
  1254. return processRequestBodyInfo(command, m_data->m_serverStatus);
  1255. }
  1256. bool hasStatus = m_data->m_commandProcessor->processCommand(command, m_data->m_serverStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  1257. m_data->m_hasStatus = hasStatus;
  1258. if (m_data->m_ownsCommandProcessor)
  1259. {
  1260. m_data->m_commandProcessor->reportNotifications();
  1261. }
  1262. /*if (hasStatus)
  1263. {
  1264. postProcessStatus(m_data->m_serverStatus);
  1265. m_data->m_hasStatus = false;
  1266. }
  1267. */
  1268. return hasStatus;
  1269. }
  1270. int PhysicsDirect::getNumBodies() const
  1271. {
  1272. return m_data->m_bodyJointMap.size();
  1273. }
  1274. void PhysicsDirect::removeCachedBody(int bodyUniqueId)
  1275. {
  1276. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap[bodyUniqueId];
  1277. if (bodyJointsPtr && *bodyJointsPtr)
  1278. {
  1279. for (int i = 0; i < (*bodyJointsPtr)->m_userDataIds.size(); i++)
  1280. {
  1281. const int userDataId = (*bodyJointsPtr)->m_userDataIds[i];
  1282. SharedMemoryUserData* userData = m_data->m_userDataMap[userDataId];
  1283. m_data->m_userDataHandleLookup.remove(SharedMemoryUserDataHashKey(userData));
  1284. m_data->m_userDataMap.remove(userDataId);
  1285. }
  1286. delete (*bodyJointsPtr);
  1287. m_data->m_bodyJointMap.remove(bodyUniqueId);
  1288. }
  1289. }
  1290. int PhysicsDirect::getNumUserConstraints() const
  1291. {
  1292. return m_data->m_userConstraintInfoMap.size();
  1293. }
  1294. int PhysicsDirect::getUserConstraintInfo(int constraintUniqueId, struct b3UserConstraint& info) const
  1295. {
  1296. b3UserConstraint* constraintPtr = m_data->m_userConstraintInfoMap[constraintUniqueId];
  1297. if (constraintPtr)
  1298. {
  1299. info = *constraintPtr;
  1300. return 1;
  1301. }
  1302. return 0;
  1303. }
  1304. int PhysicsDirect::getUserConstraintId(int serialIndex) const
  1305. {
  1306. if ((serialIndex >= 0) && (serialIndex < getNumUserConstraints()))
  1307. {
  1308. return m_data->m_userConstraintInfoMap.getKeyAtIndex(serialIndex).getUid1();
  1309. }
  1310. return -1;
  1311. }
  1312. int PhysicsDirect::getBodyUniqueId(int serialIndex) const
  1313. {
  1314. if ((serialIndex >= 0) && (serialIndex < getNumBodies()))
  1315. {
  1316. return m_data->m_bodyJointMap.getKeyAtIndex(serialIndex).getUid1();
  1317. }
  1318. return -1;
  1319. }
  1320. bool PhysicsDirect::getBodyInfo(int bodyUniqueId, struct b3BodyInfo& info) const
  1321. {
  1322. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap[bodyUniqueId];
  1323. if (bodyJointsPtr && *bodyJointsPtr)
  1324. {
  1325. BodyJointInfoCache2* bodyJoints = *bodyJointsPtr;
  1326. strcpy(info.m_baseName, bodyJoints->m_baseName.c_str());
  1327. strcpy(info.m_bodyName, bodyJoints->m_bodyName.c_str());
  1328. return true;
  1329. }
  1330. return false;
  1331. }
  1332. int PhysicsDirect::getNumJoints(int bodyUniqueId) const
  1333. {
  1334. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap[bodyUniqueId];
  1335. if (bodyJointsPtr && *bodyJointsPtr)
  1336. {
  1337. BodyJointInfoCache2* bodyJoints = *bodyJointsPtr;
  1338. return bodyJoints->m_jointInfo.size();
  1339. }
  1340. btAssert(0);
  1341. return 0;
  1342. }
  1343. int PhysicsDirect::getNumDofs(int bodyUniqueId) const
  1344. {
  1345. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap[bodyUniqueId];
  1346. if (bodyJointsPtr && *bodyJointsPtr)
  1347. {
  1348. BodyJointInfoCache2* bodyJoints = *bodyJointsPtr;
  1349. return bodyJoints->m_numDofs;
  1350. }
  1351. btAssert(0);
  1352. return 0;
  1353. }
  1354. bool PhysicsDirect::getJointInfo(int bodyIndex, int jointIndex, struct b3JointInfo& info) const
  1355. {
  1356. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap[bodyIndex];
  1357. if (bodyJointsPtr && *bodyJointsPtr)
  1358. {
  1359. BodyJointInfoCache2* bodyJoints = *bodyJointsPtr;
  1360. if ((jointIndex >= 0) && (jointIndex < bodyJoints->m_jointInfo.size()))
  1361. {
  1362. info = bodyJoints->m_jointInfo[jointIndex];
  1363. info.m_qSize = 0;
  1364. info.m_uSize = 0;
  1365. switch (info.m_jointType)
  1366. {
  1367. case eSphericalType:
  1368. {
  1369. info.m_qSize = 4;//quaterion x,y,z,w
  1370. info.m_uSize = 3;
  1371. break;
  1372. }
  1373. case ePlanarType:
  1374. {
  1375. info.m_qSize = 2;
  1376. info.m_uSize = 2;
  1377. break;
  1378. }
  1379. case ePrismaticType:
  1380. case eRevoluteType:
  1381. {
  1382. info.m_qSize = 1;
  1383. info.m_uSize = 1;
  1384. break;
  1385. }
  1386. default:
  1387. {
  1388. }
  1389. }
  1390. return true;
  1391. }
  1392. }
  1393. return false;
  1394. }
  1395. void PhysicsDirect::setSharedMemoryKey(int key)
  1396. {
  1397. }
  1398. void PhysicsDirect::uploadBulletFileToSharedMemory(const char* data, int len)
  1399. {
  1400. if (len > SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE)
  1401. {
  1402. len = SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE;
  1403. }
  1404. for (int i = 0; i < len; i++)
  1405. {
  1406. m_data->m_bulletStreamDataServerToClient[i] = data[i];
  1407. }
  1408. //m_data->m_physicsClient->uploadBulletFileToSharedMemory(data,len);
  1409. }
  1410. void PhysicsDirect::uploadRaysToSharedMemory(struct SharedMemoryCommand& command, const double* rayFromWorldArray, const double* rayToWorldArray, int numRays)
  1411. {
  1412. int curNumStreamingRays = command.m_requestRaycastIntersections.m_numStreamingRays;
  1413. int newNumRays = curNumStreamingRays + numRays;
  1414. btAssert(newNumRays < MAX_RAY_INTERSECTION_BATCH_SIZE_STREAMING);
  1415. if (newNumRays < MAX_RAY_INTERSECTION_BATCH_SIZE_STREAMING)
  1416. {
  1417. for (int i = 0; i < numRays; i++)
  1418. {
  1419. b3RayData* rayDataStream = (b3RayData*)m_data->m_bulletStreamDataServerToClient;
  1420. rayDataStream[curNumStreamingRays + i].m_rayFromPosition[0] = rayFromWorldArray[i * 3 + 0];
  1421. rayDataStream[curNumStreamingRays + i].m_rayFromPosition[1] = rayFromWorldArray[i * 3 + 1];
  1422. rayDataStream[curNumStreamingRays + i].m_rayFromPosition[2] = rayFromWorldArray[i * 3 + 2];
  1423. rayDataStream[curNumStreamingRays + i].m_rayToPosition[0] = rayToWorldArray[i * 3 + 0];
  1424. rayDataStream[curNumStreamingRays + i].m_rayToPosition[1] = rayToWorldArray[i * 3 + 1];
  1425. rayDataStream[curNumStreamingRays + i].m_rayToPosition[2] = rayToWorldArray[i * 3 + 2];
  1426. command.m_requestRaycastIntersections.m_numStreamingRays++;
  1427. }
  1428. }
  1429. }
  1430. int PhysicsDirect::getNumDebugLines() const
  1431. {
  1432. return m_data->m_debugLinesFrom.size();
  1433. }
  1434. const float* PhysicsDirect::getDebugLinesFrom() const
  1435. {
  1436. if (getNumDebugLines())
  1437. {
  1438. return &m_data->m_debugLinesFrom[0].m_x;
  1439. }
  1440. return 0;
  1441. }
  1442. const float* PhysicsDirect::getDebugLinesTo() const
  1443. {
  1444. if (getNumDebugLines())
  1445. {
  1446. return &m_data->m_debugLinesTo[0].m_x;
  1447. }
  1448. return 0;
  1449. }
  1450. const float* PhysicsDirect::getDebugLinesColor() const
  1451. {
  1452. if (getNumDebugLines())
  1453. {
  1454. return &m_data->m_debugLinesColor[0].m_x;
  1455. }
  1456. return 0;
  1457. }
  1458. void PhysicsDirect::getCachedCameraImage(b3CameraImageData* cameraData)
  1459. {
  1460. if (cameraData)
  1461. {
  1462. cameraData->m_pixelWidth = m_data->m_cachedCameraPixelsWidth;
  1463. cameraData->m_pixelHeight = m_data->m_cachedCameraPixelsHeight;
  1464. cameraData->m_depthValues = m_data->m_cachedCameraDepthBuffer.size() ? &m_data->m_cachedCameraDepthBuffer[0] : 0;
  1465. cameraData->m_rgbColorData = m_data->m_cachedCameraPixelsRGBA.size() ? &m_data->m_cachedCameraPixelsRGBA[0] : 0;
  1466. cameraData->m_segmentationMaskValues = m_data->m_cachedSegmentationMask.size() ? &m_data->m_cachedSegmentationMask[0] : 0;
  1467. }
  1468. }
  1469. void PhysicsDirect::getCachedMeshData(struct b3MeshData* meshData)
  1470. {
  1471. m_data->m_cachedMeshData.m_numVertices = m_data->m_cachedVertexPositions.size();
  1472. m_data->m_cachedMeshData.m_vertices = m_data->m_cachedMeshData.m_numVertices ? &m_data->m_cachedVertexPositions[0] : 0;
  1473. *meshData = m_data->m_cachedMeshData;
  1474. }
  1475. void PhysicsDirect::getCachedContactPointInformation(struct b3ContactInformation* contactPointData)
  1476. {
  1477. contactPointData->m_numContactPoints = m_data->m_cachedContactPoints.size();
  1478. contactPointData->m_contactPointData = contactPointData->m_numContactPoints ? &m_data->m_cachedContactPoints[0] : 0;
  1479. }
  1480. void PhysicsDirect::getCachedOverlappingObjects(struct b3AABBOverlapData* overlappingObjects)
  1481. {
  1482. overlappingObjects->m_numOverlappingObjects = m_data->m_cachedOverlappingObjects.size();
  1483. overlappingObjects->m_overlappingObjects = m_data->m_cachedOverlappingObjects.size() ? &m_data->m_cachedOverlappingObjects[0] : 0;
  1484. }
  1485. void PhysicsDirect::getCachedVisualShapeInformation(struct b3VisualShapeInformation* visualShapesInfo)
  1486. {
  1487. visualShapesInfo->m_numVisualShapes = m_data->m_cachedVisualShapes.size();
  1488. visualShapesInfo->m_visualShapeData = visualShapesInfo->m_numVisualShapes ? &m_data->m_cachedVisualShapes[0] : 0;
  1489. }
  1490. void PhysicsDirect::getCachedCollisionShapeInformation(struct b3CollisionShapeInformation* collisionShapesInfo)
  1491. {
  1492. collisionShapesInfo->m_numCollisionShapes = m_data->m_cachedCollisionShapes.size();
  1493. collisionShapesInfo->m_collisionShapeData = collisionShapesInfo->m_numCollisionShapes ? &m_data->m_cachedCollisionShapes[0] : 0;
  1494. }
  1495. void PhysicsDirect::getCachedVREvents(struct b3VREventsData* vrEventsData)
  1496. {
  1497. vrEventsData->m_numControllerEvents = m_data->m_cachedVREvents.size();
  1498. vrEventsData->m_controllerEvents = vrEventsData->m_numControllerEvents ? &m_data->m_cachedVREvents[0] : 0;
  1499. }
  1500. void PhysicsDirect::getCachedKeyboardEvents(struct b3KeyboardEventsData* keyboardEventsData)
  1501. {
  1502. keyboardEventsData->m_numKeyboardEvents = m_data->m_cachedKeyboardEvents.size();
  1503. keyboardEventsData->m_keyboardEvents = keyboardEventsData->m_numKeyboardEvents ? &m_data->m_cachedKeyboardEvents[0] : 0;
  1504. }
  1505. void PhysicsDirect::getCachedMouseEvents(struct b3MouseEventsData* mouseEventsData)
  1506. {
  1507. mouseEventsData->m_numMouseEvents = m_data->m_cachedMouseEvents.size();
  1508. mouseEventsData->m_mouseEvents = mouseEventsData->m_numMouseEvents ? &m_data->m_cachedMouseEvents[0] : 0;
  1509. }
  1510. void PhysicsDirect::getCachedRaycastHits(struct b3RaycastInformation* raycastHits)
  1511. {
  1512. raycastHits->m_numRayHits = m_data->m_raycastHits.size();
  1513. raycastHits->m_rayHits = raycastHits->m_numRayHits ? &m_data->m_raycastHits[0] : 0;
  1514. }
  1515. void PhysicsDirect::getCachedMassMatrix(int dofCountCheck, double* massMatrix)
  1516. {
  1517. int sz = dofCountCheck * dofCountCheck;
  1518. if (sz == m_data->m_cachedMassMatrix.size())
  1519. {
  1520. for (int i = 0; i < sz; i++)
  1521. {
  1522. massMatrix[i] = m_data->m_cachedMassMatrix[i];
  1523. }
  1524. }
  1525. }
  1526. bool PhysicsDirect::getCachedReturnData(b3UserDataValue* returnData)
  1527. {
  1528. if (m_data->m_cachedReturnDataValue.m_length)
  1529. {
  1530. *returnData = m_data->m_cachedReturnDataValue;
  1531. return true;
  1532. }
  1533. return false;
  1534. }
  1535. void PhysicsDirect::setTimeOut(double timeOutInSeconds)
  1536. {
  1537. m_data->m_timeOutInSeconds = timeOutInSeconds;
  1538. }
  1539. double PhysicsDirect::getTimeOut() const
  1540. {
  1541. return m_data->m_timeOutInSeconds;
  1542. }
  1543. bool PhysicsDirect::getCachedUserData(int userDataId, struct b3UserDataValue& valueOut) const
  1544. {
  1545. SharedMemoryUserData* userDataPtr = m_data->m_userDataMap[userDataId];
  1546. if (!userDataPtr)
  1547. {
  1548. return false;
  1549. }
  1550. valueOut.m_type = (userDataPtr)->m_type;
  1551. valueOut.m_length = userDataPtr->m_bytes.size();
  1552. valueOut.m_data1 = userDataPtr->m_bytes.size() ? &userDataPtr->m_bytes[0] : 0;
  1553. return true;
  1554. }
  1555. int PhysicsDirect::getCachedUserDataId(int bodyUniqueId, int linkIndex, int visualShapeIndex, const char* key) const
  1556. {
  1557. int* userDataId = m_data->m_userDataHandleLookup.find(SharedMemoryUserDataHashKey(key, bodyUniqueId, linkIndex, visualShapeIndex));
  1558. if (!userDataId)
  1559. {
  1560. return -1;
  1561. }
  1562. return *userDataId;
  1563. }
  1564. int PhysicsDirect::getNumUserData(int bodyUniqueId) const
  1565. {
  1566. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap[bodyUniqueId];
  1567. if (!bodyJointsPtr || !(*bodyJointsPtr))
  1568. {
  1569. return 0;
  1570. }
  1571. return (*bodyJointsPtr)->m_userDataIds.size();
  1572. }
  1573. void PhysicsDirect::getUserDataInfo(int bodyUniqueId, int userDataIndex, const char** keyOut, int* userDataIdOut, int* linkIndexOut, int* visualShapeIndexOut) const
  1574. {
  1575. BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap[bodyUniqueId];
  1576. if (!bodyJointsPtr || !(*bodyJointsPtr) || userDataIndex < 0 || userDataIndex > (*bodyJointsPtr)->m_userDataIds.size())
  1577. {
  1578. *keyOut = 0;
  1579. *userDataIdOut = -1;
  1580. return;
  1581. }
  1582. int userDataId = (*bodyJointsPtr)->m_userDataIds[userDataIndex];
  1583. SharedMemoryUserData* userData = m_data->m_userDataMap[userDataId];
  1584. *userDataIdOut = userDataId;
  1585. *keyOut = userData->m_key.c_str();
  1586. *linkIndexOut = userData->m_linkIndex;
  1587. *visualShapeIndexOut = userData->m_visualShapeIndex;
  1588. }
  1589. void PhysicsDirect::pushProfileTiming(const char* timingName)
  1590. {
  1591. std::string** strPtr = m_data->m_profileTimingStringArray[timingName];
  1592. std::string* str = 0;
  1593. if (strPtr)
  1594. {
  1595. str = *strPtr;
  1596. }
  1597. else
  1598. {
  1599. str = new std::string(timingName);
  1600. m_data->m_profileTimingStringArray.insert(timingName, str);
  1601. }
  1602. m_data->m_profileTimings.push_back(new CProfileSample(str->c_str()));
  1603. }
  1604. void PhysicsDirect::popProfileTiming()
  1605. {
  1606. if (m_data->m_profileTimings.size())
  1607. {
  1608. CProfileSample* sample = m_data->m_profileTimings[m_data->m_profileTimings.size() - 1];
  1609. m_data->m_profileTimings.pop_back();
  1610. delete sample;
  1611. }
  1612. }