metaforce/Runtime/World/CWallWalker.hpp

63 lines
2.6 KiB
C++
Raw Permalink Normal View History

2018-10-06 20:42:33 -07:00
#pragma once
2017-11-20 09:33:21 -08:00
#include <string_view>
#include "Runtime/RetroTypes.hpp"
#include "Runtime/Collision/CCollidableSphere.hpp"
#include "Runtime/Collision/CCollisionSurface.hpp"
#include "Runtime/World/CPatterned.hpp"
#include <zeus/CVector3f.hpp>
2017-11-20 09:33:21 -08:00
2021-04-10 01:42:06 -07:00
namespace metaforce {
2018-12-07 21:30:43 -08:00
class CWallWalker : public CPatterned {
2018-11-11 20:21:36 -08:00
public:
2021-05-26 07:00:57 -07:00
DEFINE_ENTITY
2018-12-07 21:30:43 -08:00
enum class EWalkerType { Parasite = 0, Oculus = 1, Geemer = 2, IceZoomer = 3, Seedling = 4 };
2018-09-16 16:22:35 -07:00
protected:
CCollisionSurface x568_alignNormal{zeus::CVector3f(), zeus::skForward, zeus::skRight, UINT32_MAX};
2018-12-07 21:30:43 -08:00
CCollidableSphere x590_colSphere;
float x5b0_collisionCloseMargin;
float x5b4_alignAngVel;
float x5b8_tumbleAngle = 0.f;
float x5bc_patrolPauseRemTime = 0.f;
float x5c0_advanceWpRadius;
float x5c4_playerObstructionMinDist;
float x5c8_bendingHackWeight = 0.f;
s32 x5cc_bendingHackAnim;
EWalkerType x5d0_walkerType;
s16 x5d4_thinkCounter = 0;
bool x5d6_24_alignToFloor : 1 = false;
bool x5d6_25_hasAlignSurface : 1 = false;
bool x5d6_26_playerObstructed : 1 = false;
2018-12-07 21:30:43 -08:00
bool x5d6_27_disableMove : 1;
bool x5d6_28_addBendingWeight : 1 = true;
bool x5d6_29_applyBendingHack : 1 = false;
2018-12-07 21:30:43 -08:00
static zeus::CVector3f ProjectVectorToPlane(const zeus::CVector3f& pt, const zeus::CVector3f& plane) {
return pt - plane * pt.dot(plane);
}
static zeus::CVector3f ProjectPointToPlane(const zeus::CVector3f& p0, const zeus::CVector3f& p1,
const zeus::CVector3f& plane) {
return p0 - (p0 - p1).dot(plane) * plane;
}
void OrientToSurfaceNormal(const zeus::CVector3f& normal, float clampAngle);
static bool PointOnSurface(const CCollisionSurface& surf, const zeus::CVector3f& point);
void AlignToFloor(CStateManager&, float, const zeus::CVector3f&, float);
void GotoNextWaypoint(CStateManager& mgr);
2017-11-20 09:33:21 -08:00
public:
2018-12-07 21:30:43 -08:00
CWallWalker(ECharacter chr, TUniqueId uid, std::string_view name, EFlavorType flavType, const CEntityInfo& eInfo,
const zeus::CTransform& xf, CModelData&& mData, const CPatternedInfo& pInfo, EMovementType mType,
EColliderType colType, EBodyType bType, const CActorParameters& aParms, float collisionCloseMargin,
float alignAngVel, EKnockBackVariant kbVariant, float advanceWpRadius, EWalkerType wType,
float playerObstructionMinDist, bool disableMove);
2018-09-16 16:22:35 -07:00
void PreThink(float, CStateManager&) override;
void Think(float, CStateManager&) override;
void Render(CStateManager&) override;
const CCollisionPrimitive* GetCollisionPrimitive() const override { return &x590_colSphere; }
2018-12-07 21:30:43 -08:00
void UpdateWPDestination(CStateManager&);
2017-11-20 09:33:21 -08:00
};
2021-04-10 01:42:06 -07:00
} // namespace metaforce