sandbox
Loading...
Searching...
No Matches
physics_module.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_PHYSICS_PHYSICS_MODULE_HPP_
3#define LIBSBX_PHYSICS_PHYSICS_MODULE_HPP_
4
5#include <cmath>
6#include <optional>
7#include <vector>
8#include <algorithm>
9#include <ranges>
10#include <unordered_map>
11
12#include <libsbx/utility/logger.hpp>
13
14#include <libsbx/core/engine.hpp>
15#include <libsbx/core/module.hpp>
16
17#include <libsbx/containers/octree.hpp>
18
20#include <libsbx/math/volume.hpp>
22
23#include <libsbx/scenes/scenes_module.hpp>
24
25#include <libsbx/scenes/components/global_transform.hpp>
26#include <libsbx/scenes/components/transform.hpp>
27#include <libsbx/scenes/components/id.hpp>
28#include <libsbx/scenes/components/tag.hpp>
29#include <libsbx/scenes/components/relationship.hpp>
30
31#include <libsbx/physics/shape_collider.hpp>
32#include <libsbx/physics/collision_detection.hpp>
33#include <libsbx/physics/rigidbody.hpp>
34
35namespace sbx::physics {
36
37class physics_module : public core::module<physics_module> {
38
39 inline static const auto is_registered = register_module(stage::fixed, dependencies<scenes::scenes_module>{});
40
41public:
42
43 physics_module() = default;
44
45 ~physics_module() override = default;
46
47 auto update() -> void override;
48
49private:
50
52 using collision_pair_type = typename octree_type::intersection;
53
54 struct collision {
55 scenes::node node_a;
56 scenes::node node_b;
57 collision_manifold manifold;
58 }; // struct collision
59
60 struct contact_constraint {
61 math::vector3 normal;
62 math::vector3 tangent1;
63 math::vector3 tangent2;
64 math::vector3 r_a;
65 math::vector3 r_b;
66 std::float_t normal_mass{0.0f};
67 std::float_t tangent1_mass{0.0f};
68 std::float_t tangent2_mass{0.0f};
69 std::float_t bias{0.0f};
70 std::float_t normal_impulse{0.0f};
71 std::float_t tangent1_impulse{0.0f};
72 std::float_t tangent2_impulse{0.0f};
73 std::uint64_t last_seen{0};
74 }; // struct contact_constraint
75
76 struct solver_contact {
77 scenes::node node_a{};
78 scenes::node node_b{};
79 std::size_t key{};
80 contact_constraint constraint{};
81 }; // struct solver_contact
82
83 auto _integrate_velocities(std::float_t dt) -> void;
84
85 auto _integrate_positions(std::float_t dt) -> void;
86
87 auto _collision_broad_phase() -> std::vector<collision_pair_type>;
88
89 auto _collision_narrow_phase(const std::vector<collision_pair_type>& pairs) -> std::vector<collision>;
90
91 auto _resolve_collisions(const std::vector<collision>& collisions, std::float_t dt) -> void;
92
93 auto _update_character_controllers() -> void;
94
95 auto _update_cache(const std::vector<solver_contact>& solver_contacts) -> void;
96
97 auto _positional_correction(const std::vector<collision>& collisions) -> void;
98
99 std::unordered_map<std::size_t, contact_constraint> _contact_cache{};
100 std::uint64_t _solver_tick{0};
101
102}; // class physics_module
103
104} // namespace sbx::physics
105
106#endif // LIBSBX_PHYSICS_PHYSICS_MODULE_HPP_
Definition: octree.hpp:23
Definition: module.hpp:92
Definition: vector3.hpp:23
Definition: physics_module.hpp:37
Mathematical constants.
Matrix casting and decomposition utilities.
Definition: octree.hpp:133
Definition: collision_detection.hpp:28