Skip to content

Commit a4df46a

Browse files
committed
dlists
1 parent b7387bb commit a4df46a

File tree

2 files changed

+88
-103
lines changed

2 files changed

+88
-103
lines changed

src/resource/factory/DisplayListFactory.cpp

+78-89
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,27 @@
11
#include "resource/factory/DisplayListFactory.h"
22
#include "resource/type/DisplayList.h"
3+
#include "resource/readerbox/BinaryReaderBox.h"
4+
#include "resource/readerbox/XMLReaderBox.h"
35
#include "spdlog/spdlog.h"
46

57
#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
68

79
namespace LUS {
8-
std::shared_ptr<IResource> DisplayListFactory::ReadResource(std::shared_ptr<ResourceInitData> initData,
9-
std::shared_ptr<BinaryReader> reader) {
10-
auto resource = std::make_shared<DisplayList>(initData);
11-
std::shared_ptr<ResourceVersionFactory> factory = nullptr;
12-
13-
switch (resource->GetInitData()->ResourceVersion) {
14-
case 0:
15-
factory = std::make_shared<DisplayListFactoryV0>();
16-
break;
17-
}
18-
19-
if (factory == nullptr) {
20-
SPDLOG_ERROR("Failed to load DisplayList with version {}", resource->GetInitData()->ResourceVersion);
10+
std::shared_ptr<IResource> ResourceFactoryBinaryDisplayListV0::ReadResource(std::shared_ptr<ResourceInitData> initData,
11+
std::shared_ptr<ReaderBox> readerBox) {
12+
auto binaryReaderBox = std::dynamic_pointer_cast<BinaryReaderBox>(readerBox);
13+
if (binaryReaderBox == nullptr) {
14+
SPDLOG_ERROR("ReaderBox must be a BinaryReaderBox.");
2115
return nullptr;
2216
}
2317

24-
factory->ParseFileBinary(reader, resource);
25-
26-
return resource;
27-
}
28-
29-
std::shared_ptr<IResource> DisplayListFactory::ReadResourceXML(std::shared_ptr<ResourceInitData> initData,
30-
tinyxml2::XMLElement* reader) {
31-
auto resource = std::make_shared<DisplayList>(initData);
32-
std::shared_ptr<ResourceVersionFactory> factory = nullptr;
33-
34-
switch (resource->GetInitData()->ResourceVersion) {
35-
case 0:
36-
factory = std::make_shared<DisplayListFactoryV0>();
37-
break;
38-
}
39-
40-
if (factory == nullptr) {
41-
SPDLOG_ERROR("Failed to load DisplayList with version {}", resource->GetInitData()->ResourceVersion);
18+
auto reader = binaryReaderBox->GetReader();
19+
if (reader == nullptr) {
20+
SPDLOG_ERROR("null reader in box.");
4221
return nullptr;
4322
}
4423

45-
factory->ParseFileXML(reader, resource);
46-
47-
return resource;
48-
}
49-
50-
void DisplayListFactoryV0::ParseFileBinary(std::shared_ptr<BinaryReader> reader, std::shared_ptr<IResource> resource) {
51-
std::shared_ptr<DisplayList> displayList = std::static_pointer_cast<DisplayList>(resource);
52-
ResourceVersionFactory::ParseFileBinary(reader, displayList);
24+
auto displayList = std::make_shared<DisplayList>(initData);
5325

5426
while (reader->GetBaseAddress() % 8 != 0) {
5527
reader->ReadInt8();
@@ -77,60 +49,25 @@ void DisplayListFactoryV0::ParseFileBinary(std::shared_ptr<BinaryReader> reader,
7749
break;
7850
}
7951
}
80-
}
81-
82-
std::unordered_map<std::string, uint32_t> renderModes = { { "G_RM_ZB_OPA_SURF", G_RM_ZB_OPA_SURF },
83-
{ "G_RM_AA_ZB_OPA_SURF", G_RM_AA_ZB_OPA_SURF },
84-
{ "G_RM_AA_ZB_OPA_DECAL", G_RM_AA_ZB_OPA_DECAL },
85-
{ "G_RM_AA_ZB_OPA_INTER", G_RM_AA_ZB_OPA_INTER },
86-
{ "G_RM_AA_ZB_TEX_EDGE", G_RM_AA_ZB_TEX_EDGE },
87-
{ "G_RM_AA_ZB_XLU_SURF", G_RM_AA_ZB_XLU_SURF },
88-
{ "G_RM_AA_ZB_XLU_DECAL", G_RM_AA_ZB_XLU_DECAL },
89-
{ "G_RM_AA_ZB_XLU_INTER", G_RM_AA_ZB_XLU_INTER },
90-
{ "G_RM_FOG_SHADE_A", G_RM_FOG_SHADE_A },
91-
{ "G_RM_FOG_PRIM_A", G_RM_FOG_PRIM_A },
92-
{ "G_RM_PASS", G_RM_PASS },
93-
{ "G_RM_ADD", G_RM_ADD },
94-
{ "G_RM_NOOP", G_RM_NOOP },
95-
{ "G_RM_ZB_OPA_SURF", G_RM_ZB_OPA_SURF },
96-
{ "G_RM_ZB_OPA_DECAL", G_RM_ZB_OPA_DECAL },
97-
{ "G_RM_ZB_XLU_SURF", G_RM_ZB_XLU_SURF },
98-
{ "G_RM_ZB_XLU_DECAL", G_RM_ZB_XLU_DECAL },
99-
{ "G_RM_OPA_SURF", G_RM_OPA_SURF },
100-
{ "G_RM_ZB_CLD_SURF", G_RM_ZB_CLD_SURF },
101-
{ "G_RM_ZB_OPA_SURF2", G_RM_ZB_OPA_SURF2 },
102-
{ "G_RM_AA_ZB_OPA_SURF2", G_RM_AA_ZB_OPA_SURF2 },
103-
{ "G_RM_AA_ZB_OPA_DECAL2", G_RM_AA_ZB_OPA_DECAL2 },
104-
{ "G_RM_AA_ZB_OPA_INTER2", G_RM_AA_ZB_OPA_INTER2 },
105-
{ "G_RM_AA_ZB_TEX_EDGE2", G_RM_AA_ZB_TEX_EDGE2 },
106-
{ "G_RM_AA_ZB_XLU_SURF2", G_RM_AA_ZB_XLU_SURF2 },
107-
{ "G_RM_AA_ZB_XLU_DECAL2", G_RM_AA_ZB_XLU_DECAL2 },
108-
{ "G_RM_AA_ZB_XLU_INTER2", G_RM_AA_ZB_XLU_INTER2 },
109-
{ "G_RM_ADD2", G_RM_ADD2 },
110-
{ "G_RM_ZB_OPA_SURF2", G_RM_ZB_OPA_SURF2 },
111-
{ "G_RM_ZB_OPA_DECAL2", G_RM_ZB_OPA_DECAL2 },
112-
{ "G_RM_ZB_XLU_SURF2", G_RM_ZB_XLU_SURF2 },
113-
{ "G_RM_ZB_XLU_DECAL2", G_RM_ZB_XLU_DECAL2 },
114-
{ "G_RM_ZB_CLD_SURF2", G_RM_ZB_CLD_SURF2 } };
115-
116-
static Gfx GsSpVertexOtR2P1(char* filePathPtr) {
117-
Gfx g;
118-
g.words.w0 = G_VTX_OTR_FILEPATH << 24;
119-
g.words.w1 = (uintptr_t)filePathPtr;
12052

121-
return g;
53+
return displayList;
12254
}
12355

124-
static Gfx GsSpVertexOtR2P2(int vtxCnt, int vtxBufOffset, int vtxDataOffset) {
125-
Gfx g;
126-
g.words.w0 = (uintptr_t)vtxCnt;
127-
g.words.w1 = (uintptr_t)((vtxBufOffset << 16) | vtxDataOffset);
56+
std::shared_ptr<IResource> ResourceFactoryXMLDisplayListV0::ReadResource(std::shared_ptr<ResourceInitData> initData,
57+
std::shared_ptr<ReaderBox> readerBox) {
58+
auto xmlReaderBox = std::dynamic_pointer_cast<XMLReaderBox>(readerBox);
59+
if (xmlReaderBox == nullptr) {
60+
SPDLOG_ERROR("ReaderBox must be an XMLReaderBox.");
61+
return nullptr;
62+
}
12863

129-
return g;
130-
}
64+
auto reader = xmlReaderBox->GetReader();
65+
if (reader == nullptr) {
66+
SPDLOG_ERROR("null reader in box.");
67+
return nullptr;
68+
}
13169

132-
void DisplayListFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr<IResource> resource) {
133-
std::shared_ptr<DisplayList> dl = std::static_pointer_cast<DisplayList>(resource);
70+
auto dl = std::make_shared<DisplayList>(initData);
13471

13572
auto child = reader->FirstChildElement();
13673

@@ -1031,9 +968,61 @@ void DisplayListFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::share
1031968

1032969
child = child->NextSiblingElement();
1033970
}
971+
972+
return displayList;
973+
}
974+
975+
std::unordered_map<std::string, uint32_t> renderModes = { { "G_RM_ZB_OPA_SURF", G_RM_ZB_OPA_SURF },
976+
{ "G_RM_AA_ZB_OPA_SURF", G_RM_AA_ZB_OPA_SURF },
977+
{ "G_RM_AA_ZB_OPA_DECAL", G_RM_AA_ZB_OPA_DECAL },
978+
{ "G_RM_AA_ZB_OPA_INTER", G_RM_AA_ZB_OPA_INTER },
979+
{ "G_RM_AA_ZB_TEX_EDGE", G_RM_AA_ZB_TEX_EDGE },
980+
{ "G_RM_AA_ZB_XLU_SURF", G_RM_AA_ZB_XLU_SURF },
981+
{ "G_RM_AA_ZB_XLU_DECAL", G_RM_AA_ZB_XLU_DECAL },
982+
{ "G_RM_AA_ZB_XLU_INTER", G_RM_AA_ZB_XLU_INTER },
983+
{ "G_RM_FOG_SHADE_A", G_RM_FOG_SHADE_A },
984+
{ "G_RM_FOG_PRIM_A", G_RM_FOG_PRIM_A },
985+
{ "G_RM_PASS", G_RM_PASS },
986+
{ "G_RM_ADD", G_RM_ADD },
987+
{ "G_RM_NOOP", G_RM_NOOP },
988+
{ "G_RM_ZB_OPA_SURF", G_RM_ZB_OPA_SURF },
989+
{ "G_RM_ZB_OPA_DECAL", G_RM_ZB_OPA_DECAL },
990+
{ "G_RM_ZB_XLU_SURF", G_RM_ZB_XLU_SURF },
991+
{ "G_RM_ZB_XLU_DECAL", G_RM_ZB_XLU_DECAL },
992+
{ "G_RM_OPA_SURF", G_RM_OPA_SURF },
993+
{ "G_RM_ZB_CLD_SURF", G_RM_ZB_CLD_SURF },
994+
{ "G_RM_ZB_OPA_SURF2", G_RM_ZB_OPA_SURF2 },
995+
{ "G_RM_AA_ZB_OPA_SURF2", G_RM_AA_ZB_OPA_SURF2 },
996+
{ "G_RM_AA_ZB_OPA_DECAL2", G_RM_AA_ZB_OPA_DECAL2 },
997+
{ "G_RM_AA_ZB_OPA_INTER2", G_RM_AA_ZB_OPA_INTER2 },
998+
{ "G_RM_AA_ZB_TEX_EDGE2", G_RM_AA_ZB_TEX_EDGE2 },
999+
{ "G_RM_AA_ZB_XLU_SURF2", G_RM_AA_ZB_XLU_SURF2 },
1000+
{ "G_RM_AA_ZB_XLU_DECAL2", G_RM_AA_ZB_XLU_DECAL2 },
1001+
{ "G_RM_AA_ZB_XLU_INTER2", G_RM_AA_ZB_XLU_INTER2 },
1002+
{ "G_RM_ADD2", G_RM_ADD2 },
1003+
{ "G_RM_ZB_OPA_SURF2", G_RM_ZB_OPA_SURF2 },
1004+
{ "G_RM_ZB_OPA_DECAL2", G_RM_ZB_OPA_DECAL2 },
1005+
{ "G_RM_ZB_XLU_SURF2", G_RM_ZB_XLU_SURF2 },
1006+
{ "G_RM_ZB_XLU_DECAL2", G_RM_ZB_XLU_DECAL2 },
1007+
{ "G_RM_ZB_CLD_SURF2", G_RM_ZB_CLD_SURF2 } };
1008+
1009+
static Gfx GsSpVertexOtR2P1(char* filePathPtr) {
1010+
Gfx g;
1011+
g.words.w0 = G_VTX_OTR_FILEPATH << 24;
1012+
g.words.w1 = (uintptr_t)filePathPtr;
1013+
1014+
return g;
1015+
}
1016+
1017+
static Gfx GsSpVertexOtR2P2(int vtxCnt, int vtxBufOffset, int vtxDataOffset) {
1018+
Gfx g;
1019+
g.words.w0 = (uintptr_t)vtxCnt;
1020+
g.words.w1 = (uintptr_t)((vtxBufOffset << 16) | vtxDataOffset);
1021+
1022+
return g;
10341023
}
10351024

1036-
uint32_t DisplayListFactoryV0::GetCombineLERPValue(std::string valStr) {
1025+
uint32_t ResourceFactoryDisplayList::GetCombineLERPValue(std::string valStr) {
10371026
std::string strings[] = { "G_CCMUX_COMBINED",
10381027
"G_CCMUX_TEXEL0",
10391028
"G_CCMUX_TEXEL1",

src/resource/factory/DisplayListFactory.h

+10-14
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,20 @@
44
#include "resource/ResourceFactory.h"
55

66
namespace LUS {
7-
class DisplayListFactory : public ResourceFactory {
7+
class ResourceFactoryDisplayList : public ResourceFactory {
8+
protected:
9+
uint32_t GetCombineLERPValue(std::string valStr);
10+
};
11+
12+
class ResourceFactoryBinaryDisplayListV0 : public ResourceFactoryDisplayList {
813
public:
914
std::shared_ptr<IResource> ReadResource(std::shared_ptr<ResourceInitData> initData,
10-
std::shared_ptr<BinaryReader> reader) override;
11-
std::shared_ptr<IResource> ReadResourceXML(std::shared_ptr<ResourceInitData> initData,
12-
tinyxml2::XMLElement* reader) override;
15+
std::shared_ptr<ReaderBox> readerBox) override;
1316
};
1417

15-
class DisplayListFactoryV0 : public ResourceVersionFactory {
18+
class ResourceFactoryXMLDisplayListV0 : public ResourceFactoryDisplayList {
1619
public:
17-
void ParseFileBinary(std::shared_ptr<BinaryReader> reader, std::shared_ptr<IResource> resource) override;
18-
void ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr<IResource> resource) override;
19-
20-
uint32_t GetCombineLERPValue(std::string valStr);
20+
std::shared_ptr<IResource> ReadResource(std::shared_ptr<ResourceInitData> initData,
21+
std::shared_ptr<ReaderBox> readerBox) override;
2122
};
22-
23-
// XMLDisplayListV0
24-
// XMLDisplayListV0Factory
25-
// ResourceFactoryXMLDisplayListV0
26-
2723
} // namespace LUS

0 commit comments

Comments
 (0)