1
0

CCPhysics3DConstraint.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
  1. /****************************************************************************
  2. Copyright (c) 2015-2017 Chukong Technologies Inc.
  3. http://www.cocos2d-x.org
  4. Permission is hereby granted, free of charge, to any person obtaining a copy
  5. of this software and associated documentation files (the "Software"), to deal
  6. in the Software without restriction, including without limitation the rights
  7. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. copies of the Software, and to permit persons to whom the Software is
  9. furnished to do so, subject to the following conditions:
  10. The above copyright notice and this permission notice shall be included in
  11. all copies or substantial portions of the Software.
  12. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  13. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  14. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  15. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  16. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  17. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  18. THE SOFTWARE.
  19. ****************************************************************************/
  20. #include "physics3d/CCPhysics3D.h"
  21. #if CC_USE_3D_PHYSICS
  22. #if (CC_ENABLE_BULLET_INTEGRATION)
  23. NS_CC_BEGIN
  24. Physics3DConstraint::Physics3DConstraint()
  25. : _bodyA(nullptr)
  26. , _bodyB(nullptr)
  27. , _constraint(nullptr)
  28. , _type(Physics3DConstraint::ConstraintType::UNKNOWN)
  29. , _userData(nullptr)
  30. {
  31. }
  32. Physics3DConstraint::~Physics3DConstraint()
  33. {
  34. CC_SAFE_RELEASE(_bodyA);
  35. CC_SAFE_RELEASE(_bodyB);
  36. CC_SAFE_DELETE(_constraint);
  37. }
  38. float Physics3DConstraint::getBreakingImpulse() const
  39. {
  40. return _constraint->getBreakingImpulseThreshold();
  41. }
  42. void Physics3DConstraint::setBreakingImpulse(float impulse)
  43. {
  44. _constraint->setBreakingImpulseThreshold(impulse);
  45. }
  46. bool Physics3DConstraint::isEnabled() const
  47. {
  48. return _constraint->isEnabled();
  49. }
  50. void Physics3DConstraint::setEnabled(bool enabled)
  51. {
  52. return _constraint->setEnabled(enabled);
  53. }
  54. int Physics3DConstraint::getOverrideNumSolverIterations() const
  55. {
  56. return _constraint->getOverrideNumSolverIterations();
  57. }
  58. ///override the number of constraint solver iterations used to solve this constraint
  59. ///-1 will use the default number of iterations, as specified in SolverInfo.m_numIterations
  60. void Physics3DConstraint::setOverrideNumSolverIterations(int overrideNumIterations)
  61. {
  62. _constraint->setOverrideNumSolverIterations(overrideNumIterations);
  63. }
  64. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. Physics3DPointToPointConstraint* Physics3DPointToPointConstraint::create(Physics3DRigidBody* rbA, const cocos2d::Vec3& pivotPointInA)
  66. {
  67. auto ret = new (std::nothrow) Physics3DPointToPointConstraint();
  68. if (ret && ret->init(rbA, pivotPointInA))
  69. {
  70. ret->autorelease();
  71. return ret;
  72. }
  73. CC_SAFE_DELETE(ret);
  74. return ret;
  75. }
  76. Physics3DPointToPointConstraint* Physics3DPointToPointConstraint::create(Physics3DRigidBody* rbA, Physics3DRigidBody* rbB, const cocos2d::Vec3& pivotPointInA, const cocos2d::Vec3& pivotPointInB)
  77. {
  78. auto ret = new (std::nothrow) Physics3DPointToPointConstraint();
  79. if (ret && ret->init(rbA, rbB, pivotPointInA, pivotPointInB))
  80. {
  81. ret->autorelease();
  82. return ret;
  83. }
  84. CC_SAFE_DELETE(ret);
  85. return ret;
  86. }
  87. bool Physics3DPointToPointConstraint::init(Physics3DRigidBody* rbA, const cocos2d::Vec3& pivotPointInA)
  88. {
  89. _constraint = new btPoint2PointConstraint(*rbA->getRigidBody(), convertVec3TobtVector3(pivotPointInA));
  90. _bodyA = rbA;
  91. _bodyA->retain();
  92. return true;
  93. }
  94. bool Physics3DPointToPointConstraint::init(Physics3DRigidBody* rbA, Physics3DRigidBody* rbB, const cocos2d::Vec3& pivotPointInA, const cocos2d::Vec3& pivotPointInB)
  95. {
  96. _constraint = new btPoint2PointConstraint(*rbA->getRigidBody(), *rbB->getRigidBody(), convertVec3TobtVector3(pivotPointInA), convertVec3TobtVector3(pivotPointInB));
  97. _bodyA = rbA;
  98. _bodyB = rbB;
  99. _bodyA->retain();
  100. _bodyB->retain();
  101. return true;
  102. }
  103. void Physics3DPointToPointConstraint::setPivotPointInA(const cocos2d::Vec3& pivotA)
  104. {
  105. auto point = convertVec3TobtVector3(pivotA);
  106. static_cast<btPoint2PointConstraint*>(_constraint)->setPivotA(point);
  107. }
  108. void Physics3DPointToPointConstraint::setPivotPointInB(const cocos2d::Vec3& pivotB)
  109. {
  110. auto point = convertVec3TobtVector3(pivotB);
  111. static_cast<btPoint2PointConstraint*>(_constraint)->setPivotB(point);
  112. }
  113. cocos2d::Vec3 Physics3DPointToPointConstraint::getPivotPointInA() const
  114. {
  115. const auto& point = static_cast<btPoint2PointConstraint*>(_constraint)->getPivotInA();
  116. return convertbtVector3ToVec3(point);
  117. }
  118. cocos2d::Vec3 Physics3DPointToPointConstraint::getPivotPointInB() const
  119. {
  120. const auto& point = static_cast<btPoint2PointConstraint*>(_constraint)->getPivotInB();
  121. return convertbtVector3ToVec3(point);
  122. }
  123. Physics3DPointToPointConstraint::Physics3DPointToPointConstraint()
  124. {
  125. _type = Physics3DConstraint::ConstraintType::POINT_TO_POINT;
  126. }
  127. Physics3DPointToPointConstraint::~Physics3DPointToPointConstraint()
  128. {
  129. }
  130. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  131. Physics3DHingeConstraint* Physics3DHingeConstraint::create(Physics3DRigidBody* rbA, const cocos2d::Mat4& rbAFrame, bool useReferenceFrameA)
  132. {
  133. auto ret = new (std::nothrow) Physics3DHingeConstraint();
  134. ret->_constraint = new btHingeConstraint(*rbA->getRigidBody(), convertMat4TobtTransform(rbAFrame), useReferenceFrameA);
  135. ret->_bodyA = rbA;
  136. rbA->retain();
  137. ret->autorelease();
  138. return ret;
  139. }
  140. Physics3DHingeConstraint* Physics3DHingeConstraint::create(Physics3DRigidBody* rbA, const cocos2d::Vec3& pivotInA, const cocos2d::Vec3& axisInA, bool useReferenceFrameA)
  141. {
  142. auto ret = new (std::nothrow) Physics3DHingeConstraint();
  143. ret->_constraint = new btHingeConstraint(*rbA->getRigidBody(), convertVec3TobtVector3(pivotInA), convertVec3TobtVector3(axisInA), useReferenceFrameA);
  144. ret->_bodyA = rbA;
  145. rbA->retain();
  146. ret->autorelease();
  147. return ret;
  148. }
  149. Physics3DHingeConstraint* Physics3DHingeConstraint::create(Physics3DRigidBody* rbA, Physics3DRigidBody* rbB, const cocos2d::Vec3& pivotInA,const cocos2d::Vec3& pivotInB, cocos2d::Vec3& axisInA, cocos2d::Vec3& axisInB, bool useReferenceFrameA)
  150. {
  151. auto ret = new (std::nothrow) Physics3DHingeConstraint();
  152. ret->_constraint = new btHingeConstraint(*rbA->getRigidBody(), *rbB->getRigidBody(), convertVec3TobtVector3(pivotInA), convertVec3TobtVector3(pivotInB), convertVec3TobtVector3(axisInA), convertVec3TobtVector3(axisInB), useReferenceFrameA);
  153. ret->_bodyA = rbA;
  154. rbA->retain();
  155. ret->_bodyB = rbB;
  156. rbB->retain();
  157. ret->autorelease();
  158. return ret;
  159. }
  160. Physics3DHingeConstraint* Physics3DHingeConstraint::create(Physics3DRigidBody* rbA, Physics3DRigidBody* rbB, const cocos2d::Mat4& rbAFrame, const cocos2d::Mat4& rbBFrame, bool useReferenceFrameA)
  161. {
  162. auto ret = new (std::nothrow) Physics3DHingeConstraint();
  163. ret->_constraint = new btHingeConstraint(*rbA->getRigidBody(), *rbB->getRigidBody(), convertMat4TobtTransform(rbAFrame), convertMat4TobtTransform(rbBFrame), useReferenceFrameA);
  164. ret->_bodyA = rbA;
  165. rbA->retain();
  166. ret->_bodyB = rbB;
  167. rbB->retain();
  168. ret->autorelease();
  169. return ret;
  170. }
  171. cocos2d::Mat4 Physics3DHingeConstraint::getFrameOffsetA() const
  172. {
  173. const auto& transform = static_cast<btHingeConstraint*>(_constraint)->getFrameOffsetA();
  174. return convertbtTransformToMat4(transform);
  175. }
  176. cocos2d::Mat4 Physics3DHingeConstraint::getFrameOffsetB() const
  177. {
  178. const auto& transform = static_cast<btHingeConstraint*>(_constraint)->getFrameOffsetB();
  179. return convertbtTransformToMat4(transform);
  180. }
  181. void Physics3DHingeConstraint::setFrames(const cocos2d::Mat4& frameA, const cocos2d::Mat4& frameB)
  182. {
  183. auto transformA = convertMat4TobtTransform(frameA);
  184. auto transformB = convertMat4TobtTransform(frameB);
  185. static_cast<btHingeConstraint*>(_constraint)->setFrames(transformA, transformB);
  186. }
  187. void Physics3DHingeConstraint::setAngularOnly(bool angularOnly)
  188. {
  189. static_cast<btHingeConstraint*>(_constraint)->setAngularOnly(angularOnly);
  190. }
  191. void Physics3DHingeConstraint::enableAngularMotor(bool enableMotor, float targetVelocity, float maxMotorImpulse)
  192. {
  193. static_cast<btHingeConstraint*>(_constraint)->enableAngularMotor(enableMotor, targetVelocity, maxMotorImpulse);
  194. }
  195. void Physics3DHingeConstraint::enableMotor(bool enableMotor)
  196. {
  197. static_cast<btHingeConstraint*>(_constraint)->enableMotor(enableMotor);
  198. }
  199. void Physics3DHingeConstraint::setMaxMotorImpulse(float maxMotorImpulse)
  200. {
  201. static_cast<btHingeConstraint*>(_constraint)->setMaxMotorImpulse(maxMotorImpulse);
  202. }
  203. void Physics3DHingeConstraint::setMotorTarget(const cocos2d::Quaternion& qAinB, float dt)
  204. {
  205. static_cast<btHingeConstraint*>(_constraint)->setMotorTarget(convertQuatTobtQuat(qAinB), dt);
  206. }
  207. void Physics3DHingeConstraint::setMotorTarget(float targetAngle, float dt)
  208. {
  209. static_cast<btHingeConstraint*>(_constraint)->setMotorTarget(targetAngle, dt);
  210. }
  211. void Physics3DHingeConstraint::setLimit(float low, float high, float softness, float biasFactor, float relaxationFactor)
  212. {
  213. static_cast<btHingeConstraint*>(_constraint)->setLimit(low, high, softness, biasFactor, relaxationFactor);
  214. }
  215. void Physics3DHingeConstraint::setAxis(const cocos2d::Vec3& axisInA)
  216. {
  217. auto axis = convertVec3TobtVector3(axisInA);
  218. static_cast<btHingeConstraint*>(_constraint)->setAxis(axis);
  219. }
  220. float Physics3DHingeConstraint::getLowerLimit() const
  221. {
  222. return static_cast<btHingeConstraint*>(_constraint)->getLowerLimit();
  223. }
  224. float Physics3DHingeConstraint::getUpperLimit() const
  225. {
  226. return static_cast<btHingeConstraint*>(_constraint)->getUpperLimit();
  227. }
  228. float Physics3DHingeConstraint::getHingeAngle() const
  229. {
  230. return static_cast<btHingeConstraint*>(_constraint)->getHingeAngle();
  231. }
  232. float Physics3DHingeConstraint::getHingeAngle(const cocos2d::Mat4& transA, const cocos2d::Mat4& transB)
  233. {
  234. auto btTransA = convertMat4TobtTransform(transA);
  235. auto btTransB = convertMat4TobtTransform(transB);
  236. return static_cast<btHingeConstraint*>(_constraint)->getHingeAngle(btTransA, btTransB);
  237. }
  238. cocos2d::Mat4 Physics3DHingeConstraint::getAFrame() const
  239. {
  240. const auto& trans = static_cast<btHingeConstraint*>(_constraint)->getAFrame();
  241. return convertbtTransformToMat4(trans);
  242. }
  243. cocos2d::Mat4 Physics3DHingeConstraint::getBFrame() const
  244. {
  245. const auto& trans = static_cast<btHingeConstraint*>(_constraint)->getBFrame();
  246. return convertbtTransformToMat4(trans);
  247. }
  248. bool Physics3DHingeConstraint::getAngularOnly() const
  249. {
  250. return static_cast<btHingeConstraint*>(_constraint)->getAngularOnly();
  251. }
  252. bool Physics3DHingeConstraint::getEnableAngularMotor() const
  253. {
  254. return static_cast<btHingeConstraint*>(_constraint)->getEnableAngularMotor();
  255. }
  256. float Physics3DHingeConstraint::getMotorTargetVelosity() const
  257. {
  258. return static_cast<btHingeConstraint*>(_constraint)->getMotorTargetVelosity();
  259. }
  260. float Physics3DHingeConstraint::getMaxMotorImpulse() const
  261. {
  262. return static_cast<btHingeConstraint*>(_constraint)->getMaxMotorImpulse();
  263. }
  264. bool Physics3DHingeConstraint::getUseFrameOffset() const
  265. {
  266. return static_cast<btHingeConstraint*>(_constraint)->getUseFrameOffset();
  267. }
  268. void Physics3DHingeConstraint::setUseFrameOffset(bool frameOffsetOnOff)
  269. {
  270. static_cast<btHingeConstraint*>(_constraint)->setUseFrameOffset(frameOffsetOnOff);
  271. }
  272. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  273. Physics3DSliderConstraint* Physics3DSliderConstraint::create(Physics3DRigidBody* rbA, Physics3DRigidBody* rbB, const cocos2d::Mat4& frameInA, const cocos2d::Mat4& frameInB ,bool useLinearReferenceFrameA)
  274. {
  275. auto ret = new (std::nothrow) Physics3DSliderConstraint();
  276. ret->_bodyA = rbA;
  277. ret->_bodyB = rbB;
  278. rbA->retain();
  279. rbB->retain();
  280. auto transformA = convertMat4TobtTransform(frameInA);
  281. auto transformB = convertMat4TobtTransform(frameInB);
  282. ret->_constraint = new btSliderConstraint(*rbA->getRigidBody(), *rbB->getRigidBody(), transformA, transformB, useLinearReferenceFrameA);
  283. ret->autorelease();
  284. return ret;
  285. }
  286. cocos2d::Mat4 Physics3DSliderConstraint::getFrameOffsetA() const
  287. {
  288. const auto& frameOff = static_cast<btSliderConstraint*>(_constraint)->getFrameOffsetA();
  289. return convertbtTransformToMat4(frameOff);
  290. }
  291. cocos2d::Mat4 Physics3DSliderConstraint::getFrameOffsetB() const
  292. {
  293. const auto& frameOff = static_cast<btSliderConstraint*>(_constraint)->getFrameOffsetB();
  294. return convertbtTransformToMat4(frameOff);
  295. }
  296. float Physics3DSliderConstraint::getLowerLinLimit() const
  297. {
  298. return static_cast<btSliderConstraint*>(_constraint)->getLowerLinLimit();
  299. }
  300. void Physics3DSliderConstraint::setLowerLinLimit(float lowerLimit)
  301. {
  302. static_cast<btSliderConstraint*>(_constraint)->setLowerLinLimit(lowerLimit);
  303. }
  304. float Physics3DSliderConstraint::getUpperLinLimit() const
  305. {
  306. return static_cast<btSliderConstraint*>(_constraint)->getUpperLinLimit();
  307. }
  308. void Physics3DSliderConstraint::setUpperLinLimit(float upperLimit)
  309. {
  310. static_cast<btSliderConstraint*>(_constraint)->setUpperLinLimit(upperLimit);
  311. }
  312. float Physics3DSliderConstraint::getLowerAngLimit() const
  313. {
  314. return static_cast<btSliderConstraint*>(_constraint)->getLowerAngLimit();
  315. }
  316. void Physics3DSliderConstraint::setLowerAngLimit(float lowerLimit)
  317. {
  318. static_cast<btSliderConstraint*>(_constraint)->setLowerAngLimit(lowerLimit);
  319. }
  320. float Physics3DSliderConstraint::getUpperAngLimit() const
  321. {
  322. return static_cast<btSliderConstraint*>(_constraint)->getUpperAngLimit();
  323. }
  324. void Physics3DSliderConstraint::setUpperAngLimit(float upperLimit)
  325. {
  326. static_cast<btSliderConstraint*>(_constraint)->setUpperAngLimit(upperLimit);
  327. }
  328. bool Physics3DSliderConstraint::getUseLinearReferenceFrameA() const
  329. {
  330. return static_cast<btSliderConstraint*>(_constraint)->getUseLinearReferenceFrameA();
  331. }
  332. float Physics3DSliderConstraint::getSoftnessDirLin() const
  333. {
  334. return static_cast<btSliderConstraint*>(_constraint)->getSoftnessDirLin();
  335. }
  336. float Physics3DSliderConstraint::getRestitutionDirLin() const
  337. {
  338. return static_cast<btSliderConstraint*>(_constraint)->getRestitutionDirLin();
  339. }
  340. float Physics3DSliderConstraint::getDampingDirLin() const
  341. {
  342. return static_cast<btSliderConstraint*>(_constraint)->getDampingDirLin();
  343. }
  344. float Physics3DSliderConstraint::getSoftnessDirAng() const
  345. {
  346. return static_cast<btSliderConstraint*>(_constraint)->getSoftnessDirAng();
  347. }
  348. float Physics3DSliderConstraint::getRestitutionDirAng() const
  349. {
  350. return static_cast<btSliderConstraint*>(_constraint)->getRestitutionDirAng();
  351. }
  352. float Physics3DSliderConstraint::getDampingDirAng() const
  353. {
  354. return static_cast<btSliderConstraint*>(_constraint)->getDampingDirAng();
  355. }
  356. float Physics3DSliderConstraint::getSoftnessLimLin() const
  357. {
  358. return static_cast<btSliderConstraint*>(_constraint)->getSoftnessLimLin();
  359. }
  360. float Physics3DSliderConstraint::getRestitutionLimLin() const
  361. {
  362. return static_cast<btSliderConstraint*>(_constraint)->getRestitutionLimLin();
  363. }
  364. float Physics3DSliderConstraint::getDampingLimLin() const
  365. {
  366. return static_cast<btSliderConstraint*>(_constraint)->getDampingLimAng();
  367. }
  368. float Physics3DSliderConstraint::getSoftnessLimAng() const
  369. {
  370. return static_cast<btSliderConstraint*>(_constraint)->getSoftnessLimAng();
  371. }
  372. float Physics3DSliderConstraint::getRestitutionLimAng() const
  373. {
  374. return static_cast<btSliderConstraint*>(_constraint)->getRestitutionLimAng();
  375. }
  376. float Physics3DSliderConstraint::getDampingLimAng() const
  377. {
  378. return static_cast<btSliderConstraint*>(_constraint)->getDampingLimAng();
  379. }
  380. float Physics3DSliderConstraint::getSoftnessOrthoLin() const
  381. {
  382. return static_cast<btSliderConstraint*>(_constraint)->getSoftnessOrthoLin();
  383. }
  384. float Physics3DSliderConstraint::getRestitutionOrthoLin() const
  385. {
  386. return static_cast<btSliderConstraint*>(_constraint)->getRestitutionOrthoAng();
  387. }
  388. float Physics3DSliderConstraint::getDampingOrthoLin() const
  389. {
  390. return static_cast<btSliderConstraint*>(_constraint)->getDampingOrthoLin();
  391. }
  392. float Physics3DSliderConstraint::getSoftnessOrthoAng() const
  393. {
  394. return static_cast<btSliderConstraint*>(_constraint)->getSoftnessOrthoAng();
  395. }
  396. float Physics3DSliderConstraint::getRestitutionOrthoAng() const
  397. {
  398. return static_cast<btSliderConstraint*>(_constraint)->getRestitutionOrthoAng();
  399. }
  400. float Physics3DSliderConstraint::getDampingOrthoAng() const
  401. {
  402. return static_cast<btSliderConstraint*>(_constraint)->getDampingOrthoAng();
  403. }
  404. void Physics3DSliderConstraint::setSoftnessDirLin(float softnessDirLin)
  405. {
  406. static_cast<btSliderConstraint*>(_constraint)->setSoftnessDirLin(softnessDirLin);
  407. }
  408. void Physics3DSliderConstraint::setRestitutionDirLin(float restitutionDirLin)
  409. {
  410. static_cast<btSliderConstraint*>(_constraint)->setRestitutionDirLin(restitutionDirLin);
  411. }
  412. void Physics3DSliderConstraint::setDampingDirLin(float dampingDirLin)
  413. {
  414. static_cast<btSliderConstraint*>(_constraint)->setDampingDirLin(dampingDirLin);
  415. }
  416. void Physics3DSliderConstraint::setSoftnessDirAng(float softnessDirAng)
  417. {
  418. static_cast<btSliderConstraint*>(_constraint)->setSoftnessDirAng(softnessDirAng);
  419. }
  420. void Physics3DSliderConstraint::setRestitutionDirAng(float restitutionDirAng)
  421. {
  422. static_cast<btSliderConstraint*>(_constraint)->setRestitutionDirAng(restitutionDirAng);
  423. }
  424. void Physics3DSliderConstraint::setDampingDirAng(float dampingDirAng)
  425. {
  426. static_cast<btSliderConstraint*>(_constraint)->setDampingDirAng(dampingDirAng);
  427. }
  428. void Physics3DSliderConstraint::setSoftnessLimLin(float softnessLimLin)
  429. {
  430. static_cast<btSliderConstraint*>(_constraint)->setSoftnessLimLin(softnessLimLin);
  431. }
  432. void Physics3DSliderConstraint::setRestitutionLimLin(float restitutionLimLin)
  433. {
  434. static_cast<btSliderConstraint*>(_constraint)->setRestitutionDirLin(restitutionLimLin);
  435. }
  436. void Physics3DSliderConstraint::setDampingLimLin(float dampingLimLin)
  437. {
  438. static_cast<btSliderConstraint*>(_constraint)->setDampingLimLin(dampingLimLin);
  439. }
  440. void Physics3DSliderConstraint::setSoftnessLimAng(float softnessLimAng)
  441. {
  442. static_cast<btSliderConstraint*>(_constraint)->setSoftnessLimAng(softnessLimAng);
  443. }
  444. void Physics3DSliderConstraint::setRestitutionLimAng(float restitutionLimAng)
  445. {
  446. static_cast<btSliderConstraint*>(_constraint)->setRestitutionLimAng(restitutionLimAng);
  447. }
  448. void Physics3DSliderConstraint::setDampingLimAng(float dampingLimAng)
  449. {
  450. static_cast<btSliderConstraint*>(_constraint)->setDampingLimAng(dampingLimAng);
  451. }
  452. void Physics3DSliderConstraint::setSoftnessOrthoLin(float softnessOrthoLin)
  453. {
  454. static_cast<btSliderConstraint*>(_constraint)->setSoftnessOrthoLin(softnessOrthoLin);
  455. }
  456. void Physics3DSliderConstraint::setRestitutionOrthoLin(float restitutionOrthoLin)
  457. {
  458. static_cast<btSliderConstraint*>(_constraint)->setRestitutionOrthoLin(restitutionOrthoLin);
  459. }
  460. void Physics3DSliderConstraint::setDampingOrthoLin(float dampingOrthoLin)
  461. {
  462. static_cast<btSliderConstraint*>(_constraint)->setDampingLimLin(dampingOrthoLin);
  463. }
  464. void Physics3DSliderConstraint::setSoftnessOrthoAng(float softnessOrthoAng)
  465. {
  466. static_cast<btSliderConstraint*>(_constraint)->setSoftnessOrthoAng(softnessOrthoAng);
  467. }
  468. void Physics3DSliderConstraint::setRestitutionOrthoAng(float restitutionOrthoAng)
  469. {
  470. static_cast<btSliderConstraint*>(_constraint)->setRestitutionOrthoAng(restitutionOrthoAng);
  471. }
  472. void Physics3DSliderConstraint::setDampingOrthoAng(float dampingOrthoAng)
  473. {
  474. static_cast<btSliderConstraint*>(_constraint)->setDampingOrthoAng(dampingOrthoAng);
  475. }
  476. void Physics3DSliderConstraint::setPoweredLinMotor(bool onOff)
  477. {
  478. static_cast<btSliderConstraint*>(_constraint)->setPoweredLinMotor(onOff);
  479. }
  480. bool Physics3DSliderConstraint::getPoweredLinMotor() const
  481. {
  482. return static_cast<btSliderConstraint*>(_constraint)->getPoweredLinMotor();
  483. }
  484. void Physics3DSliderConstraint::setTargetLinMotorVelocity(float targetLinMotorVelocity)
  485. {
  486. static_cast<btSliderConstraint*>(_constraint)->setTargetLinMotorVelocity(targetLinMotorVelocity);
  487. }
  488. float Physics3DSliderConstraint::getTargetLinMotorVelocity() const
  489. {
  490. return static_cast<btSliderConstraint*>(_constraint)->getTargetLinMotorVelocity();
  491. }
  492. void Physics3DSliderConstraint::setMaxLinMotorForce(float maxLinMotorForce)
  493. {
  494. static_cast<btSliderConstraint*>(_constraint)->setMaxLinMotorForce(maxLinMotorForce);
  495. }
  496. float Physics3DSliderConstraint::getMaxLinMotorForce() const
  497. {
  498. return static_cast<btSliderConstraint*>(_constraint)->getMaxLinMotorForce();
  499. }
  500. void Physics3DSliderConstraint::setPoweredAngMotor(bool onOff)
  501. {
  502. static_cast<btSliderConstraint*>(_constraint)->setPoweredAngMotor(onOff);
  503. }
  504. bool Physics3DSliderConstraint::getPoweredAngMotor() const
  505. {
  506. return static_cast<btSliderConstraint*>(_constraint)->getPoweredAngMotor();
  507. }
  508. void Physics3DSliderConstraint::setTargetAngMotorVelocity(float targetAngMotorVelocity)
  509. {
  510. return static_cast<btSliderConstraint*>(_constraint)->setTargetAngMotorVelocity(targetAngMotorVelocity);
  511. }
  512. float Physics3DSliderConstraint::getTargetAngMotorVelocity() const
  513. {
  514. return static_cast<btSliderConstraint*>(_constraint)->getTargetAngMotorVelocity();
  515. }
  516. void Physics3DSliderConstraint::setMaxAngMotorForce(float maxAngMotorForce)
  517. {
  518. return static_cast<btSliderConstraint*>(_constraint)->setMaxAngMotorForce(maxAngMotorForce);
  519. }
  520. float Physics3DSliderConstraint::getMaxAngMotorForce() const
  521. {
  522. return static_cast<btSliderConstraint*>(_constraint)->getMaxAngMotorForce();
  523. }
  524. float Physics3DSliderConstraint::getLinearPos() const
  525. {
  526. return static_cast<btSliderConstraint*>(_constraint)->getLinearPos();
  527. }
  528. float Physics3DSliderConstraint::getAngularPos() const
  529. {
  530. return static_cast<btSliderConstraint*>(_constraint)->getAngularPos();
  531. }
  532. // access for UseFrameOffset
  533. bool Physics3DSliderConstraint::getUseFrameOffset() const
  534. {
  535. return static_cast<btSliderConstraint*>(_constraint)->getUseFrameOffset();
  536. }
  537. void Physics3DSliderConstraint::setUseFrameOffset(bool frameOffsetOnOff)
  538. {
  539. static_cast<btSliderConstraint*>(_constraint)->setUseFrameOffset(frameOffsetOnOff);
  540. }
  541. void Physics3DSliderConstraint::setFrames(const cocos2d::Mat4& frameA, const cocos2d::Mat4& frameB)
  542. {
  543. auto btFrameA = convertMat4TobtTransform(frameA);
  544. auto btFrameB = convertMat4TobtTransform(frameB);
  545. static_cast<btSliderConstraint*>(_constraint)->setFrames(btFrameA, btFrameB);
  546. }
  547. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  548. Physics3DConeTwistConstraint* Physics3DConeTwistConstraint::create(Physics3DRigidBody* rbA, const cocos2d::Mat4& frameA)
  549. {
  550. auto ret = new (std::nothrow) Physics3DConeTwistConstraint();
  551. ret->_bodyA = rbA;
  552. rbA->retain();
  553. auto btFrame = convertMat4TobtTransform(frameA);
  554. ret->_constraint = new btConeTwistConstraint(*rbA->getRigidBody(), btFrame);
  555. ret->autorelease();
  556. return ret;
  557. }
  558. Physics3DConeTwistConstraint* Physics3DConeTwistConstraint::create(Physics3DRigidBody* rbA, Physics3DRigidBody* rbB, const cocos2d::Mat4& frameA, const cocos2d::Mat4& frameB)
  559. {
  560. auto ret = new (std::nothrow) Physics3DConeTwistConstraint();
  561. ret->_bodyA = rbA;
  562. ret->_bodyB = rbB;
  563. rbA->retain();
  564. rbB->retain();
  565. auto btFrameA = convertMat4TobtTransform(frameA);
  566. auto btFrameB = convertMat4TobtTransform(frameB);
  567. ret->_constraint = new btConeTwistConstraint(*rbA->getRigidBody(), *rbB->getRigidBody(), btFrameA, btFrameB);
  568. ret->autorelease();
  569. return ret;
  570. }
  571. void Physics3DConeTwistConstraint::setLimit(float swingSpan1,float swingSpan2,float twistSpan, float softness, float biasFactor, float relaxationFactor)
  572. {
  573. static_cast<btConeTwistConstraint*>(_constraint)->setLimit(swingSpan1, swingSpan2, twistSpan, softness, biasFactor, relaxationFactor);
  574. }
  575. cocos2d::Mat4 Physics3DConeTwistConstraint::getAFrame() const
  576. {
  577. const auto& frame = static_cast<btConeTwistConstraint*>(_constraint)->getAFrame();
  578. return convertbtTransformToMat4(frame);
  579. }
  580. cocos2d::Mat4 Physics3DConeTwistConstraint::getBFrame() const
  581. {
  582. const auto& frame = static_cast<btConeTwistConstraint*>(_constraint)->getBFrame();
  583. return convertbtTransformToMat4(frame);
  584. }
  585. float Physics3DConeTwistConstraint::getSwingSpan1() const
  586. {
  587. return static_cast<btConeTwistConstraint*>(_constraint)->getSwingSpan1();
  588. }
  589. float Physics3DConeTwistConstraint::getSwingSpan2() const
  590. {
  591. return static_cast<btConeTwistConstraint*>(_constraint)->getSwingSpan2();
  592. }
  593. float Physics3DConeTwistConstraint::getTwistSpan() const
  594. {
  595. return static_cast<btConeTwistConstraint*>(_constraint)->getTwistSpan();
  596. }
  597. float Physics3DConeTwistConstraint::getTwistAngle() const
  598. {
  599. return static_cast<btConeTwistConstraint*>(_constraint)->getTwistAngle();
  600. }
  601. void Physics3DConeTwistConstraint::setDamping(float damping)
  602. {
  603. static_cast<btConeTwistConstraint*>(_constraint)->setDamping(damping);
  604. }
  605. void Physics3DConeTwistConstraint::enableMotor(bool b)
  606. {
  607. static_cast<btConeTwistConstraint*>(_constraint)->enableMotor(b);
  608. }
  609. void Physics3DConeTwistConstraint::setMaxMotorImpulse(float maxMotorImpulse)
  610. {
  611. static_cast<btConeTwistConstraint*>(_constraint)->setMaxMotorImpulse(maxMotorImpulse);
  612. }
  613. void Physics3DConeTwistConstraint::setMaxMotorImpulseNormalized(float maxMotorImpulse)
  614. {
  615. static_cast<btConeTwistConstraint*>(_constraint)->setMaxMotorImpulseNormalized(maxMotorImpulse);
  616. }
  617. float Physics3DConeTwistConstraint::getFixThresh() const
  618. {
  619. return static_cast<btConeTwistConstraint*>(_constraint)->getFixThresh();
  620. }
  621. void Physics3DConeTwistConstraint::setFixThresh(float fixThresh)
  622. {
  623. static_cast<btConeTwistConstraint*>(_constraint)->setFixThresh(fixThresh);
  624. }
  625. void Physics3DConeTwistConstraint::setMotorTarget(const btQuaternion &q)
  626. {
  627. static_cast<btConeTwistConstraint*>(_constraint)->setMotorTarget(q);
  628. }
  629. // same as above, but q is the desired rotation of frameA wrt frameB in constraint space
  630. void Physics3DConeTwistConstraint::setMotorTargetInConstraintSpace(const btQuaternion &q)
  631. {
  632. static_cast<btConeTwistConstraint*>(_constraint)->setMotorTargetInConstraintSpace(q);
  633. }
  634. cocos2d::Vec3 Physics3DConeTwistConstraint::GetPointForAngle(float fAngleInRadians, float fLength) const
  635. {
  636. const auto& point = static_cast<btConeTwistConstraint*>(_constraint)->GetPointForAngle(fAngleInRadians, fLength);
  637. return convertbtVector3ToVec3(point);
  638. }
  639. void Physics3DConeTwistConstraint::setFrames(const cocos2d::Mat4& frameA, const cocos2d::Mat4& frameB)
  640. {
  641. const auto& btFrameA = convertMat4TobtTransform(frameA);
  642. const auto& btFrameB = convertMat4TobtTransform(frameB);
  643. static_cast<btConeTwistConstraint*>(_constraint)->setFrames(btFrameA, btFrameB);
  644. }
  645. cocos2d::Mat4 Physics3DConeTwistConstraint::getFrameOffsetA() const
  646. {
  647. const auto& trans = static_cast<btConeTwistConstraint*>(_constraint)->getFrameOffsetA();
  648. return convertbtTransformToMat4(trans);
  649. }
  650. cocos2d::Mat4 Physics3DConeTwistConstraint::getFrameOffsetB() const
  651. {
  652. const auto& trans = static_cast<btConeTwistConstraint*>(_constraint)->getFrameOffsetB();
  653. return convertbtTransformToMat4(trans);
  654. }
  655. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  656. Physics3D6DofConstraint* Physics3D6DofConstraint::create(Physics3DRigidBody* rbB, const cocos2d::Mat4& frameInB, bool useLinearReferenceFrameB)
  657. {
  658. auto ret = new Physics3D6DofConstraint();
  659. ret->_bodyB = rbB;
  660. rbB->retain();
  661. auto frameB = convertMat4TobtTransform(frameInB);
  662. ret->_constraint = new btGeneric6DofConstraint(*rbB->getRigidBody(), frameB, useLinearReferenceFrameB);
  663. ret->autorelease();
  664. return ret;
  665. }
  666. Physics3D6DofConstraint* Physics3D6DofConstraint::create(Physics3DRigidBody* rbA, Physics3DRigidBody* rbB, const cocos2d::Mat4& frameInA, const cocos2d::Mat4& frameInB, bool useLinearReferenceFrameA)
  667. {
  668. auto ret = new Physics3D6DofConstraint();
  669. ret->_bodyA = rbA;
  670. ret->_bodyB = rbB;
  671. rbA->retain();
  672. rbB->retain();
  673. auto frameA = convertMat4TobtTransform(frameInA);
  674. auto frameB = convertMat4TobtTransform(frameInB);
  675. ret->_constraint = new btGeneric6DofConstraint(*rbA->getRigidBody(), *rbB->getRigidBody(), frameA, frameB, useLinearReferenceFrameA);
  676. ret->autorelease();
  677. return ret;
  678. }
  679. void Physics3D6DofConstraint::setLinearLowerLimit(const cocos2d::Vec3& linearLower)
  680. {
  681. auto lower = convertVec3TobtVector3(linearLower);
  682. static_cast<btGeneric6DofConstraint*>(_constraint)->setLinearLowerLimit(lower);
  683. }
  684. cocos2d::Vec3 Physics3D6DofConstraint::getLinearLowerLimit() const
  685. {
  686. btVector3 lower;
  687. static_cast<btGeneric6DofConstraint*>(_constraint)->getLinearLowerLimit(lower);
  688. return convertbtVector3ToVec3(lower);
  689. }
  690. void Physics3D6DofConstraint::setLinearUpperLimit(const cocos2d::Vec3& linearUpper)
  691. {
  692. auto upper = convertVec3TobtVector3(linearUpper);
  693. static_cast<btGeneric6DofConstraint*>(_constraint)->setLinearUpperLimit(upper);
  694. }
  695. cocos2d::Vec3 Physics3D6DofConstraint::getLinearUpperLimit() const
  696. {
  697. btVector3 upper;
  698. static_cast<btGeneric6DofConstraint*>(_constraint)->getLinearUpperLimit(upper);
  699. return convertbtVector3ToVec3(upper);
  700. }
  701. void Physics3D6DofConstraint::setAngularLowerLimit(const cocos2d::Vec3& angularLower)
  702. {
  703. auto lower = convertVec3TobtVector3(angularLower);
  704. static_cast<btGeneric6DofConstraint*>(_constraint)->setAngularLowerLimit(lower);
  705. }
  706. cocos2d::Vec3 Physics3D6DofConstraint::getAngularLowerLimit() const
  707. {
  708. btVector3 lower;
  709. static_cast<btGeneric6DofConstraint*>(_constraint)->getAngularLowerLimit(lower);
  710. return convertbtVector3ToVec3(lower);
  711. }
  712. void Physics3D6DofConstraint::setAngularUpperLimit(const cocos2d::Vec3& angularUpper)
  713. {
  714. auto upper = convertVec3TobtVector3(angularUpper);
  715. static_cast<btGeneric6DofConstraint*>(_constraint)->setAngularUpperLimit(upper);
  716. }
  717. cocos2d::Vec3 Physics3D6DofConstraint::getAngularUpperLimit() const
  718. {
  719. btVector3 upper;
  720. static_cast<btGeneric6DofConstraint*>(_constraint)->getAngularUpperLimit(upper);
  721. return convertbtVector3ToVec3(upper);
  722. }
  723. bool Physics3D6DofConstraint::isLimited(int limitIndex) const
  724. {
  725. return static_cast<btGeneric6DofConstraint*>(_constraint)->isLimited(limitIndex);
  726. }
  727. bool Physics3D6DofConstraint::getUseFrameOffset() const
  728. {
  729. return static_cast<btGeneric6DofConstraint*>(_constraint)->getUseFrameOffset();
  730. }
  731. void Physics3D6DofConstraint::setUseFrameOffset(bool frameOffsetOnOff) const
  732. {
  733. static_cast<btGeneric6DofConstraint*>(_constraint)->setUseFrameOffset(frameOffsetOnOff);
  734. }
  735. NS_CC_END
  736. #endif // CC_ENABLE_BULLET_INTEGRATION
  737. #endif //CC_USE_3D_PHYSICS