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:
29 Trickable = 13,
30 RejectRoad = 14,
31 Soft = 15,
32 };
33 typedef EGG::TBitFlag<u16, eCollisionAttribute> CollisionAttribute;
34
36 KCLTypeMask typeMask;
37 CollisionAttribute attribute;
38 f32 dist;
39
40 u16 baseType() const {
41 return attribute & 0x1F;
42 }
43
44 u16 variant() const {
45 return (attribute >> 5) & 7;
46 }
47
48 u16 intensity() const {
49 return (attribute >> 11) & 3;
50 }
51
52 void setVariant(u16 variant) {
53 u16 current = static_cast<u16>(attribute);
54 attribute = static_cast<CollisionAttribute>((current & ~0xE0) | ((variant & 7) << 5));
55 }
56 };
57
58 void checkCourseColNarrScLocal(f32 radius, const EGG::Vector3f &pos, KCLTypeMask mask,
59 u32 timeOffset);
60
61 [[nodiscard]] bool checkSphereFull(f32 radius, const EGG::Vector3f &v0, const EGG::Vector3f &v1,
62 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut, u32 timeOffset);
63 [[nodiscard]] bool checkSphereFullPush(f32 radius, const EGG::Vector3f &v0,
64 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
65 KCLTypeMask *pFlagsOut, u32 timeOffset);
66
67 [[nodiscard]] bool checkSphereCachedPartial(f32 radius, const EGG::Vector3f &pos,
68 const EGG::Vector3f &prevPos, KCLTypeMask typeMask, CollisionInfoPartial *info,
69 KCLTypeMask *typeMaskOut, u32 timeOffset);
70 [[nodiscard]] bool checkSphereCachedPartialPush(f32 radius, const EGG::Vector3f &pos,
71 const EGG::Vector3f &prevPos, KCLTypeMask typeMask, CollisionInfoPartial *info,
72 KCLTypeMask *typeMaskOut, u32 timeOffset);
73 [[nodiscard]] bool checkSphereCachedFullPush(f32 radius, const EGG::Vector3f &pos,
74 const EGG::Vector3f &prevPos, KCLTypeMask typeMask, CollisionInfo *info,
75 KCLTypeMask *typeMaskOut, u32 timeOffset);
76
77 void resetCollisionEntries(KCLTypeMask *ptr);
78 void pushCollisionEntry(f32 dist, KCLTypeMask *typeMask, KCLTypeMask kclTypeBit,
79 CollisionAttribute attribute);
80
82 void setCurrentCollisionVariant(u16 attribute) {
83 ASSERT(m_collisionEntryCount > 0);
84 m_entries[m_collisionEntryCount - 1].setVariant(attribute);
85 }
86
88 void setCurrentCollisionTrickable(bool trickable) {
89 ASSERT(m_collisionEntryCount > 0);
90 CollisionEntry &entry = m_entries[m_collisionEntryCount - 1];
91 entry.attribute.changeBit(trickable, eCollisionAttribute::Trickable);
92 }
93
94 bool findClosestCollisionEntry(KCLTypeMask *typeMask, KCLTypeMask type);
95
97 [[nodiscard]] const CollisionEntry *closestCollisionEntry() const {
98 return m_closestCollisionEntry;
99 }
101
102 static CollisionDirector *CreateInstance();
103 static void DestroyInstance();
104
105 [[nodiscard]] static CollisionDirector *Instance() {
106 return s_instance;
107 }
108
109private:
110 CollisionDirector();
111 ~CollisionDirector() override;
112
113 const CollisionEntry *m_closestCollisionEntry;
114 std::array<CollisionEntry, COLLISION_ARR_LENGTH> m_entries;
115 size_t m_collisionEntryCount;
116
117 static CollisionDirector *s_instance;
118};
119
120} // 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.
eCollisionAttribute
Collision Entry Attribute fields.
void pushCollisionEntry(f32 dist, KCLTypeMask *typeMask, KCLTypeMask kclTypeBit, CollisionAttribute 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
Wrapper around an integral type with an enum corresponding to its bits.
Definition BitFlag.hh:16
A 3D float vector.
Definition Vector.hh:88