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 Kinoko {
10
11namespace Host {
12
13class Context;
14
15} // namespace Host
16
18namespace Field {
19
24 friend class Host::Context;
25
26public:
31 Trickable = 13,
32 RejectRoad = 14,
33 Soft = 15,
34 };
35 typedef EGG::TBitFlag<u16, eCollisionAttribute> CollisionAttribute;
36
38 KCLTypeMask typeMask;
39 CollisionAttribute attribute;
40 f32 dist;
41
42 u16 baseType() const {
43 return attribute & 0x1F;
44 }
45
46 u16 variant() const {
47 return (attribute >> 5) & 7;
48 }
49
50 u16 intensity() const {
51 return (attribute >> 11) & 3;
52 }
53
54 void setVariant(u16 variant) {
55 u16 current = static_cast<u16>(attribute);
56 attribute = static_cast<CollisionAttribute>((current & ~0xE0) | ((variant & 7) << 5));
57 }
58 };
59
60 void checkCourseColNarrScLocal(f32 radius, const EGG::Vector3f &pos, KCLTypeMask mask,
61 u32 timeOffset);
62
63 [[nodiscard]] bool checkSpherePartialPush(f32 radius, const EGG::Vector3f &pos,
64 const EGG::Vector3f &prevPos, KCLTypeMask flags, CollisionInfoPartial *info,
65 KCLTypeMask *typeMaskOut, u32 timeOffset);
66 [[nodiscard]] bool checkSphereFull(f32 radius, const EGG::Vector3f &v0, const EGG::Vector3f &v1,
67 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut, u32 timeOffset);
68 [[nodiscard]] bool checkSphereFullPush(f32 radius, const EGG::Vector3f &v0,
69 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
70 KCLTypeMask *pFlagsOut, u32 timeOffset);
71
72 [[nodiscard]] bool checkSphereCachedPartial(f32 radius, const EGG::Vector3f &pos,
73 const EGG::Vector3f &prevPos, KCLTypeMask typeMask, CollisionInfoPartial *info,
74 KCLTypeMask *typeMaskOut, u32 timeOffset);
75 [[nodiscard]] bool checkSphereCachedPartialPush(f32 radius, const EGG::Vector3f &pos,
76 const EGG::Vector3f &prevPos, KCLTypeMask typeMask, CollisionInfoPartial *info,
77 KCLTypeMask *typeMaskOut, u32 timeOffset);
78 [[nodiscard]] bool checkSphereCachedFullPush(f32 radius, const EGG::Vector3f &pos,
79 const EGG::Vector3f &prevPos, KCLTypeMask typeMask, CollisionInfo *info,
80 KCLTypeMask *typeMaskOut, u32 timeOffset);
81
82 void resetCollisionEntries(KCLTypeMask *ptr);
83 void pushCollisionEntry(f32 dist, KCLTypeMask *typeMask, KCLTypeMask kclTypeBit,
84 CollisionAttribute attribute);
85
87 void setCurrentCollisionVariant(u16 attribute) {
88 ASSERT(m_collisionEntryCount > 0);
89 m_entries[m_collisionEntryCount - 1].setVariant(attribute);
90 }
91
93 void setCurrentCollisionTrickable(bool trickable) {
94 ASSERT(m_collisionEntryCount > 0);
95 CollisionEntry &entry = m_entries[m_collisionEntryCount - 1];
96 entry.attribute.changeBit(trickable, eCollisionAttribute::Trickable);
97 }
98
99 bool findClosestCollisionEntry(KCLTypeMask *typeMask, KCLTypeMask type);
100
102 [[nodiscard]] const CollisionEntry *closestCollisionEntry() const {
103 return m_closestCollisionEntry;
104 }
106
107 static CollisionDirector *CreateInstance();
108 static void DestroyInstance();
109
110 [[nodiscard]] static CollisionDirector *Instance() {
111 return s_instance;
112 }
113
114private:
115 CollisionDirector();
116 ~CollisionDirector() override;
117
118 const CollisionEntry *m_closestCollisionEntry;
119 std::array<CollisionEntry, COLLISION_ARR_LENGTH> m_entries;
120 size_t m_collisionEntryCount;
121
122 static CollisionDirector *s_instance;
123};
124
125} // namespace Field
126
127} // namespace Kinoko
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.
bool findClosestCollisionEntry(KCLTypeMask *typeMask, KCLTypeMask type)
Finds the closest KCL triangle out of the list of tris we are colliding with.
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.
eCollisionAttribute
Collision Entry Attribute fields.
Contexts can be used to restore a previous memory state for the current session.
Definition Context.hh:71
Wrapper around an integral type with an enum corresponding to its bits.
Definition BitFlag.hh:23
A 3D float vector.
Definition Vector.hh:107