PhysicsServerSharedMemory.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. #include "PhysicsServerSharedMemory.h"
  2. #include "PosixSharedMemory.h"
  3. #include "Win32SharedMemory.h"
  4. #include "../CommonInterfaces/CommonRenderInterface.h"
  5. #include "btBulletDynamicsCommon.h"
  6. #include "LinearMath/btTransform.h"
  7. #include "Bullet3Common/b3Logging.h"
  8. #include "../CommonInterfaces/CommonGUIHelperInterface.h"
  9. #include "SharedMemoryBlock.h"
  10. #include "PhysicsServerCommandProcessor.h"
  11. struct PhysicsServerSharedMemoryInternalData
  12. {
  13. ///end handle management
  14. SharedMemoryInterface* m_sharedMemory;
  15. bool m_ownsSharedMemory;
  16. SharedMemoryBlock* m_testBlock1;
  17. int m_sharedMemoryKey;
  18. bool m_isConnected;
  19. bool m_verboseOutput;
  20. PhysicsServerCommandProcessor* m_commandProcessor;
  21. PhysicsServerSharedMemoryInternalData()
  22. :m_sharedMemory(0),
  23. m_ownsSharedMemory(false),
  24. m_testBlock1(0),
  25. m_sharedMemoryKey(SHARED_MEMORY_KEY),
  26. m_isConnected(false),
  27. m_verboseOutput(false),
  28. m_commandProcessor(0)
  29. {
  30. }
  31. SharedMemoryStatus& createServerStatus(int statusType, int sequenceNumber, int timeStamp)
  32. {
  33. SharedMemoryStatus& serverCmd =m_testBlock1->m_serverCommands[0];
  34. serverCmd .m_type = statusType;
  35. serverCmd.m_sequenceNumber = sequenceNumber;
  36. serverCmd.m_timeStamp = timeStamp;
  37. return serverCmd;
  38. }
  39. void submitServerStatus(SharedMemoryStatus& status)
  40. {
  41. m_testBlock1->m_numServerCommands++;
  42. }
  43. };
  44. PhysicsServerSharedMemory::PhysicsServerSharedMemory(SharedMemoryInterface* sharedMem)
  45. {
  46. m_data = new PhysicsServerSharedMemoryInternalData();
  47. if (sharedMem)
  48. {
  49. m_data->m_sharedMemory = sharedMem;
  50. m_data->m_ownsSharedMemory = false;
  51. } else
  52. {
  53. #ifdef _WIN32
  54. m_data->m_sharedMemory = new Win32SharedMemoryServer();
  55. #else
  56. m_data->m_sharedMemory = new PosixSharedMemory();
  57. #endif
  58. m_data->m_ownsSharedMemory = true;
  59. }
  60. m_data->m_commandProcessor = new PhysicsServerCommandProcessor;
  61. }
  62. PhysicsServerSharedMemory::~PhysicsServerSharedMemory()
  63. {
  64. m_data->m_commandProcessor->deleteDynamicsWorld();
  65. delete m_data->m_commandProcessor;
  66. delete m_data;
  67. }
  68. void PhysicsServerSharedMemory::resetDynamicsWorld()
  69. {
  70. m_data->m_commandProcessor->deleteDynamicsWorld();
  71. m_data->m_commandProcessor ->createEmptyDynamicsWorld();
  72. }
  73. void PhysicsServerSharedMemory::setSharedMemoryKey(int key)
  74. {
  75. m_data->m_sharedMemoryKey = key;
  76. }
  77. bool PhysicsServerSharedMemory::connectSharedMemory( struct GUIHelperInterface* guiHelper)
  78. {
  79. m_data->m_commandProcessor->setGuiHelper(guiHelper);
  80. bool allowCreation = true;
  81. if (m_data->m_isConnected)
  82. {
  83. b3Warning("connectSharedMemory, while already connected");
  84. return m_data->m_isConnected;
  85. }
  86. int counter = 0;
  87. do
  88. {
  89. m_data->m_testBlock1 = (SharedMemoryBlock*)m_data->m_sharedMemory->allocateSharedMemory(m_data->m_sharedMemoryKey, SHARED_MEMORY_SIZE,allowCreation);
  90. if (m_data->m_testBlock1)
  91. {
  92. int magicId =m_data->m_testBlock1->m_magicId;
  93. if (m_data->m_verboseOutput)
  94. {
  95. b3Printf("magicId = %d\n", magicId);
  96. }
  97. if (m_data->m_testBlock1->m_magicId !=SHARED_MEMORY_MAGIC_NUMBER)
  98. {
  99. InitSharedMemoryBlock(m_data->m_testBlock1);
  100. if (m_data->m_verboseOutput)
  101. {
  102. b3Printf("Created and initialized shared memory block\n");
  103. }
  104. m_data->m_isConnected = true;
  105. } else
  106. {
  107. m_data->m_sharedMemory->releaseSharedMemory(m_data->m_sharedMemoryKey, SHARED_MEMORY_SIZE);
  108. m_data->m_testBlock1 = 0;
  109. m_data->m_isConnected = false;
  110. }
  111. } else
  112. {
  113. b3Error("Cannot connect to shared memory");
  114. m_data->m_isConnected = false;
  115. }
  116. } while (counter++ < 10 && !m_data->m_isConnected);
  117. if (!m_data->m_isConnected)
  118. {
  119. b3Error("Server cannot connect to shared memory.\n");
  120. }
  121. return m_data->m_isConnected;
  122. }
  123. void PhysicsServerSharedMemory::disconnectSharedMemory(bool deInitializeSharedMemory)
  124. {
  125. m_data->m_commandProcessor->setGuiHelper(0);
  126. if (m_data->m_verboseOutput)
  127. {
  128. b3Printf("releaseSharedMemory1\n");
  129. }
  130. if (m_data->m_testBlock1)
  131. {
  132. if (m_data->m_verboseOutput)
  133. {
  134. b3Printf("m_testBlock1\n");
  135. }
  136. if (deInitializeSharedMemory)
  137. {
  138. m_data->m_testBlock1->m_magicId = 0;
  139. if (m_data->m_verboseOutput)
  140. {
  141. b3Printf("De-initialized shared memory, magic id = %d\n",m_data->m_testBlock1->m_magicId);
  142. }
  143. }
  144. btAssert(m_data->m_sharedMemory);
  145. m_data->m_sharedMemory->releaseSharedMemory(m_data->m_sharedMemoryKey, SHARED_MEMORY_SIZE);
  146. }
  147. if (m_data->m_sharedMemory)
  148. {
  149. if (m_data->m_verboseOutput)
  150. {
  151. b3Printf("m_sharedMemory\n");
  152. }
  153. if (m_data->m_ownsSharedMemory)
  154. {
  155. delete m_data->m_sharedMemory;
  156. }
  157. m_data->m_sharedMemory = 0;
  158. m_data->m_testBlock1 = 0;
  159. }
  160. }
  161. void PhysicsServerSharedMemory::releaseSharedMemory()
  162. {
  163. if (m_data->m_verboseOutput)
  164. {
  165. b3Printf("releaseSharedMemory1\n");
  166. }
  167. if (m_data->m_testBlock1)
  168. {
  169. if (m_data->m_verboseOutput)
  170. {
  171. b3Printf("m_testBlock1\n");
  172. }
  173. m_data->m_testBlock1->m_magicId = 0;
  174. if (m_data->m_verboseOutput)
  175. {
  176. b3Printf("magic id = %d\n",m_data->m_testBlock1->m_magicId);
  177. }
  178. btAssert(m_data->m_sharedMemory);
  179. m_data->m_sharedMemory->releaseSharedMemory( m_data->m_sharedMemoryKey
  180. , SHARED_MEMORY_SIZE);
  181. }
  182. if (m_data->m_sharedMemory)
  183. {
  184. if (m_data->m_verboseOutput)
  185. {
  186. b3Printf("m_sharedMemory\n");
  187. }
  188. if (m_data->m_ownsSharedMemory)
  189. {
  190. delete m_data->m_sharedMemory;
  191. }
  192. m_data->m_sharedMemory = 0;
  193. m_data->m_testBlock1 = 0;
  194. }
  195. }
  196. void PhysicsServerSharedMemory::stepSimulationRealTime(double dtInSec)
  197. {
  198. m_data->m_commandProcessor->stepSimulationRealTime(dtInSec);
  199. }
  200. void PhysicsServerSharedMemory::processClientCommands()
  201. {
  202. if (m_data->m_isConnected && m_data->m_testBlock1)
  203. {
  204. m_data->m_commandProcessor->replayLogCommand(&m_data->m_testBlock1->m_bulletStreamDataServerToClientRefactor[0],SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  205. ///we ignore overflow of integer for now
  206. if (m_data->m_testBlock1->m_numClientCommands> m_data->m_testBlock1->m_numProcessedClientCommands)
  207. {
  208. //until we implement a proper ring buffer, we assume always maximum of 1 outstanding commands
  209. btAssert(m_data->m_testBlock1->m_numClientCommands==m_data->m_testBlock1->m_numProcessedClientCommands+1);
  210. const SharedMemoryCommand& clientCmd =m_data->m_testBlock1->m_clientCommands[0];
  211. m_data->m_testBlock1->m_numProcessedClientCommands++;
  212. //todo, timeStamp
  213. int timeStamp = 0;
  214. SharedMemoryStatus& serverStatusOut = m_data->createServerStatus(CMD_BULLET_DATA_STREAM_RECEIVED_COMPLETED,clientCmd.m_sequenceNumber,timeStamp);
  215. bool hasStatus = m_data->m_commandProcessor->processCommand(clientCmd, serverStatusOut,&m_data->m_testBlock1->m_bulletStreamDataServerToClientRefactor[0],SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
  216. if (hasStatus)
  217. {
  218. m_data->submitServerStatus(serverStatusOut);
  219. }
  220. }
  221. }
  222. }
  223. void PhysicsServerSharedMemory::renderScene()
  224. {
  225. m_data->m_commandProcessor->renderScene();
  226. }
  227. void PhysicsServerSharedMemory::physicsDebugDraw(int debugDrawFlags)
  228. {
  229. m_data->m_commandProcessor->physicsDebugDraw(debugDrawFlags);
  230. }
  231. bool PhysicsServerSharedMemory::pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld)
  232. {
  233. return m_data->m_commandProcessor->pickBody(rayFromWorld,rayToWorld);
  234. }
  235. bool PhysicsServerSharedMemory::movePickedBody(const btVector3& rayFromWorld, const btVector3& rayToWorld)
  236. {
  237. return m_data->m_commandProcessor->movePickedBody(rayFromWorld,rayToWorld);
  238. }
  239. void PhysicsServerSharedMemory::removePickingConstraint()
  240. {
  241. m_data->m_commandProcessor->removePickingConstraint();
  242. }
  243. void PhysicsServerSharedMemory::enableCommandLogging(bool enable, const char* fileName)
  244. {
  245. m_data->m_commandProcessor->enableCommandLogging(enable,fileName);
  246. }
  247. void PhysicsServerSharedMemory::replayFromLogFile(const char* fileName)
  248. {
  249. m_data->m_commandProcessor->replayFromLogFile(fileName);
  250. }