mirror of https://github.com/zeldaret/botw.git
192 lines
4.5 KiB
C++
192 lines
4.5 KiB
C++
#pragma once
|
|
|
|
#include <container/seadBuffer.h>
|
|
#include <prim/seadTypedBitFlag.h>
|
|
#include "KingSystem/Map/mapMubinIter.h"
|
|
|
|
namespace ksys::map {
|
|
|
|
class Placement18;
|
|
|
|
class RailPoint {
|
|
friend class Rail;
|
|
|
|
public:
|
|
RailPoint() {
|
|
mSRT.scale = sead::Vector3f::ones;
|
|
mSRT.rotate = sead::Vector3f::zero;
|
|
mSRT.translate = sead::Vector3f::zero;
|
|
mCtrlPoints[0] = sead::Vector3f::zero;
|
|
mCtrlPoints[1] = sead::Vector3f::zero;
|
|
mPrevDistance = 0.0;
|
|
mNextDistance = 0.0;
|
|
}
|
|
virtual ~RailPoint();
|
|
virtual bool parse(MubinIter* iter, sead::Heap* heap);
|
|
|
|
const MubinIter& getIter() const;
|
|
const sead::Vector3f& getRotate() const;
|
|
const sead::Vector3f& getTranslate() const;
|
|
f32 getPrevDistance() const;
|
|
f32 getNextDistance() const;
|
|
|
|
protected:
|
|
SRT mSRT;
|
|
ControlPoints mCtrlPoints;
|
|
float mPrevDistance;
|
|
float mNextDistance;
|
|
MubinIter mIter;
|
|
};
|
|
|
|
class Rail {
|
|
public:
|
|
Rail();
|
|
virtual ~Rail();
|
|
virtual void init(MubinIter* iter, sead::Heap* heap);
|
|
virtual s32 x_18() { return 0; }
|
|
virtual s32 x_20() { return 0; }
|
|
virtual RailPoint* allocPoint(sead::Heap* heap);
|
|
virtual bool parse(MubinIter* iter);
|
|
virtual void x_38() {}
|
|
|
|
RailPoint* allocPointIdx(s32 idx, sead::Heap* heap);
|
|
s32 getNumPoints() const;
|
|
const RailPoint* getPoint(s32 idx) const;
|
|
RailPoint* getPoint(s32 idx);
|
|
|
|
const SRT& getPointSRT(s32 idx) const;
|
|
const sead::Vector3f& getPointRotate(s32 idx) const;
|
|
const sead::Vector3f& getPointTranslate(s32 idx) const;
|
|
const sead::Vector3f& getControlPoint(s32 rail_idx, s32 pt_idx) const;
|
|
|
|
sead::Vector3f calcTranslate(float progress) const;
|
|
void calcTranslate(sead::Vector3f* pos_out, float progress) const;
|
|
void calcTranslateRotate(sead::Vector3f* pos_out, sead::Vector3f* rot_out,
|
|
float progress) const;
|
|
bool isClosed() const;
|
|
bool isBezier() const;
|
|
const u32& getHashId() const;
|
|
const char* getUniqueName() const;
|
|
|
|
enum class Flag : u32 {
|
|
Closed = 1 << 0,
|
|
Bezier = 1 << 1,
|
|
RenderEnabled = 1 << 2,
|
|
AutoPlacementEnabled = 1 << 3,
|
|
Walkable = 1 << 4,
|
|
EnableHorseTrace = 1 << 5,
|
|
};
|
|
|
|
protected:
|
|
static constexpr u32 sHashBase = 0;
|
|
|
|
sead::TypedBitFlag<Flag> mFlags{};
|
|
u32 mHashId = sHashBase;
|
|
const char* mUniqueName{};
|
|
sead::Buffer<RailPoint*> mRailPoints{};
|
|
MubinIter mIter{};
|
|
};
|
|
|
|
class RailGuidePoint : public RailPoint {
|
|
friend class RailGuide;
|
|
|
|
public:
|
|
RailGuidePoint();
|
|
~RailGuidePoint() override;
|
|
|
|
bool parse(MubinIter* iter, sead::Heap* heap) override;
|
|
|
|
protected:
|
|
float mWaitFrame;
|
|
};
|
|
|
|
class RailRemainGuidePoint : public RailGuidePoint {
|
|
friend class RailRemainGuide;
|
|
|
|
public:
|
|
RailRemainGuidePoint();
|
|
~RailRemainGuidePoint() override;
|
|
|
|
bool parse(MubinIter* iter, sead::Heap* heap) override;
|
|
|
|
protected:
|
|
float mMoveSpeed;
|
|
};
|
|
|
|
class RailGuide : public Rail {
|
|
public:
|
|
RailGuide();
|
|
~RailGuide() override;
|
|
};
|
|
|
|
class RailRemainGuide : public RailGuide {
|
|
public:
|
|
RailRemainGuide();
|
|
~RailRemainGuide() override;
|
|
|
|
RailPoint* allocPoint(sead::Heap* heap) override;
|
|
};
|
|
|
|
class RailConnectablePoint : public RailPoint {
|
|
friend class RailConnectable;
|
|
|
|
public:
|
|
RailConnectablePoint();
|
|
~RailConnectablePoint() override;
|
|
|
|
bool parse(MubinIter* iter, sead::Heap* heap) override;
|
|
|
|
Rail* getJunctionRail() const;
|
|
RailPoint* getJunctionPoint() const;
|
|
void parseJunctions(Placement18 p18, s32 idx, u32 hash, sead::Heap* heap);
|
|
|
|
protected:
|
|
Rail* mJunctionRail;
|
|
RailPoint* mJunctionPoint;
|
|
};
|
|
|
|
class RailConnectable : public Rail {
|
|
public:
|
|
RailConnectable();
|
|
~RailConnectable() override;
|
|
|
|
s32 x_18() override { return 1; }
|
|
s32 x_20() override { return 1; }
|
|
void x_38() override {}
|
|
};
|
|
|
|
class RailRoutePoint : public RailConnectablePoint {
|
|
friend class RailRoute;
|
|
|
|
public:
|
|
RailRoutePoint();
|
|
~RailRoutePoint() override;
|
|
|
|
bool parse(MubinIter* iter, sead::Heap* heap) override;
|
|
const char* getCheckPointName() const;
|
|
|
|
protected:
|
|
const char* mEntryPointName;
|
|
const char* mCheckPointName;
|
|
};
|
|
|
|
class RailRoute : public RailConnectable {
|
|
public:
|
|
RailRoute();
|
|
~RailRoute() override;
|
|
|
|
bool parse(MubinIter* iter) override;
|
|
|
|
bool isRenderEnabled() const;
|
|
bool isAutoPlacementEnabled() const;
|
|
bool isWalkable() const;
|
|
bool isHorseTraceEnabled() const;
|
|
const char* getRouteId() const;
|
|
const char* getCheckPointName(s32 idx) const;
|
|
|
|
protected:
|
|
const char* mRouteId;
|
|
};
|
|
|
|
} // namespace ksys::map
|