nngn
Loading...
Searching...
No Matches
collision.h
Go to the documentation of this file.
1
12#ifndef NNGN_COLLISION_H
13#define NNGN_COLLISION_H
14
15#include <memory>
16#include <vector>
17
18#include "lua/table.h"
19#include "timing/stats.h"
20#include "utils/utils.h"
21
22#include "colliders.h"
23
24struct lua_State;
25struct Entity;
26
27namespace nngn {
28
29struct Compute;
30struct Timing;
31
32struct Collision {
33 Entity *entity0 = nullptr, *entity1 = nullptr;
34 float mass0 = 0, mass1 = 0;
35 Flags<Collider::Flag> flags0 = {}, flags1 = {};
36 vec3 force = {};
37};
38
39struct CollisionStats : StatsBase<CollisionStats, 4> {
40 std::array<uint64_t, 4>
47 plane,
54 static constexpr std::array names = {
55 "counters",
56 "aabb_copy", "aabb_exec_barrier", "aabb_exec",
57 "bb_copy", "bb_exec_barrier", "bb_exec",
58 "sphere_pos", "sphere_vel", "sphere_mass", "sphere_radius",
59 "sphere_grid_count", "sphere_exec_grid_barrier",
60 "sphere_exec_grid", "sphere_exec_barrier", "sphere_exec",
61 "plane",
62 "gravity_pos", "gravity_mass", "gravity_max_distance2",
63 "aabb_bb_exec_barrier", "aabb_bb_exec",
64 "aabb_sphere_exec_barrier", "aabb_sphere_exec",
65 "bb_sphere_exec_barrier", "bb_sphere_exec",
66 "sphere_plane_exec_barrier", "sphere_plane_exec",
67 "sphere_gravity_exec_barrier", "sphere_gravity_exec"};
68 const uint64_t *to_u64(void) const { return this->counters.data(); }
69 uint64_t *to_u64(void) { return this->counters.data(); }
70};
71
72struct Colliders {
73 struct Backend {
74 struct Input {
75 std::vector<AABBCollider> aabb = {};
76 std::vector<BBCollider> bb = {};
77 std::vector<SphereCollider> sphere = {};
78 std::vector<PlaneCollider> plane = {};
79 std::vector<GravityCollider> gravity = {};
80 };
81 struct Output {
82 CollisionStats stats = {};
83 std::vector<Collision> collisions = {};
84 };
85 NNGN_VIRTUAL(Backend)
86 virtual bool init(void) { return true; }
87 virtual bool set_max_colliders(std::size_t) { return true; }
88 virtual bool set_max_collisions(std::size_t) { return true; }
89 virtual bool check(const Timing&, Input*, Output*)
90 { return true; }
91 };
92private:
93 enum Flag : uint8_t {
94 CHECK = 1u << 0, RESOLVE = 1u << 1,
96 };
97 Flags<Flag> m_flags = {static_cast<Flag>(Flag::CHECK | Flag::RESOLVE)};
98 std::size_t m_max_colliders = 0;
99 Backend::Input input = {};
100 Backend::Output output = {};
101 std::unique_ptr<Backend> backend = {};
102public:
104 static constexpr std::size_t STATS_IDX = 1;
105 static std::unique_ptr<Backend> native_backend();
106 static std::unique_ptr<Backend> compute_backend(Compute *c);
109 ~Colliders(void);
110 auto &aabb(void) const { return this->input.aabb; }
111 auto &bb(void) const { return this->input.bb; }
112 auto &sphere(void) const { return this->input.sphere; }
113 auto &plane(void) const { return this->input.plane; }
114 auto &gravity(void) const { return this->input.gravity; }
115 std::size_t max_colliders(void) const { return this->m_max_colliders; }
116 std::size_t max_collisions(void) const;
117 auto &collisions(void) const { return this->output.collisions; }
118 bool check(void) const { return this->m_flags.is_set(Flag::CHECK); }
119 bool resolve(void) const { return this->m_flags.is_set(Flag::RESOLVE); }
120 bool has_backend(void) const { return static_cast<bool>(this->backend); }
121 void set_check(bool b) { this->m_flags.set(Flag::CHECK, b); }
122 void set_resolve(bool b) { this->m_flags.set(Flag::RESOLVE, b); }
123 bool set_max_colliders(std::size_t n);
124 bool set_max_collisions(std::size_t n);
125 bool set_backend(std::unique_ptr<Backend> p);
133 void clear(void);
134 bool check_collisions(const Timing &t);
135 void resolve_collisions(void) const;
137};
138
139inline std::size_t Colliders::max_collisions(void) const {
140 return this->output.collisions.capacity();
141}
142
143}
144
145#endif
Definition: state.h:88
c
Definition: gamma.lua:11
Colliders::Backend::Output Output
Definition: native.cpp:10
Colliders::Backend::Input Input
Definition: native.cpp:9
static constexpr auto Backend
Definition: vulkan.cpp:5
n
Definition: dump_lights.lua:5
p
Definition: input.lua:29
#define NNGN_VIRTUAL(x)
Definition: utils.h:27
#define NNGN_MOVE_ONLY(x)
Definition: utils.h:39
Definition: audio.cpp:7
vec3_base< float > vec3
Definition: vec3.h:51
Definition: entity.h:24
Definition: colliders.h:34
Definition: colliders.h:44
Definition: colliders.h:15
Definition: collision.h:74
std::vector< SphereCollider > sphere
Definition: collision.h:77
std::vector< GravityCollider > gravity
Definition: collision.h:79
std::vector< AABBCollider > aabb
Definition: collision.h:75
std::vector< BBCollider > bb
Definition: collision.h:76
std::vector< PlaneCollider > plane
Definition: collision.h:78
Definition: collision.h:81
std::vector< Collision > collisions
Definition: collision.h:83
CollisionStats stats
Definition: collision.h:82
virtual bool set_max_collisions(std::size_t)
Definition: collision.h:88
virtual bool check(const Timing &, Input *, Output *)
Definition: collision.h:89
virtual bool set_max_colliders(std::size_t)
Definition: collision.h:87
virtual bool init(void)
Definition: collision.h:86
Definition: collision.h:72
Flag
Definition: collision.h:93
@ RESOLVE
Definition: collision.h:94
@ MAX_COLLIDERS_UPDATED
Definition: collision.h:95
@ CHECK
Definition: collision.h:94
@ MAX_COLLISIONS_UPDATED
Definition: collision.h:95
auto & aabb(void) const
Definition: collision.h:110
bool resolve(void) const
Definition: collision.h:119
auto & collisions(void) const
Definition: collision.h:117
Backend::Input input
Definition: collision.h:99
bool check_collisions(const Timing &t)
bool set_max_collisions(std::size_t n)
void set_check(bool b)
Definition: collision.h:121
void set_resolve(bool b)
Definition: collision.h:122
PlaneCollider * add(const PlaneCollider &c)
auto & sphere(void) const
Definition: collision.h:112
auto & bb(void) const
Definition: collision.h:111
std::size_t max_colliders(void) const
Definition: collision.h:115
std::unique_ptr< Backend > backend
Definition: collision.h:101
static std::unique_ptr< Backend > compute_backend(Compute *c)
auto & plane(void) const
Definition: collision.h:113
bool set_max_colliders(std::size_t n)
void clear(void)
BBCollider * add(const BBCollider &c)
bool lua_on_collision(nngn::lua::state_view lua)
SphereCollider * add(const SphereCollider &c)
bool has_backend(void) const
Definition: collision.h:120
GravityCollider * add(const GravityCollider &c)
std::size_t max_collisions(void) const
Backend::Output output
Definition: collision.h:100
std::size_t m_max_colliders
Definition: collision.h:98
void remove(Collider *p)
Collider * load(nngn::lua::table_view t)
void resolve_collisions(void) const
auto & gravity(void) const
Definition: collision.h:114
AABBCollider * add(const AABBCollider &c)
Flags< Flag > m_flags
Definition: collision.h:97
static constexpr std::size_t STATS_IDX
Definition: collision.h:104
bool set_backend(std::unique_ptr< Backend > p)
static std::unique_ptr< Backend > native_backend()
bool check(void) const
Definition: collision.h:118
Definition: collision.h:39
std::array< uint64_t, 4 > aabb_exec
Definition: collision.h:42
std::array< uint64_t, 4 > bb_sphere_exec
Definition: collision.h:51
std::array< uint64_t, 4 > bb_sphere_exec_barrier
Definition: collision.h:51
std::array< uint64_t, 4 > aabb_copy
Definition: collision.h:42
std::array< uint64_t, 4 > counters
Definition: collision.h:41
std::array< uint64_t, 4 > aabb_bb_exec
Definition: collision.h:49
std::array< uint64_t, 4 > sphere_grid_count
Definition: collision.h:45
std::array< uint64_t, 4 > sphere_gravity_exec
Definition: collision.h:53
std::array< uint64_t, 4 > sphere_exec
Definition: collision.h:46
std::array< uint64_t, 4 > sphere_exec_grid_barrier
Definition: collision.h:45
std::array< uint64_t, 4 > sphere_radius
Definition: collision.h:44
std::array< uint64_t, 4 > sphere_mass
Definition: collision.h:44
std::array< uint64_t, 4 > sphere_vel
Definition: collision.h:44
std::array< uint64_t, 4 > sphere_gravity_exec_barrier
Definition: collision.h:53
std::array< uint64_t, 4 > sphere_exec_barrier
Definition: collision.h:46
std::array< uint64_t, 4 > plane
Definition: collision.h:47
std::array< uint64_t, 4 > aabb_sphere_exec_barrier
Definition: collision.h:50
std::array< uint64_t, 4 > bb_copy
Definition: collision.h:43
std::array< uint64_t, 4 > sphere_plane_exec_barrier
Definition: collision.h:52
std::array< uint64_t, 4 > gravity_max_distance2
Definition: collision.h:48
std::array< uint64_t, 4 > gravity_mass
Definition: collision.h:48
const uint64_t * to_u64(void) const
Definition: collision.h:68
static constexpr std::array names
Definition: collision.h:54
std::array< uint64_t, 4 > sphere_plane_exec
Definition: collision.h:52
std::array< uint64_t, 4 > sphere_pos
Definition: collision.h:44
std::array< uint64_t, 4 > sphere_exec_grid
Definition: collision.h:46
std::array< uint64_t, 4 > aabb_exec_barrier
Definition: collision.h:42
std::array< uint64_t, 4 > bb_exec
Definition: collision.h:43
std::array< uint64_t, 4 > gravity_pos
Definition: collision.h:48
std::array< uint64_t, 4 > aabb_sphere_exec
Definition: collision.h:50
std::array< uint64_t, 4 > aabb_bb_exec_barrier
Definition: collision.h:49
std::array< uint64_t, 4 > bb_exec_barrier
Definition: collision.h:43
uint64_t * to_u64(void)
Definition: collision.h:69
Entity * entity1
Definition: collision.h:33
float mass0
Definition: collision.h:34
Flags< Collider::Flag > flags0
Definition: collision.h:35
vec3 force
Definition: collision.h:36
Flags< Collider::Flag > flags1
Definition: collision.h:35
float mass1
Definition: collision.h:34
Entity * entity0
Definition: collision.h:33
Base class for computation back ends, which may be hardware-accelerated.
Definition: compute.h:108
Wrapper for an unsigned integral representing flags.
Definition: flags.h:18
constexpr bool is_set(AT a) const
Definition: flags.h:26
constexpr Flags & set(AT a)
Definition: flags.h:28
TerminalFlag
Definition: graphics.h:156
Definition: colliders.h:69
Definition: colliders.h:61
Definition: colliders.h:53
Definition: timing.h:20
Non-owning reference to a table on the stack.
Definition: table.h:166