A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectAmi.hh
1#pragma once
2
3#include "game/field/obj/ObjectDrivable.hh"
4
5namespace Field {
6
7class ObjectAmi final : public ObjectDrivable {
8public:
9 ObjectAmi(const System::MapdataGeoObj &params);
10 ~ObjectAmi() override;
11
13 void init() override {}
14
16 void calc() override {}
17
19 [[nodiscard]] u32 loadFlags() const override {
20 return 1;
21 }
22
24 void createCollision() override {}
25
27 void calcCollisionTransform() override {}
28
30 [[nodiscard]] f32 getCollisionRadius() const override {
31 return 15000.0f;
32 }
33
34 [[nodiscard]] bool checkPointPartial(const EGG::Vector3f &v0, const EGG::Vector3f &v1,
35 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut) override;
36 [[nodiscard]] bool checkPointPartialPush(const EGG::Vector3f &v0, const EGG::Vector3f &v1,
37 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut) override;
38 [[nodiscard]] bool checkPointFull(const EGG::Vector3f &v0, const EGG::Vector3f &v1,
39 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut) override;
40 [[nodiscard]] bool checkPointFullPush(const EGG::Vector3f &v0, const EGG::Vector3f &v1,
41 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut) override;
42 [[nodiscard]] bool checkSpherePartial(f32 radius, const EGG::Vector3f &v0,
43 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
44 KCLTypeMask *pFlagsOut, u32 timeOffset) override;
45 [[nodiscard]] bool checkSpherePartialPush(f32 radius, const EGG::Vector3f &v0,
46 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
47 KCLTypeMask *pFlagsOut, u32 timeOffset) override;
48 [[nodiscard]] bool checkSphereFull(f32 radius, const EGG::Vector3f &v0, const EGG::Vector3f &v1,
49 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut,
50 u32 timeOffset) override;
51 [[nodiscard]] bool checkSphereFullPush(f32 radius, const EGG::Vector3f &v0,
52 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
53 KCLTypeMask *pFlagsOut, u32 timeOffset) override;
54 [[nodiscard]] bool checkPointCachedPartial(const EGG::Vector3f &v0, const EGG::Vector3f &v1,
55 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut) override;
56 [[nodiscard]] bool checkPointCachedPartialPush(const EGG::Vector3f &v0, const EGG::Vector3f &v1,
57 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut) override;
58 [[nodiscard]] bool checkPointCachedFull(const EGG::Vector3f &v0, const EGG::Vector3f &v1,
59 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut) override;
60 [[nodiscard]] bool checkPointCachedFullPush(const EGG::Vector3f &v0, const EGG::Vector3f &v1,
61 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut) override;
62 [[nodiscard]] bool checkSphereCachedPartial(f32 radius, const EGG::Vector3f &v0,
63 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
64 KCLTypeMask *pFlagsOut, u32 timeOffset) override;
65 [[nodiscard]] bool checkSphereCachedPartialPush(f32 radius, const EGG::Vector3f &v0,
66 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
67 KCLTypeMask *pFlagsOut, u32 timeOffset) override;
68 [[nodiscard]] bool checkSphereCachedFull(f32 radius, const EGG::Vector3f &v0,
69 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
70 KCLTypeMask *pFlagsOut, u32 timeOffset) override;
71 [[nodiscard]] bool checkSphereCachedFullPush(f32 radius, const EGG::Vector3f &v0,
72 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
73 KCLTypeMask *pFlagsOut, u32 timeOffset) override;
74
75private:
76 [[nodiscard]] bool checkSpherePartialImpl(f32 radius, const EGG::Vector3f &v0,
77 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
78 KCLTypeMask *pFlagsOut, u32 timeOffset);
79 [[nodiscard]] bool checkSpherePartialPushImpl(f32 radius, const EGG::Vector3f &v0,
80 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
81 KCLTypeMask *pFlagsOut, u32 timeOffset);
82 [[nodiscard]] bool checkSphereFullImpl(f32 radius, const EGG::Vector3f &v0,
83 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
84 KCLTypeMask *pFlagsOut, u32 timeOffset);
85 [[nodiscard]] bool checkSphereFullPushImpl(f32 radius, const EGG::Vector3f &v0,
86 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
87 KCLTypeMask *pFlagsOut, u32 timeOffset);
88
89 template <typename T>
90 requires std::is_same_v<T, CollisionInfo> || std::is_same_v<T, CollisionInfoPartial>
91 [[nodiscard]] bool checkSphereImpl(f32 radius, const EGG::Vector3f &v0, const EGG::Vector3f &v1,
92 KCLTypeMask flags, T *pInfo, KCLTypeMask *pFlagsOut, u32 timeOffset, bool push);
93
94 [[nodiscard]] bool checkCollision(f32 radius, const EGG::Vector3f &vel, u32 time,
95 EGG::Vector3f &bbox, EGG::Vector3f &fnrm, f32 &dist);
96
97 [[nodiscard]] static f32 SpatialSin(f32 phase);
98 [[nodiscard]] static f32 TemporalSin(u32 t);
99
100 static constexpr EGG::Vector3f DIMS = EGG::Vector3f(2600.0f, 2000.0f, 13800.0f);
101};
102
103} // namespace Field
bool checkSphereImpl(f32 radius, const EGG::Vector3f &v0, const EGG::Vector3f &v1, KCLTypeMask flags, T *pInfo, KCLTypeMask *pFlagsOut, u32 timeOffset, bool push)
Helper function which contains frequently re-used code. Behavior branches depending on whether it is ...
Definition ObjectAmi.cc:149
static f32 SpatialSin(f32 phase)
Computes a spatial sine wave as a function of the z-axis phase.
Definition ObjectAmi.cc:230
static f32 TemporalSin(u32 t)
Not emitted by the game, but computes a sine wave as a function of time.
Definition ObjectAmi.cc:236
Pertains to collision.
A 3D float vector.
Definition Vector.hh:87