A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
CollisionDirector.hh
1#pragma once
2
3#include "game/field/CourseColMgr.hh"
4
5#include <egg/math/Vector.hh>
6
7#define COLLISION_ARR_LENGTH 0x40
8
9namespace Host {
10
11class Context;
12
13} // namespace Host
14
16namespace Field {
17
22 friend class Host::Context;
23
24public:
26 KCLTypeMask typeMask;
27 u16 attribute;
28 f32 dist;
29 };
30
31 void checkCourseColNarrScLocal(f32 radius, const EGG::Vector3f &pos, KCLTypeMask mask,
32 u32 timeOffset);
33
34 [[nodiscard]] bool checkSphereFull(f32 radius, const EGG::Vector3f &v0, const EGG::Vector3f &v1,
35 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut, u32 timeOffset);
36 [[nodiscard]] bool checkSphereFullPush(f32 radius, const EGG::Vector3f &v0,
37 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
38 KCLTypeMask *pFlagsOut, u32 timeOffset);
39
40 [[nodiscard]] bool checkSphereCachedPartial(f32 radius, const EGG::Vector3f &pos,
41 const EGG::Vector3f &prevPos, KCLTypeMask typeMask, CollisionInfoPartial *info,
42 KCLTypeMask *typeMaskOut, u32 timeOffset);
43 [[nodiscard]] bool checkSphereCachedPartialPush(f32 radius, const EGG::Vector3f &pos,
44 const EGG::Vector3f &prevPos, KCLTypeMask typeMask, CollisionInfoPartial *info,
45 KCLTypeMask *typeMaskOut, u32 timeOffset);
46 [[nodiscard]] bool checkSphereCachedFullPush(f32 radius, const EGG::Vector3f &pos,
47 const EGG::Vector3f &prevPos, KCLTypeMask typeMask, CollisionInfo *info,
48 KCLTypeMask *typeMaskOut, u32 timeOffset);
49
50 void resetCollisionEntries(KCLTypeMask *ptr);
51 void pushCollisionEntry(f32 dist, KCLTypeMask *typeMask, KCLTypeMask kclTypeBit, u16 attribute);
52
57 ASSERT(m_collisionEntryCount > 0);
58 u16 &entryAttr = m_entries[m_collisionEntryCount - 1].attribute;
59 entryAttr = (entryAttr & 0xff1f) | (attribute << 5);
60 }
61
65 void setCurrentCollisionTrickable(bool trickable) {
66 ASSERT(m_collisionEntryCount > 0);
67 u16 &entryAttr = m_entries[m_collisionEntryCount - 1].attribute;
68 entryAttr &= 0xdfff;
69
70 if (trickable) {
71 entryAttr |= (1 << 0xd);
72 }
73 }
74
76
78 [[nodiscard]] const CollisionEntry *closestCollisionEntry() const {
79 return m_closestCollisionEntry;
80 }
82
83 static CollisionDirector *CreateInstance();
84 static void DestroyInstance();
85
86 [[nodiscard]] static CollisionDirector *Instance() {
87 return s_instance;
88 }
89
90private:
91 CollisionDirector();
92 ~CollisionDirector() override;
93
94 const CollisionEntry *m_closestCollisionEntry;
95 std::array<CollisionEntry, COLLISION_ARR_LENGTH> m_entries;
96 size_t m_collisionEntryCount;
97
98 static CollisionDirector *s_instance;
99};
100
101} // namespace Field
An interface for ensuring certain structures and classes are destroyed with the heap.
Definition Disposer.hh:11
Manages the caching of colliding KCL triangles and exposes queries for collision checks.
void setCurrentCollisionVariant(u16 attribute)
void setCurrentCollisionTrickable(bool trickable)
void pushCollisionEntry(f32 dist, KCLTypeMask *typeMask, KCLTypeMask kclTypeBit, u16 attribute)
Called when we find a piece of collision we are touching and want to save it temporarily.
bool findClosestCollisionEntry(KCLTypeMask *typeMask, KCLTypeMask type)
Finds the closest KCL triangle out of the list of tris we are colliding with.
Contexts can be used to restore a previous memory state for the current session.
Definition Context.hh:59
Pertains to collision.
Represents the host application.
Definition HeapCommon.hh:9
A 3D float vector.
Definition Vector.hh:87