1#pragma once
2
3#include <gfx/seadColor.h>
4#include <math/seadVector.h>
5#include <prim/seadEnum.h>
6#include <prim/seadSafeString.h>
7
8namespace al {
9class ByamlIter;
10class ParameterObj;
11class ParameterList;
12
13SEAD_ENUM(YamlParamType,
14 Invalid,
15 Bool,
16 F32,
17 S32,
18 U32,
19 V2f,
20 V2s32,
21 V3f,
22 V4f,
23 Q4f,
24 C4f,
25 StringRef,
26 String32,
27 String64,
28 String128,
29 String256,
30 String512,
31 String1024,
32 String2048,
33 String4096,
34);
35
36#define PARAM_TYPE_DEF(Name, Type) \
37 class Parameter##Name : public Parameter<Type> { \
38 public: \
39 const char* getParamTypeStr() const override { \
40 return getParamType().text(); \
41 } \
42 \
43 YamlParamType getParamType() const override { \
44 return YamlParamType::Name; \
45 } \
46 };
47
48class ParameterBase {
49public:
50 ParameterBase(const sead::SafeString&, const sead::SafeString&, const sead::SafeString&,
51 ParameterObj*, bool);
52
53 ParameterBase(const sead::SafeString&, const sead::SafeString&, const sead::SafeString&,
54 ParameterList*, bool);
55
56 virtual const char* getParamTypeStr() const = 0;
57 virtual YamlParamType getParamType() const = 0;
58 virtual const void* ptr() const = 0;
59 virtual void* ptr() = 0;
60 virtual void afterGetParam();
61 virtual s32 getParamSize() const = 0;
62 virtual bool isEqual(const ParameterBase&);
63 virtual bool copy(const ParameterBase&);
64 virtual bool copyLerp(const ParameterBase&, const ParameterBase&, f32);
65
66 void initializeListNode(const sead::SafeString&, const sead::SafeString&,
67 const sead::SafeString&, ParameterObj*, bool);
68 void initializeListNode(const sead::SafeString&, const sead::SafeString&,
69 const sead::SafeString&, ParameterList*, bool);
70 void initialize(const sead::SafeString&, const sead::SafeString&, const sead::SafeString&,
71 bool);
72 u32 calcHash(const sead::SafeString&);
73 void tryGetParam(const ByamlIter&);
74
75 ParameterBase* getNext() const { return mNext; }
76
77 void setNext(ParameterBase* param) { mNext = param; }
78
79 const sead::SafeString& getParamName() const { return mName; }
80
81 u32 getHash() const { return mHash; }
82
83 template <typename T>
84 T* getValuePtr() {
85 return (T*)ptr();
86 }
87
88private:
89 ParameterBase* mNext = nullptr;
90 sead::FixedSafeString<0x40> mName;
91 u32 mHash;
92};
93
94template <typename T>
95class Parameter : public ParameterBase {
96public:
97 const void* ptr() const { return mValue; };
98
99 void* ptr() { return mValue; };
100
101 s32 getParamSize() const { return sizeof(T); }
102
103private:
104 T* mValue;
105};
106
107PARAM_TYPE_DEF(Bool, bool)
108PARAM_TYPE_DEF(F32, f32)
109PARAM_TYPE_DEF(S32, s32)
110PARAM_TYPE_DEF(U32, u32)
111PARAM_TYPE_DEF(V2f, sead::Vector2f)
112PARAM_TYPE_DEF(V3f, sead::Vector3f)
113PARAM_TYPE_DEF(V4f, sead::Vector4f)
114PARAM_TYPE_DEF(C4f, sead::Color4f)
115PARAM_TYPE_DEF(StringRef, const char*)
116PARAM_TYPE_DEF(String32, sead::FixedSafeString<32>)
117PARAM_TYPE_DEF(String64, sead::FixedSafeString<64>)
118PARAM_TYPE_DEF(String128, sead::FixedSafeString<128>)
119PARAM_TYPE_DEF(String256, sead::FixedSafeString<256>)
120PARAM_TYPE_DEF(String512, sead::FixedSafeString<512>)
121PARAM_TYPE_DEF(String1024, sead::FixedSafeString<1024>)
122PARAM_TYPE_DEF(String2048, sead::FixedSafeString<2048>)
123PARAM_TYPE_DEF(String4096, sead::FixedSafeString<4096>)
124
125} // namespace al
126