A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectObakeManager.hh
1#pragma once
2
3#include "game/field/ObjectCollisionBox.hh"
4#include "game/field/ObjectCollisionSphere.hh"
5#include "game/field/obj/ObjectDrivable.hh"
6#include "game/field/obj/ObjectObakeBlock.hh"
7
8#include "game/system/map/MapdataGeoObj.hh"
9
10#include <egg/core/Allocator.hh>
11
12#include <vector>
13
14namespace Kinoko::Field {
15
20class ObjectObakeManager : public ObjectDrivable {
21public:
22 ObjectObakeManager(const System::MapdataGeoObj &params);
23 ~ObjectObakeManager() override;
24
25 void calc() override;
26
28 [[nodiscard]] u32 loadFlags() const override {
29 return 3;
30 }
31
33 void createCollision() override {}
34
36 void calcCollisionTransform() override {}
37
39 [[nodiscard]] f32 getCollisionRadius() const override {
40 return 100000.0f;
41 }
42
43 [[nodiscard]] bool checkPointPartial(const EGG::Vector3f &pos, const EGG::Vector3f &prevPos,
44 KCLTypeMask mask, CollisionInfoPartial *info, KCLTypeMask *maskOut) override;
45 [[nodiscard]] bool checkPointPartialPush(const EGG::Vector3f &pos, const EGG::Vector3f &prevPos,
46 KCLTypeMask mask, CollisionInfoPartial *info, KCLTypeMask *maskOut) override;
47 [[nodiscard]] bool checkPointFull(const EGG::Vector3f &pos, const EGG::Vector3f &prevPos,
48 KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut) override;
49 [[nodiscard]] bool checkPointFullPush(const EGG::Vector3f &pos, const EGG::Vector3f &prevPos,
50 KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut) override;
51
52 [[nodiscard]] bool checkSpherePartial(f32 radius, const EGG::Vector3f &pos,
53 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
54 KCLTypeMask *maskOut, u32 timeOffset) override;
55 [[nodiscard]] bool checkSpherePartialPush(f32 radius, const EGG::Vector3f &pos,
56 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
57 KCLTypeMask *maskOut, u32 timeOffset) override;
58 [[nodiscard]] bool checkSphereFull(f32 radius, const EGG::Vector3f &pos,
59 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
60 KCLTypeMask *maskOut, u32 timeOffset) override;
61 [[nodiscard]] bool checkSphereFullPush(f32 radius, const EGG::Vector3f &pos,
62 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
63 KCLTypeMask *maskOut, u32 timeOffset) override;
64
65 [[nodiscard]] bool checkPointCachedPartial(const EGG::Vector3f &pos,
66 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
67 KCLTypeMask *maskOut) override;
68 [[nodiscard]] bool checkPointCachedPartialPush(const EGG::Vector3f &pos,
69 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
70 KCLTypeMask *maskOut) override;
71 [[nodiscard]] bool checkPointCachedFull(const EGG::Vector3f &pos, const EGG::Vector3f &prevPos,
72 KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut) override;
73 [[nodiscard]] bool checkPointCachedFullPush(const EGG::Vector3f &pos,
74 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
75 KCLTypeMask *maskOut) override;
76
77 [[nodiscard]] bool checkSphereCachedPartial(f32 radius, const EGG::Vector3f &pos,
78 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
79 KCLTypeMask *maskOut, u32 timeOffset) override;
80 [[nodiscard]] bool checkSphereCachedPartialPush(f32 radius, const EGG::Vector3f &pos,
81 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
82 KCLTypeMask *maskOut, u32 timeOffset) override;
83 [[nodiscard]] bool checkSphereCachedFull(f32 radius, const EGG::Vector3f &pos,
84 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
85 KCLTypeMask *maskOut, u32 timeOffset) override;
86 [[nodiscard]] bool checkSphereCachedFullPush(f32 radius, const EGG::Vector3f &pos,
87 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
88 KCLTypeMask *maskOut, u32 timeOffset) override;
89
90 void addBlock(const System::MapdataGeoObj &params);
91
92private:
93 static constexpr size_t CACHE_SIZE_X = 122;
94 static constexpr size_t CACHE_SIZE_Z = 116;
95 static constexpr f32 SPECIAL_WALL_BOUNDING_RADIUS = 85.0f;
96 static constexpr EGG::Vector3f SPECIAL_WALL_SCALE = EGG::Vector3f(1.0f, 1.1f, 1.0f);
97 static constexpr EGG::Vector3f ROAD_SCALE = EGG::Vector3f(1.0f, 0.95f, 1.0f);
98
99 [[nodiscard]] bool checkSpherePartialImpl(f32 radius, const EGG::Vector3f &pos,
100 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
101 KCLTypeMask *maskOut);
102 [[nodiscard]] bool checkSpherePartialPushImpl(f32 radius, const EGG::Vector3f &pos,
103 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
104 KCLTypeMask *maskOut);
105 [[nodiscard]] bool checkSphereFullImpl(f32 radius, const EGG::Vector3f &pos,
106 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
107 KCLTypeMask *maskOut);
108 [[nodiscard]] bool checkSphereFullPushImpl(f32 radius, const EGG::Vector3f &pos,
109 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
110 KCLTypeMask *maskOut);
111
112 [[nodiscard]] static std::pair<s32, s32> SpatialIndex(const EGG::Vector3f &pos);
113
116
118 std::array<std::array<ObjectObakeBlock *, CACHE_SIZE_X>, CACHE_SIZE_Z> m_blockCache;
119
122
123 static constexpr size_t MAX_BLOCKS = 656;
124};
125
126} // namespace Kinoko::Field
fixed_vector< ObjectObakeBlock * > m_blocks
All blocks.
std::array< std::array< ObjectObakeBlock *, CACHE_SIZE_X >, CACHE_SIZE_Z > m_blockCache
Spatially-indexed array of blocks for faster collision lookups.
static constexpr size_t MAX_BLOCKS
Allocated size of m_blocks and m_calcBlocks.
ObjectCollisionSphere * m_colSphere
Represents a kart hitbox.
ObjectCollisionBox * m_colBox
Represents hitbox of a particular block.
static std::pair< s32, s32 > SpatialIndex(const EGG::Vector3f &pos)
Helper function to return the spatial index of a given block.
fixed_vector< ObjectObakeBlock * > m_calcBlocks
Actively falling blocks.
Dynamically sized array that only allocates once.
Definition Types.hh:177
Pertains to collision.
A 3D float vector.
Definition Vector.hh:107