PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
physics_world_internal.h
1#pragma once
2
3#include "pixelbullet/physics/physics_world.h"
4
5#include <Jolt/Jolt.h>
6
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>
16
17#include <glm/gtc/quaternion.hpp>
18
19#include <cstdint>
20#include <memory>
21#include <optional>
22#include <unordered_map>
23#include <vector>
24
25namespace pixelbullet
26{
27namespace physics_internal
28{
29class JoltRuntime
30{
31public:
32 JoltRuntime();
33 ~JoltRuntime();
34};
35
36namespace object_layers
37{
38constexpr JPH::ObjectLayer k_non_moving = 0;
39constexpr JPH::ObjectLayer k_moving = 1;
40} // namespace object_layers
41
42namespace broad_phase_layers
43{
44constexpr JPH::BroadPhaseLayer k_non_moving(0);
45constexpr JPH::BroadPhaseLayer k_moving(1);
46constexpr uint32_t k_count = 2;
47} // namespace broad_phase_layers
48
49class BroadPhaseLayerInterfaceImpl final : public JPH::BroadPhaseLayerInterface
50{
51public:
52 [[nodiscard]] JPH::uint GetNumBroadPhaseLayers() const override;
53 [[nodiscard]] JPH::BroadPhaseLayer GetBroadPhaseLayer(JPH::ObjectLayer layer) const override;
54};
55
56class ObjectLayerPairFilterImpl final : public JPH::ObjectLayerPairFilter
57{
58public:
59 [[nodiscard]] bool ShouldCollide(JPH::ObjectLayer layer1, JPH::ObjectLayer layer2) const override;
60};
61
62class ObjectVsBroadPhaseLayerFilterImpl final : public JPH::ObjectVsBroadPhaseLayerFilter
63{
64public:
65 [[nodiscard]] bool ShouldCollide(JPH::ObjectLayer layer1, JPH::BroadPhaseLayer layer2) const override;
66};
67
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)
73{
74 return glm::vec3(static_cast<float>(value.GetX()), static_cast<float>(value.GetY()), static_cast<float>(value.GetZ()));
75}
76[[nodiscard]] glm::quat ToGlmQuat(const JPH::Quat& value);
77[[nodiscard]] JPH::EMotionType ToJoltMotionType(RigidBodyMotionType type);
78[[nodiscard]] JPH::ObjectLayer ResolveObjectLayer(const PhysicsBodyCreateInfo& create_info);
79[[nodiscard]] uint32_t BuildBodyKey(JPH::BodyID body_id);
80
81[[nodiscard]] std::optional<PhysicsBodyPose> SanitizePose(const PhysicsBodyPose& pose);
82[[nodiscard]] bool IsValidColliderDescription(const PhysicsColliderDescription& collider);
83[[nodiscard]] JPH::ShapeRefC CreateShape(const PhysicsColliderDescription& collider);
84} // namespace physics_internal
85
86struct PhysicsWorldImpl;
87
88class PhysicsWorldContactListener final : public JPH::ContactListener
89{
90public:
91 explicit PhysicsWorldContactListener(PhysicsWorldImpl& owner);
92
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;
95
96private:
97 PhysicsWorldImpl& owner_;
98};
99
100struct PhysicsWorldImpl
101{
102 struct Slot
103 {
104 JPH::BodyID body_id;
105 uint32_t generation = 0;
106 bool occupied = false;
107 bool is_trigger = false;
108 };
109
110 PhysicsWorldImpl();
111
112 [[nodiscard]] bool ValidateHandle(PhysicsBodyHandle handle, uint32_t& slot_index) const;
113 [[nodiscard]] PhysicsBodyHandle MakeHandle(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();
119
121 physics_internal::BroadPhaseLayerInterfaceImpl broad_phase_layer_interface;
122 physics_internal::ObjectLayerPairFilterImpl object_layer_pair_filter;
123 physics_internal::ObjectVsBroadPhaseLayerFilterImpl object_vs_broad_phase_filter;
124 JPH::PhysicsSystem physics_system;
125 JPH::TempAllocatorMalloc temp_allocator;
126 JPH::JobSystemSingleThreaded job_system;
127 PhysicsWorldContactListener contact_listener;
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;
132};
133} // namespace pixelbullet
Definition physics_world_internal.h:89
Definition physics_world_internal.h:30
Definition physics_world_internal.h:57
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