1#pragma once
2
3#include <hostio/seadHostIOReflexible.h>
4#include <prim/seadSafeString.h>
5#include "utility/aglResParameter.h"
6
7namespace sead {
8class XmlElement;
9}
10
11namespace agl::utl {
12
13class IParameterList;
14class ParameterBase;
15
16class IParameterObj {
17public:
18 IParameterObj();
19 virtual ~IParameterObj() { ; }
20
21 void pushBackListNode(ParameterBase* p_node);
22 void sortByHash();
23
24 sead::SafeString getName() const;
25 u32 getNameHash() const { return mNameHash; }
26
27 ParameterBase* getParamListHead() const { return mParamListHead; }
28 ParameterBase* getParamListTail() const { return mParamListTail; }
29 u32 getParamListSize() const { return mParamListSize; }
30 IParameterObj* getNext() const { return mNext; }
31
32 void writeToXML(sead::XmlElement* element, sead::Heap* heap);
33 bool readFromXML(const sead::XmlElement& element, bool x);
34 void createAttribute(sead::XmlElement* element, sead::Heap* heap) const;
35 static const char* getTagName();
36
37 void applyResParameterObj(ResParameterObj obj1, ResParameterObj obj2, f32 t,
38 IParameterList* list);
39
40 void applyResParameterObj(ResParameterObj obj, IParameterList* list = nullptr) {
41 applyResParameterObj_(interpolate: false, obj1: obj, obj2: {}, t: 0.0, list);
42 }
43
44 bool isComplete(ResParameterObj obj, bool) const;
45 bool verify() const;
46 bool verify(ParameterBase* p_check, ParameterBase* other) const;
47
48 void copy(ParameterBase* first, ParameterBase* last, const ParameterBase* src_first,
49 const ParameterBase* src_last);
50 void copy(const IParameterObj& obj);
51 void copyLerp(ParameterBase* first, ParameterBase* last, const ParameterBase* src1_first,
52 const ParameterBase* src1_last, const ParameterBase* src2_first,
53 const ParameterBase* src2_last, f32 t);
54 void copyLerp(const IParameterObj& obj1, const IParameterObj& obj2, f32 t);
55
56#ifdef SEAD_DEBUG
57 void genMessageParameter(sead::hostio::Context* context);
58 void listenPropertyEventParameter(sead::hostio::Reflexible* reflexible,
59 const sead::hostio::PropertyEvent* event);
60#endif
61
62protected:
63 friend class IParameterList;
64
65 virtual bool preWrite_() const { return true; }
66 virtual void postWrite_() const {}
67 virtual bool preRead_() { return true; }
68 virtual void postRead_() {}
69 virtual bool preCopy_() { return true; }
70 virtual void postCopy_() {}
71 virtual bool isApply_(ResParameterObj obj) const {
72 return obj.getParameterObjNameHash() == mNameHash;
73 }
74
75 void applyResParameterObj_(bool interpolate, ResParameterObj obj1, ResParameterObj obj2, f32 t,
76 IParameterList* list);
77 ParameterBase* searchParameter_(u32 hash);
78 ParameterBase* searchParameter_(u32 hash) const;
79
80 void copy_(ParameterBase* first, ParameterBase* last, const ParameterBase* src_first,
81 const ParameterBase* src_last);
82 void copyLerp_(ParameterBase* first, ParameterBase* last, const ParameterBase* src1_first,
83 const ParameterBase* src1_last, const ParameterBase* src2_first,
84 const ParameterBase* src2_last, f32 t);
85
86 ParameterBase* mParamListHead = nullptr;
87 ParameterBase* mParamListTail = nullptr;
88 u32 mParamListSize = 0;
89 u32 mNameHash = 0;
90 IParameterObj* mNext = nullptr;
91 const char* mName = nullptr;
92};
93
94class ParameterObj : public IParameterObj {
95public:
96 using IParameterObj::IParameterObj;
97 ~ParameterObj() override { ; }
98};
99
100} // namespace agl::utl
101