3#include "pixelbullet/physics/physics_world.h"
7#include <Jolt/Core/JobSystemSingleThreaded.h>
8#include <Jolt/Core/TempAllocator.h>
9#include <Jolt/Physics/Body/BodyID.h>
10#include <Jolt/Physics/Body/MotionType.h>
11#include <Jolt/Physics/Collision/BroadPhase/BroadPhaseLayer.h>
12#include <Jolt/Physics/Collision/ContactListener.h>
13#include <Jolt/Physics/Collision/ObjectLayer.h>
14#include <Jolt/Physics/Collision/Shape/Shape.h>
15#include <Jolt/Physics/PhysicsSystem.h>
17#include <glm/gtc/quaternion.hpp>
22#include <unordered_map>
23#include <unordered_set>
28namespace physics_internal
37namespace object_layers
39constexpr JPH::ObjectLayer k_non_moving = 0;
40constexpr JPH::ObjectLayer k_moving = 1;
43namespace broad_phase_layers
45constexpr JPH::BroadPhaseLayer k_non_moving(0);
46constexpr JPH::BroadPhaseLayer k_moving(1);
47constexpr uint32_t k_count = 2;
53 [[nodiscard]] JPH::uint GetNumBroadPhaseLayers()
const override;
54 [[nodiscard]] JPH::BroadPhaseLayer GetBroadPhaseLayer(JPH::ObjectLayer layer)
const override;
60 [[nodiscard]]
bool ShouldCollide(JPH::ObjectLayer layer1, JPH::ObjectLayer layer2)
const override;
66 [[nodiscard]]
bool ShouldCollide(JPH::ObjectLayer layer1, JPH::BroadPhaseLayer layer2)
const override;
69[[nodiscard]] JPH::Quat ToJoltQuat(
const glm::quat& rotation);
70[[nodiscard]] JPH::RVec3 ToJoltRVec3(
const glm::vec3& value);
71[[nodiscard]] JPH::Vec3 ToJoltVec3(
const glm::vec3& value);
72template <
typename TVector>
73[[nodiscard]] glm::vec3 ToGlmVec3(
const TVector& value)
75 return glm::vec3(
static_cast<float>(value.GetX()),
static_cast<float>(value.GetY()),
static_cast<float>(value.GetZ()));
77[[nodiscard]] glm::quat ToGlmQuat(
const JPH::Quat& value);
78[[nodiscard]] JPH::EMotionType ToJoltMotionType(RigidBodyMotionType type);
80[[nodiscard]] uint32_t BuildBodyKey(JPH::BodyID body_id);
82[[nodiscard]] std::optional<PhysicsBodyPose> SanitizePose(
const PhysicsBodyPose& pose);
88struct PhysicsWorldImpl;
90class PhysicsWorldContactListener final :
public JPH::ContactListener
95 void OnContactAdded(
const JPH::Body& body1,
const JPH::Body& body2,
const JPH::ContactManifold&, JPH::ContactSettings&)
override;
96 void OnContactRemoved(
const JPH::SubShapeIDPair& sub_shape_pair)
override;
102struct PhysicsWorldImpl
107 uint32_t generation = 0;
108 bool occupied =
false;
109 bool is_trigger =
false;
114 [[nodiscard]]
bool ValidateHandle(
PhysicsBodyHandle handle, uint32_t& slot_index)
const;
116 [[nodiscard]] std::optional<uint32_t> FindSlotIndex(JPH::BodyID body_id)
const;
117 void QueueDirectedTriggerEvent(uint32_t trigger_slot_index, uint32_t other_slot_index, PhysicsTriggerEventType type);
118 void QueueTriggerEvents(JPH::BodyID body1, JPH::BodyID body2, PhysicsTriggerEventType type);
119 void QueueTriggerExitEventsForSlot(uint32_t slot_index);
120 [[nodiscard]] uint32_t AcquireSlot(JPH::BodyID body_id,
bool is_trigger);
121 void ReleaseSlot(uint32_t slot_index);
122 void ResetAfterClear();
128 JPH::PhysicsSystem physics_system;
129 JPH::TempAllocatorMalloc temp_allocator;
130 JPH::JobSystemSingleThreaded job_system;
132 std::vector<Slot> slots;
133 std::vector<uint32_t> free_slots;
134 std::unordered_map<uint32_t, uint32_t> body_keys_to_slots;
135 std::unordered_set<uint64_t> active_trigger_overlaps;
136 std::vector<PhysicsTriggerEvent> pending_trigger_events;
Definition physics_world_internal.h:51
Definition physics_world_internal.h:31
Definition physics_world_internal.h:58
Definition physics_world_internal.h:64
Definition physics_types.h:76
Definition physics_types.h:25
Definition physics_types.h:37
Definition physics_types.h:45
Definition physics_world_internal.h:105
Definition physics_world_internal.h:103