New Super Mario Bros. U Headers
Loading...
Searching...
No Matches
BgCollision.h
Go to the documentation of this file.
1#pragma once
2
3#include <actor/Actor.h>
4#include <collision/BgCollisionCat.h>
5#include <collision/BgUnitCode.h>
6#include <collision/FollowArg.h>
7#include <system/LineNodeMgr.h>
8#include <utility/Angle.h>
9
10#include <math/seadMatrix.h>
11
17
18class BgCollision : public sead::IDisposer // vtbl Address: 0x10042528
19{
20public:
22
24 typedef void (*CallbackWall)(BgCollision*, ActorBgCollisionCheck*, u8 direction);
25
26 typedef bool (*CheckRev)(Actor*, Actor*);
27 typedef bool (*CheckRevWall)(Actor*, Actor*, u8 direction);
28
36 static_assert(sizeof(InitArg) == 0x18);
37
46 static_assert(sizeof(BoxInitArg) == 0x24);
47
56 static_assert(sizeof(CircleInitArg) == 0x20);
57
66 static_assert(sizeof(EllipseInitArg) == 0x24);
67
75 static_assert(sizeof(LineInitArg) == 0x24);
76
87 static_assert(sizeof(PoleRopeInitArg) == 0x28);
88
89 enum Type
90 {
114 cType_Carpet = 23, // Unused
115 cType_Leaves = 24, // Used by Palm Tree
116 cType_Wood = 25, // Used by Floating Barrel
117 cType_Cloud = 26, // Used by Bouncy Cloud
122 cType_BreakableIce = 31, // Used by frozen actors
123 cType_BreakableIce2 = 32, // Used by Portable Ice Block
124 cType_GrrrolPassage = 33, // Used by Grrrol Passage and Grrrol Spawner
126 cType_StreamCurrent = 35, // Used by Pipe Bubbles, Bg Check Info Unit Kind = 26
127 cType_AirshipHand = 36, // Used by Airship Hand, Bg Check Info Unit Kind = 32
128 cType_WaterGeyser = 37, // Used by Water Geyser, Bg Check Info Unit Kind = 33
129 cType_Unknown10 = 38, // Used by Pipes, Bg Check Info Unit Kind = Pipe, Bg Check Info Unit Param 0 = 36
130 cType_SpineCoaster = 39, // Used by Spine Coaster, Bg Check Info Unit Kind = 38
131 cType_Urchin = 40, // Used by Urchin, Bg Check Info Unit Kind = 39
133 };
134
135public:
136 // Address: 0x021A5184
138 // Address: 0x021A5610
139 virtual ~BgCollision();
140
141 // getRuntimeTypeInfoStatic()::typeInfo initialization guard variable Address: 0x101E9D2C
142 // getRuntimeTypeInfoStatic()::typeInfo Address: 0x101E9FA4
144
145 // Address: 0x021A7688 (TODO: This should be inline)
146 virtual bool vf24(u32*, u32);
147 // Address: Deleted
148 virtual u32 vf2C(u32*);
149 virtual void vf34() = 0;
150 virtual void execute() = 0;
151 virtual bool checkAreaBasic(BgCollisionCheckResultArea* res, const BasicBgCollisionCheck& bc, const sead::Vector2f& p0, const sead::Vector2f& p1, u8 hit_dir_mask) = 0;
152 virtual bool checkAreaActor(ActorBgCollisionCheckResult*, sead::Vector2f*, sead::Vector2f*, u8 direction, ActorBgCollisionCheck*) = 0;
153 virtual bool checkPointInside(bool* on_edge, const sead::Vector2f& p) const = 0;
154 virtual bool vf5C(u32*) = 0;
155 // Address: 0x021A680C
156 virtual void vf64();
157 virtual void vf6C() = 0;
158 virtual void onBgCheckDataChange(const u64& bc_data) = 0;
159 virtual bool checkPointInsideOrWithinDistance(const sead::Vector2f& p, f32 distance) const = 0;
160
162 {
163 return mAffectedArea;
164 }
165
167 {
168 return mOwner;
169 }
170
171 template <typename T>
172 T* getOwner() const
173 {
174 return sead::DynamicCast<T>(mOwner);
175 }
176
178 {
179 return mIgnoreActor;
180 }
181
182 const FollowArg& getFollowArg() const
183 {
184 return mFollowArg;
185 }
186
188 {
189 return mPosOffset;
190 }
191
192 const sead::Vector2f& getPosOffset() const
193 {
194 return mPosOffset;
195 }
196
198 {
199 return mPosOffset2;
200 }
201
203 {
204 return mTypeOffset;
205 }
206
208 {
209 return mTypeOffset;
210 }
211
212 f32 getPosX() const
213 {
214 return mFollowArg.position->x + mPosOffset.x;
215 }
216
217 f32 getPosY() const
218 {
219 return mFollowArg.position->y + mPosOffset.y;
220 }
221
223 {
224 // Not inline in NSMB2
225 return *reinterpret_cast<sead::Vector2f*>(mFollowArg.position) + mPosOffset;
226 }
227
229 {
230 return mFollowArg.position_prev->x + mPosOffsetPrev.x;
231 }
232
234 {
235 return mFollowArg.position_prev->y + mPosOffsetPrev.y;
236 }
237
239 {
240 // Not inline in NSMB2
241 return *reinterpret_cast<sead::Vector2f*>(mFollowArg.position_prev) + mPosOffsetPrev;
242 }
243
245 {
246 return getPosX() + mTypeOffset.x;
247 }
248
250 {
251 return getPosY() + mTypeOffset.y;
252 }
253
255 {
256 return getPos() + mTypeOffset;
257 }
258
260 {
261 return getPosPrevX() + mTypeOffsetPrev.x;
262 }
263
265 {
266 return getPosPrevY() + mTypeOffsetPrev.y;
267 }
268
270 {
271 return getPosPrev() + mTypeOffsetPrev;
272 }
273
274 bool isInactive() const
275 {
276 return mIsInactive;
277 }
278
280 {
281 return mAngle;
282 }
283
284 void setAngle(Angle angle)
285 {
286 mAngle = angle;
287 }
288
289 const BcList& getBcListFoot() const
290 {
291 return mBcListFoot;
292 }
293
294 const BcList& getBcListHead() const
295 {
296 return mBcListHead;
297 }
298
299 const BcList& getBcListWallR() const
300 {
301 return mBcListWallR;
302 }
303
304 const BcList& getBcListWallL() const
305 {
306 return mBcListWallL;
307 }
308
309 // Address: 0x021A5720
311 // Address: 0x021A5764
313 // Address: 0x021A56E4
315
316 // Address: 0x021A59F4
317 void reset();
318 // Address: 0x021A5598
320
321 // Address: 0x021A5A70
322 void setType(Type type); // Sets all parameters of mBgCheckData (see BgUnitCode)
323 Type getType() const { return mType; }
324
325 // Address: 0x021A5A04
326 void setBgCheckData(const u64& bc_data);
327 const u64& getBgCheckData() const { return mBgCheckData; }
328
329 // Address: 0x021A5A90
330 void setHitType(BgUnitCode::HitType hit_type);
331 // Address: 0x021A5AD0
332 void setAttr(BgUnitCode::Attr attr);
333 // Address: 0x021A5B14
334 void setSlipAttr(BgUnitCode::SlipAttr slip_attr);
335
336 // Address: 0x021A5EB4
337 void update();
338
339 // Address: 0x021A5F9C
340 sead::Vector2f addDokanMoveDiff(sead::Vector2f pos);
341
342 void setFlag(u32 flag)
343 {
344 mFlag.setDirect(flag);
345 }
346
347 void resetFlag(u32 mask)
348 {
349 mFlag.reset(mask);
350 }
351
353 {
354 mFlag.makeAllZero();
355 }
356
357 bool isFlag(s32 bit) const
358 {
359 return mFlag.isOnBit(bit);
360 }
361
362 /**
363 * @brief Register callbacks for interacting with a sensor of another actor.
364 * @param callback_foot Callback for when the @c foot sensor touches the collider, or @c nullptr for no callback.
365 * @param callback_head Callback for when the @c head sensor touches the collider, or @c nullptr for no callback.
366 * @param callback_wall Callback for when the @c wall sensor touches the collider, or @c nullptr for no callback.
367 */
368 void setCallback(Callback callback_foot, Callback callback_head, CallbackWall callback_wall)
369 {
370 mCallbackFoot = callback_foot;
371 mCallbackHead = callback_head;
372 mCallbackWall = callback_wall;
373 }
374
375 void setCheckRev(CheckRev check_rev_foot, CheckRev check_rev_head, CheckRevWall check_rev_wall)
376 {
377 mCheckRevFoot = check_rev_foot;
378 mCheckRevHead = check_rev_head;
379 mCheckRevWall = check_rev_wall;
380 }
381
383 {
384 mDrcTouchCallback = drc_touch_callback;
385 }
386
387public:
388 // Use this as default for mCheckRevFoot
389 static bool CheckRevUpperSpeed(Actor* actor_self, Actor* actor_other)
390 {
391 return actor_self->getSpeedVec().y > 0.0f;
392 }
393
394 // Use this as default for mCheckRevHead
395 static bool CheckRevUnderSpeed(Actor* actor_self, Actor* actor_other)
396 {
397 return actor_self->getSpeedVec().y < 0.0f;
398 }
399
400 // Use this as default for mCheckRevWall
401 static bool CheckRevSideSpeed(Actor* actor_self, Actor* actor_other, u8 direction)
402 {
403 if (direction == cDirType_Right)
404 {
405 if (actor_self->getSpeedVec().x > 0.0f)
406 return true;
407 }
408 else
409 {
410 if (actor_self->getSpeedVec().x < 0.0f)
411 return true;
412 }
413 return false;
414 }
415
416protected:
418
427 sead::BoundBox2f mAffectedArea; // Current Area & Prev Area
428 sead::Vector2f mPosOffset2; // Additional position offset set when area loop is on, not even used by all collision types...
432 Actor* mIgnoreActor; // Force BasicBgCollisionCheck owned by this actor to ignore this BgCollision
440 bool mIsInactive; // If true, forces BasicBgCollisionCheck to ignore this BgCollision
445 BcList mBcListFoot; // List of ActorBgCollisionCheck with foot sensor hitting this BgCollision
446 BcList mBcListHead; // List of ActorBgCollisionCheck with head sensor hitting this BgCollision
447 BcList mBcListWallR; // List of ActorBgCollisionCheck with right wall sensor hitting this BgCollision
448 BcList mBcListWallL; // List of ActorBgCollisionCheck with left wall sensor hitting this BgCollision
450 u64 mBgCheckData; // See BgUnitCode
459};
460static_assert(sizeof(BgCollision) == 0x158);
Definition ActorBgCollisionCheck.h:24
Definition ActorBgCollisionCheck.h:59
Definition ActorCollisionDrcTouchCallback.h:10
Definition BasicBgCollisionCheck.h:18
Definition BgCollision.h:19
virtual void onBgCheckDataChange(const u64 &bc_data)=0
LineNodeMgr< BgCollision > List
Definition BgCollision.h:417
List::Node mPoleListNode
Definition BgCollision.h:424
sead::Vector2f mPosOffset2
Definition BgCollision.h:428
u32 _154
Definition BgCollision.h:458
void setBgCheckData(const u64 &bc_data)
const sead::Vector2f & getTypeOffset() const
Definition BgCollision.h:207
Angle mAnglePrev
Definition BgCollision.h:444
List::Node mTouchDrcHoldListNode
Definition BgCollision.h:426
sead::BoundBox2f mAffectedArea
Definition BgCollision.h:427
const u64 & getBgCheckData() const
Definition BgCollision.h:327
Actor * getOwner() const
Definition BgCollision.h:166
CheckRevWall mCheckRevWall
Definition BgCollision.h:456
virtual void vf6C()=0
bool(* CheckRev)(Actor *, Actor *)
Definition BgCollision.h:26
void clearBcList()
List::Node _34
Definition BgCollision.h:422
Actor * mIgnoreActor
Definition BgCollision.h:432
virtual bool checkAreaBasic(BgCollisionCheckResultArea *res, const BasicBgCollisionCheck &bc, const sead::Vector2f &p0, const sead::Vector2f &p1, u8 hit_dir_mask)=0
sead::BitFlag32 mFlag
Definition BgCollision.h:429
bool isFlag(s32 bit) const
Definition BgCollision.h:357
virtual void vf64()
const sead::Vector2f & getPosOffset() const
Definition BgCollision.h:192
Actor * getIgnoreActor() const
Definition BgCollision.h:177
BcList mBcListHead
Definition BgCollision.h:446
List::Node mNonSolidListNode
Definition BgCollision.h:421
sead::Vector2f mPosOffset
Definition BgCollision.h:434
sead::Vector2f mTypeOffset
Definition BgCollision.h:438
void setCheckRev(CheckRev check_rev_foot, CheckRev check_rev_head, CheckRevWall check_rev_wall)
Definition BgCollision.h:375
sead::Vector2f mPosOffsetPrev
Definition BgCollision.h:435
Type
Definition BgCollision.h:90
@ cType_AirshipHand
Definition BgCollision.h:127
@ cType_Fence
Definition BgCollision.h:96
@ cType_Coin
Definition BgCollision.h:92
@ cType_BlockUsed
Definition BgCollision.h:103
@ cType_Vine
Definition BgCollision.h:97
@ cType_UnknownLiquid
Definition BgCollision.h:109
@ cType_SpineCoaster
Definition BgCollision.h:130
@ cType_SwingingVine
Definition BgCollision.h:118
@ cType_GrrrolPassage
Definition BgCollision.h:124
@ cType_Wood
Definition BgCollision.h:116
@ cType_SpikesUp
Definition BgCollision.h:125
@ cType_GreenCoin
Definition BgCollision.h:93
@ cType_QuestionBlockBig
Definition BgCollision.h:100
@ cType_BlueCoin
Definition BgCollision.h:94
@ cType_RedBlock
Definition BgCollision.h:106
@ cType_Cloud
Definition BgCollision.h:117
@ cType_Ice
Definition BgCollision.h:121
@ cType_WoodBlock
Definition BgCollision.h:104
@ cType_WaterGeyser
Definition BgCollision.h:128
@ cType_Quicksand
Definition BgCollision.h:113
@ cType_RopeLadder
Definition BgCollision.h:120
@ cType_SwingingChain
Definition BgCollision.h:119
@ cType_Carpet
Definition BgCollision.h:114
@ cType_DonutBlock
Definition BgCollision.h:107
@ cType_Poison
Definition BgCollision.h:112
@ cType_StreamCurrent
Definition BgCollision.h:126
@ cType_BlockUsedBig
Definition BgCollision.h:102
@ cType_BrickBlock
Definition BgCollision.h:99
@ cType_BoostBlock
Definition BgCollision.h:108
@ cType_BreakableIce
Definition BgCollision.h:122
@ cType_Leaves
Definition BgCollision.h:115
@ cType_CoinOutline
Definition BgCollision.h:95
@ cType_Urchin
Definition BgCollision.h:131
@ cType_Water
Definition BgCollision.h:110
@ cType_QuestionBlock
Definition BgCollision.h:98
@ cType_BreakableIce2
Definition BgCollision.h:123
@ cType_Normal
Definition BgCollision.h:91
@ cType_Unknown10
Definition BgCollision.h:129
@ cType_BrickBlockBig
Definition BgCollision.h:101
@ cType_InvisibleBlock
Definition BgCollision.h:132
@ cType_StoneBlock
Definition BgCollision.h:105
@ cType_Lava
Definition BgCollision.h:111
void update()
const sead::Vector2f & getPosOffset2() const
Definition BgCollision.h:197
void(* CallbackWall)(BgCollision *, ActorBgCollisionCheck *, u8 direction)
Definition BgCollision.h:24
T * getOwner() const
Definition BgCollision.h:172
BcList mBcListWallL
Definition BgCollision.h:448
void setType(Type type)
void setFlag(u32 flag)
Definition BgCollision.h:342
void resetFlag(u32 mask)
Definition BgCollision.h:347
sead::Vector2f getTypePos() const
Definition BgCollision.h:254
virtual bool checkPointInsideOrWithinDistance(const sead::Vector2f &p, f32 distance) const =0
void clearFlag()
Definition BgCollision.h:352
BcList mBcListWallR
Definition BgCollision.h:447
const FollowArg & getFollowArg() const
Definition BgCollision.h:182
List::Node mCoinListNode
Definition BgCollision.h:423
const BcList & getBcListWallR() const
Definition BgCollision.h:299
virtual u32 vf2C(u32 *)
sead::Vector2f mTypeOffsetPrev
Definition BgCollision.h:439
void setAttr(BgUnitCode::Attr attr)
List::Node mTouchDrcCheckNoDamageListNode
Definition BgCollision.h:425
sead::Vector2f & getTypeOffset()
Definition BgCollision.h:202
f32 getPosPrevX() const
Definition BgCollision.h:228
u64 mBgCheckData
Definition BgCollision.h:450
LineNodeMgr< ActorBgCollisionCheck > BcList
Definition BgCollision.h:21
sead::Vector2f getPos() const
Definition BgCollision.h:222
void setCallback(Callback callback_foot, Callback callback_head, CallbackWall callback_wall)
Register callbacks for interacting with a sensor of another actor.
Definition BgCollision.h:368
CheckRev mCheckRevFoot
Definition BgCollision.h:454
void releaseBcFoot(ActorBgCollisionCheck *bc_check)
void reset()
Type mType
Definition BgCollision.h:449
sead::Vector2f mRotPivotOffsetPrev
Definition BgCollision.h:437
void setHitType(BgUnitCode::HitType hit_type)
BcList mBcListFoot
Definition BgCollision.h:445
void setAngle(Angle angle)
Definition BgCollision.h:284
f32 getTypePosY() const
Definition BgCollision.h:249
f32 getPosX() const
Definition BgCollision.h:212
const BcList & getBcListFoot() const
Definition BgCollision.h:289
Type getType() const
Definition BgCollision.h:323
List::Node mActiveListNode
Definition BgCollision.h:419
Callback mCallbackFoot
Definition BgCollision.h:451
Actor * mOwner
Definition BgCollision.h:431
virtual bool checkAreaActor(ActorBgCollisionCheckResult *, sead::Vector2f *, sead::Vector2f *, u8 direction, ActorBgCollisionCheck *)=0
bool(* CheckRevWall)(Actor *, Actor *, u8 direction)
Definition BgCollision.h:27
sead::Vector2f getTypePosPrev() const
Definition BgCollision.h:269
const BcList & getBcListHead() const
Definition BgCollision.h:294
static bool CheckRevUpperSpeed(Actor *actor_self, Actor *actor_other)
Definition BgCollision.h:389
sead::Vector2f & getPosOffset()
Definition BgCollision.h:187
static bool CheckRevUnderSpeed(Actor *actor_self, Actor *actor_other)
Definition BgCollision.h:395
f32 getTypePosPrevY() const
Definition BgCollision.h:264
sead::BitFlag32 mCheckRevFlag
Definition BgCollision.h:430
void setSlipAttr(BgUnitCode::SlipAttr slip_attr)
static bool CheckRevSideSpeed(Actor *actor_self, Actor *actor_other, u8 direction)
Definition BgCollision.h:401
virtual ~BgCollision()
sead::Vector2f getPosPrev() const
Definition BgCollision.h:238
Angle mAngle
Definition BgCollision.h:443
CheckRev mCheckRevHead
Definition BgCollision.h:455
f32 getPosPrevY() const
Definition BgCollision.h:233
sead::Matrix22f mRotMtx
Definition BgCollision.h:442
FollowArg mFollowArg
Definition BgCollision.h:433
bool mIsInactive
Definition BgCollision.h:440
f32 getTypePosX() const
Definition BgCollision.h:244
f32 getPosY() const
Definition BgCollision.h:217
const BcList & getBcListWallL() const
Definition BgCollision.h:304
const sead::BoundBox2f getAffectedArea() const
Definition BgCollision.h:161
virtual bool checkPointInside(bool *on_edge, const sead::Vector2f &p) const =0
Callback mCallbackHead
Definition BgCollision.h:452
List::Node mSolidListNode
Definition BgCollision.h:420
virtual bool vf5C(u32 *)=0
BgCollisionCat mCategory
Definition BgCollision.h:441
sead::Vector2f addDokanMoveDiff(sead::Vector2f pos)
void setDrcTouchCallback(ActorCollisionDrcTouchCallback *drc_touch_callback)
Definition BgCollision.h:382
void(* Callback)(BgCollision *, ActorBgCollisionCheck *)
Definition BgCollision.h:23
virtual void vf34()=0
virtual void execute()=0
void entryBcFoot(ActorBgCollisionCheck *bc_check)
bool isInactive() const
Definition BgCollision.h:274
ActorCollisionDrcTouchCallback * mDrcTouchCallback
Definition BgCollision.h:457
bool isEntryBcFoot(ActorBgCollisionCheck *bc_check) const
sead::Vector2f mRotPivotOffset
Definition BgCollision.h:436
f32 getTypePosPrevX() const
Definition BgCollision.h:259
Angle getAngle() const
Definition BgCollision.h:279
CallbackWall mCallbackWall
Definition BgCollision.h:453
Definition BgCollisionCheckResult.h:19
Definition BgCollision.h:39
sead::Vector2f rot_pivot_offset
Definition BgCollision.h:41
sead::Vector2f left_top_offset
Definition BgCollision.h:42
sead::Vector2f pos_offset
Definition BgCollision.h:40
sead::Vector2f right_under_offset
Definition BgCollision.h:43
Angle angle
Definition BgCollision.h:44
Definition BgCollision.h:49
f32 radius
Definition BgCollision.h:53
sead::Vector2f rot_pivot_offset
Definition BgCollision.h:51
Angle angle
Definition BgCollision.h:54
sead::Vector2f pos_offset
Definition BgCollision.h:50
sead::Vector2f center_offset
Definition BgCollision.h:52
Definition BgCollision.h:59
sead::Vector2f center_offset
Definition BgCollision.h:62
sead::Vector2f half_size
Definition BgCollision.h:63
Angle angle
Definition BgCollision.h:64
sead::Vector2f rot_pivot_offset
Definition BgCollision.h:61
sead::Vector2f pos_offset
Definition BgCollision.h:60
Definition BgCollision.h:30
const sead::Vector2f * points
Definition BgCollision.h:33
Angle angle
Definition BgCollision.h:34
sead::Vector2f pos_offset
Definition BgCollision.h:31
sead::Vector2f rot_pivot_offset
Definition BgCollision.h:32
Definition BgCollision.h:69
sead::Vector2f rot_pivot_offset
Definition BgCollision.h:71
sead::Vector2f pos_offset
Definition BgCollision.h:70
Angle angle
Definition BgCollision.h:73
sead::Vector2f points[2]
Definition BgCollision.h:72
Definition BgCollision.h:78
f32 range
Definition BgCollision.h:83
sead::Vector2f start_point
Definition BgCollision.h:81
Angle * line_angles
Definition BgCollision.h:84
f32 line_length
Definition BgCollision.h:82
sead::Vector2f rot_pivot_offset
Definition BgCollision.h:80
Angle angle
Definition BgCollision.h:85
sead::Vector2f pos_offset
Definition BgCollision.h:79