16 [[nodiscard]] u32 loadFlags()
const override {
21 [[nodiscard]]
const char *getKclName()
const override {
27 KCLTypeMask *pFlagsOut);
30 KCLTypeMask flags,
CollisionInfo *pInfo, KCLTypeMask *pFlagsOut);
34 KCLTypeMask *pFlagsOut);
38 KCLTypeMask *pFlagsOut);
40 void createCollision()
override;
42 template <
typename T,
typename U>
43 requires(std::is_same_v<T, CollisionInfo> || std::is_same_v<T, CollisionInfoPartial>) &&
44 (std::is_same_v<U, CheckPointPartialFunc> || std::is_same_v<U, CheckPointFullFunc>)
46 KCLTypeMask flags, T *pInfo, KCLTypeMask *pFlagsOut, U checkFunc);
48 template <
typename T,
typename U>
49 requires(std::is_same_v<T, CollisionInfo> || std::is_same_v<T, CollisionInfoPartial>) &&
50 (std::is_same_v<U, CheckSpherePartialFunc> || std::is_same_v<U, CheckSphereFullFunc>)
52 KCLTypeMask flags, T *pInfo, KCLTypeMask *pFlagsOut, u32 timeOffset, U checkFunc);
54 [[nodiscard]]
bool checkCollisionImpl(f32 radius,
const EGG::Vector3f &v0,
56 KCLTypeMask *pFlagsOut, u32 timeOffset, CheckSphereFullFunc checkFunc);
61 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointPartial);
67 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointPartialPush);
72 KCLTypeMask flags,
CollisionInfo *pInfo, KCLTypeMask *pFlagsOut)
override {
73 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointFull);
78 KCLTypeMask flags,
CollisionInfo *pInfo, KCLTypeMask *pFlagsOut)
override {
79 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointFullPush);
83 [[nodiscard]]
bool checkSpherePartial(f32 radius,
const EGG::Vector3f &v0,
85 KCLTypeMask *pFlagsOut, u32 timeOffset)
override {
86 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
87 &ObjColMgr::checkSpherePartial);
91 [[nodiscard]]
bool checkSpherePartialPush(f32 radius,
const EGG::Vector3f &v0,
93 KCLTypeMask *pFlagsOut, u32 timeOffset)
override {
94 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
95 &ObjColMgr::checkSpherePartialPush);
100 KCLTypeMask flags,
CollisionInfo *pInfo, KCLTypeMask *pFlagsOut,
101 u32 timeOffset)
override {
102 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
103 &ObjColMgr::checkSphereFull);
107 [[nodiscard]]
bool checkSphereFullPush(f32 radius,
const EGG::Vector3f &v0,
109 KCLTypeMask *pFlagsOut, u32 timeOffset)
override {
110 return checkCollision(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset);
113 void narrScLocal(f32 radius,
const EGG::Vector3f &pos, KCLTypeMask mask,
114 u32 timeOffset)
override;
119 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointCachedPartial);
125 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut,
126 &ObjColMgr::checkPointCachedPartialPush);
131 KCLTypeMask flags,
CollisionInfo *pInfo, KCLTypeMask *pFlagsOut)
override {
132 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointCachedFull);
137 KCLTypeMask flags,
CollisionInfo *pInfo, KCLTypeMask *pFlagsOut)
override {
138 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut,
139 &ObjColMgr::checkPointCachedFullPush);
143 [[nodiscard]]
bool checkSphereCachedPartial(f32 radius,
const EGG::Vector3f &v0,
145 KCLTypeMask *pFlagsOut, u32 timeOffset)
override {
146 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
147 &ObjColMgr::checkSphereCachedPartial);
151 [[nodiscard]]
bool checkSphereCachedPartialPush(f32 radius,
const EGG::Vector3f &v0,
153 KCLTypeMask *pFlagsOut, u32 timeOffset)
override {
154 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
155 &ObjColMgr::checkSphereCachedPartialPush);
159 [[nodiscard]]
bool checkSphereCachedFull(f32 radius,
const EGG::Vector3f &v0,
161 KCLTypeMask *pFlagsOut, u32 timeOffset)
override {
162 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
163 &ObjColMgr::checkSphereCachedFull);
167 [[nodiscard]]
bool checkSphereCachedFullPush(f32 radius,
const EGG::Vector3f &v0,
169 KCLTypeMask *pFlagsOut, u32 timeOffset)
override {
170 return checkCollisionCached(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset);
173 void update(u32 timeOffset)
override;
174 void calcScale(u32 timeOffset)
override;
178 [[nodiscard]]
const EGG::Matrix34f &getUpdatedMatrix(u32 timeOffset)
override {
179 return calcShakeAndFall(
nullptr, timeOffset);
183 [[nodiscard]]
bool checkCollision(f32 radius,
const EGG::Vector3f &pos,
185 KCLTypeMask *maskOut, u32 timeOffset)
override {
186 return checkCollisionImpl(radius, pos, prevPos, mask, info, maskOut, timeOffset,
187 &ObjColMgr::checkSphereFullPush);
191 [[nodiscard]]
bool checkCollisionCached(f32 radius,
const EGG::Vector3f &pos,
193 KCLTypeMask *maskOut, u32 timeOffset)
override {
194 return checkCollisionImpl(radius, pos, prevPos, mask, info, maskOut, timeOffset,
195 &ObjColMgr::checkSphereCachedFullPush);
208 State calcState(u32 frame)
const;
209 f32 calcT(u32 frame)
const;
211 char m_modelName[16];
214 const u32 m_restDuration;
215 const u32 m_shakeDuration;
216 const u32 m_quakeDuration;
221 static constexpr u32 FALL_DURATION = 900;