#ifndef MAP_MAP_COLLISION_ENTRY_HPP #define MAP_MAP_COLLISION_ENTRY_HPP #include #include #include #include #include class TLiveActor; class TBGCheckData; class TMapCollisionBase { public: TMapCollisionBase(); virtual void init(const char* col_file_path, u16, const TLiveActor*); virtual void moveSRT(const JGeometry::TVec3& trans, const JGeometry::TVec3& rot, const JGeometry::TVec3& scale) { } virtual void moveTrans(const JGeometry::TVec3& trans) { } virtual void moveMtx(MtxPtr mtx) { } virtual void setUp() { offFlag(FLAG_NEEDS_SETUP); } virtual void setUpTrans(const JGeometry::TVec3& param_1) { MsMtxSetTRS(mTransformMtx, param_1, (Vec) { 0.0f, 0.0f, 0.0f }, (Vec) { 1.0f, 1.0f, 1.0f }); setUp(); } virtual void remove() { onFlag(FLAG_NEEDS_SETUP); } void setMtx(MtxPtr mtx) { MTXCopy(mtx, mTransformMtx); } void setAllActor(const TLiveActor*); void setAllData(s16); void setAllBGType(u16); void setVertexData(u32, const JGeometry::TVec3&, const JGeometry::TVec3&, const JGeometry::TVec3&); void initCheckData(s16, u16, const TLiveActor*); void initAllCheckData(s16, const f32*, u16, const TLiveActor*); void update(); void updateCheckData(const f32*); void updateVertexPos(f32*); void updateTrans(const JGeometry::TVec3& trans); void setCheckData(const f32*, const s16*, TBGCheckData*, int); bool isSetUp() const { if (checkFlag(FLAG_NEEDS_SETUP)) return false; return true; } // fabricated bool checkFlag(u16 flag) const { if (mFlags & flag) return true; return false; } void onFlag(u16 flag) { mFlags |= flag; } void offFlag(u16 flag) { mFlags &= ~flag; } s32 getKind() const { return mKind; } u32 getCheckDataNum() const { return mCheckDataNum; } void setUpMtx(MtxPtr mtx) { setMtx(mtx); setUp(); } enum { KIND_STATIC = 0, KIND_MOVE = 1, KIND_WARP = 2, }; enum { FLAG_NEEDS_SETUP = 0x1, FLAG_UNK4000 = 0x4000, FLAG_UNK8000 = 0x8000, }; protected: /* 0x4 */ TBGCheckData* mCheckDatas; /* 0x8 */ s32 mKind; /* 0xC */ u32 mCheckDataNum; /* 0x10 */ u32 mVertexNum; /* 0x14 */ Vec* mVertices; enum { HAS_ADDITIONAL_DATA = 0x1, WAS_PATCHED = 0x8000, }; struct TMapCollisionGroup { /* 0x0 */ u16 mBGType; /* 0x2 */ s16 mTriangleNum; /* 0x4 */ u16 mFlags; /* 0x8 */ s16* mIndices; /* 0xC */ u8* mSoundMaterials; /* 0x10 */ u8* unk10; /* 0x14 */ s16* mAdditionalDatas; }; /* 0x18 */ u32 mCollisionGroupNum; /* 0x1C */ TMapCollisionGroup* mCollisionGroups; /* 0x20 */ Mtx mTransformMtx; /* 0x50 */ JGeometry::TVec3 mPrevTranslation; /* 0x5C */ u16 mFlags; }; class TMapCollisionStatic : public TMapCollisionBase { public: TMapCollisionStatic(); virtual void init(const char* col_file_path, u16, const TLiveActor*); virtual void setUp(); virtual void remove() { } private: /* 0x60 */ const TLiveActor* mOwnerActor; }; class TMapCollisionWarp : public TMapCollisionBase { public: TMapCollisionWarp(); virtual void init(const char* col_file_path, u16, const TLiveActor*); virtual void setUp(); virtual void setUpTrans(const JGeometry::TVec3&); virtual void remove(); private: /* 0x60 */ u16 mEntryId; /* 0x64 */ u32 mEntrySize; }; class TMapCollisionMove : public TMapCollisionBase { public: TMapCollisionMove(); virtual void init(const char* col_file_path, u16, const TLiveActor*); virtual void moveSRT(const JGeometry::TVec3& trans, const JGeometry::TVec3& rot, const JGeometry::TVec3& scale) { MsMtxSetTRS(mTransformMtx, trans, rot, scale); move(); } virtual void moveTrans(const JGeometry::TVec3& trans); virtual void moveMtx(MtxPtr mtx) { MTXCopy(mtx, mTransformMtx); move(); } void init(u32 check_data_num, u16 bg_type, s16 data, const TLiveActor* actor); void move(); void setList(); }; #endif