diff options
| author | louist103 <35883445+louist103@users.noreply.github.com> | 2024-01-08 21:01:24 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-08 21:01:24 -0500 |
| commit | 572b13236bebbd2e4c4e9c78a02f995fb730d151 (patch) | |
| tree | 3b302377ba3afc1fad4920be1883fccac8d6b0d0 | |
| parent | 2b6f459b9523603168b6869cf03057a0d68d5f89 (diff) | |
Implement CS Splines for MM (#310)
* wip
* Finished.
| -rw-r--r-- | ZAPD/GameConfig.cpp | 2 | ||||
| -rw-r--r-- | ZAPD/OtherStructs/CutsceneMM_Commands.cpp | 144 | ||||
| -rw-r--r-- | ZAPD/OtherStructs/CutsceneMM_Commands.h | 61 | ||||
| -rw-r--r-- | ZAPD/ZAPD.vcxproj | 10 | ||||
| -rw-r--r-- | ZAPD/ZAPD.vcxproj.filters | 30 | ||||
| -rw-r--r-- | ZAPD/ZCutscene.cpp | 2 |
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); |
