BsPhysics.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsModule.h"
  6. #include "BsVector3.h"
  7. #include "BsQuaternion.h"
  8. namespace BansheeEngine
  9. {
  10. class BS_CORE_EXPORT Physics : public Module<Physics>
  11. {
  12. public:
  13. Physics();
  14. virtual ~Physics() { }
  15. virtual void update() = 0;
  16. virtual SPtr<PhysicsMaterial> createMaterial(float staticFriction, float dynamicFriction, float restitution) = 0;
  17. virtual SPtr<PhysicsMesh> createMesh(const MeshDataPtr& meshData, PhysicsMeshType type) = 0;
  18. virtual SPtr<Rigidbody> createRigidbody(const HSceneObject& linkedSO) = 0;
  19. virtual SPtr<BoxCollider> createBoxCollider(const Vector3& extents, const Vector3& position,
  20. const Quaternion& rotation) = 0;
  21. virtual SPtr<SphereCollider> createSphereCollider(float radius,
  22. const Vector3& position, const Quaternion& rotation) = 0;
  23. virtual SPtr<PlaneCollider> createPlaneCollider(const Vector3& position, const Quaternion& rotation) = 0;
  24. virtual SPtr<CapsuleCollider> createCapsuleCollider(float radius, float halfHeight,
  25. const Vector3& position, const Quaternion& rotation) = 0;
  26. virtual SPtr<MeshCollider> createMeshCollider(const Vector3& position, const Quaternion& rotation) = 0;
  27. virtual SPtr<FixedJoint> createFixedJoint() = 0;
  28. virtual SPtr<DistanceJoint> createDistanceJoint() = 0;
  29. virtual SPtr<HingeJoint> createHingeJoint() = 0;
  30. virtual SPtr<SphericalJoint> createSphericalJoint() = 0;
  31. virtual SPtr<SliderJoint> createSliderJoint() = 0;
  32. virtual SPtr<D6Joint> createD6Joint() = 0;
  33. void toggleCollision(UINT64 groupA, UINT64 groupB, bool enabled);
  34. bool isCollisionEnabled(UINT64 groupA, UINT64 groupB) const;
  35. bool _isUpdateInProgress() const { return mUpdateInProgress; }
  36. static const UINT64 CollisionMapSize = 64;
  37. protected:
  38. friend class Rigidbody;
  39. void registerRigidbody(Rigidbody* body, UINT32 priority);
  40. void unregisterRigidbody(UINT32 id, UINT32 priority);
  41. void updatePriority(UINT32 id, UINT32 oldPriority, UINT32 newPriority);
  42. mutable Mutex mMutex;
  43. bool mCollisionMap[CollisionMapSize][CollisionMapSize];
  44. bool mUpdateInProgress = false;
  45. Vector<Vector<Rigidbody*>> mRigidbodies; // TODO: Unused for now, but keeping it here just in case I change the design. Remove later.
  46. const static UINT32 MAX_PRIORITY = 128;
  47. };
  48. /** Provides easier access to Physics. */
  49. BS_CORE_EXPORT Physics& gPhysics();
  50. }