Files

175 lines
7.5 KiB
C++
Raw Permalink Normal View History

2024-01-05 10:15:41 -06:00
#include "2s2h/resource/importer/scenecommand/SetMeshFactory.h"
#include "2s2h/resource/type/scenecommand/SetMesh.h"
#include "spdlog/spdlog.h"
#include "libultraship/libultraship.h"
2024-03-26 21:26:31 -04:00
namespace SOH {
2024-05-22 09:52:56 -04:00
std::shared_ptr<Ship::IResource> SetMeshFactory::ReadResource(std::shared_ptr<Ship::ResourceInitData> initData,
std::shared_ptr<Ship::BinaryReader> reader) {
2024-03-26 21:26:31 -04:00
auto setMesh = std::make_shared<SetMesh>(initData);
2024-01-05 10:15:41 -06:00
ReadCommandId(setMesh, reader);
2024-05-22 09:52:56 -04:00
2024-01-05 10:15:41 -06:00
setMesh->data = reader->ReadInt8();
setMesh->meshHeader.base.type = reader->ReadInt8();
int32_t polyNum = 1;
if (setMesh->meshHeader.base.type != 1) {
polyNum = reader->ReadInt8();
if (setMesh->meshHeader.base.type == 0) {
setMesh->meshHeader.polygon0.num = polyNum;
} else if (setMesh->meshHeader.base.type == 2) {
setMesh->meshHeader.polygon2.num = polyNum;
} else {
2024-03-26 21:26:31 -04:00
SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}",
setMesh->meshHeader.base.type);
2024-01-05 10:15:41 -06:00
}
}
if (setMesh->meshHeader.base.type == 2) {
setMesh->dlists2.reserve(polyNum);
} else {
setMesh->dlists.reserve(setMesh->meshHeader.polygon0.num);
}
for (int32_t i = 0; i < polyNum; i++) {
if (setMesh->meshHeader.base.type == 0) {
PolygonDlist dlist;
int32_t polyType = reader->ReadInt8(); // Unused
std::string meshOpa = reader->ReadString();
std::string meshXlu = reader->ReadString();
2024-05-14 11:05:50 -05:00
dlist.opa = 0;
dlist.xlu = 0;
if (meshOpa != "") {
auto opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshOpa.c_str());
dlist.opa = (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr);
}
if (meshXlu != "") {
auto xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshXlu.c_str());
dlist.xlu = (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr);
}
2024-01-05 10:15:41 -06:00
setMesh->dlists.push_back(dlist);
} else if (setMesh->meshHeader.base.type == 1) {
PolygonDlist pType;
setMesh->meshHeader.polygon1.format = reader->ReadUByte();
std::string imgOpa = reader->ReadString();
std::string imgXlu = reader->ReadString();
2024-05-14 11:05:50 -05:00
pType.opa = 0;
pType.xlu = 0;
if (imgOpa != "") {
auto opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(imgOpa.c_str());
pType.opa = (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr);
}
if (imgXlu != "") {
auto xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(imgXlu.c_str());
pType.xlu = (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr);
}
2024-01-05 10:15:41 -06:00
int32_t bgImageCount = reader->ReadUInt32();
setMesh->images.reserve(bgImageCount);
for (int32_t i = 0; i < bgImageCount; i++) {
BgImage image;
image.unk_00 = reader->ReadUInt16();
image.id = reader->ReadUByte();
std::string imagePath = "__OTR__" + reader->ReadString();
setMesh->imagePaths.push_back(imagePath);
image.source = (void*)setMesh->imagePaths.back().c_str();
image.unk_0C = reader->ReadUInt32();
image.tlut = reader->ReadUInt32();
image.width = reader->ReadUInt16();
image.height = reader->ReadUInt16();
image.fmt = reader->ReadUByte();
image.siz = reader->ReadUByte();
image.mode0 = reader->ReadUInt16();
image.tlutCount = reader->ReadUInt16();
if (setMesh->meshHeader.polygon1.format == 1) {
setMesh->meshHeader.polygon1.single.source = image.source;
setMesh->meshHeader.polygon1.single.unk_0C = image.unk_0C;
2024-03-26 21:26:31 -04:00
setMesh->meshHeader.polygon1.single.tlut =
(void*)image.tlut; // OTRTODO: type of bgimage.tlut should be uintptr_t
2024-01-05 10:15:41 -06:00
setMesh->meshHeader.polygon1.single.width = image.width;
setMesh->meshHeader.polygon1.single.height = image.height;
setMesh->meshHeader.polygon1.single.fmt = image.fmt;
setMesh->meshHeader.polygon1.single.siz = image.siz;
setMesh->meshHeader.polygon1.single.mode0 = image.mode0;
setMesh->meshHeader.polygon1.single.tlutCount = image.tlutCount;
} else {
setMesh->images.push_back(image);
}
}
if (setMesh->meshHeader.polygon1.format != 1) {
setMesh->meshHeader.polygon1.multi.count = bgImageCount;
}
int32_t polyType = reader->ReadInt8(); // Unused??
std::string meshOpa = reader->ReadString();
std::string meshXlu = reader->ReadString();
2024-05-14 11:05:50 -05:00
pType.opa = 0;
pType.xlu = 0;
if (meshOpa != "") {
auto opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshOpa.c_str());
pType.opa = (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr);
}
if (meshXlu != "") {
auto xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshXlu.c_str());
pType.xlu = (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr);
}
2024-01-05 10:15:41 -06:00
setMesh->dlists.push_back(pType);
} else if (setMesh->meshHeader.base.type == 2) {
PolygonDlist2 dlist;
2024-03-26 21:26:31 -04:00
2024-01-05 10:15:41 -06:00
int32_t polyType = reader->ReadInt8(); // Unused
dlist.pos.x = reader->ReadInt16();
dlist.pos.y = reader->ReadInt16();
dlist.pos.z = reader->ReadInt16();
dlist.unk_06 = reader->ReadInt16();
std::string meshOpa = reader->ReadString();
std::string meshXlu = reader->ReadString();
2024-05-14 11:05:50 -05:00
dlist.opa = 0;
dlist.xlu = 0;
if (meshOpa != "") {
auto opaRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshOpa.c_str());
dlist.opa = (Gfx*)(opaRes ? opaRes->GetRawPointer() : nullptr);
}
if (meshXlu != "") {
auto xluRes = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(meshXlu.c_str());
dlist.xlu = (Gfx*)(xluRes ? xluRes->GetRawPointer() : nullptr);
}
2024-01-05 10:15:41 -06:00
setMesh->dlists2.push_back(dlist);
} else {
2024-03-26 21:26:31 -04:00
SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}",
setMesh->meshHeader.base.type);
2024-01-05 10:15:41 -06:00
}
}
if (setMesh->meshHeader.base.type == 2) {
setMesh->meshHeader.polygon2.start = setMesh->dlists2.data();
} else if (setMesh->meshHeader.base.type == 0) {
setMesh->meshHeader.polygon0.start = setMesh->dlists.data();
} else if (setMesh->meshHeader.base.type == 1) {
setMesh->meshHeader.polygon1.multi.list = setMesh->images.data();
setMesh->meshHeader.polygon1.dlist = (Gfx*)setMesh->dlists.data();
} else {
2024-03-26 21:26:31 -04:00
SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}",
setMesh->meshHeader.base.type);
2024-01-05 10:15:41 -06:00
}
2024-03-26 21:26:31 -04:00
return setMesh;
}
} // namespace SOH