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