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 ObjectChoropuGround;
14class ObjectChoropuHoll;
15
20public:
22 ~ObjectChoropu() override;
23
24 void init() override;
25 void calc() override;
26
28 [[nodiscard]] u32 loadFlags() const override {
29 return 1;
30 }
31
32 Kart::Reaction onCollision(Kart::KartObject *kartObj, Kart::Reaction reactionOnKart,
33 Kart::Reaction reactionOnObj, EGG::Vector3f &hitDepth) override;
34
35private:
36 void enterStateStub();
37 void enterDigging();
38 void enterPeeking();
39 void enterJumping();
40 void calcStateStub();
41 void calcDigging();
42 void calcPeeking();
43 void calcJumping();
44
45 void calcGround();
46 void calcGroundObjs();
47 [[nodiscard]] EGG::Matrix34f calcInterpolatedPose(f32 t) const;
48
49 std::span<ObjectChoropuGround *> m_groundObjs;
50 ObjectChoropuHoll *m_objHoll;
51 s16 m_startFrameOffset;
52 u16 m_idleDuration;
53 f32 m_groundHeight;
55 EGG::Matrix34f m_transMat;
56 EGG::Matrix34f m_railMat;
57 f32 m_groundLength;
58
59 static constexpr f32 RADIUS = 300.0f;
60 static constexpr f32 MAX_GROUND_LEN = 3000.0f;
61
62 static constexpr std::array<StateManagerEntry, 5> STATE_ENTRIES = {{
63 StateEntry<ObjectChoropu, &ObjectChoropu::enterDigging, &ObjectChoropu::calcDigging>(0),
64 StateEntry<ObjectChoropu, &ObjectChoropu::enterPeeking, &ObjectChoropu::calcPeeking>(1),
65 StateEntry<ObjectChoropu, &ObjectChoropu::enterStateStub,
66 &ObjectChoropu::calcStateStub>(2),
67 StateEntry<ObjectChoropu, &ObjectChoropu::enterJumping, &ObjectChoropu::calcJumping>(3),
68 StateEntry<ObjectChoropu, &ObjectChoropu::enterStateStub,
69 &ObjectChoropu::calcStateStub>(4),
70 }};
71};
72
74public:
75 ObjectChoropuGround(const EGG::Vector3f &pos, const EGG::Vector3f &rot,
76 const EGG::Vector3f &scale);
77 ~ObjectChoropuGround() override;
78
80 [[nodiscard]] u32 loadFlags() const override {
81 return 1;
82 }
83
85 Kart::Reaction onCollision(Kart::KartObject * /*kartObj*/, Kart::Reaction reactionOnKart,
86 Kart::Reaction /*reactionOnObj*/, EGG::Vector3f &hitDepth) override {
87 hitDepth.setZero();
88 return reactionOnKart;
89 }
90
91 void calcPosAndMat(f32 height, const EGG::Matrix34f &mat);
92
93 [[nodiscard]] f32 height() const {
94 return m_height;
95 }
96
97private:
98 f32 m_height;
99};
100
102public:
104 ~ObjectChoropuHoll() override;
105
107 void init() override {
108 resize(RADIUS, 0.0f);
109 }
110
112 [[nodiscard]] const char *getName() const override {
113 return "holl";
114 }
115
117 [[nodiscard]] u32 loadFlags() const override {
118 return 1;
119 }
120
122 [[nodiscard]] const char *getKclName() const override {
123 return "holl";
124 }
125
127 void createCollision() override {
128 m_collision = new ObjectCollisionSphere(RADIUS, EGG::Vector3f::zero);
129 }
130
132 void loadRail() override {}
133
135 Kart::Reaction onCollision(Kart::KartObject * /*kartObj*/, Kart::Reaction /*reactionOnKart*/,
136 Kart::Reaction /*reactionOnObj*/, EGG::Vector3f &hitDepth) override {
137 hitDepth.setZero();
138 return Kart::Reaction::Wall;
139 }
140
141private:
142 static constexpr f32 RADIUS = 300.0f;
143};
144
145} // 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
Base class that represents different "states" for an object.
The highest level abstraction for a kart.
Definition KartObject.hh:11
Pertains to collision.
A 3D float vector.
Definition Vector.hh:88