CollisionTutorialBullet2.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  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_collisionSdkHandle(0),
  59. m_collisionWorldHandle(0),
  60. m_stage(0),
  61. m_counter(0),
  62. m_timeSeriesCanvas0(0)
  63. {
  64. gTotalPoints = 0;
  65. m_app->setUpAxis(1);
  66. m_app->m_renderer->enableBlend(true);
  67. switch (m_tutorialIndex)
  68. {
  69. case TUT_SPHERE_PLANE_RTB3:
  70. case TUT_SPHERE_PLANE_BULLET2:
  71. {
  72. if (m_tutorialIndex==TUT_SPHERE_PLANE_BULLET2)
  73. {
  74. m_collisionSdkHandle = plCreateBullet2CollisionSdk();
  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. } else
  110. {
  111. }
  112. {
  113. btVector3 pos(j*sNumSpheres*1.5,-2.4,0);
  114. btQuaternion orn(0,0,0,1);
  115. plCollisionObjectHandle colObjHandle = plCreateCollisionObject(m_collisionSdkHandle,m_collisionWorldHandle,userPointer, -1,compoundShape,pos,orn);
  116. if (m_tutorialIndex==TUT_SPHERE_PLANE_BULLET2)
  117. {
  118. btCollisionObject* colObj = (btCollisionObject*) colObjHandle;
  119. btVector4 color=sColors[j&3];
  120. m_guiHelper->createCollisionObjectGraphicsObject(colObj,color);
  121. colliders.push_back(colObjHandle);
  122. plAddCollisionObject(m_collisionSdkHandle, m_collisionWorldHandle,colObjHandle);
  123. }
  124. }
  125. }
  126. }
  127. }
  128. {
  129. plCollisionShapeHandle colShape = plCreatePlaneShape(m_collisionSdkHandle, m_collisionWorldHandle,0,1,0,-3.5);
  130. btVector3 pos(0,0,0);
  131. btQuaternion orn(0,0,0,1);
  132. void* userPointer = 0;
  133. plCollisionObjectHandle colObj = plCreateCollisionObject(m_collisionSdkHandle,m_collisionWorldHandle,userPointer, 0,colShape,pos,orn);
  134. colliders.push_back(colObj);
  135. plAddCollisionObject(m_collisionSdkHandle, m_collisionWorldHandle,colObj);
  136. }
  137. int numContacts = plCollide(m_collisionSdkHandle,m_collisionWorldHandle,colliders[0],colliders[1],pointsOut,sPointCapacity);
  138. printf("numContacts = %d\n", numContacts);
  139. void* myUserPtr = 0;
  140. plWorldCollide(m_collisionSdkHandle,m_collisionWorldHandle,myNearCallback, myUserPtr);
  141. printf("total points=%d\n",gTotalPoints);
  142. //plRemoveCollisionObject(m_collisionSdkHandle,m_collisionWorldHandle,colObj);
  143. //plDeleteCollisionObject(m_collisionSdkHandle,colObj);
  144. //plDeleteShape(m_collisionSdkHandle,colShape);
  145. }
  146. /*
  147. m_timeSeriesCanvas0 = new TimeSeriesCanvas(m_app->m_2dCanvasInterface,512,256,"Constant Velocity");
  148. m_timeSeriesCanvas0 ->setupTimeSeries(2,60, 0);
  149. m_timeSeriesCanvas0->addDataSource("X position (m)", 255,0,0);
  150. m_timeSeriesCanvas0->addDataSource("X velocity (m/s)", 0,0,255);
  151. m_timeSeriesCanvas0->addDataSource("dX/dt (m/s)", 0,0,0);
  152. */
  153. break;
  154. }
  155. default:
  156. {
  157. m_timeSeriesCanvas0 = new TimeSeriesCanvas(m_app->m_2dCanvasInterface,512,256,"Unknown");
  158. m_timeSeriesCanvas0 ->setupTimeSeries(1,60, 0);
  159. }
  160. };
  161. {
  162. int boxId = m_app->registerCubeShape(100,0.01,100);
  163. b3Vector3 pos = b3MakeVector3(0,-3.5,0);
  164. b3Quaternion orn(0,0,0,1);
  165. b3Vector4 color = b3MakeVector4(1,1,1,1);
  166. b3Vector3 scaling = b3MakeVector3(1,1,1);
  167. m_app->m_renderer->registerGraphicsInstance(boxId,pos,orn,color,scaling);
  168. }
  169. {
  170. int textureIndex = -1;
  171. if (1)
  172. {
  173. int width,height,n;
  174. const char* filename = "data/cube.png";
  175. const unsigned char* image=0;
  176. const char* prefix[]={"./","../","../../","../../../","../../../../"};
  177. int numprefix = sizeof(prefix)/sizeof(const char*);
  178. for (int i=0;!image && i<numprefix;i++)
  179. {
  180. char relativeFileName[1024];
  181. sprintf(relativeFileName,"%s%s",prefix[i],filename);
  182. image = stbi_load(relativeFileName, &width, &height, &n, 3);
  183. }
  184. b3Assert(image);
  185. if (image)
  186. {
  187. textureIndex = m_app->m_renderer->registerTexture(image,width,height);
  188. }
  189. }
  190. }
  191. m_app->m_renderer->writeTransforms();
  192. }
  193. virtual ~CollisionTutorialBullet2()
  194. {
  195. delete m_timeSeriesCanvas0;
  196. plDeleteCollisionWorld(m_collisionSdkHandle,m_collisionWorldHandle);
  197. plDeleteCollisionSdk(m_collisionSdkHandle);
  198. m_timeSeriesCanvas0 = 0;
  199. m_app->m_renderer->enableBlend(false);
  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 = 136;
  290. float yaw = 32;
  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. }