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>
27namespace physics_internal
36namespace object_layers
38constexpr JPH::ObjectLayer k_non_moving = 0;
39constexpr JPH::ObjectLayer k_moving = 1;
42namespace broad_phase_layers
44constexpr JPH::BroadPhaseLayer k_non_moving(0);
45constexpr JPH::BroadPhaseLayer k_moving(1);
46constexpr uint32_t k_count = 2;
52 [[nodiscard]] JPH::uint GetNumBroadPhaseLayers()
const override;
53 [[nodiscard]] JPH::BroadPhaseLayer GetBroadPhaseLayer(JPH::ObjectLayer layer)
const override;
59 [[nodiscard]]
bool ShouldCollide(JPH::ObjectLayer layer1, JPH::ObjectLayer layer2)
const override;
65 [[nodiscard]]
bool ShouldCollide(JPH::ObjectLayer layer1, JPH::BroadPhaseLayer layer2)
const override;
68[[nodiscard]] JPH::Quat ToJoltQuat(
const glm::quat& rotation);
69[[nodiscard]] JPH::RVec3 ToJoltRVec3(
const glm::vec3& value);
70[[nodiscard]] JPH::Vec3 ToJoltVec3(
const glm::vec3& value);
71template <
typename TVector>
72[[nodiscard]] glm::vec3 ToGlmVec3(
const TVector& value)
74 return glm::vec3(
static_cast<float>(value.GetX()),
static_cast<float>(value.GetY()),
static_cast<float>(value.GetZ()));
76[[nodiscard]] glm::quat ToGlmQuat(
const JPH::Quat& value);
77[[nodiscard]] JPH::EMotionType ToJoltMotionType(RigidBodyMotionType type);
79[[nodiscard]] uint32_t BuildBodyKey(JPH::BodyID body_id);
81[[nodiscard]] std::optional<PhysicsBodyPose> SanitizePose(
const PhysicsBodyPose& pose);
86struct PhysicsWorldImpl;
88class PhysicsWorldContactListener final :
public JPH::ContactListener
93 void OnContactAdded(
const JPH::Body& body1,
const JPH::Body& body2,
const JPH::ContactManifold&, JPH::ContactSettings&)
override;
94 void OnContactRemoved(
const JPH::SubShapeIDPair& sub_shape_pair)
override;
100struct PhysicsWorldImpl
105 uint32_t generation = 0;
106 bool occupied =
false;
107 bool is_trigger =
false;
112 [[nodiscard]]
bool ValidateHandle(
PhysicsBodyHandle handle, uint32_t& slot_index)
const;
114 [[nodiscard]] std::optional<uint32_t> FindSlotIndex(JPH::BodyID body_id)
const;
115 void QueueTriggerEvents(JPH::BodyID body1, JPH::BodyID body2, PhysicsTriggerEventType type);
116 [[nodiscard]] uint32_t AcquireSlot(JPH::BodyID body_id,
bool is_trigger);
117 void ReleaseSlot(uint32_t slot_index);
118 void ResetAfterClear();
124 JPH::PhysicsSystem physics_system;
125 JPH::TempAllocatorMalloc temp_allocator;
126 JPH::JobSystemSingleThreaded job_system;
128 std::vector<Slot> slots;
129 std::vector<uint32_t> free_slots;
130 std::unordered_map<uint32_t, uint32_t> body_keys_to_slots;
131 std::vector<PhysicsTriggerEvent> pending_trigger_events;
Definition physics_world_internal.h:50
Definition physics_world_internal.h:30
Definition physics_world_internal.h:57
Definition physics_world_internal.h:63
Definition physics_types.h:77
Definition physics_types.h:27
Definition physics_types.h:39
Definition physics_types.h:47
Definition physics_world_internal.h:103
Definition physics_world_internal.h:101