8class ObjectVolcanoPiece final :
public ObjectKCL {
11 ~ObjectVolcanoPiece()
override;
21 [[nodiscard]]
const char *getKclName()
const override {
25 typedef bool (ObjColMgr::*CheckPointPartialFunc)(
const EGG::Vector3f &v0,
26 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
27 KCLTypeMask *pFlagsOut);
30 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut);
32 typedef bool (ObjColMgr::*CheckSpherePartialFunc)(f32 radius,
const EGG::Vector3f &v0,
33 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
34 KCLTypeMask *pFlagsOut);
36 typedef bool (ObjColMgr::*CheckSphereFullFunc)(f32 radius,
const EGG::Vector3f &v0,
37 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
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,
55 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
56 KCLTypeMask *pFlagsOut, u32 timeOffset, CheckSphereFullFunc checkFunc);
60 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut)
override {
61 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointPartial);
65 [[nodiscard]]
bool checkPointPartialPush(
const EGG::Vector3f &v0,
const EGG::Vector3f &v1,
66 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut)
override {
67 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointPartialPush);
71 [[nodiscard]]
bool checkPointFull(
const EGG::Vector3f &v0,
const EGG::Vector3f &v1,
72 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut)
override {
73 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointFull);
77 [[nodiscard]]
bool checkPointFullPush(
const EGG::Vector3f &v0,
const EGG::Vector3f &v1,
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,
84 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
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,
92 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
93 KCLTypeMask *pFlagsOut, u32 timeOffset)
override {
94 return checkSphereImpl(radius, v0, v1, flags, pInfo, pFlagsOut, timeOffset,
95 &ObjColMgr::checkSpherePartialPush);
99 [[nodiscard]]
bool checkSphereFull(f32 radius,
const EGG::Vector3f &v0,
const EGG::Vector3f &v1,
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,
108 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
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;
117 [[nodiscard]]
bool checkPointCachedPartial(
const EGG::Vector3f &v0,
const EGG::Vector3f &v1,
118 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut)
override {
119 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointCachedPartial);
123 [[nodiscard]]
bool checkPointCachedPartialPush(
const EGG::Vector3f &v0,
const EGG::Vector3f &v1,
124 KCLTypeMask flags, CollisionInfoPartial *pInfo, KCLTypeMask *pFlagsOut)
override {
125 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut,
126 &ObjColMgr::checkPointCachedPartialPush);
130 [[nodiscard]]
bool checkPointCachedFull(
const EGG::Vector3f &v0,
const EGG::Vector3f &v1,
131 KCLTypeMask flags, CollisionInfo *pInfo, KCLTypeMask *pFlagsOut)
override {
132 return checkPointImpl(v0, v1, flags, pInfo, pFlagsOut, &ObjColMgr::checkPointCachedFull);
136 [[nodiscard]]
bool checkPointCachedFullPush(
const EGG::Vector3f &v0,
const EGG::Vector3f &v1,
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,
144 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
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,
152 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfoPartial *pInfo,
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,
160 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
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,
168 const EGG::Vector3f &v1, KCLTypeMask flags, CollisionInfo *pInfo,
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;
175 void setMovingObjVel(
const EGG::Vector3f &v)
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,
184 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
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,
192 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info,
193 KCLTypeMask *maskOut, u32 timeOffset)
override {
194 return checkCollisionImpl(radius, pos, prevPos, mask, info, maskOut, timeOffset,
195 &ObjColMgr::checkSphereCachedFullPush);
207 const EGG::Matrix34f &calcShakeAndFall(EGG::Vector3f *vel, u32 timeOffset);
208 State calcState(u32 frame)
const;
209 f32 calcT(u32 frame)
const;
211 char m_modelName[16];
212 const EGG::Vector3f m_initialPos;
213 const u32 m_restDuration;
214 const u32 m_shakeDuration;
215 const u32 m_quakeDuration;
216 EGG::Matrix34f m_rtMat;
217 ObjColMgr *m_colMgrB;
218 ObjColMgr *m_colMgrC;
220 static constexpr u32 FALL_DURATION = 900;