A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectCow.hh
1#pragma once
2
3#include "game/field/StateManager.hh"
4#include "game/field/obj/ObjectCollidable.hh"
5
6namespace Field {
7
8class RailInterpolator;
9
12public:
13 ObjectCow(const System::MapdataGeoObj &params);
14 ~ObjectCow() override;
15
16 Kart::Reaction onCollision(Kart::KartObject *kartObj, Kart::Reaction reactionOnKart,
17 Kart::Reaction reactionOnObj, EGG::Vector3f &hitDepth) override;
18
19protected:
20 virtual void calcFloor();
21
22 void setup();
23 void calcPos();
24 f32 setTarget(const EGG::Vector3f &v);
25
27 [[nodiscard]] static EGG::Vector3f Interpolate(f32 t, const EGG::Vector3f &v0,
28 const EGG::Vector3f &v1) {
29 return v0 + (v1 - v0) * t;
30 }
31
33 EGG::Vector3f m_tangent;
34 EGG::Vector3f m_prevTangent;
35 EGG::Vector3f m_up;
36 EGG::Vector3f m_velocity;
38 f32 m_tangentFactor;
39 EGG::Vector3f m_floorNrm;
41 EGG::Vector3f m_targetDir;
43 f32 m_interpRate;
44
45 static constexpr EGG::Vector3f GRAVITY_FORCE = EGG::Vector3f(0.0f, 2.0f, 0.0f);
46};
47
49class ObjectCowLeader final : public ObjectCow, public StateManager {
50 friend class ObjectCowHerd;
51
52public:
54 ~ObjectCowLeader() override;
55
56 void init() override;
57 void calc() override;
58
60 [[nodiscard]] u32 loadFlags() const override {
61 return 1;
62 }
63
64private:
65 enum class AnmType {
66 EatST = 0,
67 Eat = 1,
68 EatED = 2,
69 };
70
71 void calcFloor() override;
72
73 void enterWait();
74 void enterEat();
75 void enterRoam();
76
77 void calcWait();
78 void calcEat();
79 void calcRoam();
80
81 f32 m_railSpeed;
82 bool m_endedRailSegment;
83 AnmType m_state1AnmType;
85
86 static constexpr std::array<StateManagerEntry, 3> STATE_ENTRIES = {{
87 {StateEntry<ObjectCowLeader, &ObjectCowLeader::enterWait, &ObjectCowLeader::calcWait>(
88 0)},
89 {StateEntry<ObjectCowLeader, &ObjectCowLeader::enterEat, &ObjectCowLeader::calcEat>(1)},
90 {StateEntry<ObjectCowLeader, &ObjectCowLeader::enterRoam, &ObjectCowLeader::calcRoam>(
91 2)},
92 }};
93};
94
96class ObjectCowFollower final : public ObjectCow, public StateManager {
97 friend class ObjectCowHerd;
98
99public:
100 ObjectCowFollower(const System::MapdataGeoObj &params, const EGG::Vector3f &pos, f32 rot);
101 ~ObjectCowFollower() override;
102
103 void init() override;
104 void calc() override;
105
107 [[nodiscard]] u32 loadFlags() const override {
108 return 1;
109 }
110
112 void loadRail() override {}
113
114private:
115 void enterWait();
116 void enterFreeRoam();
117 void enterFollowLeader();
118
119 void calcWait();
120 void calcFreeRoam();
121 void calcFollowLeader();
122
123 const EGG::Vector3f m_posOffset;
124 RailInterpolator *m_rail;
129
130 static constexpr f32 BASE_TOP_SPEED = 2.0f;
131 static constexpr f32 TOP_SPEED_VARIANCE = 4.0f - 2.0f;
132
134 static constexpr f32 DIST_THRESHOLD = 200.0f;
135
136 static constexpr std::array<StateManagerEntry, 3> STATE_ENTRIES = {{
137 {StateEntry<ObjectCowFollower, &ObjectCowFollower::enterWait,
138 &ObjectCowFollower::calcWait>(0)},
139 {StateEntry<ObjectCowFollower, &ObjectCowFollower::enterFreeRoam,
140 &ObjectCowFollower::calcFreeRoam>(1)},
141 {StateEntry<ObjectCowFollower, &ObjectCowFollower::enterFollowLeader,
142 &ObjectCowFollower::calcFollowLeader>(2)},
143 }};
144};
145
150class ObjectCowHerd final : public ObjectCollidable {
151public:
153 ~ObjectCowHerd() override;
154
155 void init() override;
156 void calc() override;
157
159 [[nodiscard]] u32 loadFlags() const override {
160 return 1;
161 }
162
164 void createCollision() override {}
165
167 void loadRail() override {}
168
169private:
170 void checkCollision();
171
172 ObjectCowLeader *m_leader;
173 std::span<ObjectCowFollower *> m_followers;
174};
175
176} // namespace Field
A cow that follows a leader by sharing the same rail.
Definition ObjectCow.hh:96
u16 m_waitFrames
Number of frames the cow will stand still for.
Definition ObjectCow.hh:125
static constexpr f32 DIST_THRESHOLD
Distance at which a cow is considered close enough to the rail to stop moving.
Definition ObjectCow.hh:134
f32 m_railSegThreshold
The rail segmentT at which a cow will change to state 2.
Definition ObjectCow.hh:128
f32 m_topSpeed
The speed the cow will accelerate up to.
Definition ObjectCow.hh:126
bool m_bStopping
Set when the cow is coming to a stop.
Definition ObjectCow.hh:127
The manager class that controls a group of cows.
Definition ObjectCow.hh:150
void checkCollision()
Prevents cows from walking into each other.
Definition ObjectCow.cc:488
void calc() override
Definition ObjectCow.cc:472
void init() override
Assigns the herd's rail to each child.
Definition ObjectCow.cc:465
A cow who its own rail and whose position is not influenced by the path of the others.
Definition ObjectCow.hh:49
u16 m_eatFrames
Length of the state 1 eat animation.
Definition ObjectCow.hh:84
The base class shared between ObjectCowLeader and ObjectCowFollower.
Definition ObjectCow.hh:11
EGG::Vector3f m_upForce
Used by calcPos to counteract gravity.
Definition ObjectCow.hh:42
u32 m_startFrame
The frame the cow will start moving.
Definition ObjectCow.hh:32
EGG::Vector3f m_state1TargetPos
Calculated in enterState1.
Definition ObjectCow.hh:40
f32 m_xzSpeed
XZ plane length of m_velocity.
Definition ObjectCow.hh:37
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