summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlouist103 <35883445+louist103@users.noreply.github.com>2024-01-08 21:01:24 -0500
committerGitHub <noreply@github.com>2024-01-08 21:01:24 -0500
commit572b13236bebbd2e4c4e9c78a02f995fb730d151 (patch)
tree3b302377ba3afc1fad4920be1883fccac8d6b0d0
parent2b6f459b9523603168b6869cf03057a0d68d5f89 (diff)
Implement CS Splines for MM (#310)
* wip * Finished.
-rw-r--r--ZAPD/GameConfig.cpp2
-rw-r--r--ZAPD/OtherStructs/CutsceneMM_Commands.cpp144
-rw-r--r--ZAPD/OtherStructs/CutsceneMM_Commands.h61
-rw-r--r--ZAPD/ZAPD.vcxproj10
-rw-r--r--ZAPD/ZAPD.vcxproj.filters30
-rw-r--r--ZAPD/ZCutscene.cpp2
6 files changed, 212 insertions, 37 deletions
diff --git a/ZAPD/GameConfig.cpp b/ZAPD/GameConfig.cpp
index 7990a60..cf6cdcc 100644
--- a/ZAPD/GameConfig.cpp
+++ b/ZAPD/GameConfig.cpp
@@ -167,7 +167,7 @@ void GameConfig::ConfigFunc_ExternalFile(const tinyxml2::XMLElement& element)
void GameConfig::ConfigFunc_EnumData(const tinyxml2::XMLElement& element)
{
- std::string path = Path::GetDirectoryName(configFilePath);
+ std::string path = Path::GetDirectoryName(configFilePath).string();
path = path.append("/").append(element.Attribute("File"));
tinyxml2::XMLDocument doc;
tinyxml2::XMLError eResult = doc.LoadFile(path.c_str());
diff --git a/ZAPD/OtherStructs/CutsceneMM_Commands.cpp b/ZAPD/OtherStructs/CutsceneMM_Commands.cpp
index f18e313..c26b39c 100644
--- a/ZAPD/OtherStructs/CutsceneMM_Commands.cpp
+++ b/ZAPD/OtherStructs/CutsceneMM_Commands.cpp
@@ -4,6 +4,7 @@
#include "Globals.h"
#include "Utils/BitConverter.h"
#include "Utils/StringHelper.h"
+#include "WarningHandler.h"
/**** GENERIC ****/
@@ -126,42 +127,157 @@ std::string CutsceneMMCommand_GenericCmd::GetCommandMacro() const
/**** CAMERA ****/
-CutsceneSubCommandEntry_Camera::CutsceneSubCommandEntry_Camera(const std::vector<uint8_t>& rawData,
- offset_t rawDataIndex)
- : CutsceneSubCommandEntry(rawData, rawDataIndex)
+CutsceneSubCommandEntry_SplineCamPoint::CutsceneSubCommandEntry_SplineCamPoint(const std::vector<uint8_t>& rawData,
+ offset_t rawDataIndex): CutsceneSubCommandEntry(rawData, rawDataIndex)
+{
+ interpType = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0);
+ weight = BitConverter::ToUInt8BE(rawData, rawDataIndex + 1);
+ duration = BitConverter::ToUInt16BE(rawData, rawDataIndex + 2);
+ posX = BitConverter::ToUInt16BE(rawData, rawDataIndex + 4);
+ posY = BitConverter::ToUInt16BE(rawData, rawDataIndex + 6);
+ posZ = BitConverter::ToUInt16BE(rawData, rawDataIndex + 8);
+ relTo = BitConverter::ToUInt16BE(rawData, rawDataIndex + 10);
+ printf("%s\n", GetBodySourceCode().c_str());
+
+}
+/*#define CS_CAM_POINT(interpType, weight, duration, posX, posY, posZ, relativeTo) \
+ { CMD_BBH(interpType, weight, duration) }, { CMD_HH(posX, posY) }, { CMD_HH(posZ, relativeTo) }*/
+std::string CutsceneSubCommandEntry_SplineCamPoint::GetBodySourceCode() const
+{
+ return StringHelper::Sprintf("CS_CAM_POINT(0x%02X, 0x%02X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X)", interpType, weight, duration, posX, posY, posZ, relTo);
+}
+
+size_t CutsceneSubCommandEntry_SplineCamPoint::GetRawSize() const
+{
+ return 0x0C;
+}
+
+
+CutsceneSubCommandEntry_SplineMiscPoint::CutsceneSubCommandEntry_SplineMiscPoint(const std::vector<uint8_t>& rawData,
+ offset_t rawDataIndex): CutsceneSubCommandEntry(rawData, rawDataIndex)
+{
+ unused0 = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0);
+ roll = BitConverter::ToUInt16BE(rawData, rawDataIndex + 2);
+ fov = BitConverter::ToUInt16BE(rawData, rawDataIndex + 4);
+ unused1 = BitConverter::ToUInt16BE(rawData, rawDataIndex + 6);
+ printf("%s\n", GetBodySourceCode().c_str());
+}
+
+/*#define CS_CAM_MISC(unused0, roll, fov, unused1) \
+ { CMD_HH(unused0, roll) }, { CMD_HH(fov, unused1) }*/
+
+std::string CutsceneSubCommandEntry_SplineMiscPoint::GetBodySourceCode() const
+{
+ return StringHelper::Sprintf("CS_CAM_MISC(0x%04X, 0x%04X, 0x%04X, 0x%04X)", unused0, roll, fov, unused1);
+}
+
+size_t CutsceneSubCommandEntry_SplineMiscPoint::GetRawSize() const
+{
+ return 0x08;
+}
+
+CutsceneSubCommandEntry_SplineHeader::CutsceneSubCommandEntry_SplineHeader(const std::vector<uint8_t>& rawData,
+ offset_t rawDataIndex): CutsceneSubCommandEntry(rawData, rawDataIndex)
+{
+ numEntries = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0);
+ unused0 = BitConverter::ToUInt16BE(rawData, rawDataIndex + 2);
+ unused1 = BitConverter::ToUInt16BE(rawData, rawDataIndex + 4);
+ duration = BitConverter::ToUInt16BE(rawData, rawDataIndex + 6);
+}
+
+std::string CutsceneSubCommandEntry_SplineHeader::GetBodySourceCode() const
{
+ return StringHelper::Sprintf("CS_CAM_SPLINE(0x%04X, 0x%04X, 0x%04X, 0x%04X)", numEntries, unused0, unused1, duration);
+
}
-std::string CutsceneSubCommandEntry_Camera::GetBodySourceCode() const
+size_t CutsceneSubCommandEntry_SplineHeader::GetRawSize() const
{
- return StringHelper::Sprintf("CMD_HH(0x%04X, 0x%04X)", base, startFrame);
+ return 0x08;
}
-size_t CutsceneSubCommandEntry_Camera::GetRawSize() const
+CutsceneSubCommandEntry_SplineFooter::CutsceneSubCommandEntry_SplineFooter(const std::vector<uint8_t>& rawData,
+ offset_t rawDataIndex): CutsceneSubCommandEntry(rawData, rawDataIndex)
+{
+ uint16_t firstHalfWord = BitConverter::ToUInt16BE(rawData, rawDataIndex);
+ uint16_t secondHalfWord = BitConverter::ToUInt16BE(rawData, rawDataIndex + 2);
+
+ if (firstHalfWord != 0xFFFF || secondHalfWord != 4) {
+ HANDLE_ERROR(WarningType::InvalidExtractedData, "Invalid Spline Footer",
+ StringHelper::Sprintf("Invalid Spline footer. Was expecting 0xFFFF, 0x0004. Got 0x%04X, 0x%04X",
+ firstHalfWord, secondHalfWord));
+ }
+}
+/*#define CS_CAM_END() */
+std::string CutsceneSubCommandEntry_SplineFooter::GetBodySourceCode() const
+{
+ return "CS_CAM_END()";
+}
+
+size_t CutsceneSubCommandEntry_SplineFooter::GetRawSize() const
{
return 0x04;
}
-CutsceneMMCommand_Camera::CutsceneMMCommand_Camera(const std::vector<uint8_t>& rawData,
+CutsceneMMCommand_Spline::CutsceneMMCommand_Spline(const std::vector<uint8_t>& rawData,
offset_t rawDataIndex)
: CutsceneCommand(rawData, rawDataIndex)
{
+ numHeaders = 0;
+ totalCommands = 0;
rawDataIndex += 4;
- entries.reserve(numEntries);
- for (size_t i = 0; i < numEntries / 4; i++)
- {
- auto* entry = new CutsceneSubCommandEntry_Camera(rawData, rawDataIndex);
- entries.push_back(entry);
- rawDataIndex += entry->GetRawSize();
+ while(1) {
+ if (BitConverter::ToUInt16BE(rawData, rawDataIndex) == 0xFFFF) {
+ break;
+ }
+ numHeaders++;
+
+ auto* header = new CutsceneSubCommandEntry_SplineHeader(rawData, rawDataIndex);
+ rawDataIndex += header->GetRawSize();
+ entries.push_back(header);
+
+ totalCommands += header->numEntries;
+
+ for (uint32_t i = 0; i < header->numEntries; i++)
+ {
+ auto* entry = new CutsceneSubCommandEntry_SplineCamPoint(rawData, rawDataIndex);
+ entries.push_back(entry);
+ rawDataIndex += entry->GetRawSize();
+ }
+
+ for (uint32_t i = 0; i < header->numEntries; i++)
+ {
+ auto* entry = new CutsceneSubCommandEntry_SplineCamPoint(rawData, rawDataIndex);
+ entries.push_back(entry);
+ rawDataIndex += entry->GetRawSize();
+ }
+
+ for (uint32_t i = 0; i < header->numEntries; i++)
+ {
+ auto* entry = new CutsceneSubCommandEntry_SplineMiscPoint(rawData, rawDataIndex);
+ entries.push_back(entry);
+ rawDataIndex += entry->GetRawSize();
+ }
}
+
+ auto* footer = new CutsceneSubCommandEntry_SplineFooter(rawData, rawDataIndex);
+ entries.push_back(footer);
+ rawDataIndex += footer->GetRawSize();
}
-std::string CutsceneMMCommand_Camera::GetCommandMacro() const
+std::string CutsceneMMCommand_Spline::GetCommandMacro() const
{
return StringHelper::Sprintf("CS_CAM_SPLINE_LIST(%i)", numEntries);
}
+size_t CutsceneMMCommand_Spline::GetCommandSize() const
+{
+ // 8 Bytes once for the spline command, 8 Bytes per spline the header, two grops of size 12, 1 group of size 8, 4 bytes for the footer.
+ return 8 + (8 * numHeaders) + ((totalCommands * 2) * 0xC) + (totalCommands * 8) + 4;
+}
+
+
/**** TRANSITION GENERAL ****/
CutsceneSubCommandEntry_TransitionGeneral::CutsceneSubCommandEntry_TransitionGeneral(
diff --git a/ZAPD/OtherStructs/CutsceneMM_Commands.h b/ZAPD/OtherStructs/CutsceneMM_Commands.h
index fb2f772..9891a24 100644
--- a/ZAPD/OtherStructs/CutsceneMM_Commands.h
+++ b/ZAPD/OtherStructs/CutsceneMM_Commands.h
@@ -268,24 +268,75 @@ public:
// TODO: MM cutscene camera command is implemented as a placeholder until we better understand how
// it works
-class CutsceneSubCommandEntry_Camera : public CutsceneSubCommandEntry
+
+class CutsceneSubCommandEntry_SplineCamPoint : public CutsceneSubCommandEntry
{
public:
- uint32_t unk_08;
+ uint8_t interpType;
+ uint8_t weight;
+ uint16_t duration;
+
+ uint16_t posX;
+ uint16_t posY;
+
+ uint16_t posZ;
+ uint16_t relTo;
+
+ CutsceneSubCommandEntry_SplineCamPoint(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
+
+ std::string GetBodySourceCode() const override;
- CutsceneSubCommandEntry_Camera(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
+ size_t GetRawSize() const override;
+};
+
+class CutsceneSubCommandEntry_SplineMiscPoint : public CutsceneSubCommandEntry
+{
+public:
+ uint16_t unused0;
+ uint16_t roll;
+ uint16_t fov;
+ uint16_t unused1;
+
+ CutsceneSubCommandEntry_SplineMiscPoint(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
+
+ std::string GetBodySourceCode() const override;
+
+ size_t GetRawSize() const override;
+};
+
+class CutsceneSubCommandEntry_SplineFooter : public CutsceneSubCommandEntry
+{
+public:
+ CutsceneSubCommandEntry_SplineFooter(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
+
+ std::string GetBodySourceCode() const override;
+
+ size_t GetRawSize() const override;
+};
+
+class CutsceneSubCommandEntry_SplineHeader : public CutsceneSubCommandEntry
+{
+public:
+ uint16_t numEntries;
+ uint16_t unused0;
+ uint16_t unused1;
+ uint16_t duration;
+ CutsceneSubCommandEntry_SplineHeader(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
std::string GetBodySourceCode() const override;
size_t GetRawSize() const override;
};
-class CutsceneMMCommand_Camera : public CutsceneCommand
+class CutsceneMMCommand_Spline : public CutsceneCommand
{
public:
- CutsceneMMCommand_Camera(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
+ uint32_t numHeaders;
+ uint32_t totalCommands;
+ CutsceneMMCommand_Spline(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
std::string GetCommandMacro() const override;
+ size_t GetCommandSize() const override;
};
/**** TRANSITION GENERAL ****/
diff --git a/ZAPD/ZAPD.vcxproj b/ZAPD/ZAPD.vcxproj
index 77d0bd1..22bc720 100644
--- a/ZAPD/ZAPD.vcxproj
+++ b/ZAPD/ZAPD.vcxproj
@@ -186,7 +186,8 @@ mkdir build\ZAPD
<ClCompile Include="ImageBackend.cpp" />
<ClCompile Include="Main.cpp" />
<ClCompile Include="OtherStructs\CutsceneMM_Commands.cpp" />
- <ClCompile Include="OtherStructs\Cutscene_Commands.cpp" />
+ <ClCompile Include="OtherStructs\CutsceneOoT_Commands.cpp" />
+ <ClCompile Include="OtherStructs\Cutscene_Common.cpp" />
<ClCompile Include="OtherStructs\SkinLimbStructs.cpp" />
<ClCompile Include="OutputFormatter.cpp" />
<ClCompile Include="WarningHandler.cpp" />
@@ -198,9 +199,9 @@ mkdir build\ZAPD
<ClCompile Include="ZMtx.cpp" />
<ClCompile Include="ZPath.cpp" />
<ClCompile Include="ZPlayerAnimationData.cpp" />
- <ClCompile Include="ZRoom\Commands\SetActorCutsceneList.cpp" />
<ClCompile Include="ZRoom\Commands\SetAnimatedMaterialList.cpp" />
<ClCompile Include="ZRoom\Commands\SetCsCamera.cpp" />
+ <ClCompile Include="ZRoom\Commands\SetCutsceneEntryList.cpp" />
<ClCompile Include="ZRoom\Commands\SetMinimapChests.cpp" />
<ClCompile Include="ZRoom\Commands\SetMinimapList.cpp" />
<ClCompile Include="ZRoom\Commands\SetWorldMapVisited.cpp" />
@@ -278,7 +279,8 @@ mkdir build\ZAPD
<ClInclude Include="Globals.h" />
<ClInclude Include="ImageBackend.h" />
<ClInclude Include="OtherStructs\CutsceneMM_Commands.h" />
- <ClInclude Include="OtherStructs\Cutscene_Commands.h" />
+ <ClInclude Include="OtherStructs\CutsceneOoT_Commands.h" />
+ <ClInclude Include="OtherStructs\Cutscene_Common.h" />
<ClInclude Include="OtherStructs\SkinLimbStructs.h" />
<ClInclude Include="OutputFormatter.h" />
<ClInclude Include="WarningHandler.h" />
@@ -296,9 +298,9 @@ mkdir build\ZAPD
<ClInclude Include="ZMtx.h" />
<ClInclude Include="ZPath.h" />
<ClInclude Include="ZPlayerAnimationData.h" />
- <ClInclude Include="ZRoom\Commands\SetActorCutsceneList.h" />
<ClInclude Include="ZRoom\Commands\SetAnimatedMaterialList.h" />
<ClInclude Include="ZRoom\Commands\SetCsCamera.h" />
+ <ClInclude Include="ZRoom\Commands\SetCutsceneEntryList.h" />
<ClInclude Include="ZRoom\Commands\SetMinimapChests.h" />
<ClInclude Include="ZRoom\Commands\SetMinimapList.h" />
<ClInclude Include="ZRoom\Commands\SetWorldMapVisited.h" />
diff --git a/ZAPD/ZAPD.vcxproj.filters b/ZAPD/ZAPD.vcxproj.filters
index eac4719..f693a74 100644
--- a/ZAPD/ZAPD.vcxproj.filters
+++ b/ZAPD/ZAPD.vcxproj.filters
@@ -228,9 +228,6 @@
<ClCompile Include="ZRoom\Commands\Unused1D.cpp">
<Filter>Source Files\Z64\ZRoom\Commands</Filter>
</ClCompile>
- <ClCompile Include="ZRoom\Commands\SetActorCutsceneList.cpp">
- <Filter>Source Files\Z64\ZRoom\Commands</Filter>
- </ClCompile>
<ClCompile Include="ZRoom\Commands\SetCsCamera.cpp">
<Filter>Source Files\Z64\ZRoom\Commands</Filter>
</ClCompile>
@@ -279,9 +276,6 @@
<ClCompile Include="ZCollisionPoly.cpp">
<Filter>Source Files\Z64</Filter>
</ClCompile>
- <ClCompile Include="OtherStructs\Cutscene_Commands.cpp">
- <Filter>Source Files\Z64</Filter>
- </ClCompile>
<ClCompile Include="OtherStructs\CutsceneMM_Commands.cpp">
<Filter>Source Files\Z64</Filter>
</ClCompile>
@@ -297,6 +291,15 @@
<ClCompile Include="ZWaterbox.cpp">
<Filter>Source Files\Z64</Filter>
</ClCompile>
+ <ClCompile Include="OtherStructs\CutsceneOoT_Commands.cpp">
+ <Filter>Source Files\Z64</Filter>
+ </ClCompile>
+ <ClCompile Include="OtherStructs\Cutscene_Common.cpp">
+ <Filter>Source Files\Z64</Filter>
+ </ClCompile>
+ <ClCompile Include="ZRoom\Commands\SetCutsceneEntryList.cpp">
+ <Filter>Source Files\Z64\ZRoom\Commands</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="ZRoom\ZRoom.h">
@@ -497,9 +500,6 @@
<ClInclude Include="ZRoom\Commands\SetWorldMapVisited.h">
<Filter>Header Files\Z64\ZRoom\Commands</Filter>
</ClInclude>
- <ClInclude Include="ZRoom\Commands\SetActorCutsceneList.h">
- <Filter>Header Files\Z64\ZRoom\Commands</Filter>
- </ClInclude>
<ClInclude Include="ZRoom\Commands\Unused1D.h">
<Filter>Header Files\Z64\ZRoom\Commands</Filter>
</ClInclude>
@@ -548,9 +548,6 @@
<ClInclude Include="ZCollisionPoly.h">
<Filter>Header Files\Z64</Filter>
</ClInclude>
- <ClInclude Include="OtherStructs\Cutscene_Commands.h">
- <Filter>Header Files\Z64</Filter>
- </ClInclude>
<ClInclude Include="OtherStructs\CutsceneMM_Commands.h">
<Filter>Header Files\Z64</Filter>
</ClInclude>
@@ -569,6 +566,15 @@
<ClInclude Include="ZWaterbox.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="OtherStructs\Cutscene_Common.h">
+ <Filter>Header Files\Z64</Filter>
+ </ClInclude>
+ <ClInclude Include="OtherStructs\CutsceneOoT_Commands.h">
+ <Filter>Header Files\Z64</Filter>
+ </ClInclude>
+ <ClInclude Include="ZRoom\Commands\SetCutsceneEntryList.h">
+ <Filter>Header Files\Z64\ZRoom\Commands</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<Text Include="..\SymbolMap_OoTMqDbg.txt">
diff --git a/ZAPD/ZCutscene.cpp b/ZAPD/ZCutscene.cpp
index ea723b2..b90fb87 100644
--- a/ZAPD/ZCutscene.cpp
+++ b/ZAPD/ZCutscene.cpp
@@ -323,7 +323,7 @@ CutsceneCommand* ZCutscene::GetCommandMM(uint32_t id, offset_t currentPtr) const
return new CutsceneMMCommand_Text(rawData, currentPtr);
case CutsceneMM_CommandType::CS_CMD_CAMERA_SPLINE:
- return new CutsceneMMCommand_Camera(rawData, currentPtr);
+ return new CutsceneMMCommand_Spline(rawData, currentPtr);
case CutsceneMM_CommandType::CS_CMD_TRANSITION_GENERAL:
return new CutsceneMMCommand_TransitionGeneral(rawData, currentPtr);