1#include "utility/aglResParameter.h"
2#include <basis/seadRawPrint.h>
3#include <math/seadVector.h>
4#include <prim/seadPtrUtil.h>
5#include "utility/aglParameter.h"
6
7namespace agl::utl {
8
9size_t ResParameter::getDataSize() const {
10 switch (ParameterType(ptr()->getType())) {
11 case ParameterType::Bool:
12 case ParameterType::F32:
13 case ParameterType::Int:
14 case ParameterType::U32:
15 return 4;
16 case ParameterType::Vec2:
17 return sizeof(sead::Vector2f);
18 case ParameterType::Vec3:
19 return sizeof(sead::Vector3f);
20 case ParameterType::Vec4:
21 case ParameterType::Color:
22 case ParameterType::Quat:
23 return sizeof(sead::Vector4f);
24 case ParameterType::String32:
25 case ParameterType::String64:
26 case ParameterType::String256:
27 case ParameterType::StringRef:
28 return sead::SafeString(getData<char>()).calcLength() + 1;
29 case ParameterType::Curve1:
30 return 1 * 0x80;
31 case ParameterType::Curve2:
32 return 2 * 0x80;
33 case ParameterType::Curve3:
34 return 3 * 0x80;
35 case ParameterType::Curve4:
36 return 4 * 0x80;
37 case ParameterType::BufferInt:
38 case ParameterType::BufferF32:
39 case ParameterType::BufferU32:
40 return 4 * getBufferSize();
41 case ParameterType::BufferBinary:
42 return getBufferSize();
43 default:
44 SEAD_ASSERT_MSG(false, "illigal type:%d", ptr()->getType());
45 return 0;
46 }
47}
48
49s32 ResParameterObj::searchIndex(u32 param_hash) const {
50 for (s32 i = 0; i < getNum(); ++i) {
51 if (getResParameter(index: i).getParameterNameHash() == param_hash)
52 return i;
53 }
54 return -1;
55}
56
57s32 ResParameterList::searchListIndex(u32 list_hash) const {
58 for (s32 i = 0; i < getResParameterListNum(); ++i) {
59 if (getResParameterList(index: i).getParameterListNameHash() == list_hash)
60 return i;
61 }
62 return -1;
63}
64
65s32 ResParameterList::searchObjIndex(u32 obj_hash) const {
66 for (s32 i = 0; i < getResParameterObjNum(); ++i) {
67 if (getResParameterObj(index: i).getParameterObjNameHash() == obj_hash)
68 return i;
69 }
70 return -1;
71}
72
73// NON_MATCHING: partial implementation (unused conversion code is unimplemented)
74ResParameterArchive::ResParameterArchive(const void* p_data) {
75 mpData = static_cast<ResParameterArchiveData*>(const_cast<void*>(p_data));
76 if (!p_data)
77 return;
78
79 SEAD_ASSERT(sead::PtrUtil::isAlignedN(p_data, 4));
80 if (mpData->flags.isOff(val: ResParameterArchiveFlag::LittleEndian))
81 ModifyEndianU32(is_le: false, p_data: const_cast<ResParameterArchiveData*>(mpData),
82 size: sizeof(ResParameterArchiveData));
83
84 verify();
85
86 if (mpData->flags.isOn(val: ResParameterArchiveFlag::LittleEndian) &&
87 mpData->flags.isOn(val: ResParameterArchiveFlag::Utf8)) {
88 // Nothing else to do.
89 return;
90 }
91
92 // FIXME: implement endianness and string encoding conversion (requires PrivateResource)
93 SEAD_ASSERT_MSG(false, "endianness and string conversion is unimplemented");
94}
95
96} // namespace agl::utl
97