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 <vector>
11
12namespace Field {
13
19public:
21 ~ObjectObakeManager() override;
22
23 void calc() override;
24
26 [[nodiscard]] u32 loadFlags() const override {
27 return 3;
28 }
29
31 void createCollision() override {}
32
34 void calcCollisionTransform() override {}
35
37 [[nodiscard]] f32 getCollisionRadius() const override {
38 return 100000.0f;
39 }
40
41 [[nodiscard]] bool checkPointPartial(const EGG::Vector3f &pos, const EGG::Vector3f &prevPos,
42 KCLTypeMask mask, CollisionInfoPartial *info, KCLTypeMask *maskOut) override;
43 [[nodiscard]] bool checkPointPartialPush(const EGG::Vector3f &pos, const EGG::Vector3f &prevPos,
44 KCLTypeMask mask, CollisionInfoPartial *info, KCLTypeMask *maskOut) override;
45 [[nodiscard]] bool checkPointFull(const EGG::Vector3f &pos, const EGG::Vector3f &prevPos,
46 KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut) override;
47 [[nodiscard]] bool checkPointFullPush(const EGG::Vector3f &pos, const EGG::Vector3f &prevPos,
48 KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut) override;
49
50 [[nodiscard]] bool checkSpherePartial(f32 radius, const EGG::Vector3f &pos,
51 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
52 KCLTypeMask *maskOut, u32 timeOffset) override;
53 [[nodiscard]] bool checkSpherePartialPush(f32 radius, const EGG::Vector3f &pos,
54 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
55 KCLTypeMask *maskOut, u32 timeOffset) override;
56 [[nodiscard]] bool checkSphereFull(f32 radius, const EGG::Vector3f &pos,
57 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
58 KCLTypeMask *maskOut, u32 timeOffset) override;
59 [[nodiscard]] bool checkSphereFullPush(f32 radius, const EGG::Vector3f &pos,
60 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
61 KCLTypeMask *maskOut, u32 timeOffset) override;
62
63 [[nodiscard]] bool checkPointCachedPartial(const EGG::Vector3f &pos,
64 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
65 KCLTypeMask *maskOut) override;
66 [[nodiscard]] bool checkPointCachedPartialPush(const EGG::Vector3f &pos,
67 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
68 KCLTypeMask *maskOut) override;
69 [[nodiscard]] bool checkPointCachedFull(const EGG::Vector3f &pos, const EGG::Vector3f &prevPos,
70 KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut) override;
71 [[nodiscard]] bool checkPointCachedFullPush(const EGG::Vector3f &pos,
72 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
73 KCLTypeMask *maskOut) override;
74
75 [[nodiscard]] bool checkSphereCachedPartial(f32 radius, const EGG::Vector3f &pos,
76 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
77 KCLTypeMask *maskOut, u32 timeOffset) override;
78 [[nodiscard]] bool checkSphereCachedPartialPush(f32 radius, const EGG::Vector3f &pos,
79 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
80 KCLTypeMask *maskOut, u32 timeOffset) override;
81 [[nodiscard]] bool checkSphereCachedFull(f32 radius, const EGG::Vector3f &pos,
82 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
83 KCLTypeMask *maskOut, u32 timeOffset) override;
84 [[nodiscard]] bool checkSphereCachedFullPush(f32 radius, const EGG::Vector3f &pos,
85 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
86 KCLTypeMask *maskOut, u32 timeOffset) override;
87
88 void addBlock(const System::MapdataGeoObj &params);
89
90private:
91 static constexpr size_t CACHE_SIZE_X = 122;
92 static constexpr size_t CACHE_SIZE_Z = 116;
93 static constexpr f32 SPECIAL_WALL_BOUNDING_RADIUS = 85.0f;
94 static constexpr EGG::Vector3f SPECIAL_WALL_SCALE = EGG::Vector3f(1.0f, 1.1f, 1.0f);
95 static constexpr EGG::Vector3f ROAD_SCALE = EGG::Vector3f(1.0f, 0.95f, 1.0f);
96
97 [[nodiscard]] bool checkSpherePartialImpl(f32 radius, const EGG::Vector3f &pos,
98 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
99 KCLTypeMask *maskOut);
100 [[nodiscard]] bool checkSpherePartialPushImpl(f32 radius, const EGG::Vector3f &pos,
101 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfoPartial *info,
102 KCLTypeMask *maskOut);
103 [[nodiscard]] bool checkSphereFullImpl(f32 radius, const EGG::Vector3f &pos,
104 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
105 KCLTypeMask *maskOut);
106 [[nodiscard]] bool checkSphereFullPushImpl(f32 radius, const EGG::Vector3f &pos,
107 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
108 KCLTypeMask *maskOut);
109
110 [[nodiscard]] static std::pair<s32, s32> SpatialIndex(const EGG::Vector3f &pos);
111
114
116 std::array<std::array<ObjectObakeBlock *, CACHE_SIZE_Z>, CACHE_SIZE_X> m_blockCache;
117
118 std::vector<ObjectObakeBlock *> m_blocks;
119 std::vector<ObjectObakeBlock *> m_calcBlocks;
120};
121
122} // namespace Field
The manager class for SNES Ghost Valley 2 blocks.
std::vector< ObjectObakeBlock * > m_calcBlocks
Actively falling blocks.
ObjectCollisionBox * m_colBox
Represents hitbox of a particular block.
std::vector< ObjectObakeBlock * > m_blocks
All blocks.
std::array< std::array< ObjectObakeBlock *, CACHE_SIZE_Z >, CACHE_SIZE_X > m_blockCache
Spatially-indexed array of blocks for faster collision lookups.
static std::pair< s32, s32 > SpatialIndex(const EGG::Vector3f &pos)
Helper function to return the spatial index of a given block.
ObjectCollisionSphere * m_colSphere
Represents a kart hitbox.
Pertains to collision.
A 3D float vector.
Definition Vector.hh:87