A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectChoropu.hh
1#pragma once
2
3#include "game/field/ObjectCollisionSphere.hh"
4#include "game/field/StateManager.hh"
5#include "game/field/obj/ObjectCollidable.hh"
6
7#include "game/kart/KartCollide.hh"
8
9#include <vector>
10
11namespace Field {
12
13class ObjectChoropu;
14class ObjectChoropuGround;
15class ObjectChoropuHoll;
16
20class ObjectChoropu : public ObjectCollidable, public StateManager<ObjectChoropu> {
22
23public:
25 ~ObjectChoropu() override;
26
27 void init() override;
28 void calc() override;
29
31 [[nodiscard]] u32 loadFlags() const override {
32 return 1;
33 }
34
35 Kart::Reaction onCollision(Kart::KartObject *kartObj, Kart::Reaction reactionOnKart,
36 Kart::Reaction reactionOnObj, EGG::Vector3f &hitDepth) override;
37
38private:
39 void enterStateStub();
40 void enterDigging();
41 void enterPeeking();
42 void enterJumping();
43 void calcStateStub();
44 void calcDigging();
45 void calcPeeking();
46 void calcJumping();
47
48 void calcGround();
49 void calcGroundObjs();
50 [[nodiscard]] EGG::Matrix34f calcInterpolatedPose(f32 t) const;
51
52 std::span<ObjectChoropuGround *> m_groundObjs;
53 ObjectChoropuHoll *m_objHoll;
54 s16 m_startFrameOffset;
55 u16 m_idleDuration;
56 f32 m_groundHeight;
58 EGG::Matrix34f m_transMat;
59 EGG::Matrix34f m_railMat;
60 f32 m_groundLength;
61
62 static constexpr f32 RADIUS = 300.0f;
63 static constexpr f32 MAX_GROUND_LEN = 3000.0f;
64
65 static constexpr std::array<StateManagerEntry<ObjectChoropu>, 5> STATE_ENTRIES = {{
66 {0, &ObjectChoropu::enterDigging, &ObjectChoropu::calcDigging},
67 {1, &ObjectChoropu::enterPeeking, &ObjectChoropu::calcPeeking},
68 {2, &ObjectChoropu::enterStateStub, &ObjectChoropu::calcStateStub},
69 {3, &ObjectChoropu::enterJumping, &ObjectChoropu::calcJumping},
70 {4, &ObjectChoropu::enterStateStub, &ObjectChoropu::calcStateStub},
71 }};
72};
73
75public:
76 ObjectChoropuGround(const EGG::Vector3f &pos, const EGG::Vector3f &rot,
77 const EGG::Vector3f &scale);
78 ~ObjectChoropuGround() override;
79
81 [[nodiscard]] u32 loadFlags() const override {
82 return 1;
83 }
84
86 Kart::Reaction onCollision(Kart::KartObject * /*kartObj*/, Kart::Reaction reactionOnKart,
87 Kart::Reaction /*reactionOnObj*/, EGG::Vector3f &hitDepth) override {
88 hitDepth.setZero();
89 return reactionOnKart;
90 }
91
92 void calcPosAndMat(f32 height, const EGG::Matrix34f &mat);
93
94 [[nodiscard]] f32 height() const {
95 return m_height;
96 }
97
98private:
99 f32 m_height;
100};
101
103public:
105 ~ObjectChoropuHoll() override;
106
108 void init() override {
109 resize(RADIUS, 0.0f);
110 }
111
113 [[nodiscard]] const char *getName() const override {
114 return "holl";
115 }
116
118 [[nodiscard]] u32 loadFlags() const override {
119 return 1;
120 }
121
123 [[nodiscard]] const char *getKclName() const override {
124 return "holl";
125 }
126
128 void createCollision() override {
129 m_collision = new ObjectCollisionSphere(RADIUS, EGG::Vector3f::zero);
130 }
131
133 void loadRail() override {}
134
136 Kart::Reaction onCollision(Kart::KartObject * /*kartObj*/, Kart::Reaction /*reactionOnKart*/,
137 Kart::Reaction /*reactionOnObj*/, EGG::Vector3f &hitDepth) override {
138 hitDepth.setZero();
139 return Kart::Reaction::Wall;
140 }
141
142private:
143 static constexpr f32 RADIUS = 300.0f;
144};
145
146} // namespace Field
A 3 x 4 matrix.
Definition Matrix.hh:8
Represents the MMM and rPG monty moles.
static constexpr f32 MAX_GROUND_LEN
Max length of the dirt trail.
bool m_isStationary
rPG moles don't move while MMM moles do
The highest level abstraction for a kart.
Definition KartObject.hh:11
Pertains to collision.
A 3D float vector.
Definition Vector.hh:88