CollisionTutorialBullet2.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. #include "CollisionTutorialBullet2.h"
  2. #include "../CommonInterfaces/CommonGraphicsAppInterface.h"
  3. #include "../CommonInterfaces/CommonRenderInterface.h"
  4. #include "../CommonInterfaces/CommonExampleInterface.h"
  5. #include "LinearMath/btTransform.h"
  6. #include "../CommonInterfaces/CommonGUIHelperInterface.h"
  7. #include "../RenderingExamples/TimeSeriesCanvas.h"
  8. #include "stb_image/stb_image.h"
  9. #include "Bullet3Common/b3Quaternion.h"
  10. #include "Bullet3Common/b3Matrix3x3.h"
  11. #include "../CommonInterfaces/CommonParameterInterface.h"
  12. #include "LinearMath/btAlignedObjectArray.h"
  13. #include "CollisionSdkC_Api.h"
  14. #include "LinearMath/btQuickprof.h"
  15. ///Not Invented Here link reminder http://www.joelonsoftware.com/articles/fog0000000007.html
  16. ///todo: use the 'userData' to prevent this use of global variables
  17. static int gTotalPoints = 0;
  18. const int sPointCapacity = 10000;
  19. const int sNumCompounds = 10;
  20. const int sNumSpheres = 10;
  21. lwContactPoint pointsOut[sPointCapacity];
  22. int numNearCallbacks = 0;
  23. static btVector4 sColors[4] =
  24. {
  25. btVector4(1, 0.7, 0.7, 1),
  26. btVector4(1, 1, 0.7, 1),
  27. btVector4(0.7, 1, 0.7, 1),
  28. btVector4(0.7, 1, 1, 1),
  29. };
  30. void myNearCallback(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, void* userData, plCollisionObjectHandle objA, plCollisionObjectHandle objB)
  31. {
  32. numNearCallbacks++;
  33. int remainingCapacity = sPointCapacity - gTotalPoints;
  34. btAssert(remainingCapacity > 0);
  35. if (remainingCapacity > 0)
  36. {
  37. lwContactPoint* pointPtr = &pointsOut[gTotalPoints];
  38. int numNewPoints = plCollide(sdkHandle, worldHandle, objA, objB, pointPtr, remainingCapacity);
  39. btAssert(numNewPoints <= remainingCapacity);
  40. gTotalPoints += numNewPoints;
  41. }
  42. }
  43. class CollisionTutorialBullet2 : public CommonExampleInterface
  44. {
  45. CommonGraphicsApp* m_app;
  46. GUIHelperInterface* m_guiHelper;
  47. int m_tutorialIndex;
  48. TimeSeriesCanvas* m_timeSeriesCanvas0;
  49. plCollisionSdkHandle m_collisionSdkHandle;
  50. plCollisionWorldHandle m_collisionWorldHandle;
  51. // int m_stage;
  52. // int m_counter;
  53. public:
  54. CollisionTutorialBullet2(GUIHelperInterface* guiHelper, int tutorialIndex)
  55. : m_app(guiHelper->getAppInterface()),
  56. m_guiHelper(guiHelper),
  57. m_tutorialIndex(tutorialIndex),
  58. m_timeSeriesCanvas0(0),
  59. m_collisionSdkHandle(0),
  60. m_collisionWorldHandle(0)
  61. // m_stage(0),
  62. // m_counter(0)
  63. {
  64. gTotalPoints = 0;
  65. m_app->setUpAxis(1);
  66. switch (m_tutorialIndex)
  67. {
  68. case TUT_SPHERE_PLANE_RTB3:
  69. case TUT_SPHERE_PLANE_BULLET2:
  70. {
  71. if (m_tutorialIndex == TUT_SPHERE_PLANE_BULLET2)
  72. {
  73. m_collisionSdkHandle = plCreateBullet2CollisionSdk();
  74. }
  75. else
  76. {
  77. #ifndef DISABLE_REAL_TIME_BULLET3_COLLISION_SDK
  78. m_collisionSdkHandle = plCreateRealTimeBullet3CollisionSdk();
  79. #endif //DISABLE_REAL_TIME_BULLET3_COLLISION_SDK
  80. }
  81. if (m_collisionSdkHandle)
  82. {
  83. int maxNumObjsCapacity = 1024;
  84. int maxNumShapesCapacity = 1024;
  85. int maxNumPairsCapacity = 16384;
  86. btAlignedObjectArray<plCollisionObjectHandle> colliders;
  87. m_collisionWorldHandle = plCreateCollisionWorld(m_collisionSdkHandle, maxNumObjsCapacity, maxNumShapesCapacity, maxNumPairsCapacity);
  88. //create objects, do query etc
  89. {
  90. float radius = 1.f;
  91. void* userPointer = 0;
  92. {
  93. for (int j = 0; j < sNumCompounds; j++)
  94. {
  95. plCollisionShapeHandle compoundShape = plCreateCompoundShape(m_collisionSdkHandle, m_collisionWorldHandle);
  96. for (int i = 0; i < sNumSpheres; i++)
  97. {
  98. btVector3 childPos(i * 1.5, 0, 0);
  99. btQuaternion childOrn(0, 0, 0, 1);
  100. btVector3 scaling(radius, radius, radius);
  101. plCollisionShapeHandle childShape = plCreateSphereShape(m_collisionSdkHandle, m_collisionWorldHandle, radius);
  102. plAddChildShape(m_collisionSdkHandle, m_collisionWorldHandle, compoundShape, childShape, childPos, childOrn);
  103. //m_guiHelper->createCollisionObjectGraphicsObject(colObj,color);
  104. }
  105. if (m_tutorialIndex == TUT_SPHERE_PLANE_BULLET2)
  106. {
  107. btCollisionShape* colShape = (btCollisionShape*)compoundShape;
  108. m_guiHelper->createCollisionShapeGraphicsObject(colShape);
  109. }
  110. else
  111. {
  112. }
  113. {
  114. btVector3 pos(j * sNumSpheres * 1.5, -2.4, 0);
  115. btQuaternion orn(0, 0, 0, 1);
  116. plCollisionObjectHandle colObjHandle = plCreateCollisionObject(m_collisionSdkHandle, m_collisionWorldHandle, userPointer, -1, compoundShape, pos, orn);
  117. if (m_tutorialIndex == TUT_SPHERE_PLANE_BULLET2)
  118. {
  119. btCollisionObject* colObj = (btCollisionObject*)colObjHandle;
  120. btVector4 color = sColors[j & 3];
  121. m_guiHelper->createCollisionObjectGraphicsObject(colObj, color);
  122. colliders.push_back(colObjHandle);
  123. plAddCollisionObject(m_collisionSdkHandle, m_collisionWorldHandle, colObjHandle);
  124. }
  125. }
  126. }
  127. }
  128. }
  129. {
  130. plCollisionShapeHandle colShape = plCreatePlaneShape(m_collisionSdkHandle, m_collisionWorldHandle, 0, 1, 0, -3.5);
  131. btVector3 pos(0, 0, 0);
  132. btQuaternion orn(0, 0, 0, 1);
  133. void* userPointer = 0;
  134. plCollisionObjectHandle colObj = plCreateCollisionObject(m_collisionSdkHandle, m_collisionWorldHandle, userPointer, 0, colShape, pos, orn);
  135. colliders.push_back(colObj);
  136. plAddCollisionObject(m_collisionSdkHandle, m_collisionWorldHandle, colObj);
  137. }
  138. int numContacts = plCollide(m_collisionSdkHandle, m_collisionWorldHandle, colliders[0], colliders[1], pointsOut, sPointCapacity);
  139. printf("numContacts = %d\n", numContacts);
  140. void* myUserPtr = 0;
  141. plWorldCollide(m_collisionSdkHandle, m_collisionWorldHandle, myNearCallback, myUserPtr);
  142. printf("total points=%d\n", gTotalPoints);
  143. //plRemoveCollisionObject(m_collisionSdkHandle,m_collisionWorldHandle,colObj);
  144. //plDeleteCollisionObject(m_collisionSdkHandle,colObj);
  145. //plDeleteShape(m_collisionSdkHandle,colShape);
  146. }
  147. /*
  148. m_timeSeriesCanvas0 = new TimeSeriesCanvas(m_app->m_2dCanvasInterface,512,256,"Constant Velocity");
  149. m_timeSeriesCanvas0 ->setupTimeSeries(2,60, 0);
  150. m_timeSeriesCanvas0->addDataSource("X position (m)", 255,0,0);
  151. m_timeSeriesCanvas0->addDataSource("X velocity (m/s)", 0,0,255);
  152. m_timeSeriesCanvas0->addDataSource("dX/dt (m/s)", 0,0,0);
  153. */
  154. break;
  155. }
  156. default:
  157. {
  158. m_timeSeriesCanvas0 = new TimeSeriesCanvas(m_app->m_2dCanvasInterface, 512, 256, "Unknown");
  159. m_timeSeriesCanvas0->setupTimeSeries(1, 60, 0);
  160. }
  161. };
  162. {
  163. int boxId = m_app->registerCubeShape(100, 0.01, 100);
  164. b3Vector3 pos = b3MakeVector3(0, -3.5, 0);
  165. b3Quaternion orn(0, 0, 0, 1);
  166. b3Vector4 color = b3MakeVector4(1, 1, 1, 1);
  167. b3Vector3 scaling = b3MakeVector3(1, 1, 1);
  168. m_app->m_renderer->registerGraphicsInstance(boxId, pos, orn, color, scaling);
  169. }
  170. {
  171. int textureIndex = -1;
  172. if (1)
  173. {
  174. int width, height, n;
  175. const char* filename = "data/cube.png";
  176. const unsigned char* image = 0;
  177. const char* prefix[] = {"./", "../", "../../", "../../../", "../../../../"};
  178. int numprefix = sizeof(prefix) / sizeof(const char*);
  179. for (int i = 0; !image && i < numprefix; i++)
  180. {
  181. char relativeFileName[1024];
  182. sprintf(relativeFileName, "%s%s", prefix[i], filename);
  183. image = stbi_load(relativeFileName, &width, &height, &n, 3);
  184. }
  185. b3Assert(image);
  186. if (image)
  187. {
  188. textureIndex = m_app->m_renderer->registerTexture(image, width, height);
  189. }
  190. }
  191. }
  192. m_app->m_renderer->writeTransforms();
  193. }
  194. virtual ~CollisionTutorialBullet2()
  195. {
  196. delete m_timeSeriesCanvas0;
  197. plDeleteCollisionWorld(m_collisionSdkHandle, m_collisionWorldHandle);
  198. plDeleteCollisionSdk(m_collisionSdkHandle);
  199. m_timeSeriesCanvas0 = 0;
  200. }
  201. virtual void initPhysics()
  202. {
  203. }
  204. virtual void exitPhysics()
  205. {
  206. }
  207. virtual void stepSimulation(float deltaTime)
  208. {
  209. #ifndef BT_NO_PROFILE
  210. CProfileManager::Reset();
  211. #endif
  212. void* myUserPtr = 0;
  213. gTotalPoints = 0;
  214. numNearCallbacks = 0;
  215. {
  216. BT_PROFILE("plWorldCollide");
  217. if (m_collisionSdkHandle && m_collisionWorldHandle)
  218. {
  219. plWorldCollide(m_collisionSdkHandle, m_collisionWorldHandle, myNearCallback, myUserPtr);
  220. }
  221. }
  222. #if 0
  223. switch (m_tutorialIndex)
  224. {
  225. case TUT_SPHERE_SPHERE:
  226. {
  227. if (m_timeSeriesCanvas0)
  228. {
  229. float xPos = 0.f;
  230. float xVel = 1.f;
  231. m_timeSeriesCanvas0->insertDataAtCurrentTime(xPos,0,true);
  232. m_timeSeriesCanvas0->insertDataAtCurrentTime(xVel,1,true);
  233. }
  234. break;
  235. }
  236. default:
  237. {
  238. }
  239. };
  240. #endif
  241. if (m_timeSeriesCanvas0)
  242. m_timeSeriesCanvas0->nextTick();
  243. // m_app->m_renderer->writeSingleInstanceTransformToCPU(m_bodies[i]->m_worldPose.m_position, m_bodies[i]->m_worldPose.m_orientation, m_bodies[i]->m_graphicsIndex);
  244. m_app->m_renderer->writeTransforms();
  245. #ifndef BT_NO_PROFILE
  246. CProfileManager::Increment_Frame_Counter();
  247. #endif
  248. }
  249. virtual void renderScene()
  250. {
  251. if (m_app && m_app->m_renderer)
  252. {
  253. m_app->m_renderer->renderScene();
  254. m_app->m_renderer->clearZBuffer();
  255. m_app->drawText3D("X", 1, 0, 0, 1);
  256. m_app->drawText3D("Y", 0, 1, 0, 1);
  257. m_app->drawText3D("Z", 0, 0, 1, 1);
  258. for (int i = 0; i < gTotalPoints; i++)
  259. {
  260. const lwContactPoint& contact = pointsOut[i];
  261. btVector3 color(1, 1, 0);
  262. btScalar lineWidth = 3;
  263. if (contact.m_distance < 0)
  264. {
  265. color.setValue(1, 0, 0);
  266. }
  267. m_app->m_renderer->drawLine(contact.m_ptOnAWorld, contact.m_ptOnBWorld, color, lineWidth);
  268. }
  269. }
  270. }
  271. virtual void physicsDebugDraw(int debugDrawFlags)
  272. {
  273. }
  274. virtual bool mouseMoveCallback(float x, float y)
  275. {
  276. return false;
  277. }
  278. virtual bool mouseButtonCallback(int button, int state, float x, float y)
  279. {
  280. return false;
  281. }
  282. virtual bool keyboardCallback(int key, int state)
  283. {
  284. return false;
  285. }
  286. virtual void resetCamera()
  287. {
  288. float dist = 10.5;
  289. float pitch = -32;
  290. float yaw = 136;
  291. float targetPos[3] = {0, 0, 0};
  292. if (m_app->m_renderer && m_app->m_renderer->getActiveCamera())
  293. {
  294. m_app->m_renderer->getActiveCamera()->setCameraDistance(dist);
  295. m_app->m_renderer->getActiveCamera()->setCameraPitch(pitch);
  296. m_app->m_renderer->getActiveCamera()->setCameraYaw(yaw);
  297. m_app->m_renderer->getActiveCamera()->setCameraTargetPosition(targetPos[0], targetPos[1], targetPos[2]);
  298. }
  299. }
  300. };
  301. class CommonExampleInterface* CollisionTutorialBullet2CreateFunc(struct CommonExampleOptions& options)
  302. {
  303. return new CollisionTutorialBullet2(options.m_guiHelper, options.m_option);
  304. }