physics_world_bullet.cpp 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369
  1. /*
  2. * Copyright (c) 2012-2023 Daniele Bartolini et al.
  3. * SPDX-License-Identifier: MIT
  4. */
  5. #include "config.h"
  6. #if CROWN_PHYSICS_BULLET
  7. #include "core/containers/array.inl"
  8. #include "core/containers/hash_map.inl"
  9. #include "core/math/color4.inl"
  10. #include "core/math/constants.h"
  11. #include "core/math/matrix4x4.inl"
  12. #include "core/math/quaternion.inl"
  13. #include "core/math/vector3.inl"
  14. #include "core/memory/proxy_allocator.h"
  15. #include "core/strings/string_id.inl"
  16. #include "device/log.h"
  17. #include "resource/physics_resource.h"
  18. #include "resource/resource_manager.h"
  19. #include "world/debug_line.h"
  20. #include "world/event_stream.inl"
  21. #include "world/physics.h"
  22. #include "world/physics_world.h"
  23. #include "world/unit_manager.h"
  24. #include <BulletCollision/BroadphaseCollision/btDbvtBroadphase.h>
  25. #include <BulletCollision/CollisionDispatch/btCollisionObject.h>
  26. #include <BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h>
  27. #include <BulletCollision/CollisionDispatch/btGhostObject.h>
  28. #include <BulletCollision/CollisionShapes/btBoxShape.h>
  29. #include <BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h>
  30. #include <BulletCollision/CollisionShapes/btCapsuleShape.h>
  31. #include <BulletCollision/CollisionShapes/btCompoundShape.h>
  32. #include <BulletCollision/CollisionShapes/btConvexHullShape.h>
  33. #include <BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h>
  34. #include <BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h>
  35. #include <BulletCollision/CollisionShapes/btSphereShape.h>
  36. #include <BulletCollision/CollisionShapes/btStaticPlaneShape.h>
  37. #include <BulletCollision/CollisionShapes/btTriangleMesh.h>
  38. #include <BulletDynamics/ConstraintSolver/btFixedConstraint.h>
  39. #include <BulletDynamics/ConstraintSolver/btHingeConstraint.h>
  40. #include <BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h>
  41. #include <BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h>
  42. #include <BulletDynamics/ConstraintSolver/btSliderConstraint.h>
  43. #define BT_THREADSAFE 0
  44. #include <BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h>
  45. #include <BulletDynamics/Dynamics/btRigidBody.h>
  46. #include <LinearMath/btDefaultMotionState.h>
  47. #include <LinearMath/btIDebugDraw.h>
  48. LOG_SYSTEM(PHYSICS, "physics")
  49. namespace crown
  50. {
  51. namespace physics_globals
  52. {
  53. static btDefaultCollisionConfiguration *_bt_configuration;
  54. static btCollisionDispatcher *_bt_dispatcher;
  55. static btBroadphaseInterface *_bt_interface;
  56. static btSequentialImpulseConstraintSolver *_bt_solver;
  57. void init(Allocator &a)
  58. {
  59. _bt_configuration = CE_NEW(a, btDefaultCollisionConfiguration);
  60. _bt_dispatcher = CE_NEW(a, btCollisionDispatcher)(_bt_configuration);
  61. _bt_interface = CE_NEW(a, btDbvtBroadphase);
  62. _bt_solver = CE_NEW(a, btSequentialImpulseConstraintSolver);
  63. }
  64. void shutdown(Allocator &a)
  65. {
  66. CE_DELETE(a, _bt_solver);
  67. CE_DELETE(a, _bt_interface);
  68. CE_DELETE(a, _bt_dispatcher);
  69. CE_DELETE(a, _bt_configuration);
  70. }
  71. } // namespace physics_globals
  72. static inline btVector3 to_btVector3(const Vector3 &v)
  73. {
  74. return btVector3(v.x, v.y, v.z);
  75. }
  76. static inline btQuaternion to_btQuaternion(const Quaternion &q)
  77. {
  78. return btQuaternion(q.x, q.y, q.z, q.w);
  79. }
  80. static inline btTransform to_btTransform(const Matrix4x4 &m)
  81. {
  82. btMatrix3x3 basis(m.x.x, m.y.x, m.z.x
  83. , m.x.y, m.y.y, m.z.y
  84. , m.x.z, m.y.z, m.z.z
  85. );
  86. btVector3 pos(m.t.x, m.t.y, m.t.z);
  87. return btTransform(basis, pos);
  88. }
  89. static inline Vector3 to_vector3(const btVector3 &v)
  90. {
  91. return vector3(v.x(), v.y(), v.z());
  92. }
  93. static inline Quaternion to_quaternion(const btQuaternion &q)
  94. {
  95. return from_elements(q.x(), q.y(), q.z(), q.w());
  96. }
  97. static inline Matrix4x4 to_matrix4x4(const btTransform &t)
  98. {
  99. const btVector3 x = t.getBasis().getRow(0);
  100. const btVector3 y = t.getBasis().getRow(1);
  101. const btVector3 z = t.getBasis().getRow(2);
  102. const btVector3 o = t.getOrigin();
  103. Matrix4x4 m;
  104. m.x.x = x.x();
  105. m.x.y = y.x();
  106. m.x.z = z.x();
  107. m.x.w = 0.0f;
  108. m.y.x = x.y();
  109. m.y.y = y.y();
  110. m.y.z = z.y();
  111. m.y.w = 0.0f;
  112. m.z.x = x.z();
  113. m.z.y = y.z();
  114. m.z.z = z.z();
  115. m.z.w = 0.0f;
  116. m.t.x = o.x();
  117. m.t.y = o.y();
  118. m.t.z = o.z();
  119. m.t.w = 1.0f;
  120. return m;
  121. }
  122. struct MyDebugDrawer : public btIDebugDraw
  123. {
  124. DebugLine *_lines;
  125. explicit MyDebugDrawer(DebugLine &dl)
  126. : _lines(&dl)
  127. {
  128. }
  129. void drawLine(const btVector3 &from, const btVector3 &to, const btVector3 & /*color*/) override
  130. {
  131. const Vector3 start = to_vector3(from);
  132. const Vector3 end = to_vector3(to);
  133. _lines->add_line(start, end, COLOR4_ORANGE);
  134. }
  135. void drawContactPoint(const btVector3 &pointOnB, const btVector3 & /*normalOnB*/, btScalar /*distance*/, int /*lifeTime*/, const btVector3 & /*color*/) override
  136. {
  137. const Vector3 from = to_vector3(pointOnB);
  138. _lines->add_sphere(from, 0.1f, COLOR4_WHITE);
  139. }
  140. void reportErrorWarning(const char *warningString) override
  141. {
  142. logw(PHYSICS, warningString);
  143. }
  144. void draw3dText(const btVector3 & /*location*/, const char * /*textString*/) override
  145. {
  146. }
  147. void setDebugMode(int /*debugMode*/) override
  148. {
  149. }
  150. int getDebugMode() const override
  151. {
  152. return DBG_DrawWireframe
  153. | DBG_DrawConstraints
  154. | DBG_DrawConstraintLimits
  155. | DBG_FastWireframe
  156. ;
  157. }
  158. };
  159. struct MyFilterCallback : public btOverlapFilterCallback
  160. {
  161. bool needBroadphaseCollision(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1) const override
  162. {
  163. bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
  164. collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
  165. return collides;
  166. }
  167. };
  168. struct PhysicsWorldImpl
  169. {
  170. struct ColliderInstanceData
  171. {
  172. UnitId unit;
  173. Matrix4x4 local_tm;
  174. btTriangleIndexVertexArray *vertex_array;
  175. btCollisionShape *shape;
  176. ColliderInstance next;
  177. };
  178. struct ActorInstanceData
  179. {
  180. UnitId unit;
  181. btRigidBody *body;
  182. };
  183. Allocator *_allocator;
  184. UnitManager *_unit_manager;
  185. HashMap<UnitId, u32> _collider_map;
  186. HashMap<UnitId, u32> _actor_map;
  187. Array<ColliderInstanceData> _collider;
  188. Array<ActorInstanceData> _actor;
  189. Array<btTypedConstraint *> _joints;
  190. MyFilterCallback _filter_callback;
  191. btDiscreteDynamicsWorld *_dynamics_world;
  192. MyDebugDrawer _debug_drawer;
  193. EventStream _events;
  194. UnitDestroyCallback _unit_destroy_callback;
  195. const PhysicsConfigResource *_config_resource;
  196. bool _debug_drawing;
  197. PhysicsWorldImpl(Allocator &a, ResourceManager &rm, UnitManager &um, DebugLine &dl)
  198. : _allocator(&a)
  199. , _unit_manager(&um)
  200. , _collider_map(a)
  201. , _actor_map(a)
  202. , _collider(a)
  203. , _actor(a)
  204. , _joints(a)
  205. , _dynamics_world(NULL)
  206. , _debug_drawer(dl)
  207. , _events(a)
  208. , _debug_drawing(false)
  209. {
  210. _dynamics_world = CE_NEW(*_allocator, btDiscreteDynamicsWorld)(physics_globals::_bt_dispatcher
  211. , physics_globals::_bt_interface
  212. , physics_globals::_bt_solver
  213. , physics_globals::_bt_configuration
  214. );
  215. _dynamics_world->getCollisionWorld()->setDebugDrawer(&_debug_drawer);
  216. _dynamics_world->setInternalTickCallback(tick_cb, this);
  217. _dynamics_world->getPairCache()->setOverlapFilterCallback(&_filter_callback);
  218. _config_resource = (PhysicsConfigResource *)rm.get(RESOURCE_TYPE_PHYSICS_CONFIG, STRING_ID_64("global", 0x0b2f08fe66e395c0));
  219. _unit_destroy_callback.destroy = PhysicsWorldImpl::unit_destroyed_callback;
  220. _unit_destroy_callback.user_data = this;
  221. _unit_destroy_callback.node.next = NULL;
  222. _unit_destroy_callback.node.prev = NULL;
  223. um.register_destroy_callback(&_unit_destroy_callback);
  224. }
  225. ~PhysicsWorldImpl()
  226. {
  227. _unit_manager->unregister_destroy_callback(&_unit_destroy_callback);
  228. for (u32 i = 0; i < array::size(_actor); ++i) {
  229. btRigidBody *body = _actor[i].body;
  230. _dynamics_world->removeRigidBody(body);
  231. CE_DELETE(*_allocator, body->getMotionState());
  232. CE_DELETE(*_allocator, body->getCollisionShape());
  233. CE_DELETE(*_allocator, body);
  234. }
  235. for (u32 i = 0; i < array::size(_collider); ++i) {
  236. CE_DELETE(*_allocator, _collider[i].vertex_array);
  237. CE_DELETE(*_allocator, _collider[i].shape);
  238. }
  239. CE_DELETE(*_allocator, _dynamics_world);
  240. }
  241. PhysicsWorldImpl(const PhysicsWorldImpl &) = delete;
  242. PhysicsWorldImpl &operator=(const PhysicsWorldImpl &) = delete;
  243. ColliderInstance collider_create(UnitId unit, const ColliderDesc *sd, const Vector3 &scale)
  244. {
  245. btTriangleIndexVertexArray *vertex_array = NULL;
  246. btCollisionShape *child_shape = NULL;
  247. switch (sd->type) {
  248. case ColliderType::SPHERE:
  249. child_shape = CE_NEW(*_allocator, btSphereShape)(sd->sphere.radius);
  250. break;
  251. case ColliderType::CAPSULE:
  252. child_shape = CE_NEW(*_allocator, btCapsuleShape)(sd->capsule.radius, sd->capsule.height);
  253. break;
  254. case ColliderType::BOX:
  255. child_shape = CE_NEW(*_allocator, btBoxShape)(to_btVector3(sd->box.half_size));
  256. break;
  257. case ColliderType::CONVEX_HULL: {
  258. const u8 *data = (u8 *)&sd[1];
  259. const u32 num = *(u32 *)data;
  260. const btScalar *points = (btScalar *)(data + sizeof(u32));
  261. child_shape = CE_NEW(*_allocator, btConvexHullShape)(points, (int)num, sizeof(Vector3));
  262. break;
  263. }
  264. case ColliderType::MESH: {
  265. const char *data = (char *)&sd[1];
  266. const u32 num_points = *(u32 *)data;
  267. const char *points = data + sizeof(u32);
  268. const u32 num_indices = *(u32 *)(points + num_points*sizeof(Vector3));
  269. const char *indices = points + sizeof(u32) + num_points*sizeof(Vector3);
  270. btIndexedMesh part;
  271. part.m_vertexBase = (const unsigned char *)points;
  272. part.m_vertexStride = sizeof(Vector3);
  273. part.m_numVertices = num_points;
  274. part.m_triangleIndexBase = (const unsigned char *)indices;
  275. part.m_triangleIndexStride = sizeof(u16)*3;
  276. part.m_numTriangles = num_indices/3;
  277. part.m_indexType = PHY_SHORT;
  278. vertex_array = CE_NEW(*_allocator, btTriangleIndexVertexArray)();
  279. vertex_array->addIndexedMesh(part, PHY_SHORT);
  280. const btVector3 aabb_min(-1000.0f, -1000.0f, -1000.0f);
  281. const btVector3 aabb_max(1000.0f, 1000.0f, 1000.0f);
  282. child_shape = CE_NEW(*_allocator, btBvhTriangleMeshShape)(vertex_array, false, aabb_min, aabb_max);
  283. break;
  284. }
  285. case ColliderType::HEIGHTFIELD:
  286. CE_FATAL("Not implemented");
  287. break;
  288. default:
  289. CE_FATAL("Unknown shape type");
  290. break;
  291. }
  292. child_shape->setLocalScaling(to_btVector3(scale));
  293. const u32 last = array::size(_collider);
  294. ColliderInstanceData cid;
  295. cid.unit = unit;
  296. cid.local_tm = sd->local_tm;
  297. cid.vertex_array = vertex_array;
  298. cid.shape = child_shape;
  299. cid.next.i = UINT32_MAX;
  300. ColliderInstance ci = collider_first(unit);
  301. while (is_valid(ci) && is_valid(collider_next(ci)))
  302. ci = collider_next(ci);
  303. if (is_valid(ci))
  304. _collider[ci.i].next.i = last;
  305. else
  306. hash_map::set(_collider_map, unit, last);
  307. array::push_back(_collider, cid);
  308. return make_collider_instance(last);
  309. }
  310. void collider_destroy(ColliderInstance collider)
  311. {
  312. CE_ASSERT(collider.i < array::size(_collider), "Index out of bounds");
  313. const u32 last = array::size(_collider) - 1;
  314. const UnitId u = _collider[collider.i].unit;
  315. const ColliderInstance first_i = collider_first(u);
  316. const ColliderInstance last_i = make_collider_instance(last);
  317. collider_swap_node(last_i, collider);
  318. collider_remove_node(first_i, collider);
  319. CE_DELETE(*_allocator, _collider[collider.i].vertex_array);
  320. CE_DELETE(*_allocator, _collider[collider.i].shape);
  321. _collider[collider.i] = _collider[last];
  322. array::pop_back(_collider);
  323. }
  324. void collider_remove_node(ColliderInstance first, ColliderInstance collider)
  325. {
  326. CE_ASSERT(first.i < array::size(_collider), "Index out of bounds");
  327. CE_ASSERT(collider.i < array::size(_collider), "Index out of bounds");
  328. const UnitId u = _collider[first.i].unit;
  329. if (collider.i == first.i) {
  330. if (!is_valid(collider_next(collider)))
  331. hash_map::remove(_collider_map, u);
  332. else
  333. hash_map::set(_collider_map, u, collider_next(collider).i);
  334. } else {
  335. ColliderInstance prev = collider_previous(collider);
  336. _collider[prev.i].next = collider_next(collider);
  337. }
  338. }
  339. void collider_swap_node(ColliderInstance a, ColliderInstance b)
  340. {
  341. CE_ASSERT(a.i < array::size(_collider), "Index out of bounds");
  342. CE_ASSERT(b.i < array::size(_collider), "Index out of bounds");
  343. const UnitId u = _collider[a.i].unit;
  344. const ColliderInstance first_i = collider_first(u);
  345. if (a.i == first_i.i) {
  346. hash_map::set(_collider_map, u, b.i);
  347. } else {
  348. const ColliderInstance prev_a = collider_previous(a);
  349. CE_ENSURE(prev_a.i != a.i);
  350. _collider[prev_a.i].next = b;
  351. }
  352. }
  353. ColliderInstance collider_first(UnitId unit)
  354. {
  355. return make_collider_instance(hash_map::get(_collider_map, unit, UINT32_MAX));
  356. }
  357. ColliderInstance collider_next(ColliderInstance collider)
  358. {
  359. return _collider[collider.i].next;
  360. }
  361. ColliderInstance collider_previous(ColliderInstance collider)
  362. {
  363. CE_ASSERT(collider.i < array::size(_collider), "Index out of bounds");
  364. const UnitId u = _collider[collider.i].unit;
  365. ColliderInstance curr = collider_first(u);
  366. ColliderInstance prev = { UINT32_MAX };
  367. while (curr.i != collider.i) {
  368. prev = curr;
  369. curr = collider_next(curr);
  370. }
  371. return prev;
  372. }
  373. ActorInstance actor_create(UnitId unit, const ActorResource *ar, const Matrix4x4 &tm)
  374. {
  375. CE_ASSERT(!hash_map::has(_actor_map, unit), "Unit already has an actor component");
  376. const PhysicsActor *actor_class = physics_config_resource::actor(_config_resource, ar->actor_class);
  377. const PhysicsMaterial *material = physics_config_resource::material(_config_resource, ar->material);
  378. const bool is_kinematic = (actor_class->flags & CROWN_PHYSICS_ACTOR_KINEMATIC) != 0;
  379. const bool is_dynamic = (actor_class->flags & CROWN_PHYSICS_ACTOR_DYNAMIC) != 0;
  380. const bool is_static = !is_kinematic && !is_dynamic;
  381. const bool is_trigger = (actor_class->flags & CROWN_PHYSICS_ACTOR_TRIGGER) != 0;
  382. const f32 mass = is_dynamic ? ar->mass : 0.0f;
  383. // Create compound shape
  384. btCompoundShape *shape = CE_NEW(*_allocator, btCompoundShape)(true);
  385. ColliderInstance ci = collider_first(unit);
  386. while (is_valid(ci)) {
  387. shape->addChildShape(to_btTransform(_collider[ci.i].local_tm), _collider[ci.i].shape);
  388. ci = collider_next(ci);
  389. }
  390. // Create motion state
  391. const btTransform tr = to_btTransform(tm);
  392. btDefaultMotionState *ms = is_static
  393. ? NULL
  394. : CE_NEW(*_allocator, btDefaultMotionState)(tr)
  395. ;
  396. // If dynamic, calculate inertia
  397. btVector3 inertia;
  398. if (mass != 0.0f) // Actor is dynamic iff mass != 0
  399. shape->calculateLocalInertia(mass, inertia);
  400. btRigidBody::btRigidBodyConstructionInfo rbinfo(mass, ms, shape, inertia);
  401. rbinfo.m_startWorldTransform = tr;
  402. rbinfo.m_linearDamping = actor_class->linear_damping;
  403. rbinfo.m_angularDamping = actor_class->angular_damping;
  404. rbinfo.m_restitution = material->restitution;
  405. rbinfo.m_friction = material->friction;
  406. rbinfo.m_rollingFriction = material->rolling_friction;
  407. rbinfo.m_linearSleepingThreshold = 0.5f; // FIXME
  408. rbinfo.m_angularSleepingThreshold = 0.7f; // FIXME
  409. // Create rigid body
  410. btRigidBody *body = CE_NEW(*_allocator, btRigidBody)(rbinfo);
  411. int cflags = body->getCollisionFlags();
  412. cflags |= is_kinematic ? btCollisionObject::CF_KINEMATIC_OBJECT : 0;
  413. cflags |= is_static ? btCollisionObject::CF_STATIC_OBJECT : 0;
  414. cflags |= is_trigger ? btCollisionObject::CF_NO_CONTACT_RESPONSE : 0;
  415. body->setCollisionFlags(cflags);
  416. if (is_kinematic)
  417. body->setActivationState(DISABLE_DEACTIVATION);
  418. body->setLinearFactor(btVector3((ar->flags & ActorFlags::LOCK_TRANSLATION_X) ? 0.0f : 1.0f
  419. , (ar->flags & ActorFlags::LOCK_TRANSLATION_Y) ? 0.0f : 1.0f
  420. , (ar->flags & ActorFlags::LOCK_TRANSLATION_Z) ? 0.0f : 1.0f
  421. ));
  422. body->setAngularFactor(btVector3((ar->flags & ActorFlags::LOCK_ROTATION_X) ? 0.0f : 1.0f
  423. , (ar->flags & ActorFlags::LOCK_ROTATION_Y) ? 0.0f : 1.0f
  424. , (ar->flags & ActorFlags::LOCK_ROTATION_Z) ? 0.0f : 1.0f
  425. ));
  426. const u32 last = array::size(_actor);
  427. body->setUserPointer((void *)(uintptr_t)last);
  428. // Set collision filters
  429. const u32 me = physics_config_resource::filter(_config_resource, ar->collision_filter)->me;
  430. const u32 mask = physics_config_resource::filter(_config_resource, ar->collision_filter)->mask;
  431. _dynamics_world->addRigidBody(body, me, mask);
  432. ActorInstanceData aid;
  433. aid.unit = unit;
  434. aid.body = body;
  435. array::push_back(_actor, aid);
  436. hash_map::set(_actor_map, unit, last);
  437. return make_actor_instance(last);
  438. }
  439. void actor_destroy(ActorInstance actor)
  440. {
  441. const u32 last = array::size(_actor) - 1;
  442. const UnitId u = _actor[actor.i].unit;
  443. const UnitId last_u = _actor[last].unit;
  444. _dynamics_world->removeRigidBody(_actor[actor.i].body);
  445. CE_DELETE(*_allocator, _actor[actor.i].body->getMotionState());
  446. CE_DELETE(*_allocator, _actor[actor.i].body->getCollisionShape());
  447. CE_DELETE(*_allocator, _actor[actor.i].body);
  448. _actor[actor.i] = _actor[last];
  449. _actor[actor.i].body->setUserPointer((void *)(uintptr_t)actor.i);
  450. array::pop_back(_actor);
  451. hash_map::set(_actor_map, last_u, actor.i);
  452. hash_map::remove(_actor_map, u);
  453. }
  454. ActorInstance actor(UnitId unit)
  455. {
  456. return make_actor_instance(hash_map::get(_actor_map, unit, UINT32_MAX));
  457. }
  458. Vector3 actor_world_position(ActorInstance actor) const
  459. {
  460. return to_vector3(_actor[actor.i].body->getCenterOfMassPosition());
  461. }
  462. Quaternion actor_world_rotation(ActorInstance actor) const
  463. {
  464. return to_quaternion(_actor[actor.i].body->getOrientation());
  465. }
  466. Matrix4x4 actor_world_pose(ActorInstance actor) const
  467. {
  468. return to_matrix4x4(_actor[actor.i].body->getCenterOfMassTransform());
  469. }
  470. void actor_teleport_world_position(ActorInstance actor, const Vector3 &p)
  471. {
  472. btTransform pose = _actor[actor.i].body->getCenterOfMassTransform();
  473. pose.setOrigin(to_btVector3(p));
  474. _actor[actor.i].body->setCenterOfMassTransform(pose);
  475. }
  476. void actor_teleport_world_rotation(ActorInstance actor, const Quaternion &r)
  477. {
  478. btTransform pose = _actor[actor.i].body->getCenterOfMassTransform();
  479. pose.setRotation(to_btQuaternion(r));
  480. _actor[actor.i].body->setCenterOfMassTransform(pose);
  481. }
  482. void actor_teleport_world_pose(ActorInstance actor, const Matrix4x4 &m)
  483. {
  484. const Quaternion rot = rotation(m);
  485. const Vector3 pos = translation(m);
  486. btTransform pose = _actor[actor.i].body->getCenterOfMassTransform();
  487. pose.setRotation(to_btQuaternion(rot));
  488. pose.setOrigin(to_btVector3(pos));
  489. _actor[actor.i].body->setCenterOfMassTransform(pose);
  490. }
  491. Vector3 actor_center_of_mass(ActorInstance actor) const
  492. {
  493. return to_vector3(_actor[actor.i].body->getCenterOfMassTransform().getOrigin());
  494. }
  495. void actor_enable_gravity(ActorInstance actor)
  496. {
  497. btRigidBody *body = _actor[actor.i].body;
  498. body->setFlags(body->getFlags() & ~BT_DISABLE_WORLD_GRAVITY);
  499. body->setGravity(_dynamics_world->getGravity());
  500. }
  501. void actor_disable_gravity(ActorInstance actor)
  502. {
  503. btRigidBody *body = _actor[actor.i].body;
  504. body->setFlags(body->getFlags() | BT_DISABLE_WORLD_GRAVITY);
  505. body->setGravity(btVector3(0.0f, 0.0f, 0.0f));
  506. }
  507. void actor_enable_collision(ActorInstance /*i*/)
  508. {
  509. CE_FATAL("Not implemented yet");
  510. }
  511. void actor_disable_collision(ActorInstance /*i*/)
  512. {
  513. CE_FATAL("Not implemented yet");
  514. }
  515. void actor_set_collision_filter(ActorInstance /*i*/, StringId32 /*filter*/)
  516. {
  517. CE_FATAL("Not implemented yet");
  518. }
  519. void actor_set_kinematic(ActorInstance actor, bool kinematic)
  520. {
  521. btRigidBody *body = _actor[actor.i].body;
  522. int flags = body->getCollisionFlags();
  523. if (kinematic) {
  524. body->setCollisionFlags(flags | btCollisionObject::CF_KINEMATIC_OBJECT);
  525. body->setActivationState(DISABLE_DEACTIVATION);
  526. } else {
  527. body->setCollisionFlags(flags & ~btCollisionObject::CF_KINEMATIC_OBJECT);
  528. body->setActivationState(ACTIVE_TAG);
  529. }
  530. }
  531. bool actor_is_static(ActorInstance actor) const
  532. {
  533. return _actor[actor.i].body->getCollisionFlags() & btCollisionObject::CF_STATIC_OBJECT;
  534. }
  535. bool actor_is_dynamic(ActorInstance actor) const
  536. {
  537. const int flags = _actor[actor.i].body->getCollisionFlags();
  538. return !(flags & btCollisionObject::CF_STATIC_OBJECT)
  539. && !(flags & btCollisionObject::CF_KINEMATIC_OBJECT)
  540. ;
  541. }
  542. bool actor_is_kinematic(ActorInstance actor) const
  543. {
  544. const int flags = _actor[actor.i].body->getCollisionFlags();
  545. return (flags & (btCollisionObject::CF_KINEMATIC_OBJECT)) != 0;
  546. }
  547. bool actor_is_nonkinematic(ActorInstance actor) const
  548. {
  549. return actor_is_dynamic(actor) && !actor_is_kinematic(actor);
  550. }
  551. f32 actor_linear_damping(ActorInstance actor) const
  552. {
  553. return _actor[actor.i].body->getLinearDamping();
  554. }
  555. void actor_set_linear_damping(ActorInstance actor, f32 rate)
  556. {
  557. _actor[actor.i].body->setDamping(rate, _actor[actor.i].body->getAngularDamping());
  558. }
  559. f32 actor_angular_damping(ActorInstance actor) const
  560. {
  561. return _actor[actor.i].body->getAngularDamping();
  562. }
  563. void actor_set_angular_damping(ActorInstance actor, f32 rate)
  564. {
  565. _actor[actor.i].body->setDamping(_actor[actor.i].body->getLinearDamping(), rate);
  566. }
  567. Vector3 actor_linear_velocity(ActorInstance actor) const
  568. {
  569. btVector3 v = _actor[actor.i].body->getLinearVelocity();
  570. return to_vector3(v);
  571. }
  572. void actor_set_linear_velocity(ActorInstance actor, const Vector3 &vel)
  573. {
  574. _actor[actor.i].body->activate();
  575. _actor[actor.i].body->setLinearVelocity(to_btVector3(vel));
  576. }
  577. Vector3 actor_angular_velocity(ActorInstance actor) const
  578. {
  579. btVector3 v = _actor[actor.i].body->getAngularVelocity();
  580. return to_vector3(v);
  581. }
  582. void actor_set_angular_velocity(ActorInstance actor, const Vector3 &vel)
  583. {
  584. _actor[actor.i].body->activate();
  585. _actor[actor.i].body->setAngularVelocity(to_btVector3(vel));
  586. }
  587. void actor_add_impulse(ActorInstance actor, const Vector3 &impulse)
  588. {
  589. _actor[actor.i].body->activate();
  590. _actor[actor.i].body->applyCentralImpulse(to_btVector3(impulse));
  591. }
  592. void actor_add_impulse_at(ActorInstance actor, const Vector3 &impulse, const Vector3 &pos)
  593. {
  594. _actor[actor.i].body->activate();
  595. _actor[actor.i].body->applyImpulse(to_btVector3(impulse), to_btVector3(pos));
  596. }
  597. void actor_add_torque_impulse(ActorInstance actor, const Vector3 &imp)
  598. {
  599. _actor[actor.i].body->applyTorqueImpulse(to_btVector3(imp));
  600. }
  601. void actor_push(ActorInstance actor, const Vector3 &vel, f32 mass)
  602. {
  603. const Vector3 f = vel * mass;
  604. _actor[actor.i].body->applyCentralForce(to_btVector3(f));
  605. }
  606. void actor_push_at(ActorInstance actor, const Vector3 &vel, f32 mass, const Vector3 &pos)
  607. {
  608. const Vector3 f = vel * mass;
  609. _actor[actor.i].body->applyForce(to_btVector3(f), to_btVector3(pos));
  610. }
  611. bool actor_is_sleeping(ActorInstance actor)
  612. {
  613. return !_actor[actor.i].body->isActive();
  614. }
  615. void actor_wake_up(ActorInstance actor)
  616. {
  617. _actor[actor.i].body->activate(true);
  618. }
  619. JointInstance joint_create(ActorInstance a0, ActorInstance a1, const JointDesc &jd)
  620. {
  621. const btVector3 anchor_0 = to_btVector3(jd.anchor_0);
  622. const btVector3 anchor_1 = to_btVector3(jd.anchor_1);
  623. btRigidBody *body_0 = _actor[a0.i].body;
  624. btRigidBody *body_1 = is_valid(a1) ? _actor[a1.i].body : NULL;
  625. btTypedConstraint *joint = NULL;
  626. switch (jd.type) {
  627. case JointType::FIXED: {
  628. const btTransform frame_0 = btTransform(btQuaternion::getIdentity(), anchor_0);
  629. const btTransform frame_1 = btTransform(btQuaternion::getIdentity(), anchor_1);
  630. joint = CE_NEW(*_allocator, btFixedConstraint)(*body_0
  631. , *body_1
  632. , frame_0
  633. , frame_1
  634. );
  635. break;
  636. }
  637. case JointType::SPRING:
  638. joint = CE_NEW(*_allocator, btPoint2PointConstraint)(*body_0
  639. , *body_1
  640. , anchor_0
  641. , anchor_1
  642. );
  643. break;
  644. case JointType::HINGE: {
  645. btHingeConstraint *hinge = CE_NEW(*_allocator, btHingeConstraint)(*body_0
  646. , *body_1
  647. , anchor_0
  648. , anchor_1
  649. , to_btVector3(jd.hinge.axis)
  650. , to_btVector3(jd.hinge.axis)
  651. );
  652. hinge->enableAngularMotor(jd.hinge.use_motor
  653. , jd.hinge.target_velocity
  654. , jd.hinge.max_motor_impulse
  655. );
  656. hinge->setLimit(jd.hinge.lower_limit
  657. , jd.hinge.upper_limit
  658. , jd.hinge.bounciness
  659. );
  660. joint = hinge;
  661. break;
  662. }
  663. default:
  664. CE_FATAL("Unknown joint type");
  665. break;
  666. }
  667. joint->setBreakingImpulseThreshold(jd.break_force);
  668. _dynamics_world->addConstraint(joint);
  669. return make_joint_instance(UINT32_MAX);
  670. }
  671. void joint_destroy(JointInstance /*i*/)
  672. {
  673. CE_FATAL("Not implemented yet");
  674. }
  675. bool cast_ray(RaycastHit &hit, const Vector3 &from, const Vector3 &dir, f32 len)
  676. {
  677. const btVector3 aa = to_btVector3(from);
  678. const btVector3 bb = to_btVector3(from + dir*len);
  679. btCollisionWorld::ClosestRayResultCallback cb(aa, bb);
  680. // Collide with everything
  681. cb.m_collisionFilterGroup = -1;
  682. cb.m_collisionFilterMask = -1;
  683. _dynamics_world->rayTest(aa, bb, cb);
  684. if (cb.hasHit()) {
  685. const u32 actor_i = (u32)(uintptr_t)btRigidBody::upcast(cb.m_collisionObject)->getUserPointer();
  686. hit.position = to_vector3(cb.m_hitPointWorld);
  687. hit.normal = to_vector3(cb.m_hitNormalWorld);
  688. hit.time = (f32)cb.m_closestHitFraction;
  689. hit.unit = _actor[actor_i].unit;
  690. hit.actor.i = actor_i;
  691. return true;
  692. }
  693. return false;
  694. }
  695. bool cast_ray_all(Array<RaycastHit> &hits, const Vector3 &from, const Vector3 &dir, f32 len)
  696. {
  697. const btVector3 aa = to_btVector3(from);
  698. const btVector3 bb = to_btVector3(from + dir*len);
  699. btCollisionWorld::AllHitsRayResultCallback cb(aa, bb);
  700. // Collide with everything
  701. cb.m_collisionFilterGroup = -1;
  702. cb.m_collisionFilterMask = -1;
  703. _dynamics_world->rayTest(aa, bb, cb);
  704. if (cb.hasHit()) {
  705. const int num = cb.m_hitPointWorld.size();
  706. array::resize(hits, num);
  707. for (int i = 0; i < num; ++i) {
  708. const u32 actor_i = (u32)(uintptr_t)btRigidBody::upcast(cb.m_collisionObjects[i])->getUserPointer();
  709. hits[i].position = to_vector3(cb.m_hitPointWorld[i]);
  710. hits[i].normal = to_vector3(cb.m_hitNormalWorld[i]);
  711. hits[i].time = (f32)cb.m_closestHitFraction;
  712. hits[i].unit = _actor[actor_i].unit;
  713. hits[i].actor.i = actor_i;
  714. }
  715. return true;
  716. }
  717. return false;
  718. }
  719. bool cast(RaycastHit &hit, const btConvexShape *shape, const Vector3 &from, const Vector3 &dir, f32 len)
  720. {
  721. const btTransform aa(btQuaternion::getIdentity(), to_btVector3(from));
  722. const btTransform bb(btQuaternion::getIdentity(), to_btVector3(from + dir*len));
  723. btCollisionWorld::ClosestConvexResultCallback cb(btVector3(0, 0, 0), btVector3(0, 0, 0));
  724. // Collide with everything
  725. cb.m_collisionFilterGroup = -1;
  726. cb.m_collisionFilterMask = -1;
  727. _dynamics_world->convexSweepTest(shape, aa, bb, cb);
  728. if (cb.hasHit()) {
  729. const u32 actor_i = (u32)(uintptr_t)btRigidBody::upcast(cb.m_hitCollisionObject)->getUserPointer();
  730. hit.position = to_vector3(cb.m_hitPointWorld);
  731. hit.normal = to_vector3(cb.m_hitNormalWorld);
  732. hit.time = (f32)cb.m_closestHitFraction;
  733. hit.unit = _actor[actor_i].unit;
  734. hit.actor.i = actor_i;
  735. return true;
  736. }
  737. return false;
  738. }
  739. bool cast_sphere(RaycastHit &hit, const Vector3 &from, f32 radius, const Vector3 &dir, f32 len)
  740. {
  741. btSphereShape shape(radius);
  742. return cast(hit, &shape, from, dir, len);
  743. }
  744. bool cast_box(RaycastHit &hit, const Vector3 &from, const Vector3 &half_extents, const Vector3 &dir, f32 len)
  745. {
  746. btBoxShape shape(to_btVector3(half_extents));
  747. return cast(hit, &shape, from, dir, len);
  748. }
  749. Vector3 gravity() const
  750. {
  751. return to_vector3(_dynamics_world->getGravity());
  752. }
  753. void set_gravity(const Vector3 &g)
  754. {
  755. _dynamics_world->setGravity(to_btVector3(g));
  756. }
  757. void update_actor_world_poses(const UnitId *begin, const UnitId *end, const Matrix4x4 *begin_world)
  758. {
  759. for (; begin != end; ++begin, ++begin_world) {
  760. const u32 ai = hash_map::get(_actor_map, *begin, UINT32_MAX);
  761. if (ai == UINT32_MAX)
  762. continue;
  763. const Quaternion rot = rotation(*begin_world);
  764. const Vector3 pos = translation(*begin_world);
  765. // http://www.bulletphysics.org/mediawiki-1.5.8/index.php/MotionStates
  766. btMotionState *ms = _actor[ai].body->getMotionState();
  767. if (ms)
  768. ms->setWorldTransform(btTransform(to_btQuaternion(rot), to_btVector3(pos)));
  769. }
  770. }
  771. void update(f32 dt)
  772. {
  773. // 12Hz to 120Hz
  774. _dynamics_world->stepSimulation(dt, 7, 1.0f/60.0f);
  775. const int num = _dynamics_world->getNumCollisionObjects();
  776. const btCollisionObjectArray &collision_array = _dynamics_world->getCollisionObjectArray();
  777. // Update actors
  778. for (int i = 0; i < num; ++i) {
  779. if ((uintptr_t)collision_array[i]->getUserPointer() == (uintptr_t)UINT32_MAX)
  780. continue;
  781. btRigidBody *body = btRigidBody::upcast(collision_array[i]);
  782. if (body
  783. && body->getMotionState()
  784. && body->isActive()
  785. ) {
  786. const UnitId unit_id = _actor[(u32)(uintptr_t)body->getUserPointer()].unit;
  787. btTransform tr;
  788. body->getMotionState()->getWorldTransform(tr);
  789. // Post transform event
  790. {
  791. PhysicsTransformEvent ev;
  792. ev.unit_id = unit_id;
  793. ev.world = to_matrix4x4(tr);
  794. event_stream::write(_events, EventType::PHYSICS_TRANSFORM, ev);
  795. }
  796. }
  797. }
  798. }
  799. EventStream &events()
  800. {
  801. return _events;
  802. }
  803. void debug_draw()
  804. {
  805. if (!_debug_drawing)
  806. return;
  807. _dynamics_world->debugDrawWorld();
  808. _debug_drawer._lines->submit();
  809. _debug_drawer._lines->reset();
  810. }
  811. void enable_debug_drawing(bool enable)
  812. {
  813. _debug_drawing = enable;
  814. }
  815. void tick_callback(btDynamicsWorld *world, btScalar /*dt*/)
  816. {
  817. // Limit bodies velocity
  818. for (u32 i = 0; i < array::size(_actor); ++i) {
  819. CE_ENSURE(NULL != _actor[i].body);
  820. const btVector3 velocity = _actor[i].body->getLinearVelocity();
  821. const btScalar speed = velocity.length();
  822. if (speed > 100.0f)
  823. _actor[i].body->setLinearVelocity(velocity * 100.0f / speed);
  824. }
  825. // Check collisions
  826. int num_manifolds = world->getDispatcher()->getNumManifolds();
  827. for (int i = 0; i < num_manifolds; ++i) {
  828. const btPersistentManifold *manifold = world->getDispatcher()->getManifoldByIndexInternal(i);
  829. const btCollisionObject *obj_a = manifold->getBody0();
  830. const btCollisionObject *obj_b = manifold->getBody1();
  831. const ActorInstance a0 = make_actor_instance((u32)(uintptr_t)obj_a->getUserPointer());
  832. const ActorInstance a1 = make_actor_instance((u32)(uintptr_t)obj_b->getUserPointer());
  833. const UnitId u0 = _actor[a0.i].unit;
  834. const UnitId u1 = _actor[a1.i].unit;
  835. int num_contacts = manifold->getNumContacts();
  836. for (int j = 0; j < num_contacts; ++j) {
  837. const btManifoldPoint &pt = manifold->getContactPoint(j);
  838. if (pt.m_distance1 < 0.0f) {
  839. // Post collision event
  840. PhysicsCollisionEvent ev;
  841. ev.type = pt.m_lifeTime == 1 ? PhysicsCollisionEvent::TOUCH_BEGIN : PhysicsCollisionEvent::TOUCHING;
  842. ev.units[0] = u0;
  843. ev.units[1] = u1;
  844. ev.actors[0] = a0;
  845. ev.actors[1] = a1;
  846. ev.position = to_vector3(pt.m_positionWorldOnB);
  847. ev.normal = to_vector3(pt.m_normalWorldOnB);
  848. ev.distance = pt.m_distance1;
  849. event_stream::write(_events, EventType::PHYSICS_COLLISION, ev);
  850. }
  851. }
  852. }
  853. }
  854. void unit_destroyed_callback(UnitId unit)
  855. {
  856. {
  857. ActorInstance first = actor(unit);
  858. if (is_valid(first))
  859. actor_destroy(first);
  860. }
  861. {
  862. ColliderInstance curr = collider_first(unit);
  863. ColliderInstance next;
  864. while (is_valid(curr)) {
  865. next = collider_next(curr);
  866. collider_destroy(curr);
  867. curr = next;
  868. }
  869. }
  870. }
  871. static void tick_cb(btDynamicsWorld *world, btScalar dt)
  872. {
  873. PhysicsWorldImpl *bw = static_cast<PhysicsWorldImpl *>(world->getWorldUserInfo());
  874. bw->tick_callback(world, dt);
  875. }
  876. static void unit_destroyed_callback(UnitId unit, void *user_ptr)
  877. {
  878. static_cast<PhysicsWorldImpl *>(user_ptr)->unit_destroyed_callback(unit);
  879. }
  880. static ColliderInstance make_collider_instance(u32 i)
  881. {
  882. ColliderInstance inst = { i }; return inst;
  883. }
  884. static ActorInstance make_actor_instance(u32 i)
  885. {
  886. ActorInstance inst = { i }; return inst;
  887. }
  888. static JointInstance make_joint_instance(u32 i)
  889. {
  890. JointInstance inst = { i }; return inst;
  891. }
  892. };
  893. PhysicsWorld::PhysicsWorld(Allocator &a, ResourceManager &rm, UnitManager &um, DebugLine &dl)
  894. : _marker(PHYSICS_WORLD_MARKER)
  895. , _allocator(&a)
  896. , _impl(NULL)
  897. {
  898. _impl = CE_NEW(*_allocator, PhysicsWorldImpl)(a, rm, um, dl);
  899. }
  900. PhysicsWorld::~PhysicsWorld()
  901. {
  902. CE_DELETE(*_allocator, _impl);
  903. _marker = 0;
  904. }
  905. ColliderInstance PhysicsWorld::collider_create(UnitId unit, const ColliderDesc *sd, const Vector3 &scl)
  906. {
  907. return _impl->collider_create(unit, sd, scl);
  908. }
  909. void PhysicsWorld::collider_destroy(ColliderInstance collider)
  910. {
  911. _impl->collider_destroy(collider);
  912. }
  913. ColliderInstance PhysicsWorld::collider_first(UnitId unit)
  914. {
  915. return _impl->collider_first(unit);
  916. }
  917. ColliderInstance PhysicsWorld::collider_next(ColliderInstance collider)
  918. {
  919. return _impl->collider_next(collider);
  920. }
  921. ActorInstance PhysicsWorld::actor_create(UnitId unit, const ActorResource *ar, const Matrix4x4 &tm)
  922. {
  923. return _impl->actor_create(unit, ar, tm);
  924. }
  925. void PhysicsWorld::actor_destroy(ActorInstance actor)
  926. {
  927. _impl->actor_destroy(actor);
  928. }
  929. ActorInstance PhysicsWorld::actor(UnitId unit)
  930. {
  931. return _impl->actor(unit);
  932. }
  933. Vector3 PhysicsWorld::actor_world_position(ActorInstance actor) const
  934. {
  935. return _impl->actor_world_position(actor);
  936. }
  937. Quaternion PhysicsWorld::actor_world_rotation(ActorInstance actor) const
  938. {
  939. return _impl->actor_world_rotation(actor);
  940. }
  941. Matrix4x4 PhysicsWorld::actor_world_pose(ActorInstance actor) const
  942. {
  943. return _impl->actor_world_pose(actor);
  944. }
  945. void PhysicsWorld::actor_teleport_world_position(ActorInstance actor, const Vector3 &p)
  946. {
  947. _impl->actor_teleport_world_position(actor, p);
  948. }
  949. void PhysicsWorld::actor_teleport_world_rotation(ActorInstance actor, const Quaternion &r)
  950. {
  951. _impl->actor_teleport_world_rotation(actor, r);
  952. }
  953. void PhysicsWorld::actor_teleport_world_pose(ActorInstance actor, const Matrix4x4 &m)
  954. {
  955. _impl->actor_teleport_world_pose(actor, m);
  956. }
  957. Vector3 PhysicsWorld::actor_center_of_mass(ActorInstance actor) const
  958. {
  959. return _impl->actor_center_of_mass(actor);
  960. }
  961. void PhysicsWorld::actor_enable_gravity(ActorInstance actor)
  962. {
  963. _impl->actor_enable_gravity(actor);
  964. }
  965. void PhysicsWorld::actor_disable_gravity(ActorInstance actor)
  966. {
  967. _impl->actor_disable_gravity(actor);
  968. }
  969. void PhysicsWorld::actor_enable_collision(ActorInstance actor)
  970. {
  971. _impl->actor_enable_collision(actor);
  972. }
  973. void PhysicsWorld::actor_disable_collision(ActorInstance actor)
  974. {
  975. _impl->actor_disable_collision(actor);
  976. }
  977. void PhysicsWorld::actor_set_collision_filter(ActorInstance actor, StringId32 filter)
  978. {
  979. _impl->actor_set_collision_filter(actor, filter);
  980. }
  981. void PhysicsWorld::actor_set_kinematic(ActorInstance actor, bool kinematic)
  982. {
  983. _impl->actor_set_kinematic(actor, kinematic);
  984. }
  985. bool PhysicsWorld::actor_is_static(ActorInstance actor) const
  986. {
  987. return _impl->actor_is_static(actor);
  988. }
  989. bool PhysicsWorld::actor_is_dynamic(ActorInstance actor) const
  990. {
  991. return _impl->actor_is_dynamic(actor);
  992. }
  993. bool PhysicsWorld::actor_is_kinematic(ActorInstance actor) const
  994. {
  995. return _impl->actor_is_kinematic(actor);
  996. }
  997. bool PhysicsWorld::actor_is_nonkinematic(ActorInstance actor) const
  998. {
  999. return _impl->actor_is_nonkinematic(actor);
  1000. }
  1001. f32 PhysicsWorld::actor_linear_damping(ActorInstance actor) const
  1002. {
  1003. return _impl->actor_linear_damping(actor);
  1004. }
  1005. void PhysicsWorld::actor_set_linear_damping(ActorInstance actor, f32 rate)
  1006. {
  1007. _impl->actor_set_linear_damping(actor, rate);
  1008. }
  1009. f32 PhysicsWorld::actor_angular_damping(ActorInstance actor) const
  1010. {
  1011. return _impl->actor_angular_damping(actor);
  1012. }
  1013. void PhysicsWorld::actor_set_angular_damping(ActorInstance actor, f32 rate)
  1014. {
  1015. _impl->actor_set_angular_damping(actor, rate);
  1016. }
  1017. Vector3 PhysicsWorld::actor_linear_velocity(ActorInstance actor) const
  1018. {
  1019. return _impl->actor_linear_velocity(actor);
  1020. }
  1021. void PhysicsWorld::actor_set_linear_velocity(ActorInstance actor, const Vector3 &vel)
  1022. {
  1023. _impl->actor_set_linear_velocity(actor, vel);
  1024. }
  1025. Vector3 PhysicsWorld::actor_angular_velocity(ActorInstance actor) const
  1026. {
  1027. return _impl->actor_angular_velocity(actor);
  1028. }
  1029. void PhysicsWorld::actor_set_angular_velocity(ActorInstance actor, const Vector3 &vel)
  1030. {
  1031. _impl->actor_set_angular_velocity(actor, vel);
  1032. }
  1033. void PhysicsWorld::actor_add_impulse(ActorInstance actor, const Vector3 &impulse)
  1034. {
  1035. _impl->actor_add_impulse(actor, impulse);
  1036. }
  1037. void PhysicsWorld::actor_add_impulse_at(ActorInstance actor, const Vector3 &impulse, const Vector3 &pos)
  1038. {
  1039. _impl->actor_add_impulse_at(actor, impulse, pos);
  1040. }
  1041. void PhysicsWorld::actor_add_torque_impulse(ActorInstance actor, const Vector3 &imp)
  1042. {
  1043. _impl->actor_add_torque_impulse(actor, imp);
  1044. }
  1045. void PhysicsWorld::actor_push(ActorInstance actor, const Vector3 &vel, f32 mass)
  1046. {
  1047. _impl->actor_push(actor, vel, mass);
  1048. }
  1049. void PhysicsWorld::actor_push_at(ActorInstance actor, const Vector3 &vel, f32 mass, const Vector3 &pos)
  1050. {
  1051. _impl->actor_push_at(actor, vel, mass, pos);
  1052. }
  1053. bool PhysicsWorld::actor_is_sleeping(ActorInstance actor)
  1054. {
  1055. return _impl->actor_is_sleeping(actor);
  1056. }
  1057. void PhysicsWorld::actor_wake_up(ActorInstance actor)
  1058. {
  1059. _impl->actor_wake_up(actor);
  1060. }
  1061. JointInstance PhysicsWorld::joint_create(ActorInstance a0, ActorInstance a1, const JointDesc &jd)
  1062. {
  1063. return _impl->joint_create(a0, a1, jd);
  1064. }
  1065. void PhysicsWorld::joint_destroy(JointInstance i)
  1066. {
  1067. _impl->joint_destroy(i);
  1068. }
  1069. bool PhysicsWorld::cast_ray(RaycastHit &hit, const Vector3 &from, const Vector3 &dir, f32 len)
  1070. {
  1071. return _impl->cast_ray(hit, from, dir, len);
  1072. }
  1073. bool PhysicsWorld::cast_ray_all(Array<RaycastHit> &hits, const Vector3 &from, const Vector3 &dir, f32 len)
  1074. {
  1075. return _impl->cast_ray_all(hits, from, dir, len);
  1076. }
  1077. bool PhysicsWorld::cast_sphere(RaycastHit &hit, const Vector3 &from, f32 radius, const Vector3 &dir, f32 len)
  1078. {
  1079. return _impl->cast_sphere(hit, from, radius, dir, len);
  1080. }
  1081. bool PhysicsWorld::cast_box(RaycastHit &hit, const Vector3 &from, const Vector3 &half_extents, const Vector3 &dir, f32 len)
  1082. {
  1083. return _impl->cast_box(hit, from, half_extents, dir, len);
  1084. }
  1085. Vector3 PhysicsWorld::gravity() const
  1086. {
  1087. return _impl->gravity();
  1088. }
  1089. void PhysicsWorld::set_gravity(const Vector3 &g)
  1090. {
  1091. _impl->set_gravity(g);
  1092. }
  1093. void PhysicsWorld::update_actor_world_poses(const UnitId *begin, const UnitId *end, const Matrix4x4 *begin_world)
  1094. {
  1095. _impl->update_actor_world_poses(begin, end, begin_world);
  1096. }
  1097. void PhysicsWorld::update(f32 dt)
  1098. {
  1099. _impl->update(dt);
  1100. }
  1101. EventStream &PhysicsWorld::events()
  1102. {
  1103. return _impl->events();
  1104. }
  1105. void PhysicsWorld::debug_draw()
  1106. {
  1107. _impl->debug_draw();
  1108. }
  1109. void PhysicsWorld::enable_debug_drawing(bool enable)
  1110. {
  1111. _impl->enable_debug_drawing(enable);
  1112. }
  1113. } // namespace crown
  1114. #endif // if CROWN_PHYSICS_BULLET