Skip to content

Commit aaed953

Browse files
committed
Fixed Movtex among other fixes
1 parent 4367716 commit aaed953

File tree

2 files changed

+44
-70
lines changed

2 files changed

+44
-70
lines changed

src/factories/sm64/MacroFactory.cpp

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -89,39 +89,20 @@ std::optional<std::shared_ptr<IParsedData>> SM64::MacroFactory::parse(std::vecto
8989

9090
std::vector<int16_t> entries;
9191

92-
while(true) {
92+
while(reader.GetBaseAddress() < segment.size) {
9393
int16_t raw = reader.ReadInt16();
9494
if(raw == 0x1E){
9595
break;
9696
}
9797

98-
entries.push_back(raw);
98+
entries.push_back(raw); // (Preset/Beh)
99+
entries.push_back(reader.ReadInt16()); // Yaw
100+
entries.push_back(reader.ReadInt16()); // PosX
101+
entries.push_back(reader.ReadInt16()); // PosY
102+
entries.push_back(reader.ReadInt16()); // PosZ
99103
}
100104

101105
entries.push_back(0x1E);
102106

103-
/*
104-
std::vector<MacroObject> macroData;
105-
while (true) {
106-
int16_t presetID = reader.ReadInt16();
107-
108-
if(presetID < 0) {
109-
break;
110-
}
111-
112-
int16_t yRot = reader.ReadInt16();
113-
int16_t xObj = reader.ReadInt16();
114-
int16_t yObj = reader.ReadInt16();
115-
int16_t zObj = reader.ReadInt16();
116-
int16_t params = reader.ReadInt16();
117-
118-
macroData.emplace_back(static_cast<MacroPresets>(presetID), yRot, xObj, yObj, zObj, params);
119-
}
120-
121-
macroData.emplace_back(MacroPresets::macro_invalid, -1, -1, -1, -1, -1);
122-
123-
return std::make_shared<SM64::MacroData>(macroData);
124-
*/
125-
126107
return std::make_shared<SM64::MacroDataAlt>(entries);
127-
}
108+
}

src/factories/sm64/MovtexFactory.cpp

Lines changed: 37 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -23,59 +23,63 @@ ExportResult SM64::MovtexCodeExporter::Export(std::ostream &write, std::shared_p
2323
const auto offset = GetSafeNode<uint32_t>(node, "offset");
2424

2525
auto movtex = std::static_pointer_cast<SM64::MovtexData>(raw);
26-
uint32_t additionalSize = 1;
26+
uint32_t additionalSize = 0;
2727

2828
write << "static Movtex " << symbol << "[] = {\n";
2929

3030
if (movtex->mIsQuad) {
3131
auto numLists = movtex->mMovtexData.at(0);
3232
write << fourSpaceTab << "MOV_TEX_INIT_LOAD(" << numLists << "),\n";
33-
additionalSize++; // MOV_TEX_INIT_LOAD has additional padding
33+
additionalSize += 2; // Count + Padding
3434
for (uint32_t i = 0; i < numLists; ++i) {
35-
write << fourSpaceTab << "MOV_TEX_ROT_SPEED(" << movtex->mMovtexData.at(i * 14 + 1) << "),\n";
36-
write << fourSpaceTab << "MOV_TEX_ROT_SCALE(" << movtex->mMovtexData.at(i * 14 + 2) << "),\n";
37-
write << fourSpaceTab << "MOV_TEX_4_BOX_TRIS(" << movtex->mMovtexData.at(i * 14 + 3) << ", " << movtex->mMovtexData.at(i * 14 + 4) << "),\n";
38-
write << fourSpaceTab << "MOV_TEX_4_BOX_TRIS(" << movtex->mMovtexData.at(i * 14 + 5) << ", " << movtex->mMovtexData.at(i * 14 + 6) << "),\n";
39-
write << fourSpaceTab << "MOV_TEX_4_BOX_TRIS(" << movtex->mMovtexData.at(i * 14 + 7) << ", " << movtex->mMovtexData.at(i * 14 + 8) << "),\n";
40-
write << fourSpaceTab << "MOV_TEX_4_BOX_TRIS(" << movtex->mMovtexData.at(i * 14 + 9) << ", " << movtex->mMovtexData.at(i * 14 + 10) << "),\n";
41-
write << fourSpaceTab << "MOV_TEX_ROT(" << movtex->mMovtexData.at(i * 14 + 11) << "),\n";
42-
write << fourSpaceTab << "MOV_TEX_ALPHA(" << movtex->mMovtexData.at(i * 14 + 12) << "),\n";
43-
write << fourSpaceTab << "MOV_TEX_DEFINE(" << movtex->mMovtexData.at(i * 14 + 13) << "),\n";
35+
uint32_t base = 1 + (i * 14);
36+
write << fourSpaceTab << "MOV_TEX_ROT_SPEED(" << movtex->mMovtexData.at(base + 0) << "),\n";
37+
write << fourSpaceTab << "MOV_TEX_ROT_SCALE(" << movtex->mMovtexData.at(base + 1) << "),\n";
38+
write << fourSpaceTab << "MOV_TEX_4_BOX_TRIS(" << movtex->mMovtexData.at(base + 2) << ", " << movtex->mMovtexData.at(base + 3) << "),\n";
39+
write << fourSpaceTab << "MOV_TEX_4_BOX_TRIS(" << movtex->mMovtexData.at(base + 4) << ", " << movtex->mMovtexData.at(base + 5) << "),\n";
40+
write << fourSpaceTab << "MOV_TEX_4_BOX_TRIS(" << movtex->mMovtexData.at(base + 6) << ", " << movtex->mMovtexData.at(base + 7) << "),\n";
41+
write << fourSpaceTab << "MOV_TEX_4_BOX_TRIS(" << movtex->mMovtexData.at(base + 8) << ", " << movtex->mMovtexData.at(base + 9) << "),\n";
42+
write << fourSpaceTab << "MOV_TEX_ROT(" << movtex->mMovtexData.at(base + 10) << "),\n";
43+
write << fourSpaceTab << "MOV_TEX_ALPHA(" << movtex->mMovtexData.at(base + 11) << "),\n";
44+
write << fourSpaceTab << "MOV_TEX_DEFINE(" << movtex->mMovtexData.at(base + 12) << "),\n";
4445
write << fourSpaceTab << "MOV_TEX_END(),\n";
46+
additionalSize += 10;
4547
}
4648
} else {
4749
write << fourSpaceTab << "MOV_TEX_SPEED(" << movtex->mMovtexData.at(0) << "),\n";
50+
additionalSize += 1;
4851
if (movtex->mHasColor) {
4952
for (uint32_t i = 0; i < movtex->mVertexCount; ++i) {
5053
// There is also a MOV_TEX_LIGHT_TRIS macro, however this is identical in result to using MOV_TEX_ROT_TRIS and would require more params on the yaml
5154
write << fourSpaceTab << "MOV_TEX_ROT_TRIS(";
52-
write << movtex->mMovtexData.at(i * 8 + 0 + 1) << ", ";
53-
write << movtex->mMovtexData.at(i * 8 + 1 + 1) << ", ";
54-
write << movtex->mMovtexData.at(i * 8 + 2 + 1) << ", ";
55-
write << movtex->mMovtexData.at(i * 8 + 3 + 1) << ", ";
56-
write << movtex->mMovtexData.at(i * 8 + 4 + 1) << ", ";
57-
write << movtex->mMovtexData.at(i * 8 + 5 + 1) << ", ";
58-
write << movtex->mMovtexData.at(i * 8 + 6 + 1) << ", ";
59-
write << movtex->mMovtexData.at(i * 8 + 7 + 1) << "),\n";
55+
write << movtex->mMovtexData.at(i * 8 + 1) << ", ";
56+
write << movtex->mMovtexData.at(i * 8 + 2) << ", ";
57+
write << movtex->mMovtexData.at(i * 8 + 3) << ", ";
58+
write << movtex->mMovtexData.at(i * 8 + 4) << ", ";
59+
write << movtex->mMovtexData.at(i * 8 + 5) << ", ";
60+
write << movtex->mMovtexData.at(i * 8 + 6) << ", ";
61+
write << movtex->mMovtexData.at(i * 8 + 7) << ", ";
62+
write << movtex->mMovtexData.at(i * 8 + 8) << "),\n";
63+
additionalSize += 8;
6064
}
6165
} else {
6266
for (uint32_t i = 0; i < movtex->mVertexCount; ++i) {
6367
write << fourSpaceTab << "MOV_TEX_TRIS(";
64-
write << movtex->mMovtexData.at(i * 5 + 0 + 1) << ", ";
65-
write << movtex->mMovtexData.at(i * 5 + 1 + 1) << ", ";
66-
write << movtex->mMovtexData.at(i * 5 + 2 + 1) << ", ";
67-
write << movtex->mMovtexData.at(i * 5 + 3 + 1) << ", ";
68-
write << movtex->mMovtexData.at(i * 5 + 4 + 1) << "),\n";
68+
write << movtex->mMovtexData.at(i * 5 + 1) << ", ";
69+
write << movtex->mMovtexData.at(i * 5 + 2) << ", ";
70+
write << movtex->mMovtexData.at(i * 5 + 3) << ", ";
71+
write << movtex->mMovtexData.at(i * 5 + 4) << ", ";
72+
write << movtex->mMovtexData.at(i * 5 + 5) << "),\n";
73+
additionalSize += 5;
6974
}
7075
}
7176
write << fourSpaceTab << "MOV_TEX_END(),\n";
77+
additionalSize += 1;
7278
}
7379

7480
write << "};\n";
7581

76-
size_t size = (movtex->mMovtexData.size() + additionalSize) * sizeof(int16_t);
77-
78-
return offset + size;
82+
return offset + (additionalSize * sizeof(int16_t));
7983
}
8084

8185
ExportResult SM64::MovtexBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
@@ -90,33 +94,22 @@ ExportResult SM64::MovtexBinaryExporter::Export(std::ostream &write, std::shared
9094
auto numLists = movtex->mMovtexData.at(0);
9195

9296
buffer.push_back(numLists);
93-
buffer.push_back(0);
97+
buffer.push_back(0); // Alignment padding
9498

9599
for (uint32_t i = 0; i < numLists; ++i) {
96100
for(size_t j = 0; j < 14; j++){
97-
buffer.push_back(movtex->mMovtexData.at(i * 14 + (j + 1)));
101+
buffer.push_back(movtex->mMovtexData.at(1 + (i * 14) + j));
98102
}
99-
100-
buffer.push_back(0);
101103
}
102104
} else {
103105
buffer.push_back(movtex->mMovtexData.at(0));
104106

105-
if (movtex->mHasColor) {
106-
for (uint32_t i = 0; i < movtex->mVertexCount; ++i) {
107-
for(size_t j = 0; j < 8; j++){
108-
buffer.push_back(movtex->mMovtexData.at(i * 8 + (j + 1)));
109-
}
110-
}
111-
} else {
112-
for (uint32_t i = 0; i < movtex->mVertexCount; ++i) {
113-
for(size_t j = 0; j < 5; j++){
114-
buffer.push_back(movtex->mMovtexData.at(i * 5 + (j + 1)));
115-
}
116-
}
107+
size_t triSize = movtex->mHasColor ? 8 : 5;
108+
for (uint32_t i = 0; i < movtex->mVertexCount * triSize; ++i) {
109+
buffer.push_back(movtex->mMovtexData.at(1 + i));
117110
}
118111

119-
buffer.push_back(0);
112+
buffer.push_back(0); // MOV_TEX_END
120113
}
121114

122115
writer.Write((uint32_t) buffer.size());

0 commit comments

Comments
 (0)