From 493bdbc3c690185898df5d821a48435a34b1d091 Mon Sep 17 00:00:00 2001 From: fig02 Date: Sat, 20 Mar 2021 12:02:12 -0400 Subject: [PATCH] git subrepo pull --force tools/ZAPD (#727) subrepo: subdir: "tools/ZAPD" merged: "4751db5c9" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "4751db5c9" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" --- tools/ZAPD/.clang-format | 84 + tools/ZAPD/.gitignore | 1 + tools/ZAPD/.gitrepo | 4 +- tools/ZAPD/Jenkinsfile | 4 +- tools/ZAPD/Makefile | 16 +- tools/ZAPD/ZAPD/BitConverter.h | 58 +- tools/ZAPD/ZAPD/Directory.h | 17 +- tools/ZAPD/ZAPD/File.h | 10 +- tools/ZAPD/ZAPD/Globals.cpp | 12 +- tools/ZAPD/ZAPD/Globals.h | 19 +- tools/ZAPD/ZAPD/HighLevel/HLAnimation.h | 1 - .../HighLevel/HLAnimationIntermediette.cpp | 32 +- .../ZAPD/HighLevel/HLAnimationIntermediette.h | 4 +- .../ZAPD/ZAPD/HighLevel/HLFileIntermediette.h | 1 - .../ZAPD/HighLevel/HLModelIntermediette.cpp | 236 +- .../ZAPD/HighLevel/HLModelIntermediette.h | 25 +- tools/ZAPD/ZAPD/HighLevel/HLTexture.cpp | 7 +- tools/ZAPD/ZAPD/HighLevel/HLTexture.h | 6 +- tools/ZAPD/ZAPD/Main.cpp | 109 +- tools/ZAPD/ZAPD/OutputFormatter.cpp | 21 +- tools/ZAPD/ZAPD/OutputFormatter.h | 17 +- tools/ZAPD/ZAPD/Overlays/ZOverlay.cpp | 43 +- tools/ZAPD/ZAPD/Overlays/ZOverlay.h | 6 +- tools/ZAPD/ZAPD/Path.h | 2 +- tools/ZAPD/ZAPD/StringHelper.h | 13 +- tools/ZAPD/ZAPD/Vec3s.h | 7 +- tools/ZAPD/ZAPD/ZAnimation.cpp | 378 +- tools/ZAPD/ZAPD/ZAnimation.h | 110 +- tools/ZAPD/ZAPD/ZArray.cpp | 26 +- tools/ZAPD/ZAPD/ZArray.h | 10 +- tools/ZAPD/ZAPD/ZBlob.cpp | 29 +- tools/ZAPD/ZAPD/ZBlob.h | 6 +- tools/ZAPD/ZAPD/ZCollision.cpp | 156 +- tools/ZAPD/ZAPD/ZCollision.h | 17 +- tools/ZAPD/ZAPD/ZCutscene.cpp | 490 ++- tools/ZAPD/ZAPD/ZCutscene.h | 13 +- tools/ZAPD/ZAPD/ZDisplayList.cpp | 928 ++-- tools/ZAPD/ZAPD/ZDisplayList.h | 71 +- tools/ZAPD/ZAPD/ZFile.cpp | 386 +- tools/ZAPD/ZAPD/ZFile.h | 34 +- tools/ZAPD/ZAPD/ZLimb.cpp | 375 +- tools/ZAPD/ZAPD/ZLimb.h | 79 +- tools/ZAPD/ZAPD/ZResource.cpp | 5 +- tools/ZAPD/ZAPD/ZResource.h | 28 +- tools/ZAPD/ZAPD/ZRoom/ActorList.h | 947 ++-- tools/ZAPD/ZAPD/ZRoom/Commands/EndMarker.cpp | 6 +- .../ZAPD/ZAPD/ZRoom/Commands/SetActorList.cpp | 67 +- tools/ZAPD/ZAPD/ZRoom/Commands/SetActorList.h | 2 +- .../ZRoom/Commands/SetAlternateHeaders.cpp | 24 +- .../ZAPD/ZRoom/Commands/SetAlternateHeaders.h | 2 +- .../ZAPD/ZRoom/Commands/SetCameraSettings.cpp | 7 +- .../ZRoom/Commands/SetCollisionHeader.cpp | 18 +- .../ZAPD/ZRoom/Commands/SetCollisionHeader.h | 2 +- .../ZAPD/ZAPD/ZRoom/Commands/SetCutscenes.cpp | 47 +- tools/ZAPD/ZAPD/ZRoom/Commands/SetCutscenes.h | 2 +- .../ZAPD/ZRoom/Commands/SetEchoSettings.cpp | 7 +- .../ZAPD/ZRoom/Commands/SetEntranceList.cpp | 29 +- .../ZAPD/ZAPD/ZRoom/Commands/SetExitList.cpp | 25 +- .../ZAPD/ZAPD/ZRoom/Commands/SetLightList.cpp | 27 +- tools/ZAPD/ZAPD/ZRoom/Commands/SetLightList.h | 2 +- .../ZRoom/Commands/SetLightingSettings.cpp | 32 +- tools/ZAPD/ZAPD/ZRoom/Commands/SetMesh.cpp | 254 +- tools/ZAPD/ZAPD/ZRoom/Commands/SetMesh.h | 58 +- .../ZAPD/ZRoom/Commands/SetObjectList.cpp | 27 +- .../ZAPD/ZAPD/ZRoom/Commands/SetPathways.cpp | 44 +- tools/ZAPD/ZAPD/ZRoom/Commands/SetPathways.h | 2 +- .../ZAPD/ZRoom/Commands/SetRoomBehavior.cpp | 8 +- .../ZAPD/ZAPD/ZRoom/Commands/SetRoomList.cpp | 31 +- .../ZAPD/ZRoom/Commands/SetSkyboxModifier.cpp | 9 +- .../ZAPD/ZRoom/Commands/SetSkyboxSettings.cpp | 9 +- .../ZAPD/ZRoom/Commands/SetSoundSettings.cpp | 8 +- .../ZAPD/ZRoom/Commands/SetSpecialObjects.cpp | 7 +- .../ZRoom/Commands/SetStartPositionList.cpp | 35 +- .../ZRoom/Commands/SetStartPositionList.h | 3 +- .../ZAPD/ZRoom/Commands/SetTimeSettings.cpp | 7 +- .../ZAPD/ZRoom/Commands/SetTimeSettings.h | 4 +- .../ZRoom/Commands/SetTransitionActorList.cpp | 32 +- tools/ZAPD/ZAPD/ZRoom/Commands/SetWind.cpp | 8 +- tools/ZAPD/ZAPD/ZRoom/Commands/Unused09.cpp | 6 +- .../ZAPD/ZRoom/Commands/ZRoomCommandUnk.cpp | 10 +- tools/ZAPD/ZAPD/ZRoom/ObjectList.h | 807 ++-- tools/ZAPD/ZAPD/ZRoom/ZRoom.cpp | 324 +- tools/ZAPD/ZAPD/ZRoom/ZRoom.h | 10 +- tools/ZAPD/ZAPD/ZRoom/ZRoomCommand.cpp | 3 +- tools/ZAPD/ZAPD/ZRoom/ZRoomCommand.h | 2 +- tools/ZAPD/ZAPD/ZScalar.cpp | 28 +- tools/ZAPD/ZAPD/ZScalar.h | 17 +- tools/ZAPD/ZAPD/ZSkeleton.cpp | 168 +- tools/ZAPD/ZAPD/ZSkeleton.h | 21 +- tools/ZAPD/ZAPD/ZSymbol.cpp | 105 + tools/ZAPD/ZAPD/ZSymbol.h | 33 + tools/ZAPD/ZAPD/ZTexture.cpp | 287 +- tools/ZAPD/ZAPD/ZTexture.h | 11 +- tools/ZAPD/ZAPD/ZVector.cpp | 22 +- tools/ZAPD/ZAPD/ZVector.h | 16 +- tools/ZAPD/ZAPD/ZVtx.cpp | 27 +- tools/ZAPD/ZAPD/ZVtx.h | 15 +- tools/ZAPD/lib/libgfxd/LICENSE | 21 + tools/ZAPD/lib/libgfxd/Makefile | 25 + tools/ZAPD/lib/libgfxd/README.md | 478 +++ tools/ZAPD/lib/libgfxd/gbi.h | 3808 +++++++++++++++++ tools/ZAPD/lib/libgfxd/gfxd.c | 863 ++++ tools/ZAPD/lib/libgfxd/gfxd.h | 11 +- tools/ZAPD/lib/libgfxd/libgfxd.a | Bin 3348354 -> 0 bytes tools/ZAPD/lib/libgfxd/priv.h | 123 + tools/ZAPD/lib/libgfxd/uc.c | 54 + tools/ZAPD/lib/libgfxd/uc_argfn.c | 1814 ++++++++ tools/ZAPD/lib/libgfxd/uc_argtbl.c | 490 +++ tools/ZAPD/lib/libgfxd/uc_f3d.c | 4 + tools/ZAPD/lib/libgfxd/uc_f3db.c | 5 + tools/ZAPD/lib/libgfxd/uc_f3dex.c | 4 + tools/ZAPD/lib/libgfxd/uc_f3dex2.c | 4 + tools/ZAPD/lib/libgfxd/uc_f3dexb.c | 5 + tools/ZAPD/lib/libgfxd/uc_macrofn.c | 2453 +++++++++++ tools/ZAPD/lib/libgfxd/uc_macrotbl.c | 1397 ++++++ 115 files changed, 16370 insertions(+), 2789 deletions(-) create mode 100644 tools/ZAPD/.clang-format create mode 100644 tools/ZAPD/ZAPD/ZSymbol.cpp create mode 100644 tools/ZAPD/ZAPD/ZSymbol.h create mode 100644 tools/ZAPD/lib/libgfxd/LICENSE create mode 100644 tools/ZAPD/lib/libgfxd/Makefile create mode 100644 tools/ZAPD/lib/libgfxd/README.md create mode 100644 tools/ZAPD/lib/libgfxd/gbi.h create mode 100644 tools/ZAPD/lib/libgfxd/gfxd.c delete mode 100644 tools/ZAPD/lib/libgfxd/libgfxd.a create mode 100644 tools/ZAPD/lib/libgfxd/priv.h create mode 100644 tools/ZAPD/lib/libgfxd/uc.c create mode 100644 tools/ZAPD/lib/libgfxd/uc_argfn.c create mode 100644 tools/ZAPD/lib/libgfxd/uc_argtbl.c create mode 100644 tools/ZAPD/lib/libgfxd/uc_f3d.c create mode 100644 tools/ZAPD/lib/libgfxd/uc_f3db.c create mode 100644 tools/ZAPD/lib/libgfxd/uc_f3dex.c create mode 100644 tools/ZAPD/lib/libgfxd/uc_f3dex2.c create mode 100644 tools/ZAPD/lib/libgfxd/uc_f3dexb.c create mode 100644 tools/ZAPD/lib/libgfxd/uc_macrofn.c create mode 100644 tools/ZAPD/lib/libgfxd/uc_macrotbl.c diff --git a/tools/ZAPD/.clang-format b/tools/ZAPD/.clang-format new file mode 100644 index 0000000000..784e734e97 --- /dev/null +++ b/tools/ZAPD/.clang-format @@ -0,0 +1,84 @@ +--- +AccessModifierOffset: -4 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlinesLeft: false +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: InlineOnly +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: true +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterCaseLabel: true + AfterClass: true + AfterControlStatement: true + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true + BeforeCatch: true + BeforeElse: true + IndentBraces: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Custom +BreakBeforeTernaryOperators: false +BreakConstructorInitializersBeforeComma: false +ColumnLimit: 100 +CommentPragmas: '^ (IWYU pragma:|NOLINT)' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ForEachMacros: [ ] +IncludeCategories: + - Regex: '^<[Ww]indows\.h>$' + Priority: 1 + - Regex: '^<' + Priority: 2 + - Regex: '^"' + Priority: 3 +IndentCaseLabels: false +IndentWidth: 4 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: false +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Left +ReflowComments: true +SortIncludes: true +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Latest +TabWidth: 4 +UseTab: AlignWithSpaces +... + diff --git a/tools/ZAPD/.gitignore b/tools/ZAPD/.gitignore index 136ffb1b28..4a9671810a 100644 --- a/tools/ZAPD/.gitignore +++ b/tools/ZAPD/.gitignore @@ -332,5 +332,6 @@ ASALocalRun/ *.out *.o *.d +lib/libgfxd/libgfxd.a .vscode/ ZAPD/BuildInfo.h \ No newline at end of file diff --git a/tools/ZAPD/.gitrepo b/tools/ZAPD/.gitrepo index 511240f54b..0fcc361bdb 100644 --- a/tools/ZAPD/.gitrepo +++ b/tools/ZAPD/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/zeldaret/ZAPD.git branch = master - commit = 4bf6600a3b67223d5e28d6a1fccfeb54e37d7a77 - parent = 8e0fa07a7e03730951ba98a377cf7738e8f26295 + commit = 4751db5c9ee0a25a26379ca5b44efad72215d256 + parent = 77ec4d491610620338e592a0f853b7c59af7fba5 method = merge cmdver = 0.4.3 diff --git a/tools/ZAPD/Jenkinsfile b/tools/ZAPD/Jenkinsfile index 0240b8ed92..d7ea29396f 100644 --- a/tools/ZAPD/Jenkinsfile +++ b/tools/ZAPD/Jenkinsfile @@ -1,5 +1,7 @@ pipeline { - agent any + agent { + label "ZAPD" + } stages { stage('Build ZAPD') { diff --git a/tools/ZAPD/Makefile b/tools/ZAPD/Makefile index cd4cd2826a..0502cb5d10 100644 --- a/tools/ZAPD/Makefile +++ b/tools/ZAPD/Makefile @@ -1,11 +1,5 @@ CC := g++ - -ifneq (, $(shell which ccache)) -CC := ccache $(CC) -endif - CFLAGS := -g -std=c++17 -I ZAPD -I lib/assimp/include -I lib/elfio -I lib/json/include -I lib/stb -I lib/tinygltf -I lib/libgfxd -I lib/tinyxml2 -O2 -rdynamic - UNAME := $(shell uname) FS_INC = @@ -19,18 +13,22 @@ CPP_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.cpp)) CPP_FILES += lib/tinyxml2/tinyxml2.cpp O_FILES := $(CPP_FILES:.cpp=.o) -all: genbuildinfo ZAPD.out +all: ZAPD.out genbuildinfo: python3 ZAPD/genbuildinfo.py clean: rm -f $(O_FILES) ZAPD.out + $(MAKE) -C lib/libgfxd clean rebuild: clean all -%.o: %.cpp +%.o: %.cpp genbuildinfo $(CC) $(CFLAGS) -c $< -o $@ -ZAPD.out: $(O_FILES) +lib/libgfxd/libgfxd.a: + $(MAKE) -C lib/libgfxd -j + +ZAPD.out: $(O_FILES) lib/libgfxd/libgfxd.a $(CC) $(CFLAGS) $(O_FILES) lib/libgfxd/libgfxd.a -o $@ $(FS_INC) diff --git a/tools/ZAPD/ZAPD/BitConverter.h b/tools/ZAPD/ZAPD/BitConverter.h index dfc3c84407..9d209f055b 100644 --- a/tools/ZAPD/ZAPD/BitConverter.h +++ b/tools/ZAPD/ZAPD/BitConverter.h @@ -49,48 +49,66 @@ public: static inline int32_t ToInt32BE(const uint8_t* data, int offset) { - return ((uint32_t)data[offset + 0] << 24) + ((uint32_t)data[offset + 1] << 16) + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; + return ((uint32_t)data[offset + 0] << 24) + ((uint32_t)data[offset + 1] << 16) + + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; } static inline int32_t ToInt32BE(const std::vector& data, int offset) { - return ((uint32_t)data[offset + 0] << 24) + ((uint32_t)data[offset + 1] << 16) + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; + return ((uint32_t)data[offset + 0] << 24) + ((uint32_t)data[offset + 1] << 16) + + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; } static inline uint32_t ToUInt32BE(const uint8_t* data, int offset) { - return ((uint32_t)data[offset + 0] << 24) + ((uint32_t)data[offset + 1] << 16) + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; + return ((uint32_t)data[offset + 0] << 24) + ((uint32_t)data[offset + 1] << 16) + + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; } static inline uint32_t ToUInt32BE(const std::vector& data, int offset) { - return ((uint32_t)data[offset + 0] << 24) + ((uint32_t)data[offset + 1] << 16) + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; + return ((uint32_t)data[offset + 0] << 24) + ((uint32_t)data[offset + 1] << 16) + + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; } static inline int64_t ToInt64BE(const uint8_t* data, int offset) { - return ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); + return ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); } static inline int64_t ToInt64BE(const std::vector& data, int offset) { - return ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); + return ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); } static inline uint64_t ToUInt64BE(const uint8_t* data, int offset) { - return ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); + return ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); } static inline uint64_t ToUInt64BE(const std::vector& data, int offset) { - return ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); + return ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); } static inline float ToFloatBE(const uint8_t* data, int offset) { float value; - uint32_t floatData = ((uint32_t)data[offset + 0] << 24) + ((uint32_t)data[offset + 1] << 16) + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; + uint32_t floatData = ((uint32_t)data[offset + 0] << 24) + + ((uint32_t)data[offset + 1] << 16) + + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; static_assert(sizeof(uint32_t) == sizeof(float)); std::memcpy(&value, &floatData, sizeof(value)); return value; @@ -99,7 +117,9 @@ public: static inline float ToFloatBE(const std::vector& data, int offset) { float value; - uint32_t floatData = ((uint32_t)data[offset + 0] << 24) + ((uint32_t)data[offset + 1] << 16) + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; + uint32_t floatData = ((uint32_t)data[offset + 0] << 24) + + ((uint32_t)data[offset + 1] << 16) + + ((uint32_t)data[offset + 2] << 8) + (uint32_t)data[offset + 3]; static_assert(sizeof(uint32_t) == sizeof(float)); std::memcpy(&value, &floatData, sizeof(value)); return value; @@ -108,9 +128,14 @@ public: static inline double ToDoubleBE(const uint8_t* data, int offset) { double value; - uint64_t floatData = ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); + uint64_t floatData = + ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); static_assert(sizeof(uint64_t) == sizeof(double)); - // Checks if the float format on the platform the ZAPD binary is running on supports the same float format as the object file. + // Checks if the float format on the platform the ZAPD binary is running on supports the + // same float format as the object file. static_assert(std::numeric_limits::is_iec559); std::memcpy(&value, &floatData, sizeof(value)); return value; @@ -119,9 +144,14 @@ public: static inline double ToDoubleBE(const std::vector& data, int offset) { double value; - uint64_t floatData = ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); + uint64_t floatData = + ((uint64_t)data[offset + 0] << 56) + ((uint64_t)data[offset + 1] << 48) + + ((uint64_t)data[offset + 2] << 40) + ((uint64_t)data[offset + 3] << 32) + + ((uint64_t)data[offset + 4] << 24) + ((uint64_t)data[offset + 5] << 16) + + ((uint64_t)data[offset + 6] << 8) + ((uint64_t)data[offset + 7]); static_assert(sizeof(uint64_t) == sizeof(double)); - // Checks if the float format on the platform the ZAPD binary is running on supports the same float format as the object file. + // Checks if the float format on the platform the ZAPD binary is running on supports the + // same float format as the object file. static_assert(std::numeric_limits::is_iec559); std::memcpy(&value, &floatData, sizeof(value)); return value; diff --git a/tools/ZAPD/ZAPD/Directory.h b/tools/ZAPD/ZAPD/Directory.h index bddec9d466..74bb14ed6c 100644 --- a/tools/ZAPD/ZAPD/Directory.h +++ b/tools/ZAPD/ZAPD/Directory.h @@ -1,7 +1,8 @@ #pragma once -#include #include +#include +#include #if __has_include() #include @@ -11,18 +12,14 @@ namespace fs = std::filesystem; namespace fs = std::experimental::filesystem; #endif +#include "StringHelper.h" + class Directory { public: - static std::string GetCurrentDirectory() - { - return fs::current_path().u8string(); - } + static std::string GetCurrentDirectory() { return fs::current_path().u8string(); } - static bool Exists(const std::string& path) - { - return fs::exists(fs::path(path)); - } + static bool Exists(const std::string& path) { return fs::exists(fs::path(path)); } static void CreateDirectory(const std::string& path) { @@ -37,6 +34,6 @@ public: fs::create_directory(curPath); } - //fs::create_directory(path); + // fs::create_directory(path); } }; diff --git a/tools/ZAPD/ZAPD/File.h b/tools/ZAPD/ZAPD/File.h index fe2e1fa3d7..5db466ad9b 100644 --- a/tools/ZAPD/ZAPD/File.h +++ b/tools/ZAPD/ZAPD/File.h @@ -1,11 +1,11 @@ #pragma once -#include #include -#include #include #include #include +#include +#include #include "StringHelper.h" class File @@ -25,7 +25,7 @@ public: char* data = new char[fileSize]; file.read(data, fileSize); std::vector result = std::vector(data, data + fileSize); - delete data; + delete[] data; return result; }; @@ -35,11 +35,11 @@ public: std::ifstream file(filePath, std::ios::in | std::ios::binary | std::ios::ate); int fileSize = (int)file.tellg(); file.seekg(0); - char* data = new char[fileSize+1]; + char* data = new char[fileSize + 1]; memset(data, 0, fileSize + 1); file.read(data, fileSize); std::string str = std::string((const char*)data); - delete data; + delete[] data; return str; }; diff --git a/tools/ZAPD/ZAPD/Globals.cpp b/tools/ZAPD/ZAPD/Globals.cpp index 572ce2ef76..e6f2458dba 100644 --- a/tools/ZAPD/ZAPD/Globals.cpp +++ b/tools/ZAPD/ZAPD/Globals.cpp @@ -1,7 +1,7 @@ #include "Globals.h" +#include #include "File.h" #include "tinyxml2.h" -#include using namespace tinyxml2; using namespace std; @@ -14,7 +14,7 @@ Globals::Globals() files = std::vector(); segments = std::vector(); - symbolMap = std::map (); + symbolMap = std::map(); segmentRefs = map(); segmentRefFiles = map(); game = ZGame::OOT_RETAIL; @@ -45,9 +45,10 @@ string Globals::FindSymbolSegRef(int segNumber, uint32_t symbolAddress) if (root == nullptr) return "ERROR"; - //vector files = vector(); + // vector files = vector(); - for (XMLElement* child = root->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for (XMLElement* child = root->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) { if (string(child->Name()) == "File") { @@ -78,7 +79,8 @@ void Globals::ReadConfigFile(const std::string& configFilePath) if (root == nullptr) return; - for (XMLElement* child = root->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for (XMLElement* child = root->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) { if (string(child->Name()) == "SymbolMap") { diff --git a/tools/ZAPD/ZAPD/Globals.h b/tools/ZAPD/ZAPD/Globals.h index 7b034de135..6b7075f492 100644 --- a/tools/ZAPD/ZAPD/Globals.h +++ b/tools/ZAPD/ZAPD/Globals.h @@ -4,10 +4,11 @@ #include #include #include "ZFile.h" -#include "ZTexture.h" #include "ZRoom/ZRoom.h" +#include "ZTexture.h" -typedef enum VerbosityLevel { +typedef enum VerbosityLevel +{ VERBOSITY_SILENT, VERBOSITY_INFO, VERBOSITY_DEBUG @@ -20,12 +21,12 @@ class Globals public: static Globals* Instance; - bool genSourceFile; // Used for extraction + bool genSourceFile; // Used for extraction bool useExternalResources; - bool testMode; // Enables certain experimental features - bool profile; // Measure performance of certain operations - bool includeFilePrefix; // Include the file prefix in symbols - VerbosityLevel verbosity; // ZAPD outputs additional information + bool testMode; // Enables certain experimental features + bool profile; // Measure performance of certain operations + bool includeFilePrefix; // Include the file prefix in symbols + VerbosityLevel verbosity; // ZAPD outputs additional information ZFileMode fileMode; std::string baseRomPath, inputPath, outputPath, cfgPath; TextureType texType; @@ -58,11 +59,11 @@ public: GameConfig(); private: - }; /* - * Note: In being able to track references across files, there are a few major files that make use of segments... + * Note: In being able to track references across files, there are a few major files that make use + * of segments... * Segment 1: nintendo_rogo_static/title_static * Segment 2: parameter_static * Segment 4: gameplay_keep diff --git a/tools/ZAPD/ZAPD/HighLevel/HLAnimation.h b/tools/ZAPD/ZAPD/HighLevel/HLAnimation.h index dfc4532462..52d6847a66 100644 --- a/tools/ZAPD/ZAPD/HighLevel/HLAnimation.h +++ b/tools/ZAPD/ZAPD/HighLevel/HLAnimation.h @@ -9,5 +9,4 @@ class HLAnimation { public: - }; \ No newline at end of file diff --git a/tools/ZAPD/ZAPD/HighLevel/HLAnimationIntermediette.cpp b/tools/ZAPD/ZAPD/HighLevel/HLAnimationIntermediette.cpp index 1b64af1357..7d879c9470 100644 --- a/tools/ZAPD/ZAPD/HighLevel/HLAnimationIntermediette.cpp +++ b/tools/ZAPD/ZAPD/HighLevel/HLAnimationIntermediette.cpp @@ -14,7 +14,6 @@ HLAnimationIntermediette::HLAnimationIntermediette() HLAnimationIntermediette::~HLAnimationIntermediette() { - } HLAnimationIntermediette* HLAnimationIntermediette::FromXML(std::string xmlPath) @@ -30,11 +29,13 @@ HLAnimationIntermediette* HLAnimationIntermediette::FromXML(std::string xmlPath) anim->limbCount = root->IntAttribute("LimbCount"); anim->frameCount = root->IntAttribute("FrameCount"); - for (XMLElement* child = root->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for (XMLElement* child = root->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) { if (string(child->Name()) == "RotationValues") { - for (XMLElement* child2 = child->FirstChildElement(); child2 != NULL; child2 = child2->NextSiblingElement()) + for (XMLElement* child2 = child->FirstChildElement(); child2 != NULL; + child2 = child2->NextSiblingElement()) { string value = child2->GetText(); anim->rotationValues.push_back(atoi(value.c_str())); @@ -42,8 +43,11 @@ HLAnimationIntermediette* HLAnimationIntermediette::FromXML(std::string xmlPath) } else if (string(child->Name()) == "RotationIndices") { - for (XMLElement* child2 = child->FirstChildElement(); child2 != NULL; child2 = child2->NextSiblingElement()) - anim->rotationIndices.push_back(RotationIndex(child2->IntAttribute("X"), child2->IntAttribute("Y"), child2->IntAttribute("Z"))); + for (XMLElement* child2 = child->FirstChildElement(); child2 != NULL; + child2 = child2->NextSiblingElement()) + anim->rotationIndices.push_back(RotationIndex(child2->IntAttribute("X"), + child2->IntAttribute("Y"), + child2->IntAttribute("Z"))); } } @@ -56,12 +60,12 @@ HLAnimationIntermediette* HLAnimationIntermediette::FromZAnimation(ZAnimation* z /*anim->limit = zAnim->limit; anim->frameCount = zAnim->frameCount; - + for (uint16_t item : zAnim->rotationValues) - anim->rotationValues.push_back(item); + anim->rotationValues.push_back(item); for (RotationIndex item : zAnim->rotationIndices) - anim->rotationIndices.push_back(item);*/ + anim->rotationIndices.push_back(item);*/ return anim; } @@ -74,10 +78,10 @@ ZAnimation* HLAnimationIntermediette::ToZAnimation() zAnim->frameCount = frameCount; for (uint16_t item : rotationValues) - zAnim->rotationValues.push_back(item); + zAnim->rotationValues.push_back(item); for (RotationIndex item : rotationIndices) - zAnim->rotationIndices.push_back(item);*/ + zAnim->rotationIndices.push_back(item);*/ return zAnim; } @@ -95,19 +99,19 @@ string HLAnimationIntermediette::OutputXML() doc.InsertFirstChild(root); XMLElement* rotValues = doc.NewElement("RotationValues"); - - for (int i = 0; i < rotationValues.size(); i++) + + for (size_t i = 0; i < rotationValues.size(); i++) { XMLElement* rotValue = doc.NewElement("Value"); rotValue->SetText(rotationValues[i]); rotValues->InsertEndChild(rotValue); } - + root->InsertEndChild(rotValues); XMLElement* rotIndices = doc.NewElement("RotationIndices"); - for (int i = 0; i < rotationIndices.size(); i++) + for (size_t i = 0; i < rotationIndices.size(); i++) { XMLElement* rotIndex = doc.NewElement("Value"); rotIndex->SetAttribute("X", rotationIndices[i].x); diff --git a/tools/ZAPD/ZAPD/HighLevel/HLAnimationIntermediette.h b/tools/ZAPD/ZAPD/HighLevel/HLAnimationIntermediette.h index 42ba9bbde8..0f5c00b04f 100644 --- a/tools/ZAPD/ZAPD/HighLevel/HLAnimationIntermediette.h +++ b/tools/ZAPD/ZAPD/HighLevel/HLAnimationIntermediette.h @@ -1,8 +1,8 @@ #pragma once #include -#include "../ZAnimation.h" #include +#include "../ZAnimation.h" #include "HLFileIntermediette.h" /* @@ -23,7 +23,7 @@ public: HLAnimationIntermediette(); ~HLAnimationIntermediette(); - + std::string OutputXML(); ZAnimation* ToZAnimation(); diff --git a/tools/ZAPD/ZAPD/HighLevel/HLFileIntermediette.h b/tools/ZAPD/ZAPD/HighLevel/HLFileIntermediette.h index bd18f1e146..ef16bb8fd9 100644 --- a/tools/ZAPD/ZAPD/HighLevel/HLFileIntermediette.h +++ b/tools/ZAPD/ZAPD/HighLevel/HLFileIntermediette.h @@ -2,5 +2,4 @@ class HLFileIntermediette { - }; \ No newline at end of file diff --git a/tools/ZAPD/ZAPD/HighLevel/HLModelIntermediette.cpp b/tools/ZAPD/ZAPD/HighLevel/HLModelIntermediette.cpp index bd8ec784ee..25355378f4 100644 --- a/tools/ZAPD/ZAPD/HighLevel/HLModelIntermediette.cpp +++ b/tools/ZAPD/ZAPD/HighLevel/HLModelIntermediette.cpp @@ -1,15 +1,15 @@ #include "HLModelIntermediette.h" -#include "../ZDisplayList.h" -#include "../StringHelper.h" +#include "../File.h" #include "../Globals.h" #include "../Path.h" -#include "../File.h" +#include "../StringHelper.h" +#include "../ZDisplayList.h" #ifdef USE_ASSIMP -#include #include -#include +#include #include +#include #endif using namespace std; @@ -31,7 +31,8 @@ HLModelIntermediette* HLModelIntermediette::FromXML(tinyxml2::XMLElement* root) { HLModelIntermediette* model = new HLModelIntermediette(); - for (XMLElement* child = root->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for (XMLElement* child = root->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) { string childName = child->Name(); HLIntermediette* block = nullptr; @@ -60,18 +61,18 @@ HLModelIntermediette* HLModelIntermediette::FromXML(tinyxml2::XMLElement* root) void HLModelIntermediette::FromZDisplayList(HLModelIntermediette* model, ZDisplayList* zDisplayList) { - //HLModelIntermediette* model = new HLModelIntermediette(); + // HLModelIntermediette* model = new HLModelIntermediette(); HLLimbIntermediette* limb = new HLLimbIntermediette(); limb->name = zDisplayList->GetName(); // Go through verts vector finalVerts = vector(); - uint32_t vStart = -1; + int32_t vStart = -1; - for (pair> pair : zDisplayList->vertices) + for (pair> pair : zDisplayList->vertices) { - if (vStart == -1) // TODO: Find a better way to do this + if (vStart == -1) // TODO: Find a better way to do this vStart = pair.first; for (Vertex v : pair.second) @@ -97,7 +98,7 @@ void HLModelIntermediette::FromZDisplayList(HLModelIntermediette* model, ZDispla HLDisplayListIntermediette* dList = new HLDisplayListIntermediette(); dList->address = zDisplayList->GetRawDataIndex(); int startIndex = 0; - + // Go through the display lists and setup commands int meshCnt = 0; @@ -112,7 +113,7 @@ void HLModelIntermediette::FromZDisplayList(HLModelIntermediette* model, ZDispla startIndex = 0; - for (int i = startIndex; i < zDisplayList->instructions.size(); i++) + for (size_t i = startIndex; i < zDisplayList->instructions.size(); i++) { uint64_t data = zDisplayList->instructions[i]; F3DZEXOpcode opcode = (F3DZEXOpcode)(data >> 56); @@ -121,15 +122,14 @@ void HLModelIntermediette::FromZDisplayList(HLModelIntermediette* model, ZDispla { int ss = (data & 0x0000FF0000000000) >> 40; int nn = (data & 0x000000FF00000000) >> 32; - int dd = (data & 0xFFFFFFFF); + // int dd = (data & 0xFFFFFFFF); int sft = 32 - (nn + 1) - ss; if (sft == 3) { - int mode1 = (dd & 0xCCCC0000) >> 0; - int mode2 = (dd & 0x33330000) >> 0; - + // int mode1 = (dd & 0xCCCC0000) >> 0; + // int mode2 = (dd & 0x33330000) >> 0; } } else if (opcode == F3DZEXOpcode::G_SETPRIMCOLOR) @@ -155,20 +155,30 @@ void HLModelIntermediette::FromZDisplayList(HLModelIntermediette* model, ZDispla lastMat->clrL = ff; lastMat->clrM = mm; } - else if (opcode == F3DZEXOpcode::G_SETTILE && (F3DZEXOpcode)(zDisplayList->instructions[i - 1] >> 56) != F3DZEXOpcode::G_RDPPIPESYNC) + else if (opcode == F3DZEXOpcode::G_SETTILE && + (F3DZEXOpcode)(zDisplayList->instructions[i - 1] >> 56) != + F3DZEXOpcode::G_RDPPIPESYNC) { - int fff = (data & 0b0000000011100000000000000000000000000000000000000000000000000000) >> 53; - int ii = (data & 0b0000000000011000000000000000000000000000000000000000000000000000) >> 51; - int nnnnnnnnn = (data & 0b0000000000000011111111100000000000000000000000000000000000000000) >> 41; - int mmmmmmmmm = (data & 0b0000000000000000000000011111111100000000000000000000000000000000) >> 32; - int ttt = (data & 0b0000000000000000000000000000000000000111000000000000000000000000) >> 24; - int pppp = (data & 0b0000000000000000000000000000000000000000111100000000000000000000) >> 20; - int cc = (data & 0b0000000000000000000000000000000000000000000011000000000000000000) >> 18; - int aaaa = (data & 0b0000000000000000000000000000000000000000000000111100000000000000) >> 14; - int ssss = (data & 0b0000000000000000000000000000000000000000000000000011110000000000) >> 10; - int dd = (data & 0b0000000000000000000000000000000000000000000000000000001100000000) >> 8; - int bbbb = (data & 0b0000000000000000000000000000000000000000000000000000000011110000) >> 4; - int uuuu = (data & 0b0000000000000000000000000000000000000000000000000000000000001111); + // int fff = (data & 0b0000000011100000000000000000000000000000000000000000000000000000) + // >> 53; int ii = (data & + // 0b0000000000011000000000000000000000000000000000000000000000000000) >> 51; int + // nnnnnnnnn = (data & + // 0b0000000000000011111111100000000000000000000000000000000000000000) >> 41; int + // mmmmmmmmm = (data & + // 0b0000000000000000000000011111111100000000000000000000000000000000) >> 32; int ttt = + // (data & 0b0000000000000000000000000000000000000111000000000000000000000000) >> 24; int + // pppp = (data & 0b0000000000000000000000000000000000000000111100000000000000000000) >> + // 20; + int cc = + (data & 0b0000000000000000000000000000000000000000000011000000000000000000) >> 18; + // int aaaa = (data & + // 0b0000000000000000000000000000000000000000000000111100000000000000) >> 14; int ssss = + // (data & 0b0000000000000000000000000000000000000000000000000011110000000000) >> 10; + int dd = + (data & 0b0000000000000000000000000000000000000000000000000000001100000000) >> 8; + // int bbbb = (data & + // 0b0000000000000000000000000000000000000000000000000000000011110000) >> 4; int uuuu = + // (data & 0b0000000000000000000000000000000000000000000000000000000000001111); lastMat->cmtH = (HLMaterialCmt)cc; lastMat->cmtV = (HLMaterialCmt)dd; @@ -188,7 +198,7 @@ void HLModelIntermediette::FromZDisplayList(HLModelIntermediette* model, ZDispla lastMat->clrA = lastClrA; lastMat->clrL = lastClrL; lastMat->clrM = lastClrM; - + // Bit of a hack here... int32_t lastData = (int32_t)(zDisplayList->instructions[i - 1]); string texName = zDisplayList->textures[lastData & 0x00FFFFFF]->GetName(); @@ -200,7 +210,8 @@ void HLModelIntermediette::FromZDisplayList(HLModelIntermediette* model, ZDispla meshCnt++; mesh = new HLMeshIntermediette(); - mesh->name = StringHelper::Sprintf("%s_%i", zDisplayList->GetName().c_str(), meshCnt); + mesh->name = + StringHelper::Sprintf("%s_%i", zDisplayList->GetName().c_str(), meshCnt); } } else if (opcode == F3DZEXOpcode::G_SETTIMG) @@ -242,7 +253,7 @@ void HLModelIntermediette::FromZDisplayList(HLModelIntermediette* model, ZDispla mesh->commands.push_back(new HLMeshCmdTriangle2(aa, bb, cc, 0, dd, ee, ff, 0)); } - int bp = 0; + // int bp = 0; } limb->commands.push_back(new HLLimbCommand(mesh->name, lastMat->name)); @@ -250,18 +261,18 @@ void HLModelIntermediette::FromZDisplayList(HLModelIntermediette* model, ZDispla model->blocks.push_back(mesh); model->blocks.push_back(limb); - //return model; + // return model; } void HLModelIntermediette::FromZSkeleton(HLModelIntermediette* model, ZSkeleton* zSkeleton) { model->hasSkeleton = true; - for (int i = 0; i < zSkeleton->limbs.size(); i++) + for (size_t i = 0; i < zSkeleton->limbs.size(); i++) { - ZLimb* limb = zSkeleton->limbs[i]; + // ZLimb* limb = zSkeleton->limbs[i]; - for (int j = 0; j < model->blocks.size(); j++) + for (size_t j = 0; j < model->blocks.size(); j++) { } } @@ -332,7 +343,7 @@ string HLModelIntermediette::OutputCode() for (HLIntermediette* block : blocks) { string code = block->OutputCode(); - + output += code; if (code != "") @@ -360,8 +371,7 @@ std::string HLModelIntermediette::OutputXML() return printer.CStr(); } - -template +template inline T* HLModelIntermediette::FindByName(string name) { for (HLIntermediette* block : blocks) @@ -376,7 +386,7 @@ inline T* HLModelIntermediette::FindByName(string name) return nullptr; } -template +template inline T* HLModelIntermediette::FindByType() { for (HLIntermediette* block : blocks) @@ -415,17 +425,14 @@ string HLIntermediette::OutputOBJ() void HLIntermediette::OutputAssimp(aiScene* scene, std::vector* verts) { - } void HLIntermediette::OutputXML(tinyxml2::XMLDocument* doc, tinyxml2::XMLElement* root) { - } void HLMeshCommand::InitFromXML(XMLElement* xmlElement) { - } string HLMeshCommand::OutputCode(HLModelIntermediette* parent) @@ -446,7 +453,6 @@ void HLMeshCommand::OutputXML(tinyxml2::XMLElement* parent) { } - HLVerticesIntermediette::HLVerticesIntermediette() : HLIntermediette() { vertices = vector(); @@ -456,10 +462,13 @@ void HLVerticesIntermediette::InitFromXML(XMLElement* verticesElement) { name = verticesElement->Attribute("Name"); - for (XMLElement* child = verticesElement->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) - vertices.push_back(Vertex(child->IntAttribute("X"), child->IntAttribute("Y"), child->IntAttribute("Z"), child->IntAttribute("Flags"), - child->IntAttribute("S"), child->IntAttribute("T"), - child->IntAttribute("R"), child->IntAttribute("G"), child->IntAttribute("B"), child->IntAttribute("A"))); + for (XMLElement* child = verticesElement->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) + vertices.push_back(Vertex(child->IntAttribute("X"), child->IntAttribute("Y"), + child->IntAttribute("Z"), child->IntAttribute("Flags"), + child->IntAttribute("S"), child->IntAttribute("T"), + child->IntAttribute("R"), child->IntAttribute("G"), + child->IntAttribute("B"), child->IntAttribute("A"))); } void HLVerticesIntermediette::InitFromVertices(vector dispListVertices) @@ -476,8 +485,8 @@ string HLVerticesIntermediette::OutputCode(HLModelIntermediette* parent) for (Vertex v : vertices) { - output += StringHelper::Sprintf("\t{ %i, %i, %i, %i, %i, %i, %i, %i, %i, %i },\n", - v.x, v.y, v.z, v.flag, v.s, v.t, v.r, v.g, v.b, v.a); + output += StringHelper::Sprintf("\t{ %i, %i, %i, %i, %i, %i, %i, %i, %i, %i },\n", v.x, v.y, + v.z, v.flag, v.s, v.t, v.r, v.g, v.b, v.a); } output += StringHelper::Sprintf("};\n"); @@ -491,32 +500,34 @@ std::string HLVerticesIntermediette::OutputOBJ() for (Vertex v : vertices) { - output += StringHelper::Sprintf("v %f %f %f %i %i %i %i\n", (float)v.x * 0.1f, (float)v.y * 0.1f, (float)v.z * 0.1f, v.r, v.g, v.b, v.a); - //output += StringHelper::Sprintf("v %f %f %f\n", (float)v.x * 0.1f, (float)v.y * 0.1f, (float)v.z * 0.1f); + output += StringHelper::Sprintf("v %f %f %f %i %i %i %i\n", (float)v.x * 0.1f, + (float)v.y * 0.1f, (float)v.z * 0.1f, v.r, v.g, v.b, v.a); + // output += StringHelper::Sprintf("v %f %f %f\n", (float)v.x * 0.1f, (float)v.y * 0.1f, + // (float)v.z * 0.1f); } - //for (Vertex v : vertices) - //output += StringHelper::Sprintf("vt %i %i\n", v.s, v.t); + // for (Vertex v : vertices) + // output += StringHelper::Sprintf("vt %i %i\n", v.s, v.t); return output; } void HLVerticesIntermediette::OutputAssimp(aiScene* scene, std::vector* verts) { - //aiVector3D* verts = new aiVector3D[vertices.size()]; - //aiVector3D* normals = new aiVector3D[vertices.size()]; + // aiVector3D* verts = new aiVector3D[vertices.size()]; + // aiVector3D* normals = new aiVector3D[vertices.size()]; verts->clear(); - for (int i = 0; i < vertices.size(); i++) + for (size_t i = 0; i < vertices.size(); i++) { verts->push_back(aiVector3D(vertices[i].x, vertices[i].y, vertices[i].z)); - //normals[i] = aiVector3D(vertices[i].x, vertices[i].y, vertices[i].z); + // normals[i] = aiVector3D(vertices[i].x, vertices[i].y, vertices[i].z); } - //mesh->mVertices = verts; - //mesh->mNormals = normals; - //mesh->mNumVertices += vertices.size(); + // mesh->mVertices = verts; + // mesh->mNormals = normals; + // mesh->mNumVertices += vertices.size(); } void HLVerticesIntermediette::OutputXML(tinyxml2::XMLDocument* doc, tinyxml2::XMLElement* root) @@ -562,8 +573,9 @@ string HLMeshCmdGeoSettings::OutputCode(HLModelIntermediette* parent) string output = ""; if (off != "") - output += StringHelper::Sprintf("gsSPClearGeometryMode(G_TEXTURE_ENABLE | %s),\n", off.c_str()); - + output += + StringHelper::Sprintf("gsSPClearGeometryMode(G_TEXTURE_ENABLE | %s),\n", off.c_str()); + if (on != "") output += StringHelper::Sprintf("gsSPSetGeometryMode(G_TEXTURE_ENABLE | %s),", on.c_str()); @@ -635,7 +647,8 @@ HLMeshCmdTriangle2::HLMeshCmdTriangle2() flag1 = 0; } -HLMeshCmdTriangle2::HLMeshCmdTriangle2(int32_t nV0, int32_t nV1, int32_t nV2, int32_t nFlag0, int32_t nV10, int32_t nV11, int32_t nV12, int32_t nFlag1) +HLMeshCmdTriangle2::HLMeshCmdTriangle2(int32_t nV0, int32_t nV1, int32_t nV2, int32_t nFlag0, + int32_t nV10, int32_t nV11, int32_t nV12, int32_t nFlag1) { v0 = nV0; v1 = nV1; @@ -654,25 +667,28 @@ void HLMeshCmdTriangle2::InitFromXML(tinyxml2::XMLElement* xmlElement) v2 = xmlElement->IntAttribute("V2"); flag0 = xmlElement->IntAttribute("Flag0"); v10 = xmlElement->IntAttribute("V10"); - v11 = xmlElement->IntAttribute("V11"); + v11 = xmlElement->IntAttribute("V11"); v12 = xmlElement->IntAttribute("V12"); flag1 = xmlElement->IntAttribute("Flag1"); } string HLMeshCmdTriangle2::OutputCode(HLModelIntermediette* parent) { - return StringHelper::Sprintf("gsSP2Triangles(%i, %i, %i, %i, %i, %i, %i, %i),", v0, v1, v2, flag0, v10, v11, v12, flag1); + return StringHelper::Sprintf("gsSP2Triangles(%i, %i, %i, %i, %i, %i, %i, %i),", v0, v1, v2, + flag0, v10, v11, v12, flag1); } std::string HLMeshCmdTriangle2::OutputOBJ(HLModelIntermediette* parent) { - HLVerticesIntermediette* verts = parent->FindByName(""); + // HLVerticesIntermediette* verts = parent->FindByName(""); string output = ""; int startIndex = parent->startIndex; - output += StringHelper::Sprintf("f %i %i %i\n", startIndex+v0+1, startIndex + v1+1, startIndex + v2+1); - output += StringHelper::Sprintf("f %i %i %i\n", startIndex + v10+1, startIndex + v11+1, startIndex + v12+1); + output += StringHelper::Sprintf("f %i %i %i\n", startIndex + v0 + 1, startIndex + v1 + 1, + startIndex + v2 + 1); + output += StringHelper::Sprintf("f %i %i %i\n", startIndex + v10 + 1, startIndex + v11 + 1, + startIndex + v12 + 1); return output; } @@ -714,7 +730,7 @@ void HLMeshCmdTriangle2::OutputXML(tinyxml2::XMLElement* parent) elem->SetAttribute("V11", v11); elem->SetAttribute("V12", v12); elem->SetAttribute("Flag1", flag1); - + parent->InsertEndChild(elem); } @@ -736,7 +752,7 @@ void HLMeshCmdLoadVertices::OutputXML(tinyxml2::XMLElement* parent) elem->SetAttribute("StartIndex", startIndex); elem->SetAttribute("NumVerts", numVerts); - + parent->InsertEndChild(elem); } @@ -760,24 +776,25 @@ void HLMeshCmdLoadVertices::OutputAssimp(HLModelIntermediette* parent, aiScene* string HLMeshCmdLoadVertices::OutputCode(HLModelIntermediette* parent) { HLVerticesIntermediette* verts = parent->FindByType(); - return StringHelper::Sprintf("gsSPVertex(&%s[%i], %i, %i),", verts->name.c_str(), startIndex, numVerts, 0); + return StringHelper::Sprintf("gsSPVertex(&%s[%i], %i, %i),", verts->name.c_str(), startIndex, + numVerts, 0); } HLMaterialIntermediette::HLMaterialIntermediette() { textureName = ""; - //repeatH = false; - //repeatV = false; + // repeatH = false; + // repeatV = false; clrR = 0; clrG = 0; clrB = 0; clrA = 0; clrM = 0; clrL = 0; - //clampH = false; - //clampV = false; - //mirrorH = false; - //mirrorV = false; + // clampH = false; + // clampV = false; + // mirrorH = false; + // mirrorV = false; cmtH = HLMaterialCmt::Wrap; cmtV = HLMaterialCmt::Wrap; } @@ -786,12 +803,12 @@ void HLMaterialIntermediette::InitFromXML(tinyxml2::XMLElement* xmlElement) { name = xmlElement->Attribute("Name"); textureName = xmlElement->Attribute("TextureName"); - //repeatH = xmlElement->BoolAttribute("RepeatH"); - //repeatV = xmlElement->BoolAttribute("RepeatV"); - //clampH = xmlElement->BoolAttribute("ClampH"); - //clampV = xmlElement->BoolAttribute("ClampV"); - //mirrorH = xmlElement->BoolAttribute("MirrorH"); - //mirrorV = xmlElement->BoolAttribute("MirrorV"); + // repeatH = xmlElement->BoolAttribute("RepeatH"); + // repeatV = xmlElement->BoolAttribute("RepeatV"); + // clampH = xmlElement->BoolAttribute("ClampH"); + // clampV = xmlElement->BoolAttribute("ClampV"); + // mirrorH = xmlElement->BoolAttribute("MirrorH"); + // mirrorV = xmlElement->BoolAttribute("MirrorV"); clrR = xmlElement->IntAttribute("ClrR"); clrG = xmlElement->IntAttribute("ClrG"); clrB = xmlElement->IntAttribute("ClrB"); @@ -835,7 +852,8 @@ string HLDisplayListIntermediette::OutputCode() void HLDisplayListIntermediette::InitFromXML(tinyxml2::XMLElement* xmlElement) { - for (XMLElement* child = xmlElement->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for (XMLElement* child = xmlElement->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) { string name = child->Name(); @@ -867,7 +885,6 @@ void HLDisplayListCmdDrawMesh::InitFromXML(tinyxml2::XMLElement* xmlElement) { meshName = xmlElement->Attribute("Mesh"); materialName = xmlElement->Attribute("Material"); - } std::string HLDisplayListCmdDrawMesh::OutputCode() @@ -885,16 +902,19 @@ void HLTextureIntermediette::InitFromXML(tinyxml2::XMLElement* xmlElement) name = xmlElement->Attribute("Name"); fileName = xmlElement->Attribute("TextureName"); - //string format = xmlElement->Attribute("Format"); - string format = "rgb5a1"; // TEST + // string format = xmlElement->Attribute("Format"); + string format = "rgb5a1"; // TEST - //tex = HLTexture::FromPNG(fileName, (HLTextureType)ZTexture::GetTextureTypeFromString(format)); - tex = ZTexture::FromPNG(Path::GetDirectoryName(Globals::Instance->inputPath) + "/" + fileName, ZTexture::GetTextureTypeFromString(format)); + // tex = HLTexture::FromPNG(fileName, + // (HLTextureType)ZTexture::GetTextureTypeFromString(format)); + tex = ZTexture::FromPNG(Path::GetDirectoryName(Globals::Instance->inputPath) + "/" + fileName, + ZTexture::GetTextureTypeFromString(format)); } std::string HLTextureIntermediette::OutputCode() { - return StringHelper::Sprintf("#include <../%s/%s.inc.c>", Globals::Instance->outputPath.c_str(), name.c_str()); + return StringHelper::Sprintf("#include <../%s/%s.inc.c>", Globals::Instance->outputPath.c_str(), + name.c_str()); } void HLTextureIntermediette::OutputXML(tinyxml2::XMLDocument* doc, tinyxml2::XMLElement* root) @@ -902,7 +922,8 @@ void HLTextureIntermediette::OutputXML(tinyxml2::XMLDocument* doc, tinyxml2::XML XMLElement* element = doc->NewElement("Texture"); element->SetAttribute("Name", name.c_str()); - element->SetAttribute("TextureName", (name + "." + tex->GetExternalExtension() + ".png").c_str()); + element->SetAttribute("TextureName", + (name + "." + tex->GetExternalExtension() + ".png").c_str()); tex->Save(Globals::Instance->outputPath); root->InsertEndChild(element); @@ -943,7 +964,8 @@ void HLMeshIntermediette::InitFromXML(tinyxml2::XMLElement* xmlElement) { name = xmlElement->Attribute("Name"); - for (XMLElement* child = xmlElement->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for (XMLElement* child = xmlElement->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) { string name = child->Name(); @@ -976,13 +998,15 @@ string HLMeshIntermediette::OutputCode(string materialName) HLTextureIntermediette* tex = parent->FindByName(mat->textureName); output += StringHelper::Sprintf("\tgsDPPipeSync(),\n"); - output += StringHelper::Sprintf("\tgsDPSetPrimColor(%i, %i, %i, %i, %i, %i),\n", mat->clrL, mat->clrM, mat->clrR, mat->clrG, mat->clrB, mat->clrA); + output += StringHelper::Sprintf("\tgsDPSetPrimColor(%i, %i, %i, %i, %i, %i),\n", mat->clrL, + mat->clrM, mat->clrR, mat->clrG, mat->clrB, mat->clrA); output += StringHelper::Sprintf("\tgsDPPipeSync(),\n"); output += StringHelper::Sprintf("\tgsSPTexture(65535, 65535, 0, 0, G_ON),\n"); - output += StringHelper::Sprintf("\tgsDPLoadMultiBlock(%s, 0, 0, %s, %s, %i, %i, 0, 0, 0, 5, 5, 0, 0),\n", mat->textureName.c_str(), - tex->tex->GetIMFmtFromType().c_str(), tex->tex->GetIMSizFromType().c_str(), tex->tex->GetWidth(), tex->tex->GetHeight()); - + output += StringHelper::Sprintf( + "\tgsDPLoadMultiBlock(%s, 0, 0, %s, %s, %i, %i, 0, 0, 0, 5, 5, 0, 0),\n", + mat->textureName.c_str(), tex->tex->GetIMFmtFromType().c_str(), + tex->tex->GetIMSizFromType().c_str(), tex->tex->GetWidth(), tex->tex->GetHeight()); for (HLMeshCommand* cmd : commands) output += "\t" + cmd->OutputCode(parent) + "\n"; @@ -1005,7 +1029,8 @@ string HLMeshIntermediette::OutputOBJ() void HLMeshIntermediette::OutputAssimp(aiScene* scene, std::vector* verts) { aiMesh* mesh = new aiMesh(); - mesh->mVertices = new aiVector3D[8192]; // TODO: Replace these hardcoded counts with the actual count + mesh->mVertices = + new aiVector3D[8192]; // TODO: Replace these hardcoded counts with the actual count mesh->mNormals = new aiVector3D[8192]; mesh->mFaces = new aiFace[8192]; mesh->mPrimitiveTypes = 8; @@ -1024,12 +1049,12 @@ void HLMeshIntermediette::OutputXML(tinyxml2::XMLDocument* doc, tinyxml2::XMLEle XMLElement* element = doc->NewElement("Mesh"); element->SetAttribute("Name", name.c_str()); - + for (HLMeshCommand* cmd : commands) { cmd->OutputXML(element); } - + root->InsertEndChild(element); } @@ -1042,7 +1067,8 @@ void HLLimbIntermediette::InitFromXML(tinyxml2::XMLElement* xmlElement) { name = xmlElement->Attribute("Name"); - for (XMLElement* child = xmlElement->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for (XMLElement* child = xmlElement->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) { string name = child->Name(); @@ -1120,8 +1146,8 @@ std::string HLLimbCommand::OutputCode(HLModelIntermediette* parent) // Time to generate the display list... HLMeshIntermediette* mesh = parent->FindByName(meshName); - HLMaterialIntermediette* mat = parent->FindByName(materialName); - HLTextureIntermediette* tex = parent->FindByName(mat->textureName); + // HLMaterialIntermediette* mat = parent->FindByName(materialName); + // HLTextureIntermediette* tex = parent->FindByName(mat->textureName); output += mesh->OutputCode(materialName); @@ -1138,11 +1164,11 @@ HLTerminator::~HLTerminator() void HLTerminator::OutputAssimp(aiScene* scene, std::vector* verts) { - for (int i = parent->meshStartIndex; i < scene->mNumMeshes; i++) + for (uint32_t i = parent->meshStartIndex; i < scene->mNumMeshes; i++) { scene->mMeshes[i]->mNumVertices = verts->size(); - for (int j = 0; j < verts->size(); j++) + for (uint32_t j = 0; j < verts->size(); j++) scene->mMeshes[i]->mVertices[j] = verts[0][j]; parent->meshStartIndex++; diff --git a/tools/ZAPD/ZAPD/HighLevel/HLModelIntermediette.h b/tools/ZAPD/ZAPD/HighLevel/HLModelIntermediette.h index c64653ef5d..b879974600 100644 --- a/tools/ZAPD/ZAPD/HighLevel/HLModelIntermediette.h +++ b/tools/ZAPD/ZAPD/HighLevel/HLModelIntermediette.h @@ -1,14 +1,14 @@ #pragma once +#include #include -#include #include -#include "HLTexture.h" -#include "HLFileIntermediette.h" +#include +#include #include "../ZDisplayList.h" #include "../ZSkeleton.h" -#include -#include +#include "HLFileIntermediette.h" +#include "HLTexture.h" /* * An intermediette format for models. Goes from FBX<-->Intermediette<-->Display List C Code. @@ -43,8 +43,8 @@ public: bool startsWithClearGeometryMode; bool lerpBeforeTextureBlock; - int startIndex; - int meshStartIndex; + uint32_t startIndex; + uint32_t meshStartIndex; HLModelIntermediette(); ~HLModelIntermediette(); @@ -98,10 +98,10 @@ class HLMaterialIntermediette : public HLIntermediette { public: std::string textureName; - //int32_t repeatH, repeatV; + // int32_t repeatH, repeatV; uint8_t clrR, clrG, clrB, clrA, clrM, clrL; - //bool clampH, clampV; - //bool mirrorH, mirrorV; + // bool clampH, clampV; + // bool mirrorH, mirrorV; HLMaterialCmt cmtH, cmtV; // TODO: Remember to add lerp params here... @@ -130,7 +130,7 @@ public: std::vector vertices; HLVerticesIntermediette(); - + virtual void InitFromXML(tinyxml2::XMLElement* verticesElement); void InitFromVertices(std::vector dispListVertices); virtual std::string OutputCode(HLModelIntermediette* parent); @@ -159,7 +159,8 @@ public: int32_t v0, v1, v2, flag0, v10, v11, v12, flag1; HLMeshCmdTriangle2(); - HLMeshCmdTriangle2(int32_t nV0, int32_t nV1, int32_t nV2, int32_t nFlag0, int32_t nV10, int32_t nV11, int32_t nV12, int32_t nFlag1); + HLMeshCmdTriangle2(int32_t nV0, int32_t nV1, int32_t nV2, int32_t nFlag0, int32_t nV10, + int32_t nV11, int32_t nV12, int32_t nFlag1); virtual void InitFromXML(tinyxml2::XMLElement* xmlElement); virtual std::string OutputCode(HLModelIntermediette* parent); diff --git a/tools/ZAPD/ZAPD/HighLevel/HLTexture.cpp b/tools/ZAPD/ZAPD/HighLevel/HLTexture.cpp index 192c50e22f..f9b362cfdc 100644 --- a/tools/ZAPD/ZAPD/HighLevel/HLTexture.cpp +++ b/tools/ZAPD/ZAPD/HighLevel/HLTexture.cpp @@ -1,6 +1,6 @@ #include "HLTexture.h" -#include "../StringHelper.h" #include +#include "../StringHelper.h" using namespace std; @@ -9,7 +9,8 @@ HLTexture* HLTexture::FromPNG(std::string pngFilePath, HLTextureType texType) int comp; HLTexture* tex = new HLTexture(); tex->type = texType; - tex->bmpRgba = (uint8_t*)stbi_load((pngFilePath).c_str(), (int*)&tex->width, (int*)&tex->height, &comp, STBI_rgb_alpha); - + tex->bmpRgba = (uint8_t*)stbi_load((pngFilePath).c_str(), (int*)&tex->width, (int*)&tex->height, + &comp, STBI_rgb_alpha); + return tex; } diff --git a/tools/ZAPD/ZAPD/HighLevel/HLTexture.h b/tools/ZAPD/ZAPD/HighLevel/HLTexture.h index c8c187b80a..53f1cadee6 100644 --- a/tools/ZAPD/ZAPD/HighLevel/HLTexture.h +++ b/tools/ZAPD/ZAPD/HighLevel/HLTexture.h @@ -1,10 +1,11 @@ #pragma once #include -#include #include +#include -// TODO: This was duplicated from ZTexture. It's probably going to be modified to differentiate from ZTexture but if not, we're going to need to have the two share an enum. +// TODO: This was duplicated from ZTexture. It's probably going to be modified to differentiate from +// ZTexture but if not, we're going to need to have the two share an enum. enum class HLTextureType { RGBA32bpp, @@ -19,7 +20,6 @@ enum class HLTextureType Error }; - class HLTexture { public: diff --git a/tools/ZAPD/ZAPD/Main.cpp b/tools/ZAPD/ZAPD/Main.cpp index 9e0195c508..d771e7a357 100644 --- a/tools/ZAPD/ZAPD/Main.cpp +++ b/tools/ZAPD/ZAPD/Main.cpp @@ -1,20 +1,20 @@ -#include "ZFile.h" -#include "ZTexture.h" -#include "ZBlob.h" -#include "ZAnimation.h" -#include "HighLevel/HLModelIntermediette.h" +#include "BuildInfo.h" +#include "Directory.h" +#include "File.h" +#include "Globals.h" #include "HighLevel/HLAnimationIntermediette.h" +#include "HighLevel/HLModelIntermediette.h" #include "Overlays/ZOverlay.h" #include "Path.h" -#include "File.h" -#include "Directory.h" -#include "Globals.h" -#include "BuildInfo.h" +#include "ZAnimation.h" +#include "ZBlob.h" +#include "ZFile.h" +#include "ZTexture.h" #if !defined(_MSC_VER) && !defined(__CYGWIN__) #include -#include #include +#include #endif #include @@ -23,9 +23,11 @@ using namespace tinyxml2; using namespace std; -bool Parse(const std::string& xmlFilePath, const std::string& basePath, const std::string& outPath, ZFileMode fileMode); +bool Parse(const std::string& xmlFilePath, const std::string& basePath, const std::string& outPath, + ZFileMode fileMode); -void BuildAssetTexture(const std::string& pngFilePath, TextureType texType, const std::string& outPath); +void BuildAssetTexture(const std::string& pngFilePath, TextureType texType, + const std::string& outPath); void BuildAssetBlob(const std::string& blobFilePath, const std::string& outPath); void BuildAssetModelIntermediette(const std::string& mdlPath, const std::string& outPath); void BuildAssetAnimationIntermediette(const std::string& animPath, const std::string& outPath); @@ -41,13 +43,13 @@ void ErrorHandler(int sig) size = backtrace(array, 4096); symbols = backtrace_symbols(array, 4096); - for (int i = 1; i < size; i++) + for (size_t i = 1; i < size; i++) { - size_t len = strlen(symbols[i]); + // size_t len = strlen(symbols[i]); cout << symbols[i] << "\n"; } - //cout << "Error: signal " << sig << ":\n"; + // cout << "Error: signal " << sig << ":\n"; backtrace_symbols_fd(array, size, STDERR_FILENO); exit(1); } @@ -101,82 +103,83 @@ int NewMain(int argc, char* argv[]) { string arg = argv[i]; - if (arg == "-o" || arg == "--outputpath") // Set output path + if (arg == "-o" || arg == "--outputpath") // Set output path { Globals::Instance->outputPath = argv[i + 1]; i++; } - else if (arg == "-i" || arg == "--inputpath") // Set input path + else if (arg == "-i" || arg == "--inputpath") // Set input path { Globals::Instance->inputPath = argv[i + 1]; i++; } - else if (arg == "-b" || arg == "--baserompath") // Set baserom path + else if (arg == "-b" || arg == "--baserompath") // Set baserom path { Globals::Instance->baseRomPath = argv[i + 1]; i++; } - else if (arg == "-gsf") // Generate source file during extraction + else if (arg == "-gsf") // Generate source file during extraction { Globals::Instance->genSourceFile = string(argv[i + 1]) == "1"; i++; } - else if (arg == "-ifp") // Include file prefix in generated symbols + else if (arg == "-ifp") // Include file prefix in generated symbols { Globals::Instance->includeFilePrefix = string(argv[i + 1]) == "1"; i++; } - else if (arg == "-tm") // Test Mode + else if (arg == "-tm") // Test Mode { Globals::Instance->testMode = string(argv[i + 1]) == "1"; i++; } - else if (arg == "-profile") // Profile + else if (arg == "-profile") // Profile { Globals::Instance->profile = string(argv[i + 1]) == "1"; i++; } - else if (arg == "-uer") // Split resources into their individual components (enabled by default) + else if (arg == + "-uer") // Split resources into their individual components (enabled by default) { Globals::Instance->useExternalResources = string(argv[i + 1]) == "1"; i++; } - else if (arg == "-tt") // Set texture type + else if (arg == "-tt") // Set texture type { Globals::Instance->texType = ZTexture::GetTextureTypeFromString(argv[i + 1]); i++; } - else if (arg == "-cfg") // Set cfg path + else if (arg == "-cfg") // Set cfg path { Globals::Instance->cfgPath = argv[i + 1]; i++; } - else if (arg == "-sm") // Set symbol map path + else if (arg == "-sm") // Set symbol map path { Globals::Instance->GenSymbolMap(argv[i + 1]); i++; } - else if (arg == "-rconf") // Read Config File + else if (arg == "-rconf") // Read Config File { Globals::Instance->ReadConfigFile(argv[i + 1]); i++; } - else if (arg == "-al") // Set actor list + else if (arg == "-al") // Set actor list { i++; } - else if (arg == "-ol") // Set object list + else if (arg == "-ol") // Set object list { i++; } - else if (arg == "-eh") // Enable Error Handler + else if (arg == "-eh") // Enable Error Handler { #if !defined(_MSC_VER) && !defined(__CYGWIN__) signal(SIGSEGV, ErrorHandler); signal(SIGABRT, ErrorHandler); #endif } - else if (arg == "-v") // Verbose + else if (arg == "-v") // Verbose { Globals::Instance->verbosity = (VerbosityLevel)strtol(argv[++i], NULL, 16); } @@ -185,9 +188,15 @@ int NewMain(int argc, char* argv[]) if (Globals::Instance->verbosity >= VERBOSITY_INFO) printf("ZAPD: Zelda Asset Processor For Decomp: %s\n", gBuildHash); - if (fileMode == ZFileMode::Build || fileMode == ZFileMode::Extract || fileMode == ZFileMode::BuildSourceFile) + if (fileMode == ZFileMode::Build || fileMode == ZFileMode::Extract || + fileMode == ZFileMode::BuildSourceFile) { - Parse(Globals::Instance->inputPath, Globals::Instance->baseRomPath, Globals::Instance->outputPath, fileMode); + bool parseSuccessful = Parse(Globals::Instance->inputPath, Globals::Instance->baseRomPath, + Globals::Instance->outputPath, fileMode); + if (!parseSuccessful) + { + return 1; + } } else if (fileMode == ZFileMode::BuildTexture) { @@ -210,11 +219,14 @@ int NewMain(int argc, char* argv[]) } else if (fileMode == ZFileMode::BuildAnimationIntermediette) { - BuildAssetAnimationIntermediette(Globals::Instance->inputPath, Globals::Instance->outputPath); + BuildAssetAnimationIntermediette(Globals::Instance->inputPath, + Globals::Instance->outputPath); } else if (fileMode == ZFileMode::BuildOverlay) { - ZOverlay* overlay = ZOverlay::FromBuild(Path::GetDirectoryName(Globals::Instance->inputPath), Path::GetDirectoryName(Globals::Instance->cfgPath)); + ZOverlay* overlay = + ZOverlay::FromBuild(Path::GetDirectoryName(Globals::Instance->inputPath), + Path::GetDirectoryName(Globals::Instance->cfgPath)); if (overlay) File::WriteAllText(Globals::Instance->outputPath, overlay->GetSourceOutputCode("")); @@ -223,20 +235,28 @@ int NewMain(int argc, char* argv[]) return 0; } -bool Parse(const std::string& xmlFilePath, const std::string& basePath, const std::string& outPath, ZFileMode fileMode) +bool Parse(const std::string& xmlFilePath, const std::string& basePath, const std::string& outPath, + ZFileMode fileMode) { XMLDocument doc; XMLError eResult = doc.LoadFile(xmlFilePath.c_str()); if (eResult != tinyxml2::XML_SUCCESS) + { + fprintf(stderr, "Invalid xml file: '%s'\n", xmlFilePath.c_str()); return false; + } XMLNode* root = doc.FirstChild(); if (root == nullptr) + { + fprintf(stderr, "Missing Root tag in xml file: '%s'\n", xmlFilePath.c_str()); return false; + } - for (XMLElement* child = root->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for (XMLElement* child = root->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) { if (string(child->Name()) == "File") { @@ -264,7 +284,8 @@ bool Parse(const std::string& xmlFilePath, const std::string& basePath, const st return true; } -void BuildAssetTexture(const std::string& pngFilePath, TextureType texType, const std::string& outPath) +void BuildAssetTexture(const std::string& pngFilePath, TextureType texType, + const std::string& outPath) { vector split = StringHelper::Split(outPath, "/"); string name = StringHelper::Split(split[split.size() - 1], ".")[0]; @@ -274,7 +295,8 @@ void BuildAssetTexture(const std::string& pngFilePath, TextureType texType, cons if (File::Exists(cfgPath)) name = File::ReadAllText(cfgPath); - //string src = StringHelper::Sprintf("u64 %s[] = \n{\n", name.c_str()) + tex->GetSourceOutputCode(name) + "};\n"; + // string src = StringHelper::Sprintf("u64 %s[] = \n{\n", name.c_str()) + + // tex->GetSourceOutputCode(name) + "};\n"; string src = tex->GetSourceOutputCode(name); File::WriteAllText(outPath, src); @@ -288,7 +310,8 @@ void BuildAssetBlob(const std::string& blobFilePath, const std::string& outPath) ZBlob* blob = ZBlob::FromFile(blobFilePath); string name = StringHelper::Split(split[split.size() - 1], ".")[0]; - //string src = StringHelper::Sprintf("u8 %s[] = \n{\n", name.c_str()) + blob->GetSourceOutputCode(name) + "};\n"; + // string src = StringHelper::Sprintf("u8 %s[] = \n{\n", name.c_str()) + + // blob->GetSourceOutputCode(name) + "};\n"; string src = blob->GetSourceOutputCode(name); File::WriteAllText(outPath, src); @@ -299,7 +322,7 @@ void BuildAssetBlob(const std::string& blobFilePath, const std::string& outPath) void BuildAssetModelIntermediette(const std::string& mdlPath, const std::string& outPath) { XMLDocument doc; - XMLError eResult = doc.LoadFile(mdlPath.c_str()); + // XMLError eResult = doc.LoadFile(mdlPath.c_str()); vector split = StringHelper::Split(outPath, "/"); HLModelIntermediette* mdl = HLModelIntermediette::FromXML(doc.RootElement()); @@ -318,8 +341,8 @@ void BuildAssetAnimationIntermediette(const std::string& animPath, const std::st ZAnimation* zAnim = anim->ToZAnimation(); zAnim->SetName(Path::GetFileNameWithoutExtension(split[split.size() - 1])); zAnim->parent = file; - //zAnim->rotationIndicesSeg = 1; - //zAnim->rotationValuesSeg = 2; + // zAnim->rotationIndicesSeg = 1; + // zAnim->rotationValuesSeg = 2; zAnim->GetSourceOutputCode(split[split.size() - 2]); string output = ""; diff --git a/tools/ZAPD/ZAPD/OutputFormatter.cpp b/tools/ZAPD/ZAPD/OutputFormatter.cpp index 5e7c35ccd4..3a7fbd63d6 100644 --- a/tools/ZAPD/ZAPD/OutputFormatter.cpp +++ b/tools/ZAPD/ZAPD/OutputFormatter.cpp @@ -1,6 +1,6 @@ #include "OutputFormatter.h" -int OutputFormatter::write(const char *buf, int count) +int OutputFormatter::write(const char* buf, int count) { for (int i = 0; i < count; i++) { @@ -65,29 +65,20 @@ int OutputFormatter::write(const char *buf, int count) OutputFormatter* OutputFormatter::static_instance; -int OutputFormatter::write_static(const char *buf, int count) +int OutputFormatter::write_static(const char* buf, int count) { return static_instance->write(buf, count); } -int (*OutputFormatter::static_writer())(const char *buf, int count) +int (*OutputFormatter::static_writer())(const char* buf, int count) { static_instance = this; return &write_static; } -OutputFormatter::OutputFormatter(int tab_size , int default_indent, - int line_limit) - : - tab_size{tab_size}, - default_indent{default_indent}, - line_limit{line_limit}, - col{0}, - nest{0}, - nest_indent{default_indent}, - current_indent{default_indent}, - word_p{word}, - space_p{space} +OutputFormatter::OutputFormatter(int tab_size, int default_indent, int line_limit) + : tab_size{tab_size}, default_indent{default_indent}, line_limit{line_limit}, col{0}, nest{0}, + nest_indent{default_indent}, current_indent{default_indent}, word_p{word}, space_p{space} { } diff --git a/tools/ZAPD/ZAPD/OutputFormatter.h b/tools/ZAPD/ZAPD/OutputFormatter.h index d1cdc68f6e..97edcdd37f 100644 --- a/tools/ZAPD/ZAPD/OutputFormatter.h +++ b/tools/ZAPD/ZAPD/OutputFormatter.h @@ -1,8 +1,8 @@ #pragma once -#include #include #include +#include class OutputFormatter { @@ -18,21 +18,20 @@ private: char word[128]; char space[128]; - char *word_p; - char *space_p; + char* word_p; + char* space_p; std::string str; - int write(const char *buf, int count); + int write(const char* buf, int count); - static OutputFormatter *static_instance; - static int write_static(const char *buf, int count); + static OutputFormatter* static_instance; + static int write_static(const char* buf, int count); public: - OutputFormatter(int tab_size = 4, int default_indent = 4, - int line_limit = 120); + OutputFormatter(int tab_size = 4, int default_indent = 4, int line_limit = 120); - int (*static_writer())(const char *buf, int count); + int (*static_writer())(const char* buf, int count); std::string get_output(); }; \ No newline at end of file diff --git a/tools/ZAPD/ZAPD/Overlays/ZOverlay.cpp b/tools/ZAPD/ZAPD/Overlays/ZOverlay.cpp index 006aa84395..1179b508f7 100644 --- a/tools/ZAPD/ZAPD/Overlays/ZOverlay.cpp +++ b/tools/ZAPD/ZAPD/Overlays/ZOverlay.cpp @@ -1,7 +1,7 @@ #include "ZOverlay.h" +#include "../Directory.h" #include "../File.h" #include "../Path.h" -#include "../Directory.h" #include "../StringHelper.h" using namespace std; @@ -20,7 +20,7 @@ ZOverlay::ZOverlay(string nName) : ZOverlay() ZOverlay::~ZOverlay() { - for (auto entry: entries) + for (auto entry : entries) if (entry) delete entry; entries.clear(); @@ -33,26 +33,25 @@ ZOverlay* ZOverlay::FromBuild(string buildPath, string cfgFolderPath) ZOverlay* ovl = new ZOverlay(StringHelper::Strip(cfgLines[0], "\r")); - vector relSections = {".rel.text", ".rel.data" , ".rel.rodata"}; - vector sections = {".text", ".data" , ".rodata"}; + vector relSections = {".rel.text", ".rel.data", ".rel.rodata"}; + vector sections = {".text", ".data", ".rodata"}; int sectionOffs[5] = {0}; vector textRelocs; vector dataRelocs; vector rodataRelocs; - // get the elf files vector readers; - for (int i = 1; i < cfgLines.size(); i++) + for (size_t i = 1; i < cfgLines.size(); i++) { - string elfPath = buildPath + "/" + cfgLines[i].substr(0, cfgLines[i].size()-2) + ".o"; + string elfPath = buildPath + "/" + cfgLines[i].substr(0, cfgLines[i].size() - 2) + ".o"; elfio* reader = new elfio(); if (!reader->load(elfPath)) { // not all files were compiled - for (auto r: readers) + for (auto r : readers) delete r; readers.clear(); @@ -66,11 +65,12 @@ ZOverlay* ZOverlay::FromBuild(string buildPath, string cfgFolderPath) for (auto curReader : readers) { Elf_Half sec_num = curReader->sections.size(); - for(int i = 0; i < sec_num; i++) + for (int i = 0; i < sec_num; i++) { section* pSec = curReader->sections[i]; - if (pSec->get_type() == SHT_REL && std::find(relSections.begin(), relSections.end(), pSec->get_name()) != relSections.end()) + if (pSec->get_type() == SHT_REL && std::find(relSections.begin(), relSections.end(), + pSec->get_name()) != relSections.end()) { SectionType sectionType = GetSectionTypeFromStr(pSec->get_name()); @@ -91,16 +91,17 @@ ZOverlay* ZOverlay::FromBuild(string buildPath, string cfgFolderPath) string curSymName; Elf_Half curSymShndx = SHN_UNDEF; { - symbol_section_accessor symbols(*curReader, curReader->sections[(Elf_Half)pSec->get_link()]); + symbol_section_accessor symbols( + *curReader, curReader->sections[(Elf_Half)pSec->get_link()]); Elf64_Addr value; Elf_Xword size; unsigned char bind; unsigned char type; unsigned char other; - symbols.get_symbol(symbol, curSymName, value, size, bind, type, curSymShndx, other); + symbols.get_symbol(symbol, curSymName, value, size, bind, type, curSymShndx, + other); } - // check symbols outside the elf but within the overlay if (curSymShndx == SHN_UNDEF) { @@ -129,7 +130,8 @@ ZOverlay* ZOverlay::FromBuild(string buildPath, string cfgFolderPath) unsigned char type; unsigned char other; - symbols.get_symbol(symIdx, name, value, size, bind, type, shndx, other); + symbols.get_symbol(symIdx, name, value, size, bind, type, shndx, + other); if (name == curSymName) { @@ -145,7 +147,8 @@ ZOverlay* ZOverlay::FromBuild(string buildPath, string cfgFolderPath) RelocationType typeConverted = (RelocationType)type; offset += sectionOffs[sectionType]; - RelocationEntry* reloc = new RelocationEntry(sectionType, typeConverted, offset); + RelocationEntry* reloc = + new RelocationEntry(sectionType, typeConverted, offset); // this is to keep the correct reloc entry order if (sectionType == SectionType::Text) @@ -163,7 +166,8 @@ ZOverlay* ZOverlay::FromBuild(string buildPath, string cfgFolderPath) for (int i = 0; i < sec_num; i++) { section* pSec = curReader->sections[i]; - if (pSec->get_type() == SHT_PROGBITS && std::find(sections.begin(), sections.end(), pSec->get_name()) != sections.end()) + if (pSec->get_type() == SHT_PROGBITS && + std::find(sections.begin(), sections.end(), pSec->get_name()) != sections.end()) { SectionType sectionType = GetSectionTypeFromStr(pSec->get_name()); sectionOffs[sectionType] += pSec->get_size(); @@ -178,7 +182,7 @@ ZOverlay* ZOverlay::FromBuild(string buildPath, string cfgFolderPath) for (auto reloc : rodataRelocs) ovl->entries.push_back(reloc); - for (auto r: readers) + for (auto r : readers) delete r; readers.clear(); @@ -198,7 +202,7 @@ string ZOverlay::GetSourceOutputCode(const std::string& prefix) output += StringHelper::Sprintf(".word %i\n", entries.size()); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { RelocationEntry* reloc = entries[i]; output += StringHelper::Sprintf(".word 0x%08X\n", reloc->CalcRelocationWord()); @@ -227,7 +231,8 @@ SectionType ZOverlay::GetSectionTypeFromStr(string sectionName) return SectionType::Text; else if (sectionName == ".rel.data" || sectionName == ".data") return SectionType::Data; - else if (sectionName == ".rel.rodata" || sectionName == ".rodata" || sectionName == ".rodata.str1.4" || sectionName == ".rodata.cst4") + else if (sectionName == ".rel.rodata" || sectionName == ".rodata" || + sectionName == ".rodata.str1.4" || sectionName == ".rodata.cst4") return SectionType::RoData; else if (sectionName == ".rel.bss" || sectionName == ".bss") return SectionType::Bss; diff --git a/tools/ZAPD/ZAPD/Overlays/ZOverlay.h b/tools/ZAPD/ZAPD/Overlays/ZOverlay.h index 03dba43c36..dddae6a747 100644 --- a/tools/ZAPD/ZAPD/Overlays/ZOverlay.h +++ b/tools/ZAPD/ZAPD/Overlays/ZOverlay.h @@ -1,8 +1,8 @@ #pragma once -#include "../ZResource.h" -#include #include +#include +#include "../ZResource.h" enum SectionType { @@ -64,5 +64,5 @@ private: ZOverlay(); static SectionType GetSectionTypeFromStr(std::string sectionName); - //static std::string GetOverlayNameFromElf(ELFIO::elfio& reader); + // static std::string GetOverlayNameFromElf(ELFIO::elfio& reader); }; diff --git a/tools/ZAPD/ZAPD/Path.h b/tools/ZAPD/ZAPD/Path.h index 6bfde45a45..3e45281f6c 100644 --- a/tools/ZAPD/ZAPD/Path.h +++ b/tools/ZAPD/ZAPD/Path.h @@ -1,7 +1,7 @@ #pragma once -#include #include +#include #include "StringHelper.h" #if __has_include() diff --git a/tools/ZAPD/ZAPD/StringHelper.h b/tools/ZAPD/ZAPD/StringHelper.h index 07ae37f7e0..b7771fbca4 100644 --- a/tools/ZAPD/ZAPD/StringHelper.h +++ b/tools/ZAPD/ZAPD/StringHelper.h @@ -1,10 +1,10 @@ #pragma once -#include -#include #include #include #include +#include +#include class StringHelper { @@ -62,7 +62,7 @@ public: static std::string Sprintf(const char* format, ...) { char buffer[32768]; - //char buffer[2048]; + // char buffer[2048]; std::string output = ""; va_list va; @@ -77,9 +77,8 @@ public: static std::string Implode(std::vector& elements, const char* const separator) { return std::accumulate(std::begin(elements), std::end(elements), std::string(), - [separator](std::string& ss, std::string& s) - { - return ss.empty() ? s : ss + separator + s; - }); + [separator](std::string& ss, std::string& s) { + return ss.empty() ? s : ss + separator + s; + }); } }; diff --git a/tools/ZAPD/ZAPD/Vec3s.h b/tools/ZAPD/ZAPD/Vec3s.h index 589b660b05..8df39c034d 100644 --- a/tools/ZAPD/ZAPD/Vec3s.h +++ b/tools/ZAPD/ZAPD/Vec3s.h @@ -6,5 +6,10 @@ struct Vec3s { int16_t x, y, z; - Vec3s(int16_t nX, int16_t nY, int16_t nZ) { x = nX; y = nY; z = nZ; }; + Vec3s(int16_t nX, int16_t nY, int16_t nZ) + { + x = nX; + y = nY; + z = nZ; + }; }; \ No newline at end of file diff --git a/tools/ZAPD/ZAPD/ZAnimation.cpp b/tools/ZAPD/ZAPD/ZAnimation.cpp index 21fdf3ffd9..4ae07e1e53 100644 --- a/tools/ZAPD/ZAPD/ZAnimation.cpp +++ b/tools/ZAPD/ZAPD/ZAnimation.cpp @@ -1,11 +1,11 @@ #include "ZAnimation.h" #include -#include "ZFile.h" #include "BitConverter.h" -#include "StringHelper.h" #include "File.h" -#include "HighLevel/HLAnimationIntermediette.h" #include "Globals.h" +#include "HighLevel/HLAnimationIntermediette.h" +#include "StringHelper.h" +#include "ZFile.h" using namespace std; @@ -61,18 +61,20 @@ std::string ZNormalAnimation::GetSourceOutputCode(const std::string& prefix) if (parent != nullptr) { string defaultPrefix = name.c_str(); - defaultPrefix.replace(0, 1, "s"); // replace g prefix with s for local variables + defaultPrefix.replace(0, 1, "s"); // replace g prefix with s for local variables - string headerStr = StringHelper::Sprintf("{ %i }, %sFrameData, %sJointIndices, %i", - frameCount, defaultPrefix.c_str(), defaultPrefix.c_str(), limit); - parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, 16, "AnimationHeader", StringHelper::Sprintf("%s", name.c_str()), headerStr); + string headerStr = + StringHelper::Sprintf("{ %i }, %sFrameData, %sJointIndices, %i", frameCount, + defaultPrefix.c_str(), defaultPrefix.c_str(), limit); + parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, 16, "AnimationHeader", + StringHelper::Sprintf("%s", name.c_str()), headerStr); string indicesStr = ""; string valuesStr = " "; const int lineLength = 14; const int offset = 0; - for (int i = 0; i < rotationValues.size(); i++) + for (size_t i = 0; i < rotationValues.size(); i++) { valuesStr += StringHelper::Sprintf("0x%04X, ", rotationValues[i]); @@ -80,19 +82,25 @@ std::string ZNormalAnimation::GetSourceOutputCode(const std::string& prefix) valuesStr += "\n "; } - for (int i = 0; i < rotationIndices.size(); i++) + for (size_t i = 0; i < rotationIndices.size(); i++) { - indicesStr += StringHelper::Sprintf(" { 0x%04X, 0x%04X, 0x%04X },", rotationIndices[i].x, rotationIndices[i].y, rotationIndices[i].z); + indicesStr += + StringHelper::Sprintf(" { 0x%04X, 0x%04X, 0x%04X },", rotationIndices[i].x, + rotationIndices[i].y, rotationIndices[i].z); if (i != (rotationIndices.size() - 1)) indicesStr += "\n"; } - parent->AddDeclarationArray(rotationValuesSeg, DeclarationAlignment::Align16, (int)rotationValues.size() * 2, "static s16", - StringHelper::Sprintf("%sFrameData", defaultPrefix.c_str()), rotationValues.size(), valuesStr); + parent->AddDeclarationArray(rotationValuesSeg, DeclarationAlignment::Align16, + (int)rotationValues.size() * 2, "static s16", + StringHelper::Sprintf("%sFrameData", defaultPrefix.c_str()), + rotationValues.size(), valuesStr); - parent->AddDeclarationArray(rotationIndicesSeg, DeclarationAlignment::Align16, (int)rotationIndices.size() * 6, "static JointIndex", - StringHelper::Sprintf("%sJointIndices", defaultPrefix.c_str()), rotationIndices.size(), indicesStr); + parent->AddDeclarationArray(rotationIndicesSeg, DeclarationAlignment::Align16, + (int)rotationIndices.size() * 6, "static JointIndex", + StringHelper::Sprintf("%sJointIndices", defaultPrefix.c_str()), + rotationIndices.size(), indicesStr); } return ""; @@ -103,7 +111,9 @@ int ZNormalAnimation::GetRawDataSize() return 16; } -ZNormalAnimation* ZNormalAnimation::ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, int rawDataIndex, const std::string& nRelPath) +ZNormalAnimation* ZNormalAnimation::ExtractFromXML(tinyxml2::XMLElement* reader, + std::vector nRawData, int rawDataIndex, + const std::string& nRelPath) { ZNormalAnimation* anim = new ZNormalAnimation(); anim->rawData = std::move(nRawData); @@ -127,7 +137,7 @@ void ZNormalAnimation::ParseRawData() uint32_t currentPtr = rotationValuesSeg; // Read the Rotation Values - for (int i = 0; i < ((rotationIndicesSeg - rotationValuesSeg) / 2); i++) + for (uint32_t i = 0; i < ((rotationIndicesSeg - rotationValuesSeg) / 2); i++) { rotationValues.push_back(BitConverter::ToInt16BE(data, currentPtr)); currentPtr += 2; @@ -136,9 +146,11 @@ void ZNormalAnimation::ParseRawData() currentPtr = rotationIndicesSeg; // Read the Rotation Indices - for (int i = 0; i < ((rawDataIndex - rotationIndicesSeg) / 6); i++) + for (uint32_t i = 0; i < ((rawDataIndex - rotationIndicesSeg) / 6); i++) { - rotationIndices.push_back(RotationIndex(BitConverter::ToInt16BE(data, currentPtr), BitConverter::ToInt16BE(data, currentPtr + 2), BitConverter::ToInt16BE(data, currentPtr + 4))); + rotationIndices.push_back(RotationIndex(BitConverter::ToInt16BE(data, currentPtr), + BitConverter::ToInt16BE(data, currentPtr + 2), + BitConverter::ToInt16BE(data, currentPtr + 4))); currentPtr += 6; } } @@ -152,10 +164,14 @@ std::string ZLinkAnimation::GetSourceOutputCode(const std::string& prefix) { if (parent != nullptr) { - string segSymbol = segmentAddress == 0 ? "NULL" : parent->GetDeclarationName(segmentAddress, StringHelper::Sprintf("%sSeg%06X", name.c_str(), segmentAddress)); - string headerStr = StringHelper::Sprintf("{ %i }, 0x%08X", - frameCount, segmentAddress); - parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, 16, "LinkAnimationHeader", StringHelper::Sprintf("%s", name.c_str()), headerStr); + string segSymbol = segmentAddress == 0 ? + "NULL" : + parent->GetDeclarationName( + segmentAddress, StringHelper::Sprintf("%sSeg%06X", name.c_str(), + segmentAddress)); + string headerStr = StringHelper::Sprintf("{ %i }, 0x%08X", frameCount, segmentAddress); + parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, 16, "LinkAnimationHeader", + StringHelper::Sprintf("%s", name.c_str()), headerStr); } return ""; @@ -166,7 +182,9 @@ int ZLinkAnimation::GetRawDataSize() return 8; } -ZLinkAnimation* ZLinkAnimation::ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, int rawDataIndex, const std::string& nRelPath) +ZLinkAnimation* ZLinkAnimation::ExtractFromXML(tinyxml2::XMLElement* reader, + std::vector nRawData, int rawDataIndex, + const std::string& nRelPath) { ZLinkAnimation* anim = new ZLinkAnimation(); anim->rawData = std::move(nRawData); @@ -183,6 +201,318 @@ void ZLinkAnimation::ParseRawData() const uint8_t* data = rawData.data(); - //segmentAddress = GETSEGOFFSET(BitConverter::ToInt32BE(data, rawDataIndex + 4)); + // segmentAddress = GETSEGOFFSET(BitConverter::ToInt32BE(data, rawDataIndex + 4)); segmentAddress = (BitConverter::ToInt32BE(data, rawDataIndex + 4)); } + +/* ZCurveAnimation */ + +TransformData::TransformData(ZFile* parent, const std::vector& rawData, + uint32_t fileOffset) + : parent(parent) +{ + unk_00 = BitConverter::ToUInt16BE(rawData, fileOffset + 0); + unk_02 = BitConverter::ToUInt16BE(rawData, fileOffset + 2); + unk_04 = BitConverter::ToInt16BE(rawData, fileOffset + 4); + unk_06 = BitConverter::ToInt16BE(rawData, fileOffset + 6); + unk_08 = BitConverter::ToFloatBE(rawData, fileOffset + 8); +} + +TransformData::TransformData(ZFile* parent, const std::vector& rawData, + uint32_t fileOffset, size_t index) + : TransformData(parent, rawData, fileOffset + index * GetRawDataSize()) +{ +} + +std::string TransformData::GetBody(const std::string& prefix) const +{ + return StringHelper::Sprintf("0x%04X, 0x%04X, %i, %i, %ff", unk_00, unk_02, unk_04, unk_06, + unk_08); +} + +size_t TransformData::GetRawDataSize() +{ + return 0x0C; +} + +std::string TransformData::GetSourceTypeName() +{ + return "TransformData"; +} + +ZCurveAnimation::ZCurveAnimation(tinyxml2::XMLElement* reader, const std::vector& nRawData, + int nRawDataIndex, ZFile* nParent) +{ + rawData.assign(nRawData.begin(), nRawData.end()); + rawDataIndex = nRawDataIndex; + parent = nParent; + + ParseXML(reader); + ParseRawData(); + + skel = new ZSkeleton(ZSkeletonType::Curve, ZLimbType::Curve, "CurveAnim", nRawData, + Seg2Filespace(skelOffset, parent->baseAddress), nParent); + + size_t transformDataSize = 0; + size_t copyValuesSize = 0; + if (refIndex != 0) + { + uint32_t refIndexOffset = Seg2Filespace(refIndex, parent->baseAddress); + for (size_t i = 0; i < 3 * 3 * skel->GetLimbCount(); i++) + { + uint8_t ref = BitConverter::ToUInt8BE(nRawData, refIndexOffset + i); + if (ref == 0) + { + copyValuesSize++; + } + else + { + transformDataSize += ref; + } + refIndexArr.emplace_back(ref); + } + } + + if (transformData != 0) + { + uint32_t transformDataOffset = Seg2Filespace(transformData, parent->baseAddress); + for (size_t i = 0; i < transformDataSize; i++) + { + transformDataArr.emplace_back(parent, nRawData, transformDataOffset, i); + } + } + + if (copyValues != 0) + { + uint32_t copyValuesOffset = Seg2Filespace(copyValues, parent->baseAddress); + for (size_t i = 0; i < copyValuesSize; i++) + { + copyValuesArr.emplace_back(BitConverter::ToInt16BE(nRawData, copyValuesOffset + i * 2)); + } + } +} + +ZCurveAnimation::~ZCurveAnimation() +{ + delete skel; +} + +void ZCurveAnimation::ParseXML(tinyxml2::XMLElement* reader) +{ + ZAnimation::ParseXML(reader); + + const char* skelOffsetXml = reader->Attribute("SkelOffset"); + if (skelOffsetXml == nullptr) + { + throw std::runtime_error( + "ZCurveAnimation::ParseXML: Fatal error in '%s'. Missing 'SkelOffset' attribute in " + "xml. You need to provide the offset of the curve skeleton."); + } + skelOffset = std::strtoul(skelOffsetXml, nullptr, 0); +} + +void ZCurveAnimation::ParseRawData() +{ + ZAnimation::ParseRawData(); + + refIndex = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0); + transformData = BitConverter::ToUInt32BE(rawData, rawDataIndex + 4); + copyValues = BitConverter::ToUInt32BE(rawData, rawDataIndex + 8); + unk_0C = BitConverter::ToInt16BE(rawData, rawDataIndex + 12); + unk_10 = BitConverter::ToInt16BE(rawData, rawDataIndex + 14); +} + +ZCurveAnimation* ZCurveAnimation::ExtractFromXML(tinyxml2::XMLElement* reader, + const std::vector& nRawData, + int nRawDataIndex, std::string nRelPath, + ZFile* nParent) +{ + ZCurveAnimation* curve = new ZCurveAnimation(reader, nRawData, nRawDataIndex, nParent); + curve->relativePath = std::move(nRelPath); + + curve->parent->AddDeclaration(curve->rawDataIndex, DeclarationAlignment::Align16, + curve->GetRawDataSize(), curve->GetSourceTypeName(), curve->name, + ""); + + return curve; +} + +void ZCurveAnimation::PreGenValues(const std::string& prefix) +{ + Declaration* decl = parent->GetDeclaration(skelOffset); + if (decl == nullptr) + { + skel->GetSourceOutputCode(prefix); + } + + if (refIndex != 0) + { + uint32_t refIndexOffset = Seg2Filespace(refIndex, parent->baseAddress); + string refIndexStr = + StringHelper::Sprintf("%sCurveAnime_%s_%06X", prefix.c_str(), "Ref", refIndexOffset); + + string entryStr = " "; + uint16_t arrayItemCnt = refIndexArr.size(); + + size_t i = 0; + for (auto& child : refIndexArr) + { + entryStr += StringHelper::Sprintf("0x%02X, %s", child, (i++ % 8 == 7) ? "\n " : ""); + } + + Declaration* decl = parent->GetDeclaration(refIndexOffset); + if (decl == nullptr) + { + parent->AddDeclarationArray(refIndexOffset, DeclarationAlignment::None, + arrayItemCnt * 1, "u8", refIndexStr, arrayItemCnt, + entryStr); + } + else + { + decl->text = entryStr; + } + } + + if (transformData != 0) + { + uint32_t transformDataOffset = Seg2Filespace(transformData, parent->baseAddress); + string transformDataStr = + StringHelper::Sprintf("%sCurveAnime_%s_%06X", prefix.c_str(), + TransformData::GetSourceTypeName().c_str(), transformDataOffset); + + string entryStr = ""; + uint16_t arrayItemCnt = transformDataArr.size(); + + size_t i = 0; + for (auto& child : transformDataArr) + { + entryStr += StringHelper::Sprintf(" { %s },%s", child.GetBody(prefix).c_str(), + (++i < arrayItemCnt) ? "\n" : ""); + } + + Declaration* decl = parent->GetDeclaration(transformDataOffset); + if (decl == nullptr) + { + parent->AddDeclarationArray(transformDataOffset, DeclarationAlignment::None, + arrayItemCnt * TransformData::GetRawDataSize(), + TransformData::GetSourceTypeName(), transformDataStr, + arrayItemCnt, entryStr); + } + else + { + decl->text = entryStr; + } + } + + if (copyValues != 0) + { + uint32_t copyValuesOffset = Seg2Filespace(copyValues, parent->baseAddress); + string copyValuesStr = + StringHelper::Sprintf("%sCurveAnime_%s_%06X", prefix.c_str(), "Copy", copyValuesOffset); + + string entryStr = " "; + uint16_t arrayItemCnt = copyValuesArr.size(); + + size_t i = 0; + for (auto& child : copyValuesArr) + { + entryStr += StringHelper::Sprintf("% 6i, %s", child, (i++ % 8 == 7) ? "\n " : ""); + } + + Declaration* decl = parent->GetDeclaration(copyValuesOffset); + if (decl == nullptr) + { + parent->AddDeclarationArray(copyValuesOffset, DeclarationAlignment::None, + arrayItemCnt * 2, "s16", copyValuesStr, arrayItemCnt, + entryStr); + } + else + { + decl->text = entryStr; + } + } +} + +int ZCurveAnimation::GetRawDataSize() +{ + return 0x10; +} + +std::string ZCurveAnimation::GetSourceOutputCode(const std::string& prefix) +{ + string bodyStr = ""; + uint32_t address = Seg2Filespace(rawDataIndex, parent->baseAddress); + + PreGenValues(prefix); + + string refIndexStr = "NULL"; + if (refIndex != 0) + { + uint32_t refIndexOffset = Seg2Filespace(refIndex, parent->baseAddress); + Declaration* decl = parent->GetDeclaration(refIndexOffset); + if (decl == nullptr) + { + refIndexStr = StringHelper::Sprintf("%sCurveAnime_%s_%06X", prefix.c_str(), "Ref", + refIndexOffset); + } + else + { + refIndexStr = decl->varName; + } + } + + string transformDataStr = "NULL"; + if (transformData != 0) + { + uint32_t transformDataOffset = Seg2Filespace(transformData, parent->baseAddress); + Declaration* decl = parent->GetDeclaration(transformDataOffset); + if (decl == nullptr) + { + transformDataStr = StringHelper::Sprintf("%sCurveAnime_%s_%06X", prefix.c_str(), + TransformData::GetSourceTypeName().c_str(), + transformDataOffset); + } + else + { + transformDataStr = decl->varName; + } + } + + string copyValuesStr = "NULL"; + if (copyValues != 0) + { + uint32_t copyValuesOffset = Seg2Filespace(copyValues, parent->baseAddress); + Declaration* decl = parent->GetDeclaration(copyValuesOffset); + if (decl == nullptr) + { + copyValuesStr = StringHelper::Sprintf("%sCurveAnime_%s_%06X", prefix.c_str(), "Copy", + copyValuesOffset); + } + else + { + copyValuesStr = decl->varName; + } + } + + bodyStr = + StringHelper::Sprintf("\n %s,\n %s,\n %s,\n %i, %i\n", refIndexStr.c_str(), + transformDataStr.c_str(), copyValuesStr.c_str(), unk_0C, unk_10); + + Declaration* decl = parent->GetDeclaration(address); + if (decl == nullptr) + { + parent->AddDeclaration(address, DeclarationAlignment::None, GetRawDataSize(), + GetSourceTypeName(), name, bodyStr); + } + else + { + decl->text = bodyStr; + } + + return ""; +} + +std::string ZCurveAnimation::GetSourceTypeName() +{ + return "TransformUpdateIndex"; +} diff --git a/tools/ZAPD/ZAPD/ZAnimation.h b/tools/ZAPD/ZAPD/ZAnimation.h index 25c066a072..71fbf2d109 100644 --- a/tools/ZAPD/ZAPD/ZAnimation.h +++ b/tools/ZAPD/ZAPD/ZAnimation.h @@ -1,35 +1,40 @@ #pragma once -#include -#include #include -#include "ZResource.h" +#include +#include #include "Vec3s.h" +#include "ZResource.h" +#include "ZSkeleton.h" #include "tinyxml2.h" struct RotationIndex { - //uint16_t transX, transY, transZ; + // uint16_t transX, transY, transZ; uint16_t x, y, z; - RotationIndex(uint16_t nX, uint16_t nY, uint16_t nZ) { x = nX; y = nY; z = nZ; }; + RotationIndex(uint16_t nX, uint16_t nY, uint16_t nZ) + { + x = nX; + y = nY; + z = nZ; + }; }; class ZAnimation : public ZResource { public: - int16_t frameCount; ZAnimation(); std::string GetSourceOutputCode(const std::string& prefix) override; ZResourceType GetResourceType() override; -protected: - virtual void ParseRawData(); - void Save(const std::string& outFolder); - void ParseXML(tinyxml2::XMLElement* reader); +protected: + virtual void ParseRawData() override; + void Save(const std::string& outFolder) override; + void ParseXML(tinyxml2::XMLElement* reader) override; }; class ZNormalAnimation : public ZAnimation @@ -43,13 +48,15 @@ public: ZNormalAnimation(); - std::string GetSourceOutputCode(const std::string& prefix); + std::string GetSourceOutputCode(const std::string& prefix) override; int GetRawDataSize() override; - static ZNormalAnimation* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, int rawDataIndex, const std::string& nRelPath); + static ZNormalAnimation* ExtractFromXML(tinyxml2::XMLElement* reader, + std::vector nRawData, int rawDataIndex, + const std::string& nRelPath); protected: - virtual void ParseRawData(); + virtual void ParseRawData() override; }; class ZLinkAnimation : public ZAnimation @@ -59,11 +66,82 @@ public: ZLinkAnimation(); - std::string GetSourceOutputCode(const std::string& prefix); + std::string GetSourceOutputCode(const std::string& prefix) override; int GetRawDataSize() override; - static ZLinkAnimation* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, int rawDataIndex, const std::string& nRelPath); + static ZLinkAnimation* ExtractFromXML(tinyxml2::XMLElement* reader, + std::vector nRawData, int rawDataIndex, + const std::string& nRelPath); protected: - virtual void ParseRawData(); + virtual void ParseRawData() override; }; + +class TransformData +{ +protected: + ZFile* parent; + + ///* 0x0000 */ u16 unk_00; // appears to be flags + uint16_t unk_00; + ///* 0x0002 */ s16 unk_02; + int16_t unk_02; + ///* 0x0004 */ s16 unk_04; + int16_t unk_04; + ///* 0x0006 */ s16 unk_06; + int16_t unk_06; + ///* 0x0008 */ f32 unk_08; + float unk_08; + +public: + TransformData() = default; + TransformData(ZFile* parent, const std::vector& rawData, uint32_t fileOffset); + TransformData(ZFile* parent, const std::vector& rawData, uint32_t fileOffset, + size_t index); + + [[nodiscard]] std::string GetBody(const std::string& prefix) const; + + static size_t GetRawDataSize(); + static std::string GetSourceTypeName(); +}; + +class ZCurveAnimation : public ZAnimation +{ +protected: + segptr_t skelOffset = 0; + + ///* 0x0000 */ u8* refIndex; + segptr_t refIndex = 0; + ///* 0x0004 */ TransformData* transformData; + segptr_t transformData = 0; + ///* 0x0008 */ s16* copyValues; + segptr_t copyValues = 0; + ///* 0x000C */ s16 unk_0C; + int16_t unk_0C; + ///* 0x000E */ s16 unk_10; + int16_t unk_10; + + ZSkeleton* skel; + + std::vector refIndexArr; + std::vector transformDataArr; + std::vector copyValuesArr; + +public: + ZCurveAnimation() = default; + ZCurveAnimation(tinyxml2::XMLElement* reader, const std::vector& nRawData, + int nRawDataIndex, ZFile* nParent); + ~ZCurveAnimation(); + void ParseXML(tinyxml2::XMLElement* reader) override; + void ParseRawData() override; + static ZCurveAnimation* ExtractFromXML(tinyxml2::XMLElement* reader, + const std::vector& nRawData, int nRawDataIndex, + std::string nRelPath, ZFile* nParent); + + void PreGenValues(const std::string& prefix); + int GetRawDataSize() override; + std::string GetSourceOutputCode(const std::string& prefix) override; + + std::string GetSourceTypeName() override; +}; +// TransformUpdateIndex diff --git a/tools/ZAPD/ZAPD/ZArray.cpp b/tools/ZAPD/ZAPD/ZArray.cpp index 622aef5a5d..74fa9c5af7 100644 --- a/tools/ZAPD/ZAPD/ZArray.cpp +++ b/tools/ZAPD/ZAPD/ZArray.cpp @@ -1,11 +1,10 @@ #include "ZArray.h" -#include "ZFile.h" #include "Globals.h" #include "StringHelper.h" +#include "ZFile.h" ZArray::ZArray() { - } void ZArray::ParseXML(tinyxml2::XMLElement* reader) @@ -13,7 +12,8 @@ void ZArray::ParseXML(tinyxml2::XMLElement* reader) ZResource::ParseXML(reader); arrayCnt = reader->IntAttribute("Count", 0); - testFile = new ZFile(ZFileMode::Extract, reader, Globals::Instance->baseRomPath, "", parent->GetName(), true); + testFile = new ZFile(ZFileMode::Extract, reader, Globals::Instance->baseRomPath, "", + parent->GetName(), true); } // TODO: This is a bit hacky, but until we refactor how ZFile parses the XML, it'll have to do. @@ -31,7 +31,9 @@ std::string ZArray::GetSourceOutputCode(const std::string& prefix) if (!res->DoesSupportArray()) { - throw StringHelper::Sprintf("Error! Resource %s does not support being wrapped in an array!\n", res->GetName().c_str()); + throw std::runtime_error(StringHelper::Sprintf( + "Error! Resource %s does not support being wrapped in an array!\n", + res->GetName().c_str())); } for (int i = 0; i < arrayCnt; i++) @@ -40,34 +42,34 @@ std::string ZArray::GetSourceOutputCode(const std::string& prefix) res->SetRawDataIndex(childIndex); res->ParseRawData(); std::string test = res->GetSourceOutputCode(""); - //output += " { " + testFile->declarations[childIndex]->text + " }"; + // output += " { " + testFile->declarations[childIndex]->text + " }"; output += testFile->declarations[childIndex]->text; - + if (i < arrayCnt - 1) output += ",\n"; - - int bp = 0; } if (parent != nullptr) - parent->AddDeclarationArray(rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), res->GetSourceTypeName(), name, arrayCnt, output); + parent->AddDeclarationArray(rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), + res->GetSourceTypeName(), name, arrayCnt, output); return ""; } int ZArray::GetRawDataSize() { - return arrayCnt * testFile->resources[0]->GetRawDataSize(); + return arrayCnt * testFile->resources[0]->GetRawDataSize(); } -ZArray* ZArray::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, const int rawDataIndex, const std::string& nRelPath, ZFile* nParent) +ZArray* ZArray::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, + const int rawDataIndex, const std::string& nRelPath, ZFile* nParent) { ZArray* arr = new ZArray(); arr->rawData = nRawData; arr->rawDataIndex = rawDataIndex; arr->parent = nParent; arr->ParseXML(reader); - //arr->ParseRawData(); + // arr->ParseRawData(); return arr; } diff --git a/tools/ZAPD/ZAPD/ZArray.h b/tools/ZAPD/ZAPD/ZArray.h index 8fd2565055..8e0092325c 100644 --- a/tools/ZAPD/ZAPD/ZArray.h +++ b/tools/ZAPD/ZAPD/ZArray.h @@ -1,8 +1,8 @@ #pragma once -#include -#include #include +#include +#include #include "ZResource.h" #include "tinyxml2.h" @@ -15,11 +15,13 @@ public: std::string GetSourceOutputCode(const std::string& prefix) override; int GetRawDataSize() override; - static ZArray* ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, const int rawDataIndex, const std::string& nRelPath, ZFile* nParent); + static ZArray* ExtractFromXML(tinyxml2::XMLElement* reader, + const std::vector& nRawData, const int rawDataIndex, + const std::string& nRelPath, ZFile* nParent); protected: int arrayCnt; ZFile* testFile; - //void ParseRawData(const std::vector& data, const int offset); + // void ParseRawData(const std::vector& data, const int offset); }; \ No newline at end of file diff --git a/tools/ZAPD/ZAPD/ZBlob.cpp b/tools/ZAPD/ZAPD/ZBlob.cpp index edb0e34c9c..fb39bd373a 100644 --- a/tools/ZAPD/ZAPD/ZBlob.cpp +++ b/tools/ZAPD/ZAPD/ZBlob.cpp @@ -1,26 +1,28 @@ #include "ZBlob.h" -#include "File.h" -#include "ZFile.h" #include "BitConverter.h" +#include "File.h" #include "Path.h" #include "StringHelper.h" +#include "ZFile.h" using namespace tinyxml2; using namespace std; ZBlob::ZBlob() : ZResource() { - } -ZBlob::ZBlob(const std::vector& nRawData, int nRawDataIndex, int size, std::string nName) : ZBlob() +ZBlob::ZBlob(const std::vector& nRawData, int nRawDataIndex, int size, std::string nName) + : ZBlob() { rawDataIndex = nRawDataIndex; - rawData = vector(nRawData.data() + rawDataIndex, nRawData.data() + rawDataIndex + size); + rawData = + vector(nRawData.data() + rawDataIndex, nRawData.data() + rawDataIndex + size); name = std::move(nName); } -ZBlob* ZBlob::ExtractFromXML(XMLElement* reader, const vector& nRawData, int nRawDataIndex, string nRelPath) +ZBlob* ZBlob::ExtractFromXML(XMLElement* reader, const vector& nRawData, int nRawDataIndex, + string nRelPath) { ZBlob* blob = new ZBlob(); @@ -28,7 +30,8 @@ ZBlob* ZBlob::ExtractFromXML(XMLElement* reader, const vector& nRawData blob->ParseXML(reader); int size = strtol(reader->Attribute("Size"), NULL, 16); - blob->rawData = vector(nRawData.data() + blob->rawDataIndex, nRawData.data() + blob->rawDataIndex + size); + blob->rawData = vector(nRawData.data() + blob->rawDataIndex, + nRawData.data() + blob->rawDataIndex + size); blob->relativePath = std::move(nRelPath); return blob; @@ -48,7 +51,6 @@ ZBlob* ZBlob::BuildFromXML(XMLElement* reader, const std::string& inFolder, bool ZBlob* ZBlob::FromFile(const std::string& filePath) { - int comp; ZBlob* blob = new ZBlob(); blob->name = StringHelper::Split(Path::GetFileNameWithoutExtension(filePath), ".")[0]; blob->rawData = File::ReadAllBytes(filePath); @@ -59,9 +61,9 @@ ZBlob* ZBlob::FromFile(const std::string& filePath) string ZBlob::GetSourceOutputCode(const std::string& prefix) { sourceOutput = ""; - //sourceOutput += StringHelper::Sprintf("u8 %s_%s[] = \n{\n", prefix.c_str(), name.c_str()); + // sourceOutput += StringHelper::Sprintf("u8 %s_%s[] = \n{\n", prefix.c_str(), name.c_str()); - for (int i = 0; i < rawData.size(); i += 1) + for (uint32_t i = 0; i < rawData.size(); i += 1) { if (i % 16 == 0) sourceOutput += "\t"; @@ -72,7 +74,10 @@ string ZBlob::GetSourceOutputCode(const std::string& prefix) sourceOutput += "\n"; } - //sourceOutput += "};\n"; + // Ensure there's always a trailing line feed to prevent dumb warnings. + sourceOutput += "\n"; + + // sourceOutput += "};\n"; return sourceOutput; } @@ -84,7 +89,7 @@ string ZBlob::GetSourceOutputHeader(const std::string& prefix) void ZBlob::Save(const std::string& outFolder) { - //printf("NAME = %s\n", name.c_str()); + // printf("NAME = %s\n", name.c_str()); File::WriteAllBytes(outFolder + "/" + name + ".bin", rawData); } diff --git a/tools/ZAPD/ZAPD/ZBlob.h b/tools/ZAPD/ZAPD/ZBlob.h index bb51bb1ff5..6b5508846f 100644 --- a/tools/ZAPD/ZAPD/ZBlob.h +++ b/tools/ZAPD/ZAPD/ZBlob.h @@ -8,8 +8,10 @@ class ZBlob : public ZResource public: ZBlob(const std::vector& nRawData, int rawDataIndex, int size, std::string nName); - static ZBlob* ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, int rawDataIndex, std::string nRelPath); - static ZBlob* BuildFromXML(tinyxml2::XMLElement* reader, const std::string& inFolder, bool readFile); + static ZBlob* ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, + int rawDataIndex, std::string nRelPath); + static ZBlob* BuildFromXML(tinyxml2::XMLElement* reader, const std::string& inFolder, + bool readFile); static ZBlob* FromFile(const std::string& filePath); std::string GetSourceOutputCode(const std::string& prefix) override; std::string GetSourceOutputHeader(const std::string& prefix) override; diff --git a/tools/ZAPD/ZAPD/ZCollision.cpp b/tools/ZAPD/ZAPD/ZCollision.cpp index 35ecbca57c..bb3144a94a 100644 --- a/tools/ZAPD/ZAPD/ZCollision.cpp +++ b/tools/ZAPD/ZAPD/ZCollision.cpp @@ -1,18 +1,18 @@ #include "ZCollision.h" -#include "BitConverter.h" -#include "StringHelper.h" -#include "Globals.h" #include #include +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" using namespace std; ZCollisionHeader::ZCollisionHeader() { - } -ZCollisionHeader::ZCollisionHeader(ZFile* parent, const std::string& prefix, const std::vector& rawData, int rawDataIndex) +ZCollisionHeader::ZCollisionHeader(ZFile* parent, const std::string& prefix, + const std::vector& rawData, int rawDataIndex) { const uint8_t* data = rawData.data(); @@ -42,14 +42,14 @@ ZCollisionHeader::ZCollisionHeader(ZFile* parent, const std::string& prefix, con uint32_t waterBoxSegmentOffset = Seg2Filespace(waterBoxAddress, parent->baseAddress); // HOTSPOT - for (int i = 0; i < numVerts; i++) + for (uint16_t i = 0; i < numVerts; i++) vertices.push_back(new VertexEntry(rawData, vtxSegmentOffset + (i * 6))); // HOTSPOT - for (int i = 0; i < numPolygons; i++) + for (uint16_t i = 0; i < numPolygons; i++) polygons.push_back(new PolygonEntry(rawData, polySegmentOffset + (i * 16))); - int highestPolyType = 0; + uint16_t highestPolyType = 0; for (PolygonEntry* poly : polygons) { @@ -57,70 +57,89 @@ ZCollisionHeader::ZCollisionHeader(ZFile* parent, const std::string& prefix, con highestPolyType = poly->type; } - //if (highestPolyType > 0) + // if (highestPolyType > 0) { - for (int i = 0; i < highestPolyType + 1; i++) - polygonTypes.push_back(BitConverter::ToUInt64BE(data, polyTypeDefSegmentOffset + (i * 8))); + for (uint16_t i = 0; i < highestPolyType + 1; i++) + polygonTypes.push_back( + BitConverter::ToUInt64BE(data, polyTypeDefSegmentOffset + (i * 8))); } - //else + // else //{ - //int polyTypesSize = abs(polyTypeDefSegmentOffset - camDataSegmentOffset) / 8; + // int polyTypesSize = abs(polyTypeDefSegmentOffset - camDataSegmentOffset) / 8; - //for (int i = 0; i < polyTypesSize; i++) - //polygonTypes.push_back(BitConverter::ToUInt64BE(data, polyTypeDefSegmentOffset + (i * 8))); + // for (int i = 0; i < polyTypesSize; i++) + // polygonTypes.push_back(BitConverter::ToUInt64BE(data, polyTypeDefSegmentOffset + (i * 8))); //} if (camDataAddress != 0) - camData = new CameraDataList(parent, prefix, rawData, camDataSegmentOffset, polyTypeDefSegmentOffset, polygonTypes.size()); + camData = new CameraDataList(parent, prefix, rawData, camDataSegmentOffset, + polyTypeDefSegmentOffset, polygonTypes.size()); for (int i = 0; i < numWaterBoxes; i++) - waterBoxes.push_back(new WaterBoxHeader(rawData, waterBoxSegmentOffset + (i * (Globals::Instance->game == ZGame::OOT_SW97 ? 12 : 16)))); + waterBoxes.push_back(new WaterBoxHeader( + rawData, + waterBoxSegmentOffset + (i * (Globals::Instance->game == ZGame::OOT_SW97 ? 12 : 16)))); string declaration = ""; char line[2048]; if (waterBoxes.size() > 0) { - for (int i = 0; i < waterBoxes.size(); i++) + for (size_t i = 0; i < waterBoxes.size(); i++) { - sprintf(line, " { %i, %i, %i, %i, %i, 0x%08X },\n", waterBoxes[i]->xMin, waterBoxes[i]->ySurface, waterBoxes[i]->zMin, waterBoxes[i]->xLength, waterBoxes[i]->zLength, waterBoxes[i]->properties); + sprintf(line, " { %i, %i, %i, %i, %i, 0x%08X },\n", waterBoxes[i]->xMin, + waterBoxes[i]->ySurface, waterBoxes[i]->zMin, waterBoxes[i]->xLength, + waterBoxes[i]->zLength, waterBoxes[i]->properties); declaration += line; } } if (waterBoxAddress != 0) - parent->AddDeclarationArray(waterBoxSegmentOffset, DeclarationAlignment::None, 16 * waterBoxes.size(), "WaterBox", - StringHelper::Sprintf("%s_waterBoxes_%08X", prefix.c_str(), waterBoxSegmentOffset), 0, declaration); + parent->AddDeclarationArray( + waterBoxSegmentOffset, DeclarationAlignment::None, 16 * waterBoxes.size(), "WaterBox", + StringHelper::Sprintf("%s_waterBoxes_%08X", prefix.c_str(), waterBoxSegmentOffset), 0, + declaration); if (polygons.size() > 0) { declaration = ""; - for (int i = 0; i < polygons.size(); i++) + for (size_t i = 0; i < polygons.size(); i++) { - sprintf(line, " { 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X },\n", - (uint16_t)polygons[i]->type, (uint16_t)polygons[i]->vtxA, (uint16_t)polygons[i]->vtxB, (uint16_t)polygons[i]->vtxC, - (uint16_t)polygons[i]->a, (uint16_t)polygons[i]->b, (uint16_t)polygons[i]->c, (uint16_t)polygons[i]->d); + sprintf( + line, " { 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X },\n", + (uint16_t)polygons[i]->type, (uint16_t)polygons[i]->vtxA, + (uint16_t)polygons[i]->vtxB, (uint16_t)polygons[i]->vtxC, (uint16_t)polygons[i]->a, + (uint16_t)polygons[i]->b, (uint16_t)polygons[i]->c, (uint16_t)polygons[i]->d); declaration += line; } - if (polyAddress != 0) { - parent->AddDeclarationArray(polySegmentOffset, DeclarationAlignment::None, polygons.size() * 16, "CollisionPoly", StringHelper::Sprintf("%s_polygons_%08X", prefix.c_str(), polySegmentOffset), 0, declaration); + if (polyAddress != 0) + { + parent->AddDeclarationArray( + polySegmentOffset, DeclarationAlignment::None, polygons.size() * 16, + "CollisionPoly", + StringHelper::Sprintf("%s_polygons_%08X", prefix.c_str(), polySegmentOffset), 0, + declaration); } } declaration = ""; - for (int i = 0; i < polygonTypes.size(); i++) + for (size_t i = 0; i < polygonTypes.size(); i++) { - declaration += StringHelper::Sprintf(" { 0x%08lX, 0x%08lX },", polygonTypes[i] >> 32, polygonTypes[i] & 0xFFFFFFFF); + declaration += StringHelper::Sprintf(" { 0x%08lX, 0x%08lX },", polygonTypes[i] >> 32, + polygonTypes[i] & 0xFFFFFFFF); if (i < polygonTypes.size() - 1) declaration += "\n"; } if (polyTypeDefAddress != 0) - parent->AddDeclarationArray(polyTypeDefSegmentOffset, DeclarationAlignment::None, polygonTypes.size() * 8, - "SurfaceType", StringHelper::Sprintf("%s_surfaceType_%08X", prefix.c_str(), polyTypeDefSegmentOffset), 0, declaration); + parent->AddDeclarationArray( + polyTypeDefSegmentOffset, DeclarationAlignment::None, polygonTypes.size() * 8, + "SurfaceType", + StringHelper::Sprintf("%s_surfaceType_%08X", prefix.c_str(), polyTypeDefSegmentOffset), + 0, declaration); declaration = ""; @@ -128,17 +147,20 @@ ZCollisionHeader::ZCollisionHeader(ZFile* parent, const std::string& prefix, con { declaration = ""; - for (int i = 0; i < vertices.size(); i++) + for (size_t i = 0; i < vertices.size(); i++) { - declaration += StringHelper::Sprintf(" { %i, %i, %i },", vertices[i]->x, vertices[i]->y, vertices[i]->z); + declaration += StringHelper::Sprintf(" { %i, %i, %i },", vertices[i]->x, + vertices[i]->y, vertices[i]->z); if (i < vertices.size() - 1) declaration += "\n"; } if (vtxAddress != 0) - parent->AddDeclarationArray(vtxSegmentOffset, DeclarationAlignment::None, vertices.size() * 6, - "Vec3s", StringHelper::Sprintf("%s_vtx_%08X", prefix.c_str(), vtxSegmentOffset), 0, declaration); + parent->AddDeclarationArray( + vtxSegmentOffset, DeclarationAlignment::None, vertices.size() * 6, "Vec3s", + StringHelper::Sprintf("%s_vtx_%08X", prefix.c_str(), vtxSegmentOffset), 0, + declaration); declaration = ""; } @@ -153,17 +175,19 @@ ZCollisionHeader::ZCollisionHeader(ZFile* parent, const std::string& prefix, con declaration += "\n"; - declaration += StringHelper::Sprintf(" { %i, %i, %i },\n { %i, %i, %i },\n", - absMinX, absMinY, absMinZ, - absMaxX, absMaxY, absMaxZ); + declaration += StringHelper::Sprintf(" { %i, %i, %i },\n { %i, %i, %i },\n", absMinX, + absMinY, absMinZ, absMaxX, absMaxY, absMaxZ); - declaration += StringHelper::Sprintf(" %i,\n %s_vtx_%08X,\n %i,\n %s_polygons_%08X,\n %s_surfaceType_%08X,\n &%s_camDataList_%08X,\n %i,\n %s\n", - numVerts, prefix.c_str(), vtxSegmentOffset, numPolygons, - prefix.c_str(), polySegmentOffset, prefix.c_str(), polyTypeDefSegmentOffset, - prefix.c_str(), camDataSegmentOffset, numWaterBoxes, waterBoxStr); + declaration += StringHelper::Sprintf( + " %i,\n %s_vtx_%08X,\n %i,\n %s_polygons_%08X,\n %s_surfaceType_%08X,\n " + "%s_camDataList_%08X,\n %i,\n %s\n", + numVerts, prefix.c_str(), vtxSegmentOffset, numPolygons, prefix.c_str(), polySegmentOffset, + prefix.c_str(), polyTypeDefSegmentOffset, prefix.c_str(), camDataSegmentOffset, + numWaterBoxes, waterBoxStr); - parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, DeclarationPadding::Pad16, 44, "CollisionHeader", - StringHelper::Sprintf("%s", prefix.c_str(), rawDataIndex), declaration); + parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, DeclarationPadding::Pad16, 44, + "CollisionHeader", + StringHelper::Sprintf("%s", prefix.c_str(), rawDataIndex), declaration); } ZCollisionHeader::~ZCollisionHeader() @@ -183,12 +207,11 @@ ZResourceType ZCollisionHeader::GetResourceType() return ZResourceType::CollisionHeader; } -ZCollisionHeader* ZCollisionHeader::ExtractFromXML(tinyxml2::XMLElement* reader, vector nRawData, int rawDataIndex) +ZCollisionHeader* ZCollisionHeader::ExtractFromXML(tinyxml2::XMLElement* reader, + vector nRawData, int rawDataIndex) { ZCollisionHeader* col = new ZCollisionHeader(); - - return col; } @@ -234,21 +257,25 @@ WaterBoxHeader::WaterBoxHeader(const std::vector& rawData, int rawDataI } } -CameraDataList::CameraDataList(ZFile* parent, const std::string& prefix, const std::vector& rawData, int rawDataIndex, int polyTypeDefSegmentOffset, int polygonTypesCnt) +CameraDataList::CameraDataList(ZFile* parent, const std::string& prefix, + const std::vector& rawData, int rawDataIndex, + int polyTypeDefSegmentOffset, int polygonTypesCnt) { string declaration = ""; // Parse CameraDataEntries int numElements = abs(polyTypeDefSegmentOffset - (rawDataIndex)) / 8; - //int numElements = polygonTypesCnt; + // int numElements = polygonTypesCnt; uint32_t cameraPosDataSeg = rawDataIndex; for (int i = 0; i < numElements; i++) { CameraDataEntry* entry = new CameraDataEntry(); - entry->cameraSType = BitConverter::ToInt16BE(rawData, rawDataIndex + (entries.size() * 8) + 0); + entry->cameraSType = + BitConverter::ToInt16BE(rawData, rawDataIndex + (entries.size() * 8) + 0); entry->numData = BitConverter::ToInt16BE(rawData, rawDataIndex + (entries.size() * 8) + 2); - entry->cameraPosDataSeg = BitConverter::ToInt32BE(rawData, rawDataIndex + (entries.size() * 8) + 4); + entry->cameraPosDataSeg = + BitConverter::ToInt32BE(rawData, rawDataIndex + (entries.size() * 8) + 4); if (entry->cameraPosDataSeg != 0 && GETSEGNUM(entry->cameraPosDataSeg) != 2) { @@ -262,27 +289,33 @@ CameraDataList::CameraDataList(ZFile* parent, const std::string& prefix, const s entries.push_back(entry); } - //setting cameraPosDataAddr to rawDataIndex give a pos list length of 0 + // setting cameraPosDataAddr to rawDataIndex give a pos list length of 0 uint32_t cameraPosDataOffset = cameraPosDataSeg & 0xFFFFFF; - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { char camSegLine[2048]; if (entries[i]->cameraPosDataSeg != 0) { int index = ((entries[i]->cameraPosDataSeg & 0x00FFFFFF) - cameraPosDataOffset) / 0x6; - sprintf(camSegLine, "&%s_camPosData_%08X[%i]", prefix.c_str(), cameraPosDataOffset, index); + sprintf(camSegLine, "&%s_camPosData_%08X[%i]", prefix.c_str(), cameraPosDataOffset, + index); } else sprintf(camSegLine, "0x%08X", entries[i]->cameraPosDataSeg); - declaration += StringHelper::Sprintf(" { 0x%04X, %i, %s },", entries[i]->cameraSType, entries[i]->numData, camSegLine, rawDataIndex + (i * 8)); + declaration += + StringHelper::Sprintf(" { 0x%04X, %i, %s },", entries[i]->cameraSType, + entries[i]->numData, camSegLine, rawDataIndex + (i * 8)); if (i < entries.size() - 1) declaration += "\n"; } - parent->AddDeclarationArray(rawDataIndex, DeclarationAlignment::None, entries.size() * 8, "CamData", StringHelper::Sprintf("%s_camDataList_%08X", prefix.c_str(), rawDataIndex), entries.size(), declaration); + parent->AddDeclarationArray( + rawDataIndex, DeclarationAlignment::None, entries.size() * 8, "CamData", + StringHelper::Sprintf("%s_camDataList_%08X", prefix.c_str(), rawDataIndex), entries.size(), + declaration); int numDataTotal = abs(rawDataIndex - (int)cameraPosDataOffset) / 0x6; @@ -291,15 +324,20 @@ CameraDataList::CameraDataList(ZFile* parent, const std::string& prefix, const s declaration = ""; for (int i = 0; i < numDataTotal; i++) { - CameraPositionData* data = new CameraPositionData(rawData, cameraPosDataOffset + (i * 6)); + CameraPositionData* data = + new CameraPositionData(rawData, cameraPosDataOffset + (i * 6)); cameraPositionData.push_back(data); - declaration += StringHelper::Sprintf(" { %6i, %6i, %6i },\n", data->x, data->y, data->z); + declaration += + StringHelper::Sprintf(" { %6i, %6i, %6i },\n", data->x, data->y, data->z); } int cameraPosDataIndex = cameraPosDataSeg & 0x00FFFFFF; int entrySize = numDataTotal * 0x6; - parent->AddDeclarationArray(cameraPosDataIndex, DeclarationAlignment::None, entrySize, "Vec3s", StringHelper::Sprintf("%s_camPosData_%08X", prefix.c_str(), cameraPosDataIndex), numDataTotal, declaration); + parent->AddDeclarationArray( + cameraPosDataIndex, DeclarationAlignment::None, entrySize, "Vec3s", + StringHelper::Sprintf("%s_camPosData_%08X", prefix.c_str(), cameraPosDataIndex), + numDataTotal, declaration); } } diff --git a/tools/ZAPD/ZAPD/ZCollision.h b/tools/ZAPD/ZAPD/ZCollision.h index 7f7b7150a9..1f95e57645 100644 --- a/tools/ZAPD/ZAPD/ZCollision.h +++ b/tools/ZAPD/ZAPD/ZCollision.h @@ -1,7 +1,7 @@ #pragma once -#include "ZResource.h" #include "ZFile.h" +#include "ZResource.h" #include "ZRoom/ZRoom.h" class PolygonEntry @@ -58,7 +58,8 @@ public: std::vector entries; std::vector cameraPositionData; - CameraDataList(ZFile* parent, const std::string& prefix, const std::vector& rawData, int rawDataIndex, int polyTypeDefSegmentOffset, int polygonTypesCnt); + CameraDataList(ZFile* parent, const std::string& prefix, const std::vector& rawData, + int rawDataIndex, int polyTypeDefSegmentOffset, int polygonTypesCnt); }; class ZCollisionHeader : public ZResource @@ -66,9 +67,9 @@ class ZCollisionHeader : public ZResource public: int16_t absMinX, absMinY, absMinZ; int16_t absMaxX, absMaxY, absMaxZ; - int16_t numVerts; + uint16_t numVerts; segptr_t vtxAddress; - int16_t numPolygons; + uint16_t numPolygons; segptr_t polyAddress; segptr_t polyTypeDefAddress; segptr_t camDataAddress; @@ -83,11 +84,13 @@ public: CameraDataList* camData; ZCollisionHeader(); - //ZCollisionHeader(ZRoom* nZRoom, std::vector rawData, int rawDataIndex); - ZCollisionHeader(ZFile* parent, const std::string& prefix, const std::vector& rawData, int rawDataIndex); + // ZCollisionHeader(ZRoom* nZRoom, std::vector rawData, int rawDataIndex); + ZCollisionHeader(ZFile* parent, const std::string& prefix, const std::vector& rawData, + int rawDataIndex); ~ZCollisionHeader(); ZResourceType GetResourceType() override; - static ZCollisionHeader* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, int rawDataIndex); + static ZCollisionHeader* ExtractFromXML(tinyxml2::XMLElement* reader, + std::vector nRawData, int rawDataIndex); }; diff --git a/tools/ZAPD/ZAPD/ZCutscene.cpp b/tools/ZAPD/ZAPD/ZCutscene.cpp index d2ef633930..f84be295d3 100644 --- a/tools/ZAPD/ZAPD/ZCutscene.cpp +++ b/tools/ZAPD/ZAPD/ZCutscene.cpp @@ -27,10 +27,12 @@ ZCutscene::ZCutscene(std::vector nRawData, int rawDataIndex, int rawDat int numEntries = 1; - /*if (cmdID != CutsceneCommands::SetCameraPos && cmdID != CutsceneCommands::SetCameraFocus && cmdID != CutsceneCommands::SetCameraFocusLink && cmdID != CutsceneCommands::SetCameraPosLink) + /*if (cmdID != CutsceneCommands::SetCameraPos && cmdID != CutsceneCommands::SetCameraFocus + && cmdID != CutsceneCommands::SetCameraFocusLink && cmdID != + CutsceneCommands::SetCameraPosLink) { - numEntries = BitConverter::ToInt32BE(rawData, currentPtr); - currentPtr += 4; + numEntries = BitConverter::ToInt32BE(rawData, currentPtr); + currentPtr += 4; }*/ for (int j = 0; j < numEntries; j++) @@ -39,15 +41,39 @@ ZCutscene::ZCutscene(std::vector nRawData, int rawDataIndex, int rawDat switch (cmdID) { - case CutsceneCommands::SetCameraPos: cmd = new CutsceneCommandSetCameraPos(rawData, currentPtr); break; - case CutsceneCommands::SetCameraFocus: cmd = new CutsceneCommandSetCameraPos(rawData, currentPtr); break; - case CutsceneCommands::SpecialAction: cmd = new CutsceneCommandSpecialAction(rawData, currentPtr); break; - case CutsceneCommands::SetLighting: cmd = new CutsceneCommandEnvLighting(rawData, currentPtr); break; - case CutsceneCommands::SetCameraPosLink: cmd = new CutsceneCommandSetCameraPos(rawData, currentPtr); break; - case CutsceneCommands::SetCameraFocusLink: cmd = new CutsceneCommandSetCameraPos(rawData, currentPtr); break; - case CutsceneCommands::Textbox: cmd = new CutsceneCommandTextbox(rawData, currentPtr); break; - case CutsceneCommands::Cmd09: cmd = new CutsceneCommandUnknown9(rawData, currentPtr); break; - case CutsceneCommands::Unknown: cmd = new CutsceneCommandUnknown(rawData, currentPtr); break; + case CutsceneCommands::Cmd00: + break; + case CutsceneCommands::SetCameraPos: + cmd = new CutsceneCommandSetCameraPos(rawData, currentPtr); + break; + case CutsceneCommands::SetCameraFocus: + cmd = new CutsceneCommandSetCameraPos(rawData, currentPtr); + break; + case CutsceneCommands::SpecialAction: + cmd = new CutsceneCommandSpecialAction(rawData, currentPtr); + break; + case CutsceneCommands::SetLighting: + cmd = new CutsceneCommandEnvLighting(rawData, currentPtr); + break; + case CutsceneCommands::SetCameraPosLink: + cmd = new CutsceneCommandSetCameraPos(rawData, currentPtr); + break; + case CutsceneCommands::SetCameraFocusLink: + cmd = new CutsceneCommandSetCameraPos(rawData, currentPtr); + break; + case CutsceneCommands::Cmd07: + break; + case CutsceneCommands::Cmd08: + break; + case CutsceneCommands::Cmd09: + cmd = new CutsceneCommandUnknown9(rawData, currentPtr); + break; + case CutsceneCommands::Textbox: + cmd = new CutsceneCommandTextbox(rawData, currentPtr); + break; + case CutsceneCommands::Unknown: + cmd = new CutsceneCommandUnknown(rawData, currentPtr); + break; case CutsceneCommands::SetActorAction0: case CutsceneCommands::SetActorAction1: case CutsceneCommands::SetActorAction2: @@ -58,15 +84,37 @@ ZCutscene::ZCutscene(std::vector nRawData, int rawDataIndex, int rawDat case CutsceneCommands::SetActorAction7: case CutsceneCommands::SetActorAction8: case CutsceneCommands::SetActorAction9: - case CutsceneCommands::SetActorAction10: cmd = new CutsceneCommandActorAction(rawData, currentPtr); break; - case CutsceneCommands::SetSceneTransFX: cmd = new CutsceneCommandSceneTransFX(rawData, currentPtr); break; - case CutsceneCommands::Nop: cmd = new CutsceneCommandNop(rawData, currentPtr); break; - case CutsceneCommands::PlayBGM: cmd = new CutsceneCommandPlayBGM(rawData, currentPtr); break; - case CutsceneCommands::StopBGM: cmd = new CutsceneCommandStopBGM(rawData, currentPtr); break; - case CutsceneCommands::FadeBGM: cmd = new CutsceneCommandFadeBGM(rawData, currentPtr); break; - case CutsceneCommands::SetTime: cmd = new CutsceneCommandDayTime(rawData, currentPtr); break; - case CutsceneCommands::Terminator: cmd = new CutsceneCommandTerminator(rawData, currentPtr); break; - case CutsceneCommands::End: cmd = new CutsceneCommandEnd(rawData, currentPtr); break; + case CutsceneCommands::SetActorAction10: + cmd = new CutsceneCommandActorAction(rawData, currentPtr); + break; + case CutsceneCommands::SetSceneTransFX: + cmd = new CutsceneCommandSceneTransFX(rawData, currentPtr); + break; + case CutsceneCommands::Nop: + cmd = new CutsceneCommandNop(rawData, currentPtr); + break; + case CutsceneCommands::PlayBGM: + cmd = new CutsceneCommandPlayBGM(rawData, currentPtr); + break; + case CutsceneCommands::StopBGM: + cmd = new CutsceneCommandStopBGM(rawData, currentPtr); + break; + case CutsceneCommands::FadeBGM: + cmd = new CutsceneCommandFadeBGM(rawData, currentPtr); + break; + case CutsceneCommands::SetTime: + cmd = new CutsceneCommandDayTime(rawData, currentPtr); + break; + case CutsceneCommands::Terminator: + cmd = new CutsceneCommandTerminator(rawData, currentPtr); + break; + case CutsceneCommands::End: + cmd = new CutsceneCommandEnd(rawData, currentPtr); + break; + case CutsceneCommands::Error: + fprintf(stderr, "Cutscene command error %d %s %d\n", (int)cmdID, __FILE__, + __LINE__); + break; } cmd->commandIndex = i; @@ -87,18 +135,18 @@ ZCutscene::~ZCutscene() string ZCutscene::GetSourceOutputCode(const std::string& prefix) { string output = ""; - int size = 0; + size_t size = 0; int32_t curPtr = 0; - //output += StringHelper::Sprintf("// SIZE = 0x%04X\n", GetRawDataSize()); + // output += StringHelper::Sprintf("// SIZE = 0x%04X\n", GetRawDataSize()); output += StringHelper::Sprintf("\tCS_BEGIN_CUTSCENE(%i, %i),\n", commands.size(), endFrame); - for (int i = 0; i < commands.size(); i++) + for (size_t i = 0; i < commands.size(); i++) { CutsceneCommand* cmd = commands[i]; output += "\t" + cmd->GenerateSourceCode(prefix, curPtr); curPtr += (uint32_t)cmd->GetCommandSize(); - size += (int)cmd->GetCommandSize(); + size += cmd->GetCommandSize(); } output += StringHelper::Sprintf("\tCS_END(),\n", commands.size(), endFrame); @@ -113,7 +161,7 @@ int ZCutscene::GetRawDataSize() // Beginning size += 8; - for (int i = 0; i < commands.size(); i++) + for (size_t i = 0; i < commands.size(); i++) { CutsceneCommand* cmd = commands[i]; size += (int)cmd->GetCommandSize(); @@ -126,7 +174,9 @@ int ZCutscene::GetRawDataSize() return size; } -ZCutscene* ZCutscene::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, const int rawDataIndex, const std::string& nRelPath) +ZCutscene* ZCutscene::ExtractFromXML(tinyxml2::XMLElement* reader, + const std::vector& nRawData, const int rawDataIndex, + const std::string& nRelPath) { ZCutscene* cs = new ZCutscene(nRawData, rawDataIndex, 9999); cs->rawData = nRawData; @@ -145,35 +195,165 @@ CutsceneCommands ZCutscene::GetCommandFromID(int id) { switch (id) { - case 0x0003: return CutsceneCommands::SpecialAction; - case 0x0004: return CutsceneCommands::SetLighting; - case 0x0056: return CutsceneCommands::PlayBGM; - case 0x0057: return CutsceneCommands::StopBGM; - case 0x007C: return CutsceneCommands::FadeBGM; - case 0x0009: return CutsceneCommands::Cmd09; - case 0x0013: return CutsceneCommands::Textbox; - case 0x008C: return CutsceneCommands::SetTime; - case 0x0001: return CutsceneCommands::SetCameraPos; - case 0x0002: return CutsceneCommands::SetCameraFocus; - case 0x0005: return CutsceneCommands::SetCameraPosLink; - case 0x0006: return CutsceneCommands::SetCameraFocusLink; - case 0x0007: return CutsceneCommands::Cmd07; - case 0x0008: return CutsceneCommands::Cmd08; - case 0x03E8: return CutsceneCommands::Terminator; - case 0xFFFF: return CutsceneCommands::End; - case 0x002D: return CutsceneCommands::SetSceneTransFX; - case 10: return CutsceneCommands::SetActorAction0; - case 15: case 17: case 18: case 23: case 34: case 39: case 46: case 76: case 85: case 93: case 105: case 107: case 110: case 119: case 123: case 138: case 139: case 144: return CutsceneCommands::SetActorAction1; - case 14: case 16: case 24: case 35: case 40: case 48: case 64: case 68: case 70: case 78: case 80: case 94: case 116: case 118: case 120: case 125: case 131: case 141: return CutsceneCommands::SetActorAction2; - case 25: case 36: case 41: case 50: case 67: case 69: case 72: case 81: case 106: case 117: case 121: case 126: case 132: return CutsceneCommands::SetActorAction3; - case 29: case 37: case 42: case 51: case 53: case 63: case 65: case 66: case 75: case 82: case 108: case 127: case 133: return CutsceneCommands::SetActorAction4; - case 30: case 38: case 43: case 47: case 54: case 79: case 83: case 128: case 135: return CutsceneCommands::SetActorAction5; - case 44: case 55: case 77: case 84: case 90: case 129: case 136: return CutsceneCommands::SetActorAction6; - case 31: case 52: case 57: case 58: case 88: case 115: case 130: case 137: return CutsceneCommands::SetActorAction7; - case 49: case 60: case 89: case 111: case 114: case 134: case 142: return CutsceneCommands::SetActorAction8; - case 62: return CutsceneCommands::SetActorAction9; - case 143: return CutsceneCommands::SetActorAction10; - case 0x0B: case 0x0D: case 0x1A: case 0x1B: case 0x1C: case 0x20: case 0x21: case 0x3B: case 0x3D: case 0x47: case 0x49: case 0x6D: case 0x15: case 0x16: case 0x70: case 0x71: case 0x4A: return CutsceneCommands::Unknown; + case 0x0003: + return CutsceneCommands::SpecialAction; + case 0x0004: + return CutsceneCommands::SetLighting; + case 0x0056: + return CutsceneCommands::PlayBGM; + case 0x0057: + return CutsceneCommands::StopBGM; + case 0x007C: + return CutsceneCommands::FadeBGM; + case 0x0009: + return CutsceneCommands::Cmd09; + case 0x0013: + return CutsceneCommands::Textbox; + case 0x008C: + return CutsceneCommands::SetTime; + case 0x0001: + return CutsceneCommands::SetCameraPos; + case 0x0002: + return CutsceneCommands::SetCameraFocus; + case 0x0005: + return CutsceneCommands::SetCameraPosLink; + case 0x0006: + return CutsceneCommands::SetCameraFocusLink; + case 0x0007: + return CutsceneCommands::Cmd07; + case 0x0008: + return CutsceneCommands::Cmd08; + case 0x03E8: + return CutsceneCommands::Terminator; + case 0xFFFF: + return CutsceneCommands::End; + case 0x002D: + return CutsceneCommands::SetSceneTransFX; + case 10: + return CutsceneCommands::SetActorAction0; + case 15: + case 17: + case 18: + case 23: + case 34: + case 39: + case 46: + case 76: + case 85: + case 93: + case 105: + case 107: + case 110: + case 119: + case 123: + case 138: + case 139: + case 144: + return CutsceneCommands::SetActorAction1; + case 14: + case 16: + case 24: + case 35: + case 40: + case 48: + case 64: + case 68: + case 70: + case 78: + case 80: + case 94: + case 116: + case 118: + case 120: + case 125: + case 131: + case 141: + return CutsceneCommands::SetActorAction2; + case 25: + case 36: + case 41: + case 50: + case 67: + case 69: + case 72: + case 81: + case 106: + case 117: + case 121: + case 126: + case 132: + return CutsceneCommands::SetActorAction3; + case 29: + case 37: + case 42: + case 51: + case 53: + case 63: + case 65: + case 66: + case 75: + case 82: + case 108: + case 127: + case 133: + return CutsceneCommands::SetActorAction4; + case 30: + case 38: + case 43: + case 47: + case 54: + case 79: + case 83: + case 128: + case 135: + return CutsceneCommands::SetActorAction5; + case 44: + case 55: + case 77: + case 84: + case 90: + case 129: + case 136: + return CutsceneCommands::SetActorAction6; + case 31: + case 52: + case 57: + case 58: + case 88: + case 115: + case 130: + case 137: + return CutsceneCommands::SetActorAction7; + case 49: + case 60: + case 89: + case 111: + case 114: + case 134: + case 142: + return CutsceneCommands::SetActorAction8; + case 62: + return CutsceneCommands::SetActorAction9; + case 143: + return CutsceneCommands::SetActorAction10; + case 0x0B: + case 0x0D: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x20: + case 0x21: + case 0x3B: + case 0x3D: + case 0x47: + case 0x49: + case 0x6D: + case 0x15: + case 0x16: + case 0x70: + case 0x71: + case 0x4A: + return CutsceneCommands::Unknown; } printf("WARNING: Could not identify cutscene command ID 0x%04X\n", id); @@ -188,7 +368,6 @@ ZResourceType ZCutscene::GetResourceType() CutsceneCommand::CutsceneCommand(const vector& rawData, int rawDataIndex) { - } string CutsceneCommand::GetCName(const std::string& prefix) @@ -198,7 +377,9 @@ string CutsceneCommand::GetCName(const std::string& prefix) string CutsceneCommand::GenerateSourceCode(const std::string& roomName, int baseAddress) { - return StringHelper::Sprintf("%s %sCutsceneData%04XCmd%02X = { 0x%02X,", GetCName(roomName).c_str(), roomName.c_str(), baseAddress, commandIndex, commandID); + return StringHelper::Sprintf("%s %sCutsceneData%04XCmd%02X = { 0x%02X,", + GetCName(roomName).c_str(), roomName.c_str(), baseAddress, + commandIndex, commandID); } size_t CutsceneCommand::GetCommandSize() @@ -222,7 +403,9 @@ CutsceneCameraPoint::CutsceneCameraPoint(const vector& rawData, int raw unused = BitConverter::ToInt16BE(data, rawDataIndex + 14); } -CutsceneCommandSetCameraPos::CutsceneCommandSetCameraPos(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandSetCameraPos::CutsceneCommandSetCameraPos(const vector& rawData, + int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { const uint8_t* data = rawData.data(); @@ -285,10 +468,13 @@ string CutsceneCommandSetCameraPos::GenerateSourceCode(const std::string& roomNa result += StringHelper::Sprintf("%s(%i, %i),\n", listStr.c_str(), startFrame, endFrame); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { - result += StringHelper::Sprintf("\t\t%s(%i, %i, %i, 0x%06X, %i, %i, %i, %i),\n", posStr.c_str(), entries[i]->continueFlag, entries[i]->cameraRoll, entries[i]->nextPointFrame, - *(uint32_t*)&entries[i]->viewAngle, entries[i]->posX, entries[i]->posY, entries[i]->posZ, entries[i]->unused); + result += StringHelper::Sprintf("\t\t%s(%i, %i, %i, 0x%06X, %i, %i, %i, %i),\n", + posStr.c_str(), entries[i]->continueFlag, + entries[i]->cameraRoll, entries[i]->nextPointFrame, + *(uint32_t*)&entries[i]->viewAngle, entries[i]->posX, + entries[i]->posY, entries[i]->posZ, entries[i]->unused); } return result; @@ -312,12 +498,16 @@ MusicFadeEntry::MusicFadeEntry(const vector& rawData, int rawDataIndex) unknown5 = (uint32_t)BitConverter::ToInt32BE(rawData, rawDataIndex + 24); unknown6 = (uint32_t)BitConverter::ToInt32BE(rawData, rawDataIndex + 28); unknown7 = (uint32_t)BitConverter::ToInt32BE(rawData, rawDataIndex + 32); - unknown8 = (uint32_t)BitConverter::ToInt32BE(rawData, rawDataIndex + 36); - unknown9 = (uint32_t)BitConverter::ToInt32BE(rawData, rawDataIndex + 40); - unknown10 = (uint32_t)BitConverter::ToInt32BE(rawData, rawDataIndex + 44); + unknown8 = (uint32_t)BitConverter::ToInt32BE(rawData, + rawDataIndex + 36); // Macro hardcodes it as zero + unknown9 = (uint32_t)BitConverter::ToInt32BE(rawData, + rawDataIndex + 40); // Macro hardcodes it as zero + unknown10 = (uint32_t)BitConverter::ToInt32BE(rawData, + rawDataIndex + 44); // Macro hardcodes it as zero } -CutsceneCommandFadeBGM::CutsceneCommandFadeBGM(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandFadeBGM::CutsceneCommandFadeBGM(const vector& rawData, int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { int numEntries = BitConverter::ToInt32BE(rawData, rawDataIndex + 0); @@ -341,11 +531,13 @@ string CutsceneCommandFadeBGM::GenerateSourceCode(const std::string& roomName, i result += StringHelper::Sprintf("CS_FADE_BGM_LIST(%i),\n", entries.size()); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { - result += StringHelper::Sprintf("\t\tCS_FADE_BGM(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->base, entries[i]->startFrame, entries[i]->endFrame, - entries[i]->unknown0, entries[i]->unknown1, entries[i]->unknown2, entries[i]->unknown3, entries[i]->unknown4, entries[i]->unknown5, entries[i]->unknown6, entries[i]->unknown7, - entries[i]->unknown8, entries[i]->unknown9, entries[i]->unknown10); + result += StringHelper::Sprintf( + "\t\tCS_FADE_BGM(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->base, + entries[i]->startFrame, entries[i]->endFrame, entries[i]->unknown0, + entries[i]->unknown1, entries[i]->unknown2, entries[i]->unknown3, entries[i]->unknown4, + entries[i]->unknown5, entries[i]->unknown6, entries[i]->unknown7); } return result; @@ -353,7 +545,7 @@ string CutsceneCommandFadeBGM::GenerateSourceCode(const std::string& roomName, i size_t CutsceneCommandFadeBGM::GetCommandSize() { - return CutsceneCommand::GetCommandSize() + 0x30; + return CutsceneCommand::GetCommandSize() + 0x30 * entries.size(); } MusicChangeEntry::MusicChangeEntry(const vector& rawData, int rawDataIndex) @@ -371,7 +563,8 @@ MusicChangeEntry::MusicChangeEntry(const vector& rawData, int rawDataIn unknown7 = (uint32_t)BitConverter::ToInt32BE(rawData, rawDataIndex + 32); } -CutsceneCommandPlayBGM::CutsceneCommandPlayBGM(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandPlayBGM::CutsceneCommandPlayBGM(const vector& rawData, int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { int numEntries = BitConverter::ToInt32BE(rawData, rawDataIndex + 0); @@ -390,11 +583,13 @@ string CutsceneCommandPlayBGM::GenerateSourceCode(const std::string& roomName, i result += StringHelper::Sprintf("CS_PLAY_BGM_LIST(%i),\n", entries.size()); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { - result += StringHelper::Sprintf("\t\tCS_PLAY_BGM(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->sequence, entries[i]->startFrame, - entries[i]->endFrame, entries[i]->unknown0, entries[i]->unknown1, entries[i]->unknown2, entries[i]->unknown3, entries[i]->unknown4, entries[i]->unknown5, - entries[i]->unknown6, entries[i]->unknown7); + result += StringHelper::Sprintf( + "\t\tCS_PLAY_BGM(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->sequence, + entries[i]->startFrame, entries[i]->endFrame, entries[i]->unknown0, + entries[i]->unknown1, entries[i]->unknown2, entries[i]->unknown3, entries[i]->unknown4, + entries[i]->unknown5, entries[i]->unknown6, entries[i]->unknown7); } return result; @@ -410,7 +605,8 @@ size_t CutsceneCommandPlayBGM::GetCommandSize() return CutsceneCommand::GetCommandSize() + 0x30; } -CutsceneCommandStopBGM::CutsceneCommandStopBGM(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandStopBGM::CutsceneCommandStopBGM(const vector& rawData, int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { int numEntries = BitConverter::ToInt32BE(rawData, rawDataIndex + 0); @@ -429,11 +625,13 @@ string CutsceneCommandStopBGM::GenerateSourceCode(const std::string& roomName, i result += StringHelper::Sprintf("CS_STOP_BGM_LIST(%i),\n", entries.size()); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { - result += StringHelper::Sprintf("CS_STOP_BGM(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->sequence, entries[i]->startFrame, - entries[i]->endFrame, entries[i]->unknown0, entries[i]->unknown1, entries[i]->unknown2, entries[i]->unknown3, entries[i]->unknown4, entries[i]->unknown5, - entries[i]->unknown6, entries[i]->unknown7); + result += StringHelper::Sprintf( + "\t\tCS_STOP_BGM(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->sequence, + entries[i]->startFrame, entries[i]->endFrame, entries[i]->unknown0, + entries[i]->unknown1, entries[i]->unknown2, entries[i]->unknown3, entries[i]->unknown4, + entries[i]->unknown5, entries[i]->unknown6, entries[i]->unknown7); } return result; @@ -464,7 +662,9 @@ EnvLightingEntry::EnvLightingEntry(const vector& rawData, int rawDataIn unused7 = (uint32_t)BitConverter::ToInt32BE(rawData, rawDataIndex + 32); } -CutsceneCommandEnvLighting::CutsceneCommandEnvLighting(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandEnvLighting::CutsceneCommandEnvLighting(const vector& rawData, + int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { int numEntries = BitConverter::ToInt32BE(rawData, rawDataIndex + 0); @@ -483,10 +683,12 @@ string CutsceneCommandEnvLighting::GenerateSourceCode(const std::string& roomNam result += StringHelper::Sprintf("CS_LIGHTING_LIST(%i),\n", entries.size()); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { - result += StringHelper::Sprintf("CS_LIGHTING(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->setting, entries[i]->startFrame, - entries[i]->endFrame, entries[i]->unused0, entries[i]->unused1, entries[i]->unused2, entries[i]->unused3, entries[i]->unused4, entries[i]->unused5, + result += StringHelper::Sprintf( + "\t\tCS_LIGHTING(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->setting, + entries[i]->startFrame, entries[i]->endFrame, entries[i]->unused0, entries[i]->unused1, + entries[i]->unused2, entries[i]->unused3, entries[i]->unused4, entries[i]->unused5, entries[i]->unused6, entries[i]->unused7); } @@ -512,10 +714,12 @@ Unknown9Entry::Unknown9Entry(const vector& rawData, int rawDataIndex) unk3 = rawData[rawDataIndex + 7]; unk4 = rawData[rawDataIndex + 8]; unused0 = rawData[rawDataIndex + 10]; - unused1 = rawData[rawDataIndex + 11];; + unused1 = rawData[rawDataIndex + 11]; + ; } -CutsceneCommandUnknown9::CutsceneCommandUnknown9(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandUnknown9::CutsceneCommandUnknown9(const vector& rawData, int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { int numEntries = BitConverter::ToInt32BE(rawData, rawDataIndex); @@ -534,10 +738,12 @@ string CutsceneCommandUnknown9::GenerateSourceCode(const std::string& roomName, result += StringHelper::Sprintf("CS_CMD_09_LIST(%i),\n", entries.size()); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { - result += StringHelper::Sprintf("CS_CMD_09(%i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->base, entries[i]->startFrame, entries[i]->endFrame, entries[i]->unk2, - entries[i]->unk3, entries[i]->unk4, entries[i]->unused0, entries[i]->unused1); + result += StringHelper::Sprintf("\t\tCS_CMD_09(%i, %i, %i, %i, %i, %i, %i, %i),\n", + entries[i]->base, entries[i]->startFrame, + entries[i]->endFrame, entries[i]->unk2, entries[i]->unk3, + entries[i]->unk4, entries[i]->unused0, entries[i]->unused1); } return result; @@ -569,7 +775,8 @@ UnkEntry::UnkEntry(const vector& rawData, int rawDataIndex) unused11 = (uint32_t)BitConverter::ToInt32BE(rawData, rawDataIndex + 44); } -CutsceneCommandUnknown::CutsceneCommandUnknown(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandUnknown::CutsceneCommandUnknown(const vector& rawData, int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { int numEntries = BitConverter::ToInt32BE(rawData, rawDataIndex); @@ -588,11 +795,13 @@ string CutsceneCommandUnknown::GenerateSourceCode(const std::string& roomName, i result += StringHelper::Sprintf("CS_UNK_DATA_LIST(0x%02X, %i),\n", commandID, entries.size()); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { - result += StringHelper::Sprintf("\tCS_UNK_DATA(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->unused0, entries[i]->unused1, entries[i]->unused2, - entries[i]->unused3, entries[i]->unused4, entries[i]->unused5, entries[i]->unused6, - entries[i]->unused7, entries[i]->unused8, entries[i]->unused9, entries[i]->unused10, entries[i]->unused11); + result += StringHelper::Sprintf( + "\t\tCS_UNK_DATA(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", + entries[i]->unused0, entries[i]->unused1, entries[i]->unused2, entries[i]->unused3, + entries[i]->unused4, entries[i]->unused5, entries[i]->unused6, entries[i]->unused7, + entries[i]->unused8, entries[i]->unused9, entries[i]->unused10, entries[i]->unused11); } return result; @@ -618,7 +827,8 @@ DayTimeEntry::DayTimeEntry(const vector& rawData, int rawDataIndex) unused = rawData[rawDataIndex + 8]; } -CutsceneCommandDayTime::CutsceneCommandDayTime(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandDayTime::CutsceneCommandDayTime(const vector& rawData, int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { int numEntries = BitConverter::ToInt32BE(rawData, rawDataIndex); @@ -642,10 +852,11 @@ string CutsceneCommandDayTime::GenerateSourceCode(const std::string& roomName, i result += StringHelper::Sprintf("CS_TIME_LIST(%i),\n", entries.size()); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { - result += StringHelper::Sprintf("\t\tCS_TIME(%i, %i, %i, %i, %i, %i),\n", entries[i]->base, entries[i]->startFrame, entries[i]->endFrame, - entries[i]->hour, entries[i]->minute, entries[i]->unused); + result += StringHelper::Sprintf("\t\tCS_TIME(%i, %i, %i, %i, %i, %i),\n", entries[i]->base, + entries[i]->startFrame, entries[i]->endFrame, + entries[i]->hour, entries[i]->minute, entries[i]->unused); } return result; @@ -666,7 +877,8 @@ TextboxEntry::TextboxEntry(const vector& rawData, int rawDataIndex) textID2 = (uint16_t)BitConverter::ToInt16BE(rawData, rawDataIndex + 10); } -CutsceneCommandTextbox::CutsceneCommandTextbox(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandTextbox::CutsceneCommandTextbox(const vector& rawData, int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { int numEntries = BitConverter::ToInt32BE(rawData, rawDataIndex); @@ -690,16 +902,19 @@ string CutsceneCommandTextbox::GenerateSourceCode(const std::string& roomName, i result += StringHelper::Sprintf("CS_TEXT_LIST(%i),\n", entries.size()); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { if (entries[i]->base == 0xFFFF) { - result += StringHelper::Sprintf("\t\tCS_TEXT_NONE(%i, %i),\n", entries[i]->startFrame, entries[i]->endFrame); + result += StringHelper::Sprintf("\t\tCS_TEXT_NONE(%i, %i),\n", entries[i]->startFrame, + entries[i]->endFrame); } else { - result += StringHelper::Sprintf("\t\tCS_TEXT_DISPLAY_TEXTBOX(%i, %i, %i, %i, %i, %i),\n", entries[i]->base, entries[i]->startFrame, entries[i]->endFrame, entries[i]->type, - entries[i]->textID1, entries[i]->textID2); + result += StringHelper::Sprintf( + "\t\tCS_TEXT_DISPLAY_TEXTBOX(%i, %i, %i, %i, %i, %i),\n", entries[i]->base, + entries[i]->startFrame, entries[i]->endFrame, entries[i]->type, entries[i]->textID1, + entries[i]->textID2); } } @@ -732,7 +947,9 @@ ActorAction::ActorAction(const vector& rawData, int rawDataIndex) normalZ = BitConverter::ToInt32BE(data, rawDataIndex + 44); } -CutsceneCommandActorAction::CutsceneCommandActorAction(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandActorAction::CutsceneCommandActorAction(const vector& rawData, + int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { int numEntries = BitConverter::ToInt32BE(rawData, rawDataIndex); @@ -748,14 +965,28 @@ CutsceneCommandActorAction::CutsceneCommandActorAction(const vector& ra string CutsceneCommandActorAction::GenerateSourceCode(const std::string& roomName, int baseAddress) { string result = ""; + string subCommand = ""; - result += StringHelper::Sprintf("CS_NPC_ACTION_LIST(%i, %i),\n", commandID, entries.size()); - - for (int i = 0; i < entries.size(); i++) + if (commandID == 10) { - result += StringHelper::Sprintf("\tCS_NPC_ACTION(0x%04X, %i, %i, 0x%04X, 0x%04X, 0x%04X, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->action, entries[i]->startFrame, entries[i]->endFrame, - entries[i]->rotX, entries[i]->rotY, entries[i]->rotZ, entries[i]->startPosX, entries[i]->startPosY, entries[i]->startPosZ, entries[i]->endPosX, entries[i]->endPosY, entries[i]->endPosZ, - *(int32_t*)&entries[i]->normalX, *(int32_t*)&entries[i]->normalY, *(int32_t*)&entries[i]->normalZ); + result += StringHelper::Sprintf("CS_PLAYER_ACTION_LIST(%i),\n", entries.size()); + subCommand = "CS_PLAYER_ACTION"; + } + else + { + result += StringHelper::Sprintf("CS_NPC_ACTION_LIST(%i, %i),\n", commandID, entries.size()); + subCommand = "CS_NPC_ACTION"; + } + + for (size_t i = 0; i < entries.size(); i++) + { + result += StringHelper::Sprintf( + "\t\t%s(0x%04X, %i, %i, 0x%04X, 0x%04X, 0x%04X, %i, %i, %i, %i, %i, %i, %i, %i, %i),\n", + subCommand.c_str(), entries[i]->action, entries[i]->startFrame, entries[i]->endFrame, + entries[i]->rotX, entries[i]->rotY, entries[i]->rotZ, entries[i]->startPosX, + entries[i]->startPosY, entries[i]->startPosZ, entries[i]->endPosX, entries[i]->endPosY, + entries[i]->endPosZ, *(int32_t*)&entries[i]->normalX, *(int32_t*)&entries[i]->normalY, + *(int32_t*)&entries[i]->normalZ); } return result; @@ -771,14 +1002,16 @@ size_t CutsceneCommandActorAction::GetCommandSize() return CutsceneCommand::GetCommandSize() + (entries.size() * 0x30); } -CutsceneCommandTerminator::CutsceneCommandTerminator(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandTerminator::CutsceneCommandTerminator(const vector& rawData, + int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { rawDataIndex += 4; base = (uint16_t)BitConverter::ToInt16BE(rawData, rawDataIndex + 0); startFrame = (uint16_t)BitConverter::ToInt16BE(rawData, rawDataIndex + 2); endFrame = (uint16_t)BitConverter::ToInt16BE(rawData, rawDataIndex + 4); - unknown = (uint16_t)BitConverter::ToInt16BE(rawData, rawDataIndex + 6); + unknown = (uint16_t)BitConverter::ToInt16BE(rawData, rawDataIndex + 6); // endFrame duplicate } string CutsceneCommandTerminator::GetCName(const std::string& prefix) @@ -790,7 +1023,7 @@ string CutsceneCommandTerminator::GenerateSourceCode(const std::string& roomName { string result = ""; - result += StringHelper::Sprintf("CS_TERMINATOR(0x%04X, %i, %i, 0x%04X),\n", base, startFrame, endFrame, unknown); + result += StringHelper::Sprintf("CS_TERMINATOR(0x%04X, %i, %i),\n", base, startFrame, endFrame); return result; } @@ -800,7 +1033,8 @@ size_t CutsceneCommandTerminator::GetCommandSize() return CutsceneCommand::GetCommandSize() + 8; } -CutsceneCommandEnd::CutsceneCommandEnd(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandEnd::CutsceneCommandEnd(const vector& rawData, int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { base = (uint16_t)BitConverter::ToInt16BE(rawData, rawDataIndex + 0); startFrame = (uint16_t)BitConverter::ToInt16BE(rawData, rawDataIndex + 2); @@ -846,7 +1080,9 @@ SpecialActionEntry::SpecialActionEntry(const vector& rawData, int rawDa unused10 = BitConverter::ToUInt32BE(data, rawDataIndex + 44); } -CutsceneCommandSpecialAction::CutsceneCommandSpecialAction(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandSpecialAction::CutsceneCommandSpecialAction(const vector& rawData, + int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { int numEntries = BitConverter::ToInt32BE(rawData, rawDataIndex + 0); @@ -859,17 +1095,22 @@ CutsceneCommandSpecialAction::CutsceneCommandSpecialAction(const vector } } -string CutsceneCommandSpecialAction::GenerateSourceCode(const std::string& roomName, int baseAddress) +string CutsceneCommandSpecialAction::GenerateSourceCode(const std::string& roomName, + int baseAddress) { string result = ""; result += StringHelper::Sprintf("CS_MISC_LIST(%i),\n", entries.size()); - for (int i = 0; i < entries.size(); i++) + for (size_t i = 0; i < entries.size(); i++) { - result += StringHelper::Sprintf("\t\tCS_MISC(0x%04X, %i, %i, 0x%04X, 0x%04X, 0x%04X, %i, %i, %i, %i, %i, %i, %i, %i),\n", entries[i]->base, entries[i]->startFrame, entries[i]->endFrame, - entries[i]->unused0, entries[i]->unused1, entries[i]->unused2, entries[i]->unused3, entries[i]->unused4, entries[i]->unused5, entries[i]->unused6, - entries[i]->unused7, entries[i]->unused8, entries[i]->unused9, entries[i]->unused10); + result += StringHelper::Sprintf( + "\t\tCS_MISC(0x%04X, %i, %i, 0x%04X, 0x%04X, 0x%04X, %i, %i, %i, %i, %i, %i, %i, " + "%i),\n", + entries[i]->base, entries[i]->startFrame, entries[i]->endFrame, entries[i]->unused0, + entries[i]->unused1, entries[i]->unused2, entries[i]->unused3, entries[i]->unused4, + entries[i]->unused5, entries[i]->unused6, entries[i]->unused7, entries[i]->unused8, + entries[i]->unused9, entries[i]->unused10); } return result; @@ -885,7 +1126,8 @@ size_t CutsceneCommandSpecialAction::GetCommandSize() return CutsceneCommand::GetCommandSize() + (0x30 * entries.size()); } -CutsceneCommandNop::CutsceneCommandNop(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandNop::CutsceneCommandNop(const vector& rawData, int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { base = (uint16_t)BitConverter::ToInt16BE(rawData, rawDataIndex + 0); startFrame = (uint16_t)BitConverter::ToInt16BE(rawData, rawDataIndex + 2); @@ -902,7 +1144,9 @@ size_t CutsceneCommandNop::GetCommandSize() return CutsceneCommand::GetCommandSize() + 6; } -CutsceneCommandSceneTransFX::CutsceneCommandSceneTransFX(const vector& rawData, int rawDataIndex) : CutsceneCommand(rawData, rawDataIndex) +CutsceneCommandSceneTransFX::CutsceneCommandSceneTransFX(const vector& rawData, + int rawDataIndex) + : CutsceneCommand(rawData, rawDataIndex) { rawDataIndex += 4; diff --git a/tools/ZAPD/ZAPD/ZCutscene.h b/tools/ZAPD/ZAPD/ZCutscene.h index bf26b90280..6c97db98e1 100644 --- a/tools/ZAPD/ZAPD/ZCutscene.h +++ b/tools/ZAPD/ZAPD/ZCutscene.h @@ -1,8 +1,8 @@ #pragma once -#include -#include #include +#include +#include #include "ZResource.h" #include "tinyxml2.h" @@ -141,7 +141,7 @@ class CutsceneCommandFadeBGM : public CutsceneCommand public: std::vector entries; - CutsceneCommandFadeBGM( const std::vector& rawData, int rawDataIndex); + CutsceneCommandFadeBGM(const std::vector& rawData, int rawDataIndex); std::string GetCName(const std::string& prefix); std::string GenerateSourceCode(const std::string& roomName, int baseAddress); size_t GetCommandSize(); @@ -411,11 +411,14 @@ public: ZResourceType GetResourceType() override; - static ZCutscene* ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, const int rawDataIndex, const std::string& nRelPath); + static ZCutscene* ExtractFromXML(tinyxml2::XMLElement* reader, + const std::vector& nRawData, const int rawDataIndex, + const std::string& nRelPath); + protected: int numCommands; int endFrame; std::vector commands; - void ParseRawData(); + void ParseRawData() override; }; diff --git a/tools/ZAPD/ZAPD/ZDisplayList.cpp b/tools/ZAPD/ZAPD/ZDisplayList.cpp index 02e43d52fc..c5fd660496 100644 --- a/tools/ZAPD/ZAPD/ZDisplayList.cpp +++ b/tools/ZAPD/ZAPD/ZDisplayList.cpp @@ -1,15 +1,15 @@ #include "ZDisplayList.h" -#include "BitConverter.h" -#include "StringHelper.h" -#include "OutputFormatter.h" -#include "HighLevel/HLModelIntermediette.h" -#include "Globals.h" -#include "gfxd.h" -#include -#include #include #include +#include +#include #include +#include "BitConverter.h" +#include "Globals.h" +#include "HighLevel/HLModelIntermediette.h" +#include "OutputFormatter.h" +#include "StringHelper.h" +#include "gfxd.h" using namespace std; using namespace tinyxml2; @@ -40,19 +40,21 @@ ZDisplayList::ZDisplayList() : ZResource() } // EXTRACT MODE -ZDisplayList* ZDisplayList::ExtractFromXML(XMLElement* reader, vector nRawData, int nRawDataIndex, int rawDataSize, string nRelPath) +ZDisplayList* ZDisplayList::ExtractFromXML(XMLElement* reader, vector nRawData, + int nRawDataIndex, int rawDataSize, string nRelPath) { ZDisplayList* dList = new ZDisplayList(); dList->ParseXML(reader); - //dList->name = reader->Attribute("Name"); + // dList->name = reader->Attribute("Name"); dList->rawData = nRawData; dList->rawDataIndex = nRawDataIndex; dList->fileData = dList->rawData; dList->relativePath = nRelPath; - dList->rawData = vector(dList->rawData.data() + dList->rawDataIndex, dList->rawData.data() + dList->rawDataIndex + rawDataSize); + dList->rawData = vector(dList->rawData.data() + dList->rawDataIndex, + dList->rawData.data() + dList->rawDataIndex + rawDataSize); dList->ParseRawData(); return dList; @@ -66,12 +68,14 @@ ZDisplayList* ZDisplayList::BuildFromXML(XMLElement* reader, string inFolder, bo return dList; } -ZDisplayList::ZDisplayList(vector nRawData, int nRawDataIndex, int rawDataSize) : ZDisplayList() +ZDisplayList::ZDisplayList(vector nRawData, int nRawDataIndex, int rawDataSize) + : ZDisplayList() { fileData = nRawData; rawDataIndex = nRawDataIndex; name = StringHelper::Sprintf("DL_%06X", rawDataIndex); - rawData = vector(nRawData.data() + rawDataIndex, nRawData.data() + rawDataIndex + rawDataSize); + rawData = vector(nRawData.data() + rawDataIndex, + nRawData.data() + rawDataIndex + rawDataSize); ParseRawData(); } @@ -86,7 +90,8 @@ void ZDisplayList::ParseRawData() instructions.push_back(BitConverter::ToUInt64BE(rawDataArr, (i * 8))); } -void ZDisplayList::ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int i, std::string prefix, char* line) +void ZDisplayList::ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int i, std::string prefix, + char* line) { switch (opcode) { @@ -95,13 +100,13 @@ void ZDisplayList::ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int i, std::s break; case F3DZEXOpcode::G_DL: Opcode_G_DL(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_MODIFYVTX: Opcode_G_MODIFYVTX(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_CULLDL: Opcode_G_CULLDL(data, i, prefix, line); - break; + break; /*case F3DZEXOpcode::G_BRANCH_Z: { int aaa = (data & 0x00FFF00000000000) >> 44; @@ -113,10 +118,10 @@ void ZDisplayList::ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int i, std::s break;*/ case F3DZEXOpcode::G_TRI1: Opcode_G_TRI1(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_TRI2: Opcode_G_TRI2(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_QUAD: { int aa = ((data & 0x00FF000000000000ULL) >> 48) / 2; @@ -131,7 +136,7 @@ void ZDisplayList::ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int i, std::s Opcode_G_VTX(data, i, prefix, line); } break; - case F3DZEXOpcode::G_SETTIMG: // HOTSPOT + case F3DZEXOpcode::G_SETTIMG: // HOTSPOT { Opcode_G_SETTIMG(data, i, prefix, line); } @@ -187,30 +192,30 @@ void ZDisplayList::ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int i, std::s else sprintf(line, "gsSPClearGeometryMode(%s),", geoModeStr.c_str()); - //sprintf(line, "gsSPGeometryMode(0x%08X, 0x%08X),", ~cccccc, ssssssss); + // sprintf(line, "gsSPGeometryMode(0x%08X, 0x%08X),", ~cccccc, ssssssss); } break; case F3DZEXOpcode::G_SETPRIMCOLOR: Opcode_G_SETPRIMCOLOR(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_SETOTHERMODE_L: Opcode_G_SETOTHERMODE_L(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_SETOTHERMODE_H: Opcode_G_SETOTHERMODE_H(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_SETTILE: Opcode_G_SETTILE(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_SETTILESIZE: Opcode_G_SETTILESIZE(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_LOADBLOCK: Opcode_G_LOADBLOCK(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_TEXTURE: Opcode_G_TEXTURE(data, i, prefix, line); - break; + break; case F3DZEXOpcode::G_RDPSETOTHERMODE: { int hhhhhh = (data & 0x00FFFFFF00000000) >> 32; @@ -269,10 +274,12 @@ void ZDisplayList::ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int i, std::s uint32_t b = (data2 & 0x00000FFF00000000) >> 32; uint32_t z = (data2 & 0x00000000FFFFFFFF) >> 0; - //sprintf(line, "gsDPWord(%i, 0),", h); - sprintf(line, "gsSPBranchLessZraw(%sDlist0x%06X, 0x%02X, 0x%02X),", prefix.c_str(), h & 0x00FFFFFF, (a / 5) | (b / 2), z); + // sprintf(line, "gsDPWord(%i, 0),", h); + sprintf(line, "gsSPBranchLessZraw(%sDlist0x%06X, 0x%02X, 0x%02X),", prefix.c_str(), + h & 0x00FFFFFF, (a / 5) | (b / 2), z); - ZDisplayList* nList = new ZDisplayList(fileData, h & 0x00FFFFFF, GetDListLength(fileData, h & 0x00FFFFFF, dListType)); + ZDisplayList* nList = new ZDisplayList( + fileData, h & 0x00FFFFFF, GetDListLength(fileData, h & 0x00FFFFFF, dListType)); nList->scene = scene; nList->parent = parent; otherDLists.push_back(nList); @@ -290,14 +297,15 @@ void ZDisplayList::ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int i, std::s break;*/ case F3DZEXOpcode::G_MTX: Opcode_G_MTX(data, i, prefix, line); - break; + break; default: sprintf(line, "// Opcode 0x%02X unimplemented!", (uint32_t)opcode); break; } } -void ZDisplayList::ParseF3DEX(F3DEXOpcode opcode, uint64_t data, int i, std::string prefix, char* line) +void ZDisplayList::ParseF3DEX(F3DEXOpcode opcode, uint64_t data, int i, std::string prefix, + char* line) { switch (opcode) { @@ -452,7 +460,7 @@ bool ZDisplayList::SequenceCheck(vector sequence, int startIndex) { bool success = true; - for (int j = 0; j < sequence.size(); j++) + for (size_t j = 0; j < sequence.size(); j++) { F3DZEXOpcode opcode = (F3DZEXOpcode)(instructions[startIndex + j] >> 56); @@ -488,18 +496,23 @@ int ZDisplayList::OptimizationCheck_LoadTextureBlock(int startIndex, string& out return -1; } - std::vector sequence = { F3DZEXOpcode::G_SETTIMG, F3DZEXOpcode::G_SETTILE, F3DZEXOpcode::G_RDPLOADSYNC, F3DZEXOpcode::G_LOADBLOCK, F3DZEXOpcode::G_RDPPIPESYNC, F3DZEXOpcode::G_SETTILE, F3DZEXOpcode::G_SETTILESIZE }; + std::vector sequence = {F3DZEXOpcode::G_SETTIMG, F3DZEXOpcode::G_SETTILE, + F3DZEXOpcode::G_RDPLOADSYNC, F3DZEXOpcode::G_LOADBLOCK, + F3DZEXOpcode::G_RDPPIPESYNC, F3DZEXOpcode::G_SETTILE, + F3DZEXOpcode::G_SETTILESIZE}; bool seqRes = SequenceCheck(sequence, startIndex); if (seqRes) { - // gsDPLoadTextureBlock(texAddr, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) - // gsDPLoadMultiBlock(texAddr, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) - // gsDPLoadTextureBlock_4b(texAddr, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) - // gsDPLoadMultiBlock_4b(texAddr, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) + // gsDPLoadTextureBlock(texAddr, fmt, siz, width, height, pal, cms, cmt, masks, maskt, + // shifts, shiftt) gsDPLoadMultiBlock(texAddr, tmem, rtile, fmt, siz, width, height, pal, + // cms, cmt, masks, maskt, shifts, shiftt) gsDPLoadTextureBlock_4b(texAddr, fmt, width, + // height, pal, cms, cmt, masks, maskt, shifts, shiftt) gsDPLoadMultiBlock_4b(texAddr, tmem, + // rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) - uint32_t texAddr, tmem, rtile, fmt, siz, sizB, width, height, width2, height2, pal, cms, cmt, masks, maskt, shifts, shiftt; + uint32_t texAddr, tmem, rtile, fmt, siz, sizB, width, height, width2, height2, pal, cms, + cmt, masks, maskt, shifts, shiftt; string texStr = ""; // gsDPSetTextureImage @@ -507,7 +520,7 @@ int ZDisplayList::OptimizationCheck_LoadTextureBlock(int startIndex, string& out uint64_t data = instructions[startIndex + 0]; int __ = (data & 0x00FF000000000000) >> 48; - int www = (data & 0x00000FFF00000000) >> 32; + // int www = (data & 0x00000FFF00000000) >> 32; fmt = (__ & 0xE0) >> 5; siz = (__ & 0x18) >> 3; @@ -518,7 +531,9 @@ int ZDisplayList::OptimizationCheck_LoadTextureBlock(int startIndex, string& out Declaration* texDecl = nullptr; - if (parent != nullptr && segmentNumber != 2) // HACK: Until we have declarations use segment addresses, we'll exclude scene references... + if (parent != nullptr && + segmentNumber != 2) // HACK: Until we have declarations use segment addresses, + // we'll exclude scene references... { texDecl = parent->GetDeclaration(texAddr); @@ -532,7 +547,8 @@ int ZDisplayList::OptimizationCheck_LoadTextureBlock(int startIndex, string& out texStr = StringHelper::Sprintf("%s", texDecl->varName.c_str()); else if (segmentNumber == 2) texStr = StringHelper::Sprintf("%sTex_%06X", scene->GetName().c_str(), texAddr); - else if (!Globals::Instance->HasSegment(segmentNumber)) // Probably an external asset we are unable to track + else if (!Globals::Instance->HasSegment( + segmentNumber)) // Probably an external asset we are unable to track texStr = StringHelper::Sprintf("0x%06X", data); else texStr = StringHelper::Sprintf("%sTex_%06X", prefix.c_str(), texAddr); @@ -547,17 +563,22 @@ int ZDisplayList::OptimizationCheck_LoadTextureBlock(int startIndex, string& out { uint64_t data = instructions[startIndex + 1]; - tmem = (data & 0b0000000000000000111111111111111100000000000000000000000000000000) >> 32; + tmem = + (data & 0b0000000000000000111111111111111100000000000000000000000000000000) >> 32; cmt = (data & 0b0000000000000000000000000000000000000000000011000000000000000000) >> 18; - maskt = (data & 0b0000000000000000000000000000000000000000000000111100000000000000) >> 14; - shiftt = (data & 0b0000000000000000000000000000000000000000000000000011110000000000) >> 10; + maskt = + (data & 0b0000000000000000000000000000000000000000000000111100000000000000) >> 14; + shiftt = + (data & 0b0000000000000000000000000000000000000000000000000011110000000000) >> 10; cms = (data & 0b0000000000000000000000000000000000000000000000000000001100000000) >> 8; - masks = (data & 0b0000000000000000000000000000000000000000000000000000000011110000) >> 4; + masks = + (data & 0b0000000000000000000000000000000000000000000000000000000011110000) >> 4; shifts = (data & 0b0000000000000000000000000000000000000000000000000000000000001111); - //sprintf(line, "gsDPSetTile(%s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),", fmtTbl[fff].c_str(), sizTbl[ii].c_str(), nnnnnnnnn, mmmmmmmmm, ttt, pppp, cc, aaaa, ssss, dd, bbbb, uuuu); - + // sprintf(line, "gsDPSetTile(%s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),", + // fmtTbl[fff].c_str(), sizTbl[ii].c_str(), nnnnnnnnn, mmmmmmmmm, ttt, pppp, cc, aaaa, + // ssss, dd, bbbb, uuuu); } // gsDPLoadSync @@ -571,8 +592,9 @@ int ZDisplayList::OptimizationCheck_LoadTextureBlock(int startIndex, string& out uint64_t data = instructions[startIndex + 5]; int __ = (data & 0x00FF000000000000) >> 48; pal = (data & 0b0000000000000000000000000000000000000000111100000000000000000000) >> 20; - //siz = (__ & 0x18) >> 3; - rtile = (data & 0b0000000000000000000000000000000011111111000000000000000000000000) >> 24; + // siz = (__ & 0x18) >> 3; + rtile = + (data & 0b0000000000000000000000000000000011111111000000000000000000000000) >> 24; sizB = (__ & 0x18) >> 3; } @@ -585,13 +607,15 @@ int ZDisplayList::OptimizationCheck_LoadTextureBlock(int startIndex, string& out int shiftAmtW = 2; int shiftAmtH = 2; - if (sizB == (int)F3DZEXTexSizes::G_IM_SIZ_8b && fmt == (int)F3DZEXTexFormats::G_IM_FMT_IA) + if (sizB == (int)F3DZEXTexSizes::G_IM_SIZ_8b && + fmt == (int)F3DZEXTexFormats::G_IM_FMT_IA) shiftAmtW = 3; if (sizB == (int)F3DZEXTexSizes::G_IM_SIZ_4b) shiftAmtW = 3; - if (sizB == (int)F3DZEXTexSizes::G_IM_SIZ_4b && fmt == (int)F3DZEXTexFormats::G_IM_FMT_IA) + if (sizB == (int)F3DZEXTexSizes::G_IM_SIZ_4b && + fmt == (int)F3DZEXTexFormats::G_IM_FMT_IA) shiftAmtH = 3; width = (uuu >> shiftAmtW) + 1; @@ -601,29 +625,39 @@ int ZDisplayList::OptimizationCheck_LoadTextureBlock(int startIndex, string& out height2 = (vvv >> 2) + 1; } - string fmtTbl[] = { "G_IM_FMT_RGBA", "G_IM_FMT_YUV", "G_IM_FMT_CI", "G_IM_FMT_IA", "G_IM_FMT_I" }; - string sizTbl[] = { "G_IM_SIZ_4b", "G_IM_SIZ_8b", "G_IM_SIZ_16b", "G_IM_SIZ_32b" }; + string fmtTbl[] = {"G_IM_FMT_RGBA", "G_IM_FMT_YUV", "G_IM_FMT_CI", "G_IM_FMT_IA", + "G_IM_FMT_I"}; + string sizTbl[] = {"G_IM_SIZ_4b", "G_IM_SIZ_8b", "G_IM_SIZ_16b", "G_IM_SIZ_32b"}; - //output += StringHelper::Sprintf("gsDPLoadTextureBlock(%s, %s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", - //texStr.c_str(), fmtTbl[fmt].c_str(), sizTbl[siz].c_str(), width, height, pal, cms, cmt, masks, maskt, shifts, shiftt); + // output += StringHelper::Sprintf("gsDPLoadTextureBlock(%s, %s, %s, %i, %i, %i, %i, %i, %i, + // %i, %i, %i),", texStr.c_str(), fmtTbl[fmt].c_str(), sizTbl[siz].c_str(), width, height, + // pal, cms, cmt, masks, maskt, shifts, shiftt); if (siz == 2 && sizB == 0) { if (tmem != 0) - output += StringHelper::Sprintf("gsDPLoadMultiBlock_4b(%s, %i, %i, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", - texStr.c_str(), tmem, rtile, fmtTbl[fmt].c_str(), width2, height2, pal, cms, cmt, masks, maskt, shifts, shiftt); + output += StringHelper::Sprintf( + "gsDPLoadMultiBlock_4b(%s, %i, %i, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", + texStr.c_str(), tmem, rtile, fmtTbl[fmt].c_str(), width2, height2, pal, cms, + cmt, masks, maskt, shifts, shiftt); else - output += StringHelper::Sprintf("gsDPLoadTextureBlock_4b(%s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", - texStr.c_str(), fmtTbl[fmt].c_str(), width2, height2, pal, cms, cmt, masks, maskt, shifts, shiftt); + output += StringHelper::Sprintf( + "gsDPLoadTextureBlock_4b(%s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", + texStr.c_str(), fmtTbl[fmt].c_str(), width2, height2, pal, cms, cmt, masks, + maskt, shifts, shiftt); } else if (siz == 2 && sizB != 0) { if (tmem != 0) - output += StringHelper::Sprintf("gsDPLoadMultiBlock(%s, %i, %i, %s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", - texStr.c_str(), tmem, rtile, fmtTbl[fmt].c_str(), sizTbl[sizB].c_str(), width2, height2, pal, cms, cmt, masks, maskt, shifts, shiftt); + output += StringHelper::Sprintf( + "gsDPLoadMultiBlock(%s, %i, %i, %s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", + texStr.c_str(), tmem, rtile, fmtTbl[fmt].c_str(), sizTbl[sizB].c_str(), width2, + height2, pal, cms, cmt, masks, maskt, shifts, shiftt); else - output += StringHelper::Sprintf("gsDPLoadTextureBlock(%s, %s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", - texStr.c_str(), fmtTbl[fmt].c_str(), sizTbl[sizB].c_str(), width2, height2, pal, cms, cmt, masks, maskt, shifts, shiftt); + output += StringHelper::Sprintf( + "gsDPLoadTextureBlock(%s, %s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", + texStr.c_str(), fmtTbl[fmt].c_str(), sizTbl[sizB].c_str(), width2, height2, pal, + cms, cmt, masks, maskt, shifts, shiftt); } else { @@ -641,8 +675,10 @@ int ZDisplayList::OptimizationCheck_LoadTextureBlock(int startIndex, string& out return -1; } - output += StringHelper::Sprintf("gsDPLoadMultiBlock(%s, %i, %i, %s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", - texStr.c_str(), tmem, rtile, fmtTbl[fmt].c_str(), sizTbl[siz].c_str(), width, height, pal, cms, cmt, masks, maskt, shifts, shiftt); + output += StringHelper::Sprintf( + "gsDPLoadMultiBlock(%s, %i, %i, %s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i),", + texStr.c_str(), tmem, rtile, fmtTbl[fmt].c_str(), sizTbl[siz].c_str(), width, + height, pal, cms, cmt, masks, maskt, shifts, shiftt); } lastTexAddr = texAddr; @@ -689,10 +725,12 @@ void ZDisplayList::Opcode_G_DL(uint64_t data, int i, std::string prefix, char* l sprintf(line, "gsSPDisplayList(%sDlist0x%06lX),", prefix.c_str(), GETSEGOFFSET(data)); } - // TODO: This is the same as `segNum`. Consider resuing that variable instead of making a new one. + // TODO: This is the same as `segNum`. Consider resuing that variable instead of making a new + // one. int segmentNumber = GETSEGNUM(data); - if (segmentNumber == 8 || segmentNumber == 9 || segmentNumber == 10 || segmentNumber == 11 || segmentNumber == 12 || segmentNumber == 13) // Used for runtime-generated display lists + if (segmentNumber == 8 || segmentNumber == 9 || segmentNumber == 10 || segmentNumber == 11 || + segmentNumber == 12 || segmentNumber == 13) // Used for runtime-generated display lists { if (pp != 0) sprintf(line, "gsSPBranchList(0x%08lX),", data & 0xFFFFFFFF); @@ -701,7 +739,8 @@ void ZDisplayList::Opcode_G_DL(uint64_t data, int i, std::string prefix, char* l } else { - ZDisplayList* nList = new ZDisplayList(fileData, data & 0x00FFFFFF, GetDListLength(fileData, data & 0x00FFFFFF, dListType)); + ZDisplayList* nList = new ZDisplayList( + fileData, data & 0x00FFFFFF, GetDListLength(fileData, data & 0x00FFFFFF, dListType)); nList->scene = scene; nList->parent = parent; otherDLists.push_back(nList); @@ -778,17 +817,16 @@ void ZDisplayList::Opcode_G_MTX(uint64_t data, int i, std::string prefix, char* if (pp & 0x01) push = true; - + if (pp & 0x02) load = true; - + if (pp & 0x04) projection = true; sprintf(line, "gsSPMatrix(%s, %s | %s | %s),", matrixRef.c_str(), - projection ? "G_MTX_PROJECTION" : "G_MTX_MODELVIEW", - push ? "G_MTX_PUSH" : "G_MTX_NOPUSH", - load ? "G_MTX_LOAD" : "G_MTX_MUL"); + projection ? "G_MTX_PROJECTION" : "G_MTX_MODELVIEW", + push ? "G_MTX_PUSH" : "G_MTX_NOPUSH", load ? "G_MTX_LOAD" : "G_MTX_MUL"); } void ZDisplayList::Opcode_G_VTX(uint64_t data, int i, std::string prefix, char* line) @@ -804,8 +842,7 @@ void ZDisplayList::Opcode_G_VTX(uint64_t data, int i, std::string prefix, char* { uint32_t hi = data >> 32; -#define _SHIFTR( v, s, w ) \ - (((uint32_t)v >> s) & ((0x01 << w) - 1)) +#define _SHIFTR(v, s, w) (((uint32_t)v >> s) & ((0x01 << w) - 1)) nn = _SHIFTR(hi, 10, 6); @@ -813,10 +850,12 @@ void ZDisplayList::Opcode_G_VTX(uint64_t data, int i, std::string prefix, char* } // Hack: Don't extract vertices from a unknown segment. - if (!Globals::Instance->HasSegment(GETSEGNUM(data))) { + if (!Globals::Instance->HasSegment(GETSEGNUM(data))) + { segptr_t segmented = data & 0xFFFFFFFF; references.push_back(segmented); - parent->AddDeclaration(segmented, DeclarationAlignment::Align16, 16, "Vtx", StringHelper::Sprintf("0x%08X", segmented), ""); + parent->AddDeclaration(segmented, DeclarationAlignment::Align16, 16, "Vtx", + StringHelper::Sprintf("0x%08X", segmented), ""); return; } references.push_back(vtxAddr); @@ -828,7 +867,7 @@ void ZDisplayList::Opcode_G_VTX(uint64_t data, int i, std::string prefix, char* // TODO: These two could probably be condenced to one... if (parent->GetDeclarationRanged(vtxAddr + (nn * 16)) != nullptr) { - Declaration* decl = parent->GetDeclarationRanged(vtxAddr + (nn * 16)); + // Declaration* decl = parent->GetDeclarationRanged(vtxAddr + (nn * 16)); uint32_t addr = parent->GetDeclarationRangedAddress(vtxAddr + (nn * 16)); int diff = addr - vtxAddr; if (diff > 0) @@ -839,7 +878,7 @@ void ZDisplayList::Opcode_G_VTX(uint64_t data, int i, std::string prefix, char* if (parent->GetDeclarationRanged(vtxAddr) != nullptr) { - Declaration* decl = parent->GetDeclarationRanged(vtxAddr); + // Declaration* decl = parent->GetDeclarationRanged(vtxAddr); uint32_t addr = parent->GetDeclarationRangedAddress(vtxAddr); int diff = addr - vtxAddr; if (diff > 0) @@ -880,15 +919,16 @@ void ZDisplayList::Opcode_G_TEXTURE(uint64_t data, int i, std::string prefix, ch else nnnnnnn = (____ & 0xFE) >> 1; - sprintf(line, "gsSPTexture(%i, %i, %i, %i, %s),", ssss, tttt, lll, ddd, nnnnnnn == 1 ? "G_ON" : "G_OFF"); + sprintf(line, "gsSPTexture(%i, %i, %i, %i, %s),", ssss, tttt, lll, ddd, + nnnnnnn == 1 ? "G_ON" : "G_OFF"); } void ZDisplayList::Opcode_G_SETTIMG(uint64_t data, int i, std::string prefix, char* line) { int __ = (data & 0x00FF000000000000) >> 48; int www = (data & 0x00000FFF00000000) >> 32; - string fmtTbl[] = { "G_IM_FMT_RGBA", "G_IM_FMT_YUV", "G_IM_FMT_CI", "G_IM_FMT_IA", "G_IM_FMT_I" }; - string sizTbl[] = { "G_IM_SIZ_4b", "G_IM_SIZ_8b", "G_IM_SIZ_16b", "G_IM_SIZ_32b" }; + string fmtTbl[] = {"G_IM_FMT_RGBA", "G_IM_FMT_YUV", "G_IM_FMT_CI", "G_IM_FMT_IA", "G_IM_FMT_I"}; + string sizTbl[] = {"G_IM_SIZ_4b", "G_IM_SIZ_8b", "G_IM_SIZ_16b", "G_IM_SIZ_32b"}; uint32_t fmt = (__ & 0xE0) >> 5; uint32_t siz = (__ & 0x18) >> 3; @@ -896,7 +936,7 @@ void ZDisplayList::Opcode_G_SETTIMG(uint64_t data, int i, std::string prefix, ch if (Globals::Instance->verbosity >= VERBOSITY_DEBUG) printf("TextureGenCheck G_SETTIMG\n"); - TextureGenCheck(prefix); // HOTSPOT + TextureGenCheck(prefix); // HOTSPOT lastTexFmt = (F3DZEXTexFormats)fmt; lastTexSiz = (F3DZEXTexSizes)siz; @@ -926,24 +966,27 @@ void ZDisplayList::Opcode_G_SETTIMG(uint64_t data, int i, std::string prefix, ch else { // TEST: CHECK OTHER FILES FOR REF - //if (segmentNumber == 4) + // if (segmentNumber == 4) //{ - //Globals::Instance->FindSymbolSegRef(segmentNumber, texAddress); + // Globals::Instance->FindSymbolSegRef(segmentNumber, texAddress); //} - //else + // else { sprintf(texStr, "0x%08lX", data & 0xFFFFFFFF); } } - sprintf(line, "gsDPSetTextureImage(%s, %s, %i, %s),", fmtTbl[fmt].c_str(), sizTbl[siz].c_str(), www + 1, texStr); - //sprintf(line, "gsDPSetTextureImage(%s, %s, %i, @r),", fmtTbl[fmt].c_str(), sizTbl[siz].c_str(), www + 1); - //references.push_back(data & 0x00FFFFFF); + sprintf(line, "gsDPSetTextureImage(%s, %s, %i, %s),", fmtTbl[fmt].c_str(), + sizTbl[siz].c_str(), www + 1, texStr); + // sprintf(line, "gsDPSetTextureImage(%s, %s, %i, @r),", fmtTbl[fmt].c_str(), + // sizTbl[siz].c_str(), www + 1); references.push_back(data & 0x00FFFFFF); } else { - //sprintf(line, "gsDPSetTextureImage(%s, %s, %i, 0x%08X),", fmtTbl[fmt].c_str(), sizTbl[siz].c_str(), www + 1, data & 0xFFFFFFFF); - sprintf(line, "gsDPSetTextureImage(%s, %s, %i, %sTex_%06lX),", fmtTbl[fmt].c_str(), sizTbl[siz].c_str(), www + 1, scene->GetName().c_str(), GETSEGOFFSET(data)); + // sprintf(line, "gsDPSetTextureImage(%s, %s, %i, 0x%08X),", fmtTbl[fmt].c_str(), + // sizTbl[siz].c_str(), www + 1, data & 0xFFFFFFFF); + sprintf(line, "gsDPSetTextureImage(%s, %s, %i, %sTex_%06lX),", fmtTbl[fmt].c_str(), + sizTbl[siz].c_str(), www + 1, scene->GetName().c_str(), GETSEGOFFSET(data)); } } @@ -951,8 +994,10 @@ void ZDisplayList::Opcode_G_SETTILE(uint64_t data, int i, std::string prefix, ch { int fff = (data & 0b0000000011100000000000000000000000000000000000000000000000000000) >> 53; int ii = (data & 0b0000000000011000000000000000000000000000000000000000000000000000) >> 51; - int nnnnnnnnn = (data & 0b0000000000000011111111100000000000000000000000000000000000000000) >> 41; - int mmmmmmmmm = (data & 0b0000000000000000000000011111111100000000000000000000000000000000) >> 32; + int nnnnnnnnn = + (data & 0b0000000000000011111111100000000000000000000000000000000000000000) >> 41; + int mmmmmmmmm = + (data & 0b0000000000000000000000011111111100000000000000000000000000000000) >> 32; int ttt = (data & 0b0000000000000000000000000000000000000111000000000000000000000000) >> 24; int pppp = (data & 0b0000000000000000000000000000000000000000111100000000000000000000) >> 20; int cc = (data & 0b0000000000000000000000000000000000000000000011000000000000000000) >> 18; @@ -962,15 +1007,17 @@ void ZDisplayList::Opcode_G_SETTILE(uint64_t data, int i, std::string prefix, ch int bbbb = (data & 0b0000000000000000000000000000000000000000000000000000000011110000) >> 4; int uuuu = (data & 0b0000000000000000000000000000000000000000000000000000000000001111); - string fmtTbl[] = { "G_IM_FMT_RGBA", "G_IM_FMT_YUV", "G_IM_FMT_CI", "G_IM_FMT_IA", "G_IM_FMT_I" }; - string sizTbl[] = { "G_IM_SIZ_4b", "G_IM_SIZ_8b", "G_IM_SIZ_16b", "G_IM_SIZ_32b" }; + string fmtTbl[] = {"G_IM_FMT_RGBA", "G_IM_FMT_YUV", "G_IM_FMT_CI", "G_IM_FMT_IA", "G_IM_FMT_I"}; + string sizTbl[] = {"G_IM_SIZ_4b", "G_IM_SIZ_8b", "G_IM_SIZ_16b", "G_IM_SIZ_32b"}; if (fff == (int)F3DZEXTexFormats::G_IM_FMT_CI) lastCISiz = (F3DZEXTexSizes)ii; lastTexSizTest = (F3DZEXTexSizes)ii; - sprintf(line, "gsDPSetTile(%s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),", fmtTbl[fff].c_str(), sizTbl[ii].c_str(), nnnnnnnnn, mmmmmmmmm, ttt, pppp, cc, aaaa, ssss, dd, bbbb, uuuu); + sprintf(line, "gsDPSetTile(%s, %s, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i),", + fmtTbl[fff].c_str(), sizTbl[ii].c_str(), nnnnnnnnn, mmmmmmmmm, ttt, pppp, cc, aaaa, + ssss, dd, bbbb, uuuu); } void ZDisplayList::Opcode_G_SETTILESIZE(uint64_t data, int index, std::string prefix, char* line) @@ -984,22 +1031,25 @@ void ZDisplayList::Opcode_G_SETTILESIZE(uint64_t data, int index, std::string pr int shiftAmtW = 2; int shiftAmtH = 2; - if (lastTexSizTest == F3DZEXTexSizes::G_IM_SIZ_8b && lastTexFmt == F3DZEXTexFormats::G_IM_FMT_IA) + if (lastTexSizTest == F3DZEXTexSizes::G_IM_SIZ_8b && + lastTexFmt == F3DZEXTexFormats::G_IM_FMT_IA) shiftAmtW = 3; - //if (lastTexFmt == F3DZEXTexFormats::G_IM_FMT_I || lastTexFmt == F3DZEXTexFormats::G_IM_FMT_CI) + // if (lastTexFmt == F3DZEXTexFormats::G_IM_FMT_I || lastTexFmt == + // F3DZEXTexFormats::G_IM_FMT_CI) if (lastTexSizTest == F3DZEXTexSizes::G_IM_SIZ_4b) shiftAmtW = 3; - if (lastTexSizTest == F3DZEXTexSizes::G_IM_SIZ_4b && lastTexFmt == F3DZEXTexFormats::G_IM_FMT_IA) + if (lastTexSizTest == F3DZEXTexSizes::G_IM_SIZ_4b && + lastTexFmt == F3DZEXTexFormats::G_IM_FMT_IA) shiftAmtH = 3; - lastTexWidth = (uuu >> shiftAmtW) + 1; lastTexHeight = (vvv >> shiftAmtH) + 1; if (Globals::Instance->verbosity >= VERBOSITY_DEBUG) - printf("lastTexWidth: %i lastTexHeight: %i, lastTexSizTest: 0x%x, lastTexFmt: 0x%x\n", lastTexWidth, lastTexHeight, (uint32_t)lastTexSizTest, (uint32_t)lastTexFmt); + printf("lastTexWidth: %i lastTexHeight: %i, lastTexSizTest: 0x%x, lastTexFmt: 0x%x\n", + lastTexWidth, lastTexHeight, (uint32_t)lastTexSizTest, (uint32_t)lastTexFmt); if (Globals::Instance->verbosity >= VERBOSITY_DEBUG) printf("TextureGenCheck G_SETTILESIZE\n"); @@ -1017,11 +1067,11 @@ void ZDisplayList::Opcode_G_LOADBLOCK(uint64_t data, int index, std::string pref int xxx = (data & 0x0000000000FFF000) >> 12; int ddd = (data & 0x0000000000000FFF); - //lastTexHeight = (ddd + 1) / 16; + // lastTexHeight = (ddd + 1) / 16; lastTexLoaded = true; - //TextureGenCheck(prefix); + // TextureGenCheck(prefix); sprintf(line, "gsDPLoadBlock(%i, %i, %i, %i, %i),", i, sss, ttt, xxx, ddd); } @@ -1045,24 +1095,59 @@ void ZDisplayList::Opcode_G_SETCOMBINE(uint64_t data, int i, std::string prefix, int ab1 = (data & 0b00000000000000000000000000000000000000000000000000000000111000) >> 3; int ad1 = (data & 0b00000000000000000000000000000000000000000000000000000000000111) >> 0; - string modesA[] = { "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE", "SHADE", "ENVIRONMENT", "1", "NOISE", - "0", "9", "10", "11", "12", "13", "14", "0"}; - string modesB[] = { "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE", "SHADE", "ENVIRONMENT", "CENTER", "K4", - "8", "9", "10", "11", "12", "13", "14", "0"}; - string modesC[] = { "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE", "SHADE", "ENVIRONMENT", "1", "COMBINED_ALPHA", - "TEXEL0_ALPHA", "TEXEL1_ALPHA", "PRIMITIVE_ALPHA", "SHADE_ALPHA", "ENV_ALPHA", "LOD_FRACTION", "PRIM_LOD_FRAC", "K5", - "16", "17", "18", "19", "20", "21", "22", "23", - "24", "25", "26", "27", "28", "29", "30", "0" }; - string modesD[] = { "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE", "SHADE", "ENVIRONMENT", "1", "0"}; + string modesA[] = {"COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE", "SHADE", "ENVIRONMENT", + "1", "NOISE", "0", "9", "10", "11", + "12", "13", "14", "0"}; + string modesB[] = {"COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE", "SHADE", "ENVIRONMENT", + "CENTER", "K4", "8", "9", "10", "11", + "12", "13", "14", "0"}; + string modesC[] = {"COMBINED", + "TEXEL0", + "TEXEL1", + "PRIMITIVE", + "SHADE", + "ENVIRONMENT", + "1", + "COMBINED_ALPHA", + "TEXEL0_ALPHA", + "TEXEL1_ALPHA", + "PRIMITIVE_ALPHA", + "SHADE_ALPHA", + "ENV_ALPHA", + "LOD_FRACTION", + "PRIM_LOD_FRAC", + "K5", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "0"}; + string modesD[] = {"COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE", + "SHADE", "ENVIRONMENT", "1", "0"}; - string modes2[] = { "COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE", "SHADE", "ENVIRONMENT", "1", "0" }; - string modes2C[] = { "LOD_FRACTION", "TEXEL0", "TEXEL1", "PRIMITIVE", "SHADE", "ENVIRONMENT", "PRIM_LOD_FRAC", "0" }; + string modes2[] = {"COMBINED", "TEXEL0", "TEXEL1", "PRIMITIVE", + "SHADE", "ENVIRONMENT", "1", "0"}; + string modes2C[] = {"LOD_FRACTION", "TEXEL0", "TEXEL1", "PRIMITIVE", + "SHADE", "ENVIRONMENT", "PRIM_LOD_FRAC", "0"}; - sprintf(line, "gsDPSetCombineLERP(%s, %s, %s, %s, %s, %s, %s, %s,\n %s, %s, %s, %s, %s, %s, %s, %s),", - modesA[a0].c_str(), modesB[b0].c_str(), modesC[c0].c_str(), modesD[d0].c_str(), - modes2[aa0].c_str(), modes2[ab0].c_str(), modes2C[ac0].c_str(), modes2[ad0].c_str(), - modesA[a1].c_str(), modesB[b1].c_str(), modesC[c1].c_str(), modesD[d1].c_str(), - modes2[aa1].c_str(), modes2[ab1].c_str(), modes2C[ac1].c_str(), modes2[ad1].c_str()); + sprintf(line, + "gsDPSetCombineLERP(%s, %s, %s, %s, %s, %s, %s, %s,\n %s, %s, " + "%s, %s, %s, %s, %s, %s),", + modesA[a0].c_str(), modesB[b0].c_str(), modesC[c0].c_str(), modesD[d0].c_str(), + modes2[aa0].c_str(), modes2[ab0].c_str(), modes2C[ac0].c_str(), modes2[ad0].c_str(), + modesA[a1].c_str(), modesB[b1].c_str(), modesC[c1].c_str(), modesD[d1].c_str(), + modes2[aa1].c_str(), modes2[ab1].c_str(), modes2C[ac1].c_str(), modes2[ad1].c_str()); } void ZDisplayList::Opcode_G_SETPRIMCOLOR(uint64_t data, int i, std::string prefix, char* line) @@ -1076,7 +1161,8 @@ void ZDisplayList::Opcode_G_SETPRIMCOLOR(uint64_t data, int i, std::string prefi sprintf(line, "gsDPSetPrimColor(%i, %i, %i, %i, %i, %i),", mm, ff, rr, gg, bb, aa); } -void ZDisplayList::Opcode_F3DEX_G_SETOTHERMODE_L(uint64_t data, int i, std::string prefix, char* line) +void ZDisplayList::Opcode_F3DEX_G_SETOTHERMODE_L(uint64_t data, int i, std::string prefix, + char* line) { int sft = (data & 0x0000FF0000000000) >> 40; int len = (data & 0x000000FF00000000) >> 32; @@ -1102,154 +1188,210 @@ void ZDisplayList::Opcode_G_SETOTHERMODE_L(uint64_t data, int i, std::string pre { int ss = (data & 0x0000FF0000000000) >> 40; len = ((data & 0x000000FF00000000) >> 32) + 1; - sft = 32 - (len) - ss; + sft = 32 - (len)-ss; } if (sft == G_MDSFT_RENDERMODE) { - int mode1 = (dd & 0xCCCC0000) >> 0; - int mode2 = (dd & 0x3333FFFF); + uint32_t mode1 = (dd & 0xCCCC0000) >> 0; + uint32_t mode2 = (dd & 0x3333FFFF); // TODO: Jesus Christ This is Messy - uint32_t tblA[] = - { - G_RM_FOG_SHADE_A, G_RM_FOG_PRIM_A, G_RM_PASS, G_RM_AA_ZB_OPA_SURF, - G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_OPA_DECAL, G_RM_AA_ZB_XLU_DECAL, - G_RM_AA_ZB_OPA_INTER, G_RM_AA_ZB_XLU_INTER, G_RM_AA_ZB_XLU_LINE, - G_RM_AA_ZB_DEC_LINE, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_INTER, - G_RM_AA_ZB_SUB_SURF, G_RM_AA_ZB_PCL_SURF, G_RM_AA_ZB_OPA_TERR, - G_RM_AA_ZB_TEX_TERR, G_RM_AA_ZB_SUB_TERR, G_RM_RA_ZB_OPA_SURF, - G_RM_RA_ZB_OPA_DECAL, G_RM_RA_ZB_OPA_INTER, G_RM_AA_OPA_SURF, - G_RM_AA_XLU_SURF, G_RM_AA_XLU_LINE, G_RM_AA_DEC_LINE, - G_RM_AA_TEX_EDGE, G_RM_AA_SUB_SURF, G_RM_AA_PCL_SURF, - G_RM_AA_OPA_TERR, G_RM_AA_TEX_TERR, G_RM_AA_SUB_TERR, - G_RM_RA_OPA_SURF, G_RM_ZB_OPA_SURF, G_RM_ZB_XLU_SURF, - G_RM_ZB_OPA_DECAL, G_RM_ZB_XLU_DECAL, G_RM_ZB_CLD_SURF, - G_RM_ZB_OVL_SURF, G_RM_ZB_PCL_SURF, G_RM_OPA_SURF, - G_RM_XLU_SURF, G_RM_CLD_SURF, G_RM_TEX_EDGE, G_RM_PCL_SURF, - G_RM_ADD, G_RM_NOOP, G_RM_VISCVG, G_RM_OPA_CI + uint32_t tblA[] = {G_RM_FOG_SHADE_A, + G_RM_FOG_PRIM_A, + G_RM_PASS, + G_RM_AA_ZB_OPA_SURF, + G_RM_AA_ZB_XLU_SURF, + G_RM_AA_ZB_OPA_DECAL, + G_RM_AA_ZB_XLU_DECAL, + G_RM_AA_ZB_OPA_INTER, + G_RM_AA_ZB_XLU_INTER, + G_RM_AA_ZB_XLU_LINE, + G_RM_AA_ZB_DEC_LINE, + G_RM_AA_ZB_TEX_EDGE, + G_RM_AA_ZB_TEX_INTER, + G_RM_AA_ZB_SUB_SURF, + G_RM_AA_ZB_PCL_SURF, + G_RM_AA_ZB_OPA_TERR, + G_RM_AA_ZB_TEX_TERR, + G_RM_AA_ZB_SUB_TERR, + G_RM_RA_ZB_OPA_SURF, + G_RM_RA_ZB_OPA_DECAL, + G_RM_RA_ZB_OPA_INTER, + G_RM_AA_OPA_SURF, + G_RM_AA_XLU_SURF, + G_RM_AA_XLU_LINE, + G_RM_AA_DEC_LINE, + G_RM_AA_TEX_EDGE, + G_RM_AA_SUB_SURF, + G_RM_AA_PCL_SURF, + G_RM_AA_OPA_TERR, + G_RM_AA_TEX_TERR, + G_RM_AA_SUB_TERR, + G_RM_RA_OPA_SURF, + G_RM_ZB_OPA_SURF, + G_RM_ZB_XLU_SURF, + G_RM_ZB_OPA_DECAL, + G_RM_ZB_XLU_DECAL, + G_RM_ZB_CLD_SURF, + G_RM_ZB_OVL_SURF, + G_RM_ZB_PCL_SURF, + G_RM_OPA_SURF, + G_RM_XLU_SURF, + G_RM_CLD_SURF, + G_RM_TEX_EDGE, + G_RM_PCL_SURF, + G_RM_ADD, + G_RM_NOOP, + G_RM_VISCVG, + G_RM_OPA_CI}; + + uint32_t tblB[] = {G_RM_AA_ZB_OPA_SURF2, + G_RM_AA_ZB_XLU_SURF2, + G_RM_AA_ZB_OPA_DECAL2, + G_RM_AA_ZB_XLU_DECAL2, + G_RM_AA_ZB_OPA_INTER2, + G_RM_AA_ZB_XLU_INTER2, + G_RM_AA_ZB_XLU_LINE2, + G_RM_AA_ZB_DEC_LINE2, + G_RM_AA_ZB_TEX_EDGE2, + G_RM_AA_ZB_TEX_INTER2, + G_RM_AA_ZB_SUB_SURF2, + G_RM_AA_ZB_PCL_SURF2, + G_RM_AA_ZB_OPA_TERR2, + G_RM_AA_ZB_TEX_TERR2, + G_RM_AA_ZB_SUB_TERR2, + G_RM_RA_ZB_OPA_SURF2, + G_RM_RA_ZB_OPA_DECAL2, + G_RM_RA_ZB_OPA_INTER2, + G_RM_AA_OPA_SURF2, + G_RM_AA_XLU_SURF2, + G_RM_AA_XLU_LINE2, + G_RM_AA_DEC_LINE2, + G_RM_AA_TEX_EDGE2, + G_RM_AA_SUB_SURF2, + G_RM_AA_PCL_SURF2, + G_RM_AA_OPA_TERR2, + G_RM_AA_TEX_TERR2, + G_RM_AA_SUB_TERR2, + G_RM_RA_OPA_SURF2, + G_RM_ZB_OPA_SURF2, + G_RM_ZB_XLU_SURF2, + G_RM_ZB_OPA_DECAL2, + G_RM_ZB_XLU_DECAL2, + G_RM_ZB_CLD_SURF2, + G_RM_ZB_OVL_SURF2, + G_RM_ZB_PCL_SURF2, + G_RM_OPA_SURF2, + G_RM_XLU_SURF2, + G_RM_CLD_SURF2, + G_RM_TEX_EDGE2, + G_RM_PCL_SURF2, + G_RM_ADD2, + G_RM_NOOP2, + G_RM_VISCVG2, + G_RM_OPA_CI2}; + + map str = { + {G_RM_FOG_SHADE_A, "G_RM_FOG_SHADE_A"}, + {G_RM_FOG_PRIM_A, "G_RM_FOG_PRIM_A"}, + {G_RM_PASS, "G_RM_PASS"}, + {G_RM_AA_ZB_OPA_SURF, "G_RM_AA_ZB_OPA_SURF"}, + {G_RM_AA_ZB_OPA_SURF2, "G_RM_AA_ZB_OPA_SURF2"}, + {G_RM_AA_ZB_XLU_SURF, "G_RM_AA_ZB_XLU_SURF"}, + {G_RM_AA_ZB_XLU_SURF2, "G_RM_AA_ZB_XLU_SURF2"}, + {G_RM_AA_ZB_OPA_DECAL, "G_RM_AA_ZB_OPA_DECAL"}, + {G_RM_AA_ZB_OPA_DECAL2, "G_RM_AA_ZB_OPA_DECAL2"}, + {G_RM_AA_ZB_XLU_DECAL, "G_RM_AA_ZB_XLU_DECAL"}, + {G_RM_AA_ZB_XLU_DECAL2, "G_RM_AA_ZB_XLU_DECAL2"}, + {G_RM_AA_ZB_OPA_INTER, "G_RM_AA_ZB_OPA_INTER"}, + {G_RM_AA_ZB_OPA_INTER2, "G_RM_AA_ZB_OPA_INTER2"}, + {G_RM_AA_ZB_XLU_INTER, "G_RM_AA_ZB_XLU_INTER"}, + {G_RM_AA_ZB_XLU_INTER2, "G_RM_AA_ZB_XLU_INTER2"}, + {G_RM_AA_ZB_XLU_LINE, "G_RM_AA_ZB_XLU_LINE"}, + {G_RM_AA_ZB_XLU_LINE2, "G_RM_AA_ZB_XLU_LINE2"}, + {G_RM_AA_ZB_DEC_LINE, "G_RM_AA_ZB_DEC_LINE"}, + {G_RM_AA_ZB_DEC_LINE2, "G_RM_AA_ZB_DEC_LINE2"}, + {G_RM_AA_ZB_TEX_EDGE, "G_RM_AA_ZB_TEX_EDGE"}, + {G_RM_AA_ZB_TEX_EDGE2, "G_RM_AA_ZB_TEX_EDGE2"}, + {G_RM_AA_ZB_TEX_INTER, "G_RM_AA_ZB_TEX_INTER"}, + {G_RM_AA_ZB_TEX_INTER2, "G_RM_AA_ZB_TEX_INTER2"}, + {G_RM_AA_ZB_SUB_SURF, "G_RM_AA_ZB_SUB_SURF"}, + {G_RM_AA_ZB_SUB_SURF2, "G_RM_AA_ZB_SUB_SURF2"}, + {G_RM_AA_ZB_PCL_SURF, "G_RM_AA_ZB_PCL_SURF"}, + {G_RM_AA_ZB_PCL_SURF2, "G_RM_AA_ZB_PCL_SURF2"}, + {G_RM_AA_ZB_OPA_TERR, "G_RM_AA_ZB_OPA_TERR"}, + {G_RM_AA_ZB_OPA_TERR2, "G_RM_AA_ZB_OPA_TERR2"}, + {G_RM_AA_ZB_TEX_TERR, "G_RM_AA_ZB_TEX_TERR"}, + {G_RM_AA_ZB_TEX_TERR2, "G_RM_AA_ZB_TEX_TERR2"}, + {G_RM_AA_ZB_SUB_TERR, "G_RM_AA_ZB_SUB_TERR"}, + {G_RM_AA_ZB_SUB_TERR2, "G_RM_AA_ZB_SUB_TERR2"}, + {G_RM_RA_ZB_OPA_SURF, "G_RM_RA_ZB_OPA_SURF"}, + {G_RM_RA_ZB_OPA_SURF2, "G_RM_RA_ZB_OPA_SURF2"}, + {G_RM_RA_ZB_OPA_DECAL, "G_RM_RA_ZB_OPA_DECAL"}, + {G_RM_RA_ZB_OPA_DECAL2, "G_RM_RA_ZB_OPA_DECAL2"}, + {G_RM_RA_ZB_OPA_INTER, "G_RM_RA_ZB_OPA_INTER"}, + {G_RM_RA_ZB_OPA_INTER2, "G_RM_RA_ZB_OPA_INTER2"}, + {G_RM_AA_OPA_SURF, "G_RM_AA_OPA_SURF"}, + {G_RM_AA_OPA_SURF2, "G_RM_AA_OPA_SURF2"}, + {G_RM_AA_XLU_SURF, "G_RM_AA_XLU_SURF"}, + {G_RM_AA_XLU_SURF2, "G_RM_AA_XLU_SURF2"}, + {G_RM_AA_XLU_LINE, "G_RM_AA_XLU_LINE"}, + {G_RM_AA_XLU_LINE2, "G_RM_AA_XLU_LINE2"}, + {G_RM_AA_DEC_LINE, "G_RM_AA_DEC_LINE"}, + {G_RM_AA_DEC_LINE2, "G_RM_AA_DEC_LINE2"}, + {G_RM_AA_TEX_EDGE, "G_RM_AA_TEX_EDGE"}, + {G_RM_AA_TEX_EDGE2, "G_RM_AA_TEX_EDGE2"}, + {G_RM_AA_SUB_SURF, "G_RM_AA_SUB_SURF"}, + {G_RM_AA_SUB_SURF2, "G_RM_AA_SUB_SURF2"}, + {G_RM_AA_PCL_SURF, "G_RM_AA_PCL_SURF"}, + {G_RM_AA_PCL_SURF2, "G_RM_AA_PCL_SURF2"}, + {G_RM_AA_OPA_TERR, "G_RM_AA_OPA_TERR"}, + {G_RM_AA_OPA_TERR2, "G_RM_AA_OPA_TERR2"}, + {G_RM_AA_TEX_TERR, "G_RM_AA_TEX_TERR"}, + {G_RM_AA_TEX_TERR2, "G_RM_AA_TEX_TERR2"}, + {G_RM_AA_TEX_TERR, "G_RM_AA_TEX_TERR"}, + {G_RM_AA_TEX_TERR2, "G_RM_AA_TEX_TERR2"}, + {G_RM_AA_SUB_TERR, "G_RM_AA_SUB_TERR"}, + {G_RM_AA_SUB_TERR2, "G_RM_AA_SUB_TERR2"}, + {G_RM_RA_OPA_SURF, "G_RM_RA_OPA_SURF"}, + {G_RM_RA_OPA_SURF2, "G_RM_RA_OPA_SURF2"}, + {G_RM_ZB_OPA_SURF, "G_RM_ZB_OPA_SURF"}, + {G_RM_ZB_OPA_SURF2, "G_RM_ZB_OPA_SURF2"}, + {G_RM_ZB_XLU_SURF, "G_RM_ZB_XLU_SURF"}, + {G_RM_ZB_XLU_SURF2, "G_RM_ZB_XLU_SURF2"}, + {G_RM_ZB_OPA_DECAL, "G_RM_ZB_OPA_DECAL"}, + {G_RM_ZB_OPA_DECAL2, "G_RM_ZB_OPA_DECAL2"}, + {G_RM_ZB_XLU_DECAL, "G_RM_ZB_XLU_DECAL"}, + {G_RM_ZB_XLU_DECAL2, "G_RM_ZB_XLU_DECAL2"}, + {G_RM_ZB_CLD_SURF, "G_RM_ZB_CLD_SURF"}, + {G_RM_ZB_CLD_SURF2, "G_RM_ZB_CLD_SURF2"}, + {G_RM_ZB_OVL_SURF, "G_RM_ZB_OVL_SURF"}, + {G_RM_ZB_OVL_SURF2, "G_RM_ZB_OVL_SURF2"}, + {G_RM_ZB_PCL_SURF, "G_RM_ZB_PCL_SURF"}, + {G_RM_ZB_PCL_SURF2, "G_RM_ZB_PCL_SURF2"}, + {G_RM_OPA_SURF, "G_RM_OPA_SURF"}, + {G_RM_OPA_SURF2, "G_RM_OPA_SURF2"}, + {G_RM_XLU_SURF, "G_RM_XLU_SURF"}, + {G_RM_XLU_SURF2, "G_RM_XLU_SURF2"}, + {G_RM_CLD_SURF, "G_RM_CLD_SURF"}, + {G_RM_CLD_SURF2, "G_RM_CLD_SURF2"}, + {G_RM_TEX_EDGE, "G_RM_TEX_EDGE"}, + {G_RM_TEX_EDGE2, "G_RM_TEX_EDGE2"}, + {G_RM_PCL_SURF, "G_RM_PCL_SURF"}, + {G_RM_PCL_SURF2, "G_RM_PCL_SURF2"}, + {G_RM_ADD, "G_RM_ADD"}, + {G_RM_ADD2, "G_RM_ADD2"}, + {G_RM_NOOP, "G_RM_NOOP"}, + {G_RM_NOOP2, "G_RM_NOOP2"}, + {G_RM_VISCVG, "G_RM_VISCVG"}, + {G_RM_VISCVG2, "G_RM_VISCVG2"}, + {G_RM_OPA_CI, "G_RM_OPA_CI"}, + {G_RM_OPA_CI2, "G_RM_OPA_CI2"}, }; - uint32_t tblB[] = - { - G_RM_AA_ZB_OPA_SURF2, - G_RM_AA_ZB_XLU_SURF2, G_RM_AA_ZB_OPA_DECAL2, G_RM_AA_ZB_XLU_DECAL2, - G_RM_AA_ZB_OPA_INTER2, G_RM_AA_ZB_XLU_INTER2, G_RM_AA_ZB_XLU_LINE2, - G_RM_AA_ZB_DEC_LINE2, G_RM_AA_ZB_TEX_EDGE2, G_RM_AA_ZB_TEX_INTER2, - G_RM_AA_ZB_SUB_SURF2, G_RM_AA_ZB_PCL_SURF2, G_RM_AA_ZB_OPA_TERR2, - G_RM_AA_ZB_TEX_TERR2, G_RM_AA_ZB_SUB_TERR2, G_RM_RA_ZB_OPA_SURF2, - G_RM_RA_ZB_OPA_DECAL2, G_RM_RA_ZB_OPA_INTER2, G_RM_AA_OPA_SURF2, - G_RM_AA_XLU_SURF2, G_RM_AA_XLU_LINE2, G_RM_AA_DEC_LINE2, - G_RM_AA_TEX_EDGE2, G_RM_AA_SUB_SURF2, G_RM_AA_PCL_SURF2, - G_RM_AA_OPA_TERR2, G_RM_AA_TEX_TERR2, G_RM_AA_SUB_TERR2, - G_RM_RA_OPA_SURF2, G_RM_ZB_OPA_SURF2, G_RM_ZB_XLU_SURF2, - G_RM_ZB_OPA_DECAL2, G_RM_ZB_XLU_DECAL2, G_RM_ZB_CLD_SURF2, - G_RM_ZB_OVL_SURF2, G_RM_ZB_PCL_SURF2, G_RM_OPA_SURF2, - G_RM_XLU_SURF2, G_RM_CLD_SURF2, G_RM_TEX_EDGE2, G_RM_PCL_SURF2, - G_RM_ADD2, G_RM_NOOP2,G_RM_VISCVG2, G_RM_OPA_CI2 - }; - - map str = - { - { G_RM_FOG_SHADE_A, "G_RM_FOG_SHADE_A" }, - { G_RM_FOG_PRIM_A, "G_RM_FOG_PRIM_A" }, - { G_RM_PASS, "G_RM_PASS" }, - { G_RM_AA_ZB_OPA_SURF, "G_RM_AA_ZB_OPA_SURF" }, - { G_RM_AA_ZB_OPA_SURF2, "G_RM_AA_ZB_OPA_SURF2" }, - { G_RM_AA_ZB_XLU_SURF, "G_RM_AA_ZB_XLU_SURF" }, - { G_RM_AA_ZB_XLU_SURF2, "G_RM_AA_ZB_XLU_SURF2" }, - { G_RM_AA_ZB_OPA_DECAL, "G_RM_AA_ZB_OPA_DECAL" }, - { G_RM_AA_ZB_OPA_DECAL2, "G_RM_AA_ZB_OPA_DECAL2" }, - { G_RM_AA_ZB_XLU_DECAL, "G_RM_AA_ZB_XLU_DECAL" }, - { G_RM_AA_ZB_XLU_DECAL2, "G_RM_AA_ZB_XLU_DECAL2" }, - { G_RM_AA_ZB_OPA_INTER, "G_RM_AA_ZB_OPA_INTER" }, - { G_RM_AA_ZB_OPA_INTER2, "G_RM_AA_ZB_OPA_INTER2" }, - { G_RM_AA_ZB_XLU_INTER, "G_RM_AA_ZB_XLU_INTER" }, - { G_RM_AA_ZB_XLU_INTER2, "G_RM_AA_ZB_XLU_INTER2" }, - { G_RM_AA_ZB_XLU_LINE, "G_RM_AA_ZB_XLU_LINE" }, - { G_RM_AA_ZB_XLU_LINE2, "G_RM_AA_ZB_XLU_LINE2" }, - { G_RM_AA_ZB_DEC_LINE, "G_RM_AA_ZB_DEC_LINE" }, - { G_RM_AA_ZB_DEC_LINE2, "G_RM_AA_ZB_DEC_LINE2" }, - { G_RM_AA_ZB_TEX_EDGE, "G_RM_AA_ZB_TEX_EDGE" }, - { G_RM_AA_ZB_TEX_EDGE2, "G_RM_AA_ZB_TEX_EDGE2" }, - { G_RM_AA_ZB_TEX_INTER, "G_RM_AA_ZB_TEX_INTER" }, - { G_RM_AA_ZB_TEX_INTER2, "G_RM_AA_ZB_TEX_INTER2" }, - { G_RM_AA_ZB_SUB_SURF, "G_RM_AA_ZB_SUB_SURF" }, - { G_RM_AA_ZB_SUB_SURF2, "G_RM_AA_ZB_SUB_SURF2" }, - { G_RM_AA_ZB_PCL_SURF, "G_RM_AA_ZB_PCL_SURF" }, - { G_RM_AA_ZB_PCL_SURF2, "G_RM_AA_ZB_PCL_SURF2" }, - { G_RM_AA_ZB_OPA_TERR, "G_RM_AA_ZB_OPA_TERR" }, - { G_RM_AA_ZB_OPA_TERR2, "G_RM_AA_ZB_OPA_TERR2" }, - { G_RM_AA_ZB_TEX_TERR, "G_RM_AA_ZB_TEX_TERR" }, - { G_RM_AA_ZB_TEX_TERR2, "G_RM_AA_ZB_TEX_TERR2" }, - { G_RM_AA_ZB_SUB_TERR, "G_RM_AA_ZB_SUB_TERR" }, - { G_RM_AA_ZB_SUB_TERR2, "G_RM_AA_ZB_SUB_TERR2" }, - { G_RM_RA_ZB_OPA_SURF, "G_RM_RA_ZB_OPA_SURF" }, - { G_RM_RA_ZB_OPA_SURF2, "G_RM_RA_ZB_OPA_SURF2" }, - { G_RM_RA_ZB_OPA_DECAL, "G_RM_RA_ZB_OPA_DECAL" }, - { G_RM_RA_ZB_OPA_DECAL2, "G_RM_RA_ZB_OPA_DECAL2" }, - { G_RM_RA_ZB_OPA_INTER, "G_RM_RA_ZB_OPA_INTER" }, - { G_RM_RA_ZB_OPA_INTER2, "G_RM_RA_ZB_OPA_INTER2" }, - { G_RM_AA_OPA_SURF, "G_RM_AA_OPA_SURF" }, - { G_RM_AA_OPA_SURF2, "G_RM_AA_OPA_SURF2" }, - { G_RM_AA_XLU_SURF, "G_RM_AA_XLU_SURF" }, - { G_RM_AA_XLU_SURF2, "G_RM_AA_XLU_SURF2" }, - { G_RM_AA_XLU_LINE, "G_RM_AA_XLU_LINE" }, - { G_RM_AA_XLU_LINE2, "G_RM_AA_XLU_LINE2" }, - { G_RM_AA_DEC_LINE, "G_RM_AA_DEC_LINE" }, - { G_RM_AA_DEC_LINE2, "G_RM_AA_DEC_LINE2" }, - { G_RM_AA_TEX_EDGE, "G_RM_AA_TEX_EDGE" }, - { G_RM_AA_TEX_EDGE2, "G_RM_AA_TEX_EDGE2" }, - { G_RM_AA_SUB_SURF, "G_RM_AA_SUB_SURF" }, - { G_RM_AA_SUB_SURF2, "G_RM_AA_SUB_SURF2" }, - { G_RM_AA_PCL_SURF, "G_RM_AA_PCL_SURF" }, - { G_RM_AA_PCL_SURF2, "G_RM_AA_PCL_SURF2" }, - { G_RM_AA_OPA_TERR, "G_RM_AA_OPA_TERR" }, - { G_RM_AA_OPA_TERR2, "G_RM_AA_OPA_TERR2" }, - { G_RM_AA_TEX_TERR, "G_RM_AA_TEX_TERR" }, - { G_RM_AA_TEX_TERR2, "G_RM_AA_TEX_TERR2" }, - { G_RM_AA_TEX_TERR, "G_RM_AA_TEX_TERR" }, - { G_RM_AA_TEX_TERR2, "G_RM_AA_TEX_TERR2" }, - { G_RM_AA_SUB_TERR, "G_RM_AA_SUB_TERR" }, - { G_RM_AA_SUB_TERR2, "G_RM_AA_SUB_TERR2" }, - { G_RM_RA_OPA_SURF, "G_RM_RA_OPA_SURF" }, - { G_RM_RA_OPA_SURF2, "G_RM_RA_OPA_SURF2" }, - { G_RM_ZB_OPA_SURF, "G_RM_ZB_OPA_SURF" }, - { G_RM_ZB_OPA_SURF2, "G_RM_ZB_OPA_SURF2" }, - { G_RM_ZB_XLU_SURF, "G_RM_ZB_XLU_SURF" }, - { G_RM_ZB_XLU_SURF2, "G_RM_ZB_XLU_SURF2" }, - { G_RM_ZB_OPA_DECAL, "G_RM_ZB_OPA_DECAL" }, - { G_RM_ZB_OPA_DECAL2, "G_RM_ZB_OPA_DECAL2" }, - { G_RM_ZB_XLU_DECAL, "G_RM_ZB_XLU_DECAL" }, - { G_RM_ZB_XLU_DECAL2, "G_RM_ZB_XLU_DECAL2" }, - { G_RM_ZB_CLD_SURF, "G_RM_ZB_CLD_SURF" }, - { G_RM_ZB_CLD_SURF2, "G_RM_ZB_CLD_SURF2" }, - { G_RM_ZB_OVL_SURF, "G_RM_ZB_OVL_SURF" }, - { G_RM_ZB_OVL_SURF2, "G_RM_ZB_OVL_SURF2" }, - { G_RM_ZB_PCL_SURF, "G_RM_ZB_PCL_SURF" }, - { G_RM_ZB_PCL_SURF2, "G_RM_ZB_PCL_SURF2" }, - { G_RM_OPA_SURF, "G_RM_OPA_SURF" }, - { G_RM_OPA_SURF2, "G_RM_OPA_SURF2" }, - { G_RM_XLU_SURF, "G_RM_XLU_SURF" }, - { G_RM_XLU_SURF2, "G_RM_XLU_SURF2" }, - { G_RM_CLD_SURF, "G_RM_CLD_SURF" }, - { G_RM_CLD_SURF2, "G_RM_CLD_SURF2" }, - { G_RM_TEX_EDGE, "G_RM_TEX_EDGE" }, - { G_RM_TEX_EDGE2, "G_RM_TEX_EDGE2" }, - { G_RM_PCL_SURF, "G_RM_PCL_SURF" }, - { G_RM_PCL_SURF2, "G_RM_PCL_SURF2" }, - { G_RM_ADD, "G_RM_ADD" }, - { G_RM_ADD2, "G_RM_ADD2" }, - { G_RM_NOOP, "G_RM_NOOP" }, - { G_RM_NOOP2, "G_RM_NOOP2" }, - { G_RM_VISCVG, "G_RM_VISCVG" }, - { G_RM_VISCVG2, "G_RM_VISCVG2" }, - { G_RM_OPA_CI, "G_RM_OPA_CI" }, - { G_RM_OPA_CI2, "G_RM_OPA_CI2" }, - }; - - for (int k = 0; k < sizeof(tblA) / 4; k++) + for (uint32_t k = 0; k < sizeof(tblA) / 4; k++) { if ((dd & tblA[k]) == tblA[k]) { @@ -1258,7 +1400,7 @@ void ZDisplayList::Opcode_G_SETOTHERMODE_L(uint64_t data, int i, std::string pre } } - for (int k = 0; k < sizeof(tblB) / 4; k++) + for (uint32_t k = 0; k < sizeof(tblB) / 4; k++) { if ((dd & tblB[k]) == tblB[k]) { @@ -1375,7 +1517,7 @@ void ZDisplayList::Opcode_G_SETOTHERMODE_L(uint64_t data, int i, std::string pre int bb = (mode2 >> 16) & 0b11; mode2Str += StringHelper::Sprintf("GBL_c2(%i, %i, %i, %i)", bp, ba, bm, bb); - //mode2Str = StringHelper::Sprintf("0x%08X", mode2); + // mode2Str = StringHelper::Sprintf("0x%08X", mode2); } sprintf(line, "gsDPSetRenderMode(%s, %s),", mode1Str.c_str(), mode2Str.c_str()); @@ -1394,9 +1536,9 @@ void ZDisplayList::Opcode_G_SETOTHERMODE_H(uint64_t data, int i, std::string pre int sft = 32 - (nn + 1) - ss; - if (sft == 14) // G_MDSFT_TEXTLUT + if (sft == 14) // G_MDSFT_TEXTLUT { - string types[] = { "G_TT_NONE", "G_TT_NONE", "G_TT_RGBA16", "G_TT_IA16" }; + string types[] = {"G_TT_NONE", "G_TT_NONE", "G_TT_RGBA16", "G_TT_IA16"}; sprintf(line, "gsDPSetTextureLUT(%s),", types[dd >> 14].c_str()); } else @@ -1443,10 +1585,11 @@ static int GfxdCallback_FormatSingleEntry(void) gfxd_macro_dflt(); gfxd_puts(","); - // dont print a new line after the last command - if (gfxd_macro_id() != gfxd_SPEndDisplayList) { - gfxd_puts("\n"); - } + // dont print a new line after the last command + if (gfxd_macro_id() != gfxd_SPEndDisplayList) + { + gfxd_puts("\n"); + } return 0; } @@ -1457,7 +1600,8 @@ static int GfxdCallback_Vtx(uint32_t seg, int32_t count) uint32_t vtxOffset = Seg2Filespace(seg, instance->parent->baseAddress); string vtxName = ""; - if (!Globals::Instance->HasSegment(GETSEGNUM(seg))) // Probably an external asset we are unable to track + if (!Globals::Instance->HasSegment( + GETSEGNUM(seg))) // Probably an external asset we are unable to track { vtxName = StringHelper::Sprintf("0x%08X", seg); } @@ -1469,7 +1613,7 @@ static int GfxdCallback_Vtx(uint32_t seg, int32_t count) // TODO: These two could probably be condenced to one... if (instance->parent->GetDeclarationRanged(vtxOffset + (count * 16)) != nullptr) { - Declaration* decl = instance->parent->GetDeclarationRanged(vtxOffset + (count * 16)); + // Declaration* decl = instance->parent->GetDeclarationRanged(vtxOffset + (count * 16)); uint32_t addr = instance->parent->GetDeclarationRangedAddress(vtxOffset + (count * 16)); int diff = addr - vtxOffset; @@ -1481,7 +1625,7 @@ static int GfxdCallback_Vtx(uint32_t seg, int32_t count) if (instance->parent->GetDeclarationRanged(vtxOffset) != nullptr) { - Declaration* decl = instance->parent->GetDeclarationRanged(vtxOffset); + // Declaration* decl = instance->parent->GetDeclarationRanged(vtxOffset); uint32_t addr = instance->parent->GetDeclarationRangedAddress(vtxOffset); int diff = addr - vtxOffset; @@ -1505,7 +1649,7 @@ static int GfxdCallback_Vtx(uint32_t seg, int32_t count) } instance->vertices[vtxOffset] = vtxList; } - + vtxName = "@r"; } @@ -1514,7 +1658,8 @@ static int GfxdCallback_Vtx(uint32_t seg, int32_t count) return 1; } -static int GfxdCallback_Texture(uint32_t seg, int32_t fmt, int32_t siz, int32_t width, int32_t height, int32_t pal) +static int GfxdCallback_Texture(uint32_t seg, int32_t fmt, int32_t siz, int32_t width, + int32_t height, int32_t pal) { ZDisplayList* instance = ZDisplayList::static_instance; uint32_t texOffset = Seg2Filespace(seg, instance->parent->baseAddress); @@ -1522,7 +1667,9 @@ static int GfxdCallback_Texture(uint32_t seg, int32_t fmt, int32_t siz, int32_t Declaration* texDecl = nullptr; string texName = ""; - if (instance->parent != nullptr && texSegNum != 2) // HACK: Until we have declarations use segment addresses, we'll exclude scene references... + if (instance->parent != nullptr && + texSegNum != 2) // HACK: Until we have declarations use segment addresses, we'll exclude + // scene references... { texDecl = instance->parent->GetDeclaration(texOffset); @@ -1530,12 +1677,14 @@ static int GfxdCallback_Texture(uint32_t seg, int32_t fmt, int32_t siz, int32_t texDecl = instance->parent->GetDeclaration(seg); } - if (!Globals::Instance->HasSegment(texSegNum)) // Probably an external asset we are unable to track + if (!Globals::Instance->HasSegment( + texSegNum)) // Probably an external asset we are unable to track texName = StringHelper::Sprintf("0x%08X", seg); else if (texDecl != nullptr) texName = StringHelper::Sprintf("%s", texDecl->varName.c_str()); else if (texSegNum == 2) - texName = StringHelper::Sprintf("%sTex_%06X", instance->scene->GetName().c_str(), texOffset); + texName = + StringHelper::Sprintf("%sTex_%06X", instance->scene->GetName().c_str(), texOffset); else texName = StringHelper::Sprintf("%sTex_%06X", instance->curPrefix.c_str(), texOffset); @@ -1562,7 +1711,9 @@ static int GfxdCallback_Palette(uint32_t seg, int32_t idx, int32_t count) Declaration* palDecl = nullptr; string palName = ""; - if (instance->parent != nullptr && palSegNum != 2) // HACK: Until we have declarations use segment addresses, we'll exclude scene references... + if (instance->parent != nullptr && + palSegNum != 2) // HACK: Until we have declarations use segment addresses, we'll exclude + // scene references... { palDecl = instance->parent->GetDeclaration(palOffset); @@ -1570,12 +1721,14 @@ static int GfxdCallback_Palette(uint32_t seg, int32_t idx, int32_t count) palDecl = instance->parent->GetDeclaration(seg); } - if (!Globals::Instance->HasSegment(palSegNum)) // Probably an external asset we are unable to track + if (!Globals::Instance->HasSegment( + palSegNum)) // Probably an external asset we are unable to track palName = StringHelper::Sprintf("0x%08X", seg); else if (palDecl != nullptr) palName = StringHelper::Sprintf("%s", palDecl->varName.c_str()); else if (palSegNum == 2) - palName = StringHelper::Sprintf("%sTex_%06X", instance->scene->GetName().c_str(), palOffset); + palName = + StringHelper::Sprintf("%sTex_%06X", instance->scene->GetName().c_str(), palOffset); else palName = StringHelper::Sprintf("%sTex_%06X", instance->curPrefix.c_str(), palOffset); @@ -1594,7 +1747,7 @@ static int GfxdCallback_Palette(uint32_t seg, int32_t idx, int32_t count) return 1; } -static int GfxdCallback_DisplayList(uint32_t seg) +static int GfxdCallback_DisplayList(uint32_t seg) { ZDisplayList* instance = ZDisplayList::static_instance; uint32_t dListOffset = GETSEGOFFSET(seg); @@ -1605,7 +1758,8 @@ static int GfxdCallback_DisplayList(uint32_t seg) if (instance->parent != nullptr) dListDecl = instance->parent->GetDeclaration(dListOffset); - if (!Globals::Instance->HasSegment(dListSegNum)) // Probably an external asset we are unable to track + if (!Globals::Instance->HasSegment( + dListSegNum)) // Probably an external asset we are unable to track dListName = StringHelper::Sprintf("0x%08X", seg); else if (dListDecl != nullptr) dListName = StringHelper::Sprintf("%s", dListDecl->varName.c_str()); @@ -1614,7 +1768,9 @@ static int GfxdCallback_DisplayList(uint32_t seg) if (dListSegNum <= 6) { - ZDisplayList* newDList = new ZDisplayList(instance->fileData, dListOffset, instance->GetDListLength(instance->fileData, dListOffset, instance->dListType)); + ZDisplayList* newDList = new ZDisplayList( + instance->fileData, dListOffset, + instance->GetDListLength(instance->fileData, dListOffset, instance->dListType)); newDList->scene = instance->scene; newDList->parent = instance->parent; instance->otherDLists.push_back(newDList); @@ -1625,7 +1781,7 @@ static int GfxdCallback_DisplayList(uint32_t seg) return 1; } -static int GfxdCallback_Matrix(uint32_t seg) +static int GfxdCallback_Matrix(uint32_t seg) { string mtxName = ""; @@ -1645,61 +1801,66 @@ string ZDisplayList::GetSourceOutputCode(const std::string& prefix) { OutputFormatter outputformatter; string sourceOutput = ""; - int dListSize = instructions.size() * sizeof(instructions[0]); + size_t dListSize = instructions.size() * sizeof(instructions[0]); gfxd_input_buffer(instructions.data(), dListSize); - gfxd_endian(gfxd_endian_little, sizeof(uint64_t)); // tell gfxdis what format the data is + gfxd_endian(gfxd_endian_little, sizeof(uint64_t)); // tell gfxdis what format the data is - gfxd_macro_fn(GfxdCallback_FormatSingleEntry); // format for each command entry - gfxd_vtx_callback(GfxdCallback_Vtx); // handle vertices - gfxd_timg_callback(GfxdCallback_Texture); // handle textures - gfxd_tlut_callback(GfxdCallback_Palette); // handle palettes - gfxd_dl_callback(GfxdCallback_DisplayList); // handle child display lists - gfxd_mtx_callback(GfxdCallback_Matrix); // handle matrices - gfxd_output_callback(outputformatter.static_writer()); // convert tabs to 4 spaces and enforce 120 line limit + gfxd_macro_fn(GfxdCallback_FormatSingleEntry); // format for each command entry + gfxd_vtx_callback(GfxdCallback_Vtx); // handle vertices + gfxd_timg_callback(GfxdCallback_Texture); // handle textures + gfxd_tlut_callback(GfxdCallback_Palette); // handle palettes + gfxd_dl_callback(GfxdCallback_DisplayList); // handle child display lists + gfxd_mtx_callback(GfxdCallback_Matrix); // handle matrices + gfxd_output_callback( + outputformatter.static_writer()); // convert tabs to 4 spaces and enforce 120 line limit - gfxd_enable(gfxd_emit_dec_color); // use decimal for colors + gfxd_enable(gfxd_emit_dec_color); // use decimal for colors // set microcode. see gfxd.h for more options. - if (dListType == DListType::F3DZEX) { + if (dListType == DListType::F3DZEX) + { gfxd_target(gfxd_f3dex2); - } else { + } + else + { gfxd_target(gfxd_f3dex); } this->curPrefix = prefix; static_instance = this; - gfxd_execute(); // generate display list - sourceOutput += outputformatter.get_output(); // write formatted display list + gfxd_execute(); // generate display list + sourceOutput += outputformatter.get_output(); // write formatted display list // Iterate through our vertex lists, connect intersecting lists. if (vertices.size() > 0) { vector>> verticesSorted(vertices.begin(), vertices.end()); - sort(verticesSorted.begin(), verticesSorted.end(), [](const auto& lhs, const auto& rhs) - { - return lhs.first < rhs.first; - }); + sort(verticesSorted.begin(), verticesSorted.end(), + [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); - for (int i = 0; i < verticesSorted.size() - 1; i++) + for (size_t i = 0; i < verticesSorted.size() - 1; i++) { - //int vtxSize = verticesSorted[i].second.size() * 16; - int vtxSize = (int)vertices[verticesSorted[i].first].size() * 16; + // int vtxSize = verticesSorted[i].second.size() * 16; + size_t vtxSize = vertices[verticesSorted[i].first].size() * 16; - if ((verticesSorted[i].first + vtxSize) > verticesSorted[i + 1].first) + if ((verticesSorted[i].first + (int)vtxSize) > verticesSorted[i + 1].first) { - int intersectAmt = (verticesSorted[i].first + vtxSize) - verticesSorted[i + 1].first; + int intersectAmt = + (verticesSorted[i].first + vtxSize) - verticesSorted[i + 1].first; int intersectIndex = intersectAmt / 16; - for (int j = intersectIndex; j < verticesSorted[i + 1].second.size(); j++) + for (size_t j = intersectIndex; j < verticesSorted[i + 1].second.size(); j++) { vertices[verticesSorted[i].first].push_back(verticesSorted[i + 1].second[j]); } - //defines += StringHelper::Sprintf("#define %sVtx_%06X ((u32)%sVtx_%06X + 0x%06X)\n", prefix.c_str(), verticesSorted[i + 1].first, prefix.c_str(), verticesSorted[i].first, verticesSorted[i + 1].first - verticesSorted[i].first); + // defines += StringHelper::Sprintf("#define %sVtx_%06X ((u32)%sVtx_%06X + + // 0x%06X)\n", prefix.c_str(), verticesSorted[i + 1].first, prefix.c_str(), + // verticesSorted[i].first, verticesSorted[i + 1].first - verticesSorted[i].first); - int nSize = (int)vertices[verticesSorted[i].first].size(); + // int nSize = (int)vertices[verticesSorted[i].first].size(); vertices.erase(verticesSorted[i + 1].first); verticesSorted.erase(verticesSorted.begin() + i + 1); @@ -1708,7 +1869,7 @@ string ZDisplayList::GetSourceOutputCode(const std::string& prefix) } } - if (scene == nullptr) // TODO: Bit of a hack but it works for now... + if (scene == nullptr) // TODO: Bit of a hack but it works for now... parent->defines += defines; // Generate Vertex Declarations @@ -1723,8 +1884,9 @@ string ZDisplayList::GetSourceOutputCode(const std::string& prefix) if (curAddr != item.first) declaration += "\n"; - declaration += StringHelper::Sprintf(" VTX(%i, %i, %i, %i, %i, %i, %i, %i, %i),", - vtx.x, vtx.y, vtx.z, vtx.s, vtx.t, vtx.r, vtx.g, vtx.b, vtx.a); + declaration += + StringHelper::Sprintf(" VTX(%i, %i, %i, %i, %i, %i, %i, %i, %i),", vtx.x, + vtx.y, vtx.z, vtx.s, vtx.t, vtx.r, vtx.g, vtx.b, vtx.a); curAddr += 16; } @@ -1733,8 +1895,11 @@ string ZDisplayList::GetSourceOutputCode(const std::string& prefix) if (parent != nullptr) { - parent->AddDeclarationArray(item.first, DeclarationAlignment::None, item.second.size() * 16, "static Vtx", - StringHelper::Sprintf("%sVtx_%06X", prefix.c_str(), item.first, item.second.size()), item.second.size(), declaration); + parent->AddDeclarationArray(item.first, DeclarationAlignment::None, + item.second.size() * 16, "static Vtx", + StringHelper::Sprintf("%sVtx_%06X", prefix.c_str(), + item.first, item.second.size()), + item.second.size(), declaration); } } } @@ -1743,23 +1908,26 @@ string ZDisplayList::GetSourceOutputCode(const std::string& prefix) { if (scene != nullptr && scene->textures.size() != 0) { - vector> texturesSorted(scene->textures.begin(), scene->textures.end()); + vector> texturesSorted(scene->textures.begin(), + scene->textures.end()); - sort(texturesSorted.begin(), texturesSorted.end(), [](const auto& lhs, const auto& rhs) - { - return lhs.first < rhs.first; - }); + sort(texturesSorted.begin(), texturesSorted.end(), + [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); - for (int i = 0; i < texturesSorted.size() - 1; i++) + for (size_t i = 0; i < texturesSorted.size() - 1; i++) { int texSize = scene->textures[texturesSorted[i].first]->GetRawDataSize(); if ((texturesSorted[i].first + texSize) > texturesSorted[i + 1].first) { - int intersectAmt = (texturesSorted[i].first + texSize) - texturesSorted[i + 1].first; + // int intersectAmt = (texturesSorted[i].first + texSize) - texturesSorted[i + + // 1].first; - defines += StringHelper::Sprintf("#define %sTex_%06X ((u32)%sTex_%06X + 0x%06X)\n", scene->GetName().c_str(), texturesSorted[i + 1].first, scene->GetName().c_str(), - texturesSorted[i].first, texturesSorted[i + 1].first - texturesSorted[i].first); + defines += StringHelper::Sprintf( + "#define %sTex_%06X ((u32)%sTex_%06X + 0x%06X)\n", scene->GetName().c_str(), + texturesSorted[i + 1].first, scene->GetName().c_str(), + texturesSorted[i].first, + texturesSorted[i + 1].first - texturesSorted[i].first); scene->parent->declarations.erase(texturesSorted[i + 1].first); scene->textures.erase(texturesSorted[i + 1].first); @@ -1775,32 +1943,34 @@ string ZDisplayList::GetSourceOutputCode(const std::string& prefix) { vector> texturesSorted(textures.begin(), textures.end()); - sort(texturesSorted.begin(), texturesSorted.end(), [](const auto& lhs, const auto& rhs) - { - return lhs.first < rhs.first; - }); + sort(texturesSorted.begin(), texturesSorted.end(), + [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); - for (int i = 0; i < texturesSorted.size() - 1; i++) + for (size_t i = 0; i < texturesSorted.size() - 1; i++) { - if (texturesSorted.size() == 0) // ????? + if (texturesSorted.size() == 0) // ????? break; int texSize = textures[texturesSorted[i].first]->GetRawDataSize(); if ((texturesSorted[i].first + texSize) > texturesSorted[i + 1].first) { - int intersectAmt = (texturesSorted[i].first + texSize) - texturesSorted[i + 1].first; + // int intersectAmt = (texturesSorted[i].first + texSize) - texturesSorted[i + + // 1].first; // If we're working with a palette, resize it to its "real" dimensions if (texturesSorted[i].second->isPalette) { - texturesSorted[i].second->SetWidth((texturesSorted[i + 1].first - texturesSorted[i].first) / 2); + texturesSorted[i].second->SetWidth( + (texturesSorted[i + 1].first - texturesSorted[i].first) / 2); texturesSorted[i].second->SetHeight(1); } else { - defines += StringHelper::Sprintf("#define %sTex_%06X ((u32)%sTex_%06X + 0x%06X)\n", prefix.c_str(), texturesSorted[i + 1].first, prefix.c_str(), - texturesSorted[i].first, texturesSorted[i + 1].first - texturesSorted[i].first); + defines += StringHelper::Sprintf( + "#define %sTex_%06X ((u32)%sTex_%06X + 0x%06X)\n", prefix.c_str(), + texturesSorted[i + 1].first, prefix.c_str(), texturesSorted[i].first, + texturesSorted[i + 1].first - texturesSorted[i].first); textures.erase(texturesSorted[i + 1].first); texturesSorted.erase(texturesSorted.begin() + i + 1); @@ -1828,19 +1998,24 @@ string ZDisplayList::GetSourceOutputCode(const std::string& prefix) item.second->Save(Globals::Instance->outputPath); - parent->AddDeclarationIncludeArray(item.first, StringHelper::Sprintf("%s/%s.%s.inc.c", - Globals::Instance->outputPath.c_str(), Path::GetFileNameWithoutExtension(item.second->GetName()).c_str(), - item.second->GetExternalExtension().c_str()), item.second->GetRawDataSize(), - "u64", StringHelper::Sprintf("%sTex_%06X", prefix.c_str(), item.first), 0); + parent->AddDeclarationIncludeArray( + item.first, + StringHelper::Sprintf( + "%s/%s.%s.inc.c", Globals::Instance->outputPath.c_str(), + Path::GetFileNameWithoutExtension(item.second->GetName()).c_str(), + item.second->GetExternalExtension().c_str()), + item.second->GetRawDataSize(), "u64", + StringHelper::Sprintf("%sTex_%06X", prefix.c_str(), item.first), 0); } } } - } if (parent != nullptr) { - Declaration* decl = parent->AddDeclarationArray(rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), "Gfx", StringHelper::Sprintf("%s", name.c_str()), 0, sourceOutput); + Declaration* decl = parent->AddDeclarationArray( + rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), "Gfx", + StringHelper::Sprintf("%s", name.c_str()), 0, sourceOutput); decl->references = references; return ""; } @@ -1851,7 +2026,9 @@ string ZDisplayList::GetSourceOutputCode(const std::string& prefix) // HOTSPOT void ZDisplayList::TextureGenCheck(string prefix) { - if (TextureGenCheck(fileData, textures, scene, parent, prefix, lastTexWidth, lastTexHeight, lastTexAddr, lastTexSeg, lastTexFmt, lastTexSiz, lastTexLoaded, lastTexIsPalette)) + if (TextureGenCheck(fileData, textures, scene, parent, prefix, lastTexWidth, lastTexHeight, + lastTexAddr, lastTexSeg, lastTexFmt, lastTexSiz, lastTexLoaded, + lastTexIsPalette)) { lastTexAddr = 0; lastTexLoaded = false; @@ -1860,18 +2037,26 @@ void ZDisplayList::TextureGenCheck(string prefix) } // HOTSPOT -bool ZDisplayList::TextureGenCheck(vector fileData, map& textures, ZRoom* scene, ZFile* parent, string prefix, uint32_t texWidth, uint32_t texHeight, uint32_t texAddr, uint32_t texSeg, F3DZEXTexFormats texFmt, F3DZEXTexSizes texSiz, bool texLoaded, bool texIsPalette) +bool ZDisplayList::TextureGenCheck(vector fileData, map& textures, + ZRoom* scene, ZFile* parent, string prefix, uint32_t texWidth, + uint32_t texHeight, uint32_t texAddr, uint32_t texSeg, + F3DZEXTexFormats texFmt, F3DZEXTexSizes texSiz, bool texLoaded, + bool texIsPalette) { int segmentNumber = GETSEGNUM(texSeg); if (Globals::Instance->verbosity >= VERBOSITY_DEBUG) - printf("TextureGenCheck seg=%i width=%i height=%i ispal=%i addr=0x%06X\n", segmentNumber, texWidth, texHeight, texIsPalette, texAddr); + printf("TextureGenCheck seg=%i width=%i height=%i ispal=%i addr=0x%06X\n", segmentNumber, + texWidth, texHeight, texIsPalette, texAddr); - if ((texSeg != 0 || texAddr != 0) && texWidth != 0 && texHeight != 0 && texLoaded && Globals::Instance->HasSegment(segmentNumber)) + if ((texSeg != 0 || texAddr != 0) && texWidth != 0 && texHeight != 0 && texLoaded && + Globals::Instance->HasSegment(segmentNumber)) { - if (segmentNumber != 2) // Not from a scene file + if (segmentNumber != 2) // Not from a scene file { - ZTexture* tex = ZTexture::FromBinary(TexFormatToTexType(texFmt, texSiz), fileData, texAddr, StringHelper::Sprintf("%sTex_%06X", prefix.c_str(), texAddr), texWidth, texHeight); + ZTexture* tex = ZTexture::FromBinary( + TexFormatToTexType(texFmt, texSiz), fileData, texAddr, + StringHelper::Sprintf("%sTex_%06X", prefix.c_str(), texAddr), texWidth, texHeight); tex->isPalette = texIsPalette; textures[texAddr] = tex; @@ -1879,15 +2064,24 @@ bool ZDisplayList::TextureGenCheck(vector fileData, mapGetRawData(), texAddr, - StringHelper::Sprintf("%sTex_%06X", Globals::Instance->lastScene->GetName().c_str(), texAddr), texWidth, texHeight); + ZTexture* tex = ZTexture::FromBinary( + TexFormatToTexType(texFmt, texSiz), scene->GetRawData(), texAddr, + StringHelper::Sprintf("%sTex_%06X", Globals::Instance->lastScene->GetName().c_str(), + texAddr), + texWidth, texHeight); if (scene != nullptr) { scene->textures[texAddr] = tex; - scene->parent->AddDeclarationIncludeArray(texAddr, StringHelper::Sprintf("%s/%s.%s.inc.c", - Globals::Instance->outputPath.c_str(), Path::GetFileNameWithoutExtension(tex->GetName()).c_str(), tex->GetExternalExtension().c_str()), tex->GetRawDataSize(), - "u64", StringHelper::Sprintf("%sTex_%06X", Globals::Instance->lastScene->GetName().c_str(), texAddr), 0); + scene->parent->AddDeclarationIncludeArray( + texAddr, + StringHelper::Sprintf("%s/%s.%s.inc.c", Globals::Instance->outputPath.c_str(), + Path::GetFileNameWithoutExtension(tex->GetName()).c_str(), + tex->GetExternalExtension().c_str()), + tex->GetRawDataSize(), "u64", + StringHelper::Sprintf("%sTex_%06X", + Globals::Instance->lastScene->GetName().c_str(), texAddr), + 0); } return true; @@ -1906,13 +2100,13 @@ TextureType ZDisplayList::TexFormatToTexType(F3DZEXTexFormats fmt, F3DZEXTexSize else if (siz == F3DZEXTexSizes::G_IM_SIZ_32b) return TextureType::RGBA32bpp; } - else if (fmt == F3DZEXTexFormats::G_IM_FMT_CI) - { - if (siz == F3DZEXTexSizes::G_IM_SIZ_4b) - return TextureType::Palette4bpp; + else if (fmt == F3DZEXTexFormats::G_IM_FMT_CI) + { + if (siz == F3DZEXTexSizes::G_IM_SIZ_4b) + return TextureType::Palette4bpp; else if (siz == F3DZEXTexSizes::G_IM_SIZ_8b) - return TextureType::Palette8bpp; - } + return TextureType::Palette8bpp; + } else if (fmt == F3DZEXTexFormats::G_IM_FMT_IA) { if (siz == F3DZEXTexSizes::G_IM_SIZ_4b) @@ -1930,7 +2124,6 @@ TextureType ZDisplayList::TexFormatToTexType(F3DZEXTexFormats fmt, F3DZEXTexSize return TextureType::Grayscale8bpp; else if (siz == F3DZEXTexSizes::G_IM_SIZ_16b) return TextureType::Grayscale8bpp; - } return TextureType::RGBA16bpp; @@ -1938,18 +2131,18 @@ TextureType ZDisplayList::TexFormatToTexType(F3DZEXTexFormats fmt, F3DZEXTexSize void ZDisplayList::Save(const std::string& outFolder) { - //HLModelIntermediette* mdl = HLModelIntermediette::FromZDisplayList(this); + // HLModelIntermediette* mdl = HLModelIntermediette::FromZDisplayList(this); // For testing purposes only at the moment... - //if (Globals::Instance->testMode) + // if (Globals::Instance->testMode) //{ - //string xml = mdl->OutputXML(); - //string obj = mdl->ToOBJFile(); - //string fbx = mdl->ToFBXFile(); + // string xml = mdl->OutputXML(); + // string obj = mdl->ToOBJFile(); + // string fbx = mdl->ToFBXFile(); - //File::WriteAllText(outFolder + "/" + name + ".mdli", xml); - //File::WriteAllText(outFolder + "/" + name + ".obj", obj); - //File::WriteAllText(outFolder + "/" + name + ".fbx", fbx); + // File::WriteAllText(outFolder + "/" + name + ".mdli", xml); + // File::WriteAllText(outFolder + "/" + name + ".obj", obj); + // File::WriteAllText(outFolder + "/" + name + ".fbx", fbx); //} } @@ -1989,7 +2182,8 @@ Vertex::Vertex() a = 0; } -Vertex::Vertex(int16_t nX, int16_t nY, int16_t nZ, uint16_t nFlag, int16_t nS, int16_t nT, uint8_t nR, uint8_t nG, uint8_t nB, uint8_t nA) +Vertex::Vertex(int16_t nX, int16_t nY, int16_t nZ, uint16_t nFlag, int16_t nS, int16_t nT, + uint8_t nR, uint8_t nG, uint8_t nB, uint8_t nA) { x = nX; y = nY; diff --git a/tools/ZAPD/ZAPD/ZDisplayList.h b/tools/ZAPD/ZAPD/ZDisplayList.h index 66f2f4e2b5..c3f3f8b1c4 100644 --- a/tools/ZAPD/ZAPD/ZDisplayList.h +++ b/tools/ZAPD/ZAPD/ZDisplayList.h @@ -1,13 +1,13 @@ #pragma once #include "ZResource.h" -#include "ZTexture.h" #include "ZRoom/ZRoom.h" +#include "ZTexture.h" #include "tinyxml2.h" -#include #include #include +#include enum class F3DEXOpcode { @@ -164,10 +164,10 @@ enum class OoTSegments FrameBuffer = 16, }; -#define G_MDSFT_ALPHACOMPARE 0 -#define G_MDSFT_ZSRCSEL 2 -#define G_MDSFT_RENDERMODE 3 -#define G_MDSFT_BLENDER 16 +#define G_MDSFT_ALPHACOMPARE 0 +#define G_MDSFT_ZSRCSEL 2 +#define G_MDSFT_RENDERMODE 3 +#define G_MDSFT_BLENDER 16 #define G_RM_FOG_SHADE_A 0xC8000000 #define G_RM_FOG_PRIM_A 0xC4000000 @@ -263,23 +263,23 @@ enum class OoTSegments #define G_RM_OPA_CI 0x0C080000 #define G_RM_OPA_CI2 0x03020000 -#define AA_EN 0x8 -#define Z_CMP 0x10 -#define Z_UPD 0x20 -#define IM_RD 0x40 -#define CLR_ON_CVG 0x80 -#define CVG_DST_CLAMP 0 -#define CVG_DST_WRAP 0x100 -#define CVG_DST_FULL 0x200 -#define CVG_DST_SAVE 0x300 -#define ZMODE_OPA 0 -#define ZMODE_INTER 0x400 -#define ZMODE_XLU 0x800 -#define ZMODE_DEC 0xc00 -#define CVG_X_ALPHA 0x1000 -#define ALPHA_CVG_SEL 0x2000 -#define FORCE_BL 0x4000 -#define TEX_EDGE 0x0000 +#define AA_EN 0x8 +#define Z_CMP 0x10 +#define Z_UPD 0x20 +#define IM_RD 0x40 +#define CLR_ON_CVG 0x80 +#define CVG_DST_CLAMP 0 +#define CVG_DST_WRAP 0x100 +#define CVG_DST_FULL 0x200 +#define CVG_DST_SAVE 0x300 +#define ZMODE_OPA 0 +#define ZMODE_INTER 0x400 +#define ZMODE_XLU 0x800 +#define ZMODE_DEC 0xc00 +#define CVG_X_ALPHA 0x1000 +#define ALPHA_CVG_SEL 0x2000 +#define FORCE_BL 0x4000 +#define TEX_EDGE 0x0000 class Vertex { @@ -290,7 +290,8 @@ public: uint8_t r, g, b, a; Vertex(); - Vertex(int16_t nX, int16_t nY, int16_t nZ, uint16_t nFlag, int16_t nS, int16_t nT, uint8_t nR, uint8_t nG, uint8_t nB, uint8_t nA); + Vertex(int16_t nX, int16_t nY, int16_t nZ, uint16_t nFlag, int16_t nS, int16_t nT, uint8_t nR, + uint8_t nG, uint8_t nB, uint8_t nA); Vertex(std::vector rawData, int rawDataIndex); }; @@ -298,7 +299,7 @@ class ZDisplayList : public ZResource { protected: static TextureType TexFormatToTexType(F3DZEXTexFormats fmt, F3DZEXTexSizes siz); - void ParseRawData(); + void ParseRawData() override; void ParseF3DZEX(F3DZEXOpcode opcode, uint64_t data, int i, std::string prefix, char* line); void ParseF3DEX(F3DEXOpcode opcode, uint64_t data, int i, std::string prefix, char* line); @@ -331,6 +332,7 @@ protected: void Opcode_G_SETOTHERMODE_H(uint64_t data, int i, std::string prefix, char* line); void Opcode_G_LOADTLUT(uint64_t data, int i, std::string prefix, char* line); void Opcode_G_ENDDL(uint64_t data, int i, std::string prefix, char* line); + public: std::string sceneSegName; ZRoom* scene; @@ -345,7 +347,7 @@ public: DListType dListType; - //int dListAddress; + // int dListAddress; std::map> vertices; std::map vtxDeclarations; @@ -356,21 +358,28 @@ public: std::vector references; - std::string defines; // Hack for special cases where vertex arrays intersect... + std::string defines; // Hack for special cases where vertex arrays intersect... std::vector fileData; ZDisplayList(); ZDisplayList(std::vector nRawData, int rawDataIndex, int rawDataSize); static ZDisplayList* static_instance; - static ZDisplayList* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, int rawDataIndex, int rawDataSize, std::string nRelPath); - static ZDisplayList* BuildFromXML(tinyxml2::XMLElement* reader, std::string inFolder, bool readFile); + static ZDisplayList* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, + int rawDataIndex, int rawDataSize, std::string nRelPath); + static ZDisplayList* BuildFromXML(tinyxml2::XMLElement* reader, std::string inFolder, + bool readFile); void TextureGenCheck(std::string prefix); - static bool TextureGenCheck(std::vector fileData, std::map& textures, ZRoom* scene, ZFile* parent, std::string prefix, uint32_t texWidth, uint32_t texHeight, uint32_t texAddr, uint32_t texSeg, F3DZEXTexFormats texFmt, F3DZEXTexSizes texSiz, bool texLoaded, bool texIsPalette); + static bool TextureGenCheck(std::vector fileData, + std::map& textures, ZRoom* scene, + ZFile* parent, std::string prefix, uint32_t texWidth, + uint32_t texHeight, uint32_t texAddr, uint32_t texSeg, + F3DZEXTexFormats texFmt, F3DZEXTexSizes texSiz, bool texLoaded, + bool texIsPalette); static int GetDListLength(std::vector rawData, int rawDataIndex, DListType dListType); - std::vector GetRawData(); + std::vector GetRawData() override; int GetRawDataSize() override; std::string GetSourceOutputHeader(const std::string& prefix) override; std::string GetSourceOutputCode(const std::string& prefix) override; diff --git a/tools/ZAPD/ZAPD/ZFile.cpp b/tools/ZAPD/ZAPD/ZFile.cpp index 5046ed1cbb..75eb9bc1a3 100644 --- a/tools/ZAPD/ZAPD/ZFile.cpp +++ b/tools/ZAPD/ZAPD/ZFile.cpp @@ -1,24 +1,25 @@ #include "ZFile.h" -#include "ZBlob.h" -#include "ZDisplayList.h" -#include "ZRoom/ZRoom.h" -#include "ZTexture.h" -#include "ZAnimation.h" -#include "ZLimb.h" -#include "ZSkeleton.h" -#include "ZCollision.h" -#include "ZScalar.h" -#include "ZVector.h" -#include "ZVtx.h" -#include "ZCutscene.h" -#include "ZArray.h" -#include "Path.h" -#include "File.h" -#include "Directory.h" -#include "Globals.h" -#include "HighLevel/HLModelIntermediette.h" #include #include +#include "Directory.h" +#include "File.h" +#include "Globals.h" +#include "HighLevel/HLModelIntermediette.h" +#include "Path.h" +#include "ZAnimation.h" +#include "ZArray.h" +#include "ZBlob.h" +#include "ZCollision.h" +#include "ZCutscene.h" +#include "ZDisplayList.h" +#include "ZLimb.h" +#include "ZRoom/ZRoom.h" +#include "ZScalar.h" +#include "ZSkeleton.h" +#include "ZSymbol.h" +#include "ZTexture.h" +#include "ZVector.h" +#include "ZVtx.h" using namespace tinyxml2; using namespace std; @@ -28,7 +29,7 @@ ZFile::ZFile() resources = vector(); basePath = ""; outputPath = Directory::GetCurrentDirectory(); - declarations = map(); + declarations = map(); defines = ""; baseAddress = 0; rangeStart = 0x000000000; @@ -41,7 +42,9 @@ ZFile::ZFile(string nOutPath, string nName) : ZFile() name = nName; } -ZFile::ZFile(ZFileMode mode, XMLElement* reader, string nBasePath, string nOutPath, std::string filename, bool placeholderMode) : ZFile() +ZFile::ZFile(ZFileMode mode, XMLElement* reader, string nBasePath, string nOutPath, + std::string filename, bool placeholderMode) + : ZFile() { if (nBasePath == "") basePath = Directory::GetCurrentDirectory(); @@ -71,7 +74,8 @@ void ZFile::ParseXML(ZFileMode mode, XMLElement* reader, std::string filename, b int segment = -1; - // TODO: This should be a variable on the ZFile, but it is a large change in order to force all ZResource types to have a parent ZFile. + // TODO: This should be a variable on the ZFile, but it is a large change in order to force all + // ZResource types to have a parent ZFile. const char* gameStr = reader->Attribute("Game"); if (reader->Attribute("Game") != nullptr) { @@ -90,39 +94,45 @@ void ZFile::ParseXML(ZFileMode mode, XMLElement* reader, std::string filename, b } if (reader->Attribute("BaseAddress") != NULL) - baseAddress = (uint32_t)strtoul(StringHelper::Split(reader->Attribute("BaseAddress"), "0x")[1].c_str(), NULL, 16); + baseAddress = (uint32_t)strtoul( + StringHelper::Split(reader->Attribute("BaseAddress"), "0x")[1].c_str(), NULL, 16); if (reader->Attribute("RangeStart") != NULL) - rangeStart = (uint32_t)strtoul(StringHelper::Split(reader->Attribute("RangeStart"), "0x")[1].c_str(), NULL, 16); + rangeStart = (uint32_t)strtoul( + StringHelper::Split(reader->Attribute("RangeStart"), "0x")[1].c_str(), NULL, 16); if (reader->Attribute("RangeEnd") != NULL) - rangeEnd = (uint32_t)strtoul(StringHelper::Split(reader->Attribute("RangeEnd"), "0x")[1].c_str(), NULL, 16); + rangeEnd = (uint32_t)strtoul( + StringHelper::Split(reader->Attribute("RangeEnd"), "0x")[1].c_str(), NULL, 16); if (reader->Attribute("Segment") != NULL) segment = strtol(reader->Attribute("Segment"), NULL, 10); if (segment != -1) { - //printf("Adding Segment %i\n", segment); + // printf("Adding Segment %i\n", segment); Globals::Instance->AddSegment(segment); } string folderName = basePath + "/" + Path::GetFileNameWithoutExtension(name); - + if (mode == ZFileMode::Extract) { if (!File::Exists(basePath + "/" + name)) - throw StringHelper::Sprintf("Error! File %s does not exist.", (basePath + "/" + name).c_str()); + throw StringHelper::Sprintf("Error! File %s does not exist.", + (basePath + "/" + name).c_str()); rawData = File::ReadAllBytes(basePath + "/" + name); } int rawDataIndex = 0; - for (XMLElement* child = reader->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for (XMLElement* child = reader->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) { if (child->Attribute("Offset") != NULL) - rawDataIndex = strtol(StringHelper::Split(child->Attribute("Offset"), "0x")[1].c_str(), NULL, 16); + rawDataIndex = + strtol(StringHelper::Split(child->Attribute("Offset"), "0x")[1].c_str(), NULL, 16); if (Globals::Instance->verbosity >= VERBOSITY_INFO) printf("%s: 0x%06X\n", child->Attribute("Name"), rawDataIndex); @@ -163,9 +173,15 @@ void ZFile::ParseXML(ZFileMode mode, XMLElement* reader, std::string filename, b ZResource* dList = nullptr; if (mode == ZFileMode::Extract) - dList = ZDisplayList::ExtractFromXML(child, rawData, rawDataIndex, ZDisplayList::GetDListLength(rawData, rawDataIndex, Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX), folderName); - //else - //dList = ZDisplayList::BuildFromXML(child, folderName, mode == ZFileMode::Build); + dList = ZDisplayList::ExtractFromXML( + child, rawData, rawDataIndex, + ZDisplayList::GetDListLength(rawData, rawDataIndex, + Globals::Instance->game == ZGame::OOT_SW97 ? + DListType::F3DEX : + DListType::F3DZEX), + folderName); + // else + // dList = ZDisplayList::BuildFromXML(child, folderName, mode == ZFileMode::Build); else dList = ZBlob::BuildFromXML(child, folderName, mode == ZFileMode::Build); @@ -180,7 +196,8 @@ void ZFile::ParseXML(ZFileMode mode, XMLElement* reader, std::string filename, b ZRoom* room = nullptr; if (mode == ZFileMode::Extract) - room = ZRoom::ExtractFromXML(child, rawData, rawDataIndex, folderName, this, Globals::Instance->lastScene); + room = ZRoom::ExtractFromXML(child, rawData, rawDataIndex, folderName, this, + Globals::Instance->lastScene); if (string(child->Name()) == "Scene") { @@ -226,6 +243,23 @@ void ZFile::ParseXML(ZFileMode mode, XMLElement* reader, std::string filename, b rawDataIndex += anim->GetRawDataSize(); } + else if (string(child->Name()) == "CurveAnimation") + { + ZCurveAnimation* anim = nullptr; + + if (mode == ZFileMode::Extract) + { + anim = + ZCurveAnimation::ExtractFromXML(child, rawData, rawDataIndex, folderName, this); + } + + if (anim == nullptr) + { + throw std::runtime_error("Couldn't create ZCurveAnimation."); + } + resources.push_back(anim); + rawDataIndex += anim->GetRawDataSize(); + } else if (string(child->Name()) == "Skeleton") { ZSkeleton* skeleton = nullptr; @@ -233,6 +267,10 @@ void ZFile::ParseXML(ZFileMode mode, XMLElement* reader, std::string filename, b if (mode == ZFileMode::Extract) skeleton = ZSkeleton::FromXML(child, rawData, rawDataIndex, folderName, this); + if (skeleton == nullptr) + { + throw std::runtime_error("Couldn't create ZSkeleton."); + } resources.push_back(skeleton); rawDataIndex += skeleton->GetRawDataSize(); } @@ -243,23 +281,27 @@ void ZFile::ParseXML(ZFileMode mode, XMLElement* reader, std::string filename, b if (mode == ZFileMode::Extract) limb = ZLimb::FromXML(child, rawData, rawDataIndex, folderName, this); + if (limb == nullptr) + { + throw std::runtime_error("Couldn't create ZLimb."); + } resources.push_back(limb); - rawDataIndex += limb->GetRawDataSize(); } else if (string(child->Name()) == "Symbol") { - ZResource* res = nullptr; + ZSymbol* symbol = nullptr; if (mode == ZFileMode::Extract) { - res = new ZResource(); - res->SetName(child->Attribute("Name")); - res->SetRawDataIndex(rawDataIndex); - res->outputDeclaration = false; + symbol = ZSymbol::ExtractFromXML(child, rawData, rawDataIndex, this); } - resources.push_back(res); + if (symbol == nullptr) + { + throw std::runtime_error("Couldn't create ZSymbol."); + } + resources.push_back(symbol); } else if (string(child->Name()) == "Collision") { @@ -364,7 +406,8 @@ void ZFile::ParseXML(ZFileMode mode, XMLElement* reader, std::string filename, b else { std::cerr << "ERROR bad type\n"; - printf("Encountered unknown resource type: %s on line: %d\n", child->Name(), child->GetLineNum()); + printf("Encountered unknown resource type: %s on line: %d\n", child->Name(), + child->GetLineNum()); std::exit(EXIT_FAILURE); } } @@ -388,9 +431,9 @@ void ZFile::BuildResources() for (ZResource* res : resources) { - //Console.WriteLine("Building resource " + res.GetName()); + // Console.WriteLine("Building resource " + res.GetName()); memcpy(file.data() + fileIndex, res->GetRawData().data(), res->GetRawData().size()); - //Array.Copy(res.GetRawData(), 0, file, fileIndex, res.GetRawData().Length); + // Array.Copy(res.GetRawData(), 0, file, fileIndex, res.GetRawData().Length); fileIndex += res->GetRawData().size(); } @@ -427,8 +470,8 @@ void ZFile::ExtractResources(string outputDir) { string folderName = Path::GetFileNameWithoutExtension(outputPath); - //printf("DIR CHECK: %s\n", folderName.c_str()); - //printf("OUT CHECK: %s\n", outputDir.c_str()); + // printf("DIR CHECK: %s\n", folderName.c_str()); + // printf("OUT CHECK: %s\n", outputDir.c_str()); if (!Directory::Exists(outputPath)) Directory::CreateDirectory(outputPath); @@ -443,8 +486,8 @@ void ZFile::ExtractResources(string outputDir) { if (Globals::Instance->verbosity >= VERBOSITY_INFO) printf("Saving resource %s\n", res->GetName().c_str()); - - res->CalcHash(); // TEST + + res->CalcHash(); // TEST res->Save(outputPath); } @@ -457,7 +500,8 @@ void ZFile::AddResource(ZResource* res) resources.push_back(res); } -Declaration* ZFile::AddDeclaration(uint32_t address, DeclarationAlignment alignment, uint32_t size, std::string varType, std::string varName, std::string body) +Declaration* ZFile::AddDeclaration(uint32_t address, DeclarationAlignment alignment, uint32_t size, + std::string varType, std::string varName, std::string body) { #if _DEBUG if (declarations.find(address) != declarations.end()) @@ -473,7 +517,9 @@ Declaration* ZFile::AddDeclaration(uint32_t address, DeclarationAlignment alignm return decl; } -Declaration* ZFile::AddDeclaration(uint32_t address, DeclarationAlignment alignment, DeclarationPadding padding, uint32_t size, string varType, string varName, std::string body) +Declaration* ZFile::AddDeclaration(uint32_t address, DeclarationAlignment alignment, + DeclarationPadding padding, uint32_t size, string varType, + string varName, std::string body) { #if _DEBUG if (declarations.find(address) != declarations.end()) @@ -484,11 +530,14 @@ Declaration* ZFile::AddDeclaration(uint32_t address, DeclarationAlignment alignm AddDeclarationDebugChecks(address); - declarations[address] = new Declaration(alignment, padding, size, varType, varName, false, body); + declarations[address] = + new Declaration(alignment, padding, size, varType, varName, false, body); return declarations[address]; } -Declaration* ZFile::AddDeclarationArray(uint32_t address, DeclarationAlignment alignment, uint32_t size, std::string varType, std::string varName, int arrayItemCnt, std::string body) +Declaration* ZFile::AddDeclarationArray(uint32_t address, DeclarationAlignment alignment, + uint32_t size, std::string varType, std::string varName, + int arrayItemCnt, std::string body) { #if _DEBUG if (declarations.find(address) != declarations.end()) @@ -499,12 +548,14 @@ Declaration* ZFile::AddDeclarationArray(uint32_t address, DeclarationAlignment a AddDeclarationDebugChecks(address); - declarations[address] = new Declaration(alignment, size, varType, varName, true, arrayItemCnt, body); + declarations[address] = + new Declaration(alignment, size, varType, varName, true, arrayItemCnt, body); return declarations[address]; } - -Declaration* ZFile::AddDeclarationArray(uint32_t address, DeclarationAlignment alignment, DeclarationPadding padding, uint32_t size, string varType, string varName, int arrayItemCnt, std::string body) +Declaration* ZFile::AddDeclarationArray(uint32_t address, DeclarationAlignment alignment, + DeclarationPadding padding, uint32_t size, string varType, + string varName, int arrayItemCnt, std::string body) { #if _DEBUG if (declarations.find(address) != declarations.end()) @@ -515,11 +566,11 @@ Declaration* ZFile::AddDeclarationArray(uint32_t address, DeclarationAlignment a AddDeclarationDebugChecks(address); - declarations[address] = new Declaration(alignment, padding, size, varType, varName, true, arrayItemCnt, body); + declarations[address] = + new Declaration(alignment, padding, size, varType, varName, true, arrayItemCnt, body); return declarations[address]; } - Declaration* ZFile::AddDeclarationPlaceholder(uint32_t address) { AddDeclarationDebugChecks(address); @@ -535,12 +586,14 @@ Declaration* ZFile::AddDeclarationPlaceholder(uint32_t address, string varName) AddDeclarationDebugChecks(address); if (declarations.find(address) == declarations.end()) - declarations[address] = new Declaration(DeclarationAlignment::None, 0, "", varName, false, ""); + declarations[address] = + new Declaration(DeclarationAlignment::None, 0, "", varName, false, ""); return declarations[address]; } -Declaration* ZFile::AddDeclarationInclude(uint32_t address, string includePath, uint32_t size, string varType, string varName) +Declaration* ZFile::AddDeclarationInclude(uint32_t address, string includePath, uint32_t size, + string varType, string varName) { AddDeclarationDebugChecks(address); @@ -550,7 +603,9 @@ Declaration* ZFile::AddDeclarationInclude(uint32_t address, string includePath, return declarations[address]; } -Declaration* ZFile::AddDeclarationIncludeArray(uint32_t address, std::string includePath, uint32_t size, std::string varType, std::string varName, int arrayItemCnt) +Declaration* ZFile::AddDeclarationIncludeArray(uint32_t address, std::string includePath, + uint32_t size, std::string varType, + std::string varName, int arrayItemCnt) { #if _DEBUG if (declarations.find(address) != declarations.end()) @@ -582,7 +637,9 @@ void ZFile::AddDeclarationDebugChecks(uint32_t address) std::string ZFile::GetDeclarationName(uint32_t address) { - return GetDeclarationName(address, "ERROR_COULD_NOT_FIND_DECLARATION"); // Note: For now that default message is just for testing + return GetDeclarationName(address, + "ERROR_COULD_NOT_FIND_DECLARATION"); // Note: For now that default + // message is just for testing } std::string ZFile::GetDeclarationName(uint32_t address, std::string defaultResult) @@ -646,7 +703,7 @@ void ZFile::GenerateSourceFiles(string outputDir) if (res->IsExternalResource()) { - //cout << "EXTERN\n"; + // cout << "EXTERN\n"; string path = Path::GetFileNameWithoutExtension(res->GetName()).c_str(); while (StringHelper::EndsWith(outputDir, "/")) @@ -658,16 +715,19 @@ void ZFile::GenerateSourceFiles(string outputDir) if (res->GetResourceType() != ZResourceType::Texture) declType = "u8"; - AddDeclarationIncludeArray(res->GetRawDataIndex(), StringHelper::Sprintf("%s/%s.%s.inc.c", - outputDir.c_str(), Path::GetFileNameWithoutExtension(res->GetOutName()).c_str(), res->GetExternalExtension().c_str()), res->GetRawDataSize(), - declType, res->GetName(), 0); - - - //File::WriteAllText("build/" + outputDir + "/" + Path::GetFileNameWithoutExtension(res->GetName()) + ".inc.c", resSrc); + AddDeclarationIncludeArray( + res->GetRawDataIndex(), + StringHelper::Sprintf("%s/%s.%s.inc.c", outputDir.c_str(), + Path::GetFileNameWithoutExtension(res->GetOutName()).c_str(), + res->GetExternalExtension().c_str()), + res->GetRawDataSize(), declType, res->GetName(), 0); + + // File::WriteAllText("build/" + outputDir + "/" + + // Path::GetFileNameWithoutExtension(res->GetName()) + ".inc.c", resSrc); } else { - //cout << "NOT EXTERN\n"; + // cout << "NOT EXTERN\n"; sourceOutput += resSrc; } @@ -680,18 +740,18 @@ void ZFile::GenerateSourceFiles(string outputDir) while (StringHelper::EndsWith(outputDir, "/")) outputDir = outputDir.substr(0, outputDir.length() - 1); - //string buildPath = "build/" + outputDir + "/" + "basefile.txt"; + // string buildPath = "build/" + outputDir + "/" + "basefile.txt"; string outPath = outputDir + "/" + Path::GetFileNameWithoutExtension(name) + ".c"; - //printf("WRITING %s\n", buildPath.c_str()); + // printf("WRITING %s\n", buildPath.c_str()); - //if (!Directory::Exists(Path::GetPath(outPath))) - //Directory::CreateDirectory(Path::GetPath(outPath)); + // if (!Directory::Exists(Path::GetPath(outPath))) + // Directory::CreateDirectory(Path::GetPath(outPath)); - //if (!Directory::Exists(Path::GetPath(buildPath))) - //Directory::CreateDirectory(Path::GetPath(buildPath)); + // if (!Directory::Exists(Path::GetPath(buildPath))) + // Directory::CreateDirectory(Path::GetPath(buildPath)); File::WriteAllText(outPath, sourceOutput); - //File::WriteAllText(buildPath, outPath); + // File::WriteAllText(buildPath, outPath); // Generate Header sourceOutput = ""; @@ -707,7 +767,8 @@ void ZFile::GenerateSourceFiles(string outputDir) sourceOutput += ProcessExterns(); - File::WriteAllText(outputDir + "/" + Path::GetFileNameWithoutExtension(name) + ".h", sourceOutput); + File::WriteAllText(outputDir + "/" + Path::GetFileNameWithoutExtension(name) + ".h", + sourceOutput); } void ZFile::GenerateHLIntermediette() @@ -727,7 +788,8 @@ void ZFile::GenerateHLIntermediette() std::string ZFile::GetHeaderInclude() { - return StringHelper::Sprintf("#include \"%s\"\n\n", (Path::GetFileNameWithoutExtension(name) + ".h").c_str()); + return StringHelper::Sprintf("#include \"%s\"\n\n", + (Path::GetFileNameWithoutExtension(name) + ".h").c_str()); } void ZFile::GeneratePlaceholderDeclarations() @@ -747,22 +809,16 @@ string ZFile::ProcessDeclarations() if (declarations.size() == 0) return output; - auto declarationKeysSorted = vector>(declarations.begin(), declarations.end()); - sort(declarationKeysSorted.begin(), declarationKeysSorted.end(), [](const auto& lhs, const auto& rhs) - { - return lhs.first < rhs.first; - }); - // Account for padding/alignment - int lastAddr = 0; - int lastSize = 0; + uint32_t lastAddr = 0; + uint32_t lastSize = 0; - //printf("RANGE START: 0x%06X - RANGE END: 0x%06X\n", rangeStart, rangeEnd); + // printf("RANGE START: 0x%06X - RANGE END: 0x%06X\n", rangeStart, rangeEnd); // Optimization: See if there are any arrays side by side that can be merged... - //pair lastItem = declarationKeysSorted[0]; + // pair lastItem = declarationKeysSorted[0]; - //for (int i = 1; i < declarationKeysSorted.size(); i++) + // for (int i = 1; i < declarationKeysSorted.size(); i++) //{ // pair curItem = declarationKeysSorted[i]; @@ -789,41 +845,41 @@ string ZFile::ProcessDeclarations() // lastItem = curItem; //} - for (pair item : declarations) + for (pair item : declarations) { ProcessDeclarationText(item.second); } - for (pair item : declarationKeysSorted) + for (pair item : declarations) { - while (declarations[item.first]->size % 4 != 0) + while (item.second->size % 4 != 0) { - declarations[item.first]->size++; + item.second->size++; } if (lastAddr != 0) { if (item.second->alignment == DeclarationAlignment::Align16) { - int lastAddrSizeTest = declarations[lastAddr]->size; + // int lastAddrSizeTest = declarations[lastAddr]->size; int curPtr = lastAddr + declarations[lastAddr]->size; while (curPtr % 4 != 0) { declarations[lastAddr]->size++; - //declarations[item.first]->size++; + // item.second->size++; curPtr++; } /*while (curPtr % 16 != 0) { - char buffer[2048]; + char buffer[2048]; - sprintf(buffer, "static u32 align%02X = 0;\n", curPtr); - declarations[item.first]->text = buffer + declarations[item.first]->text; + sprintf(buffer, "static u32 align%02X = 0;\n", curPtr); + item.second->text = buffer + item.second->text; - declarations[lastAddr]->size += 4; - curPtr += 4; + declarations[lastAddr]->size += 4; + curPtr += 4; }*/ } else if (item.second->alignment == DeclarationAlignment::Align8) @@ -833,8 +889,7 @@ string ZFile::ProcessDeclarations() while (curPtr % 4 != 0) { declarations[lastAddr]->size++; - //item.second->size++; - //declarations[item.first]->size++; + // item.second->size++; curPtr++; } @@ -843,11 +898,10 @@ string ZFile::ProcessDeclarations() char buffer[2048]; sprintf(buffer, "static u32 align%02X = 0;\n", curPtr); - declarations[item.first]->preText = buffer + declarations[item.first]->preText; + item.second->preText = buffer + item.second->preText; declarations[lastAddr]->size += 4; - //item.second->size += 4; - //declarations[item.first]->size += 4; + // item.second->size += 4; curPtr += 4; } } @@ -865,7 +919,7 @@ string ZFile::ProcessDeclarations() while (curPtr % 16 != 0) { - declarations[item.first]->postText += StringHelper::Sprintf("static u32 pad%02X = 0;\n", curPtr); + item.second->postText += StringHelper::Sprintf("static u32 pad%02X = 0;\n", curPtr); item.second->size += 4; curPtr += 4; @@ -878,27 +932,31 @@ string ZFile::ProcessDeclarations() // Handle unaccounted data lastAddr = 0; lastSize = 0; - for (pair item : declarationKeysSorted) + for (pair item : declarations) { if (item.first >= rangeStart && item.first < rangeEnd) { - if (lastAddr != 0 && declarations.find(lastAddr) != declarations.end() && lastAddr + declarations[lastAddr]->size > item.first) + if (lastAddr != 0 && declarations.find(lastAddr) != declarations.end() && + lastAddr + declarations[lastAddr]->size > item.first) { - printf("WARNING: Intersection detected from 0x%06X:0x%06X, conflicts with 0x%06X\n", lastAddr, lastAddr + declarations[lastAddr]->size, item.first); + printf("WARNING: Intersection detected from 0x%06X:0x%06X, conflicts with 0x%06X\n", + lastAddr, lastAddr + declarations[lastAddr]->size, item.first); } uint8_t* rawDataArr = rawData.data(); - if (lastAddr + lastSize != item.first && lastAddr >= rangeStart && lastAddr + lastSize < rangeEnd) + if (lastAddr + lastSize != item.first && lastAddr >= rangeStart && + lastAddr + lastSize < rangeEnd) { - //int diff = item.first - (lastAddr + declarations[lastAddr]->size); + // int diff = item.first - (lastAddr + declarations[lastAddr]->size); int diff = item.first - (lastAddr + lastSize); string src = " "; for (int i = 0; i < diff; i++) { - //src += StringHelper::Sprintf("0x%02X, ", rawDataArr[lastAddr + declarations[lastAddr]->size + i]); + // src += StringHelper::Sprintf("0x%02X, ", rawDataArr[lastAddr + + // declarations[lastAddr]->size + i]); src += StringHelper::Sprintf("0x%02X, ", rawDataArr[lastAddr + lastSize + i]); if ((i % 16 == 15) && (i != (diff - 1))) @@ -909,8 +967,14 @@ string ZFile::ProcessDeclarations() { if (diff > 0) { - //AddDeclarationArray(lastAddr + declarations[lastAddr]->size, DeclarationAlignment::None, diff, "static u8", StringHelper::Sprintf("unaccounted_%06X", lastAddr + declarations[lastAddr]->size), diff, src); - AddDeclarationArray(lastAddr + lastSize, DeclarationAlignment::None, diff, "static u8", StringHelper::Sprintf("unaccounted_%06X", lastAddr + lastSize), diff, src); + // AddDeclarationArray(lastAddr + declarations[lastAddr]->size, + // DeclarationAlignment::None, diff, "static u8", + // StringHelper::Sprintf("unaccounted_%06X", lastAddr + + // declarations[lastAddr]->size), diff, src); + AddDeclarationArray( + lastAddr + lastSize, DeclarationAlignment::None, diff, "static u8", + StringHelper::Sprintf("unaccounted_%06X", lastAddr + lastSize), diff, + src); } } } @@ -921,7 +985,9 @@ string ZFile::ProcessDeclarations() } // TODO: THIS CONTAINS REDUNDANCIES. CLEAN THIS UP! - if (lastAddr + declarations[lastAddr]->size < rawData.size() && lastAddr + declarations[lastAddr]->size >= rangeStart && lastAddr + declarations[lastAddr]->size < rangeEnd) + if (lastAddr + declarations[lastAddr]->size < rawData.size() && + lastAddr + declarations[lastAddr]->size >= rangeStart && + lastAddr + declarations[lastAddr]->size < rangeEnd) { int diff = (int)(rawData.size() - (lastAddr + declarations[lastAddr]->size)); @@ -929,7 +995,8 @@ string ZFile::ProcessDeclarations() for (int i = 0; i < diff; i++) { - src += StringHelper::Sprintf("0x%02X, ", rawData[lastAddr + declarations[lastAddr]->size + i]); + src += StringHelper::Sprintf("0x%02X, ", + rawData[lastAddr + declarations[lastAddr]->size + i]); if (i % 16 == 15) src += "\n "; @@ -939,34 +1006,37 @@ string ZFile::ProcessDeclarations() { if (diff > 0) { - AddDeclarationArray(lastAddr + declarations[lastAddr]->size, DeclarationAlignment::None, diff, "static u8", StringHelper::Sprintf("unaccounted_%06X", lastAddr + declarations[lastAddr]->size), - diff, src); + AddDeclarationArray(lastAddr + declarations[lastAddr]->size, + DeclarationAlignment::None, diff, "static u8", + StringHelper::Sprintf("unaccounted_%06X", + lastAddr + declarations[lastAddr]->size), + diff, src); } } } // Go through include declarations - declarationKeysSorted = vector>(declarations.begin(), declarations.end()); - sort(declarationKeysSorted.begin(), declarationKeysSorted.end(), [](const auto& lhs, const auto& rhs) - { - return lhs.first < rhs.first; - }); - // First, handle the prototypes (static only for now) int protoCnt = 0; - for (pair item : declarationKeysSorted) + for (pair item : declarations) { - if (item.second->includePath == "" && StringHelper::StartsWith(item.second->varType, "static ") && !StringHelper::StartsWith(item.second->varName, "unaccounted_")) + if (item.second->includePath == "" && + StringHelper::StartsWith(item.second->varType, "static ") && + !StringHelper::StartsWith(item.second->varName, "unaccounted_")) { if (item.second->isArray) { if (item.second->arrayItemCnt == 0) - output += StringHelper::Sprintf("%s %s[];\n", item.second->varType.c_str(), item.second->varName.c_str()); + output += StringHelper::Sprintf("%s %s[];\n", item.second->varType.c_str(), + item.second->varName.c_str()); else - output += StringHelper::Sprintf("%s %s[%i];\n", item.second->varType.c_str(), item.second->varName.c_str(), item.second->arrayItemCnt); + output += StringHelper::Sprintf("%s %s[%i];\n", item.second->varType.c_str(), + item.second->varName.c_str(), + item.second->arrayItemCnt); } else - output += StringHelper::Sprintf("%s %s;\n", item.second->varType.c_str(), item.second->varName.c_str()); + output += StringHelper::Sprintf("%s %s;\n", item.second->varType.c_str(), + item.second->varName.c_str()); protoCnt++; } @@ -976,16 +1046,20 @@ string ZFile::ProcessDeclarations() output += "\n"; // Next, output the actual declarations - for (pair item : declarationKeysSorted) + for (pair item : declarations) { - if (item.first < rangeStart || item.first >= rangeEnd) { + if (item.first < rangeStart || item.first >= rangeEnd) + { continue; } if (item.second->includePath != "") { - //output += StringHelper::Sprintf("#include \"%s\"\n", item.second->includePath.c_str()); - output += StringHelper::Sprintf("%s %s[] = {\n#include \"%s\"\n};\n\n", item.second->varType.c_str(), item.second->varName.c_str(), item.second->includePath.c_str()); + // output += StringHelper::Sprintf("#include \"%s\"\n", + // item.second->includePath.c_str()); + output += StringHelper::Sprintf( + "%s %s[] = {\n#include \"%s\"\n};\n\n", item.second->varType.c_str(), + item.second->varName.c_str(), item.second->includePath.c_str()); } else if (item.second->varType != "") { @@ -995,15 +1069,19 @@ string ZFile::ProcessDeclarations() if (item.second->isArray) { if (item.second->arrayItemCnt == 0) - output += StringHelper::Sprintf("%s %s[] = {\n", item.second->varType.c_str(), item.second->varName.c_str()); + output += StringHelper::Sprintf("%s %s[] = {\n", item.second->varType.c_str(), + item.second->varName.c_str()); else - output += StringHelper::Sprintf("%s %s[%i] = {\n", item.second->varType.c_str(), item.second->varName.c_str(), item.second->arrayItemCnt); + output += StringHelper::Sprintf("%s %s[%i] = {\n", item.second->varType.c_str(), + item.second->varName.c_str(), + item.second->arrayItemCnt); output += item.second->text + "\n"; } else { - output += StringHelper::Sprintf("%s %s = { ", item.second->varType.c_str(), item.second->varName.c_str()); + output += StringHelper::Sprintf("%s %s = { ", item.second->varType.c_str(), + item.second->varName.c_str()); output += item.second->text; } @@ -1013,7 +1091,7 @@ string ZFile::ProcessDeclarations() output += " };"; output += " " + item.second->rightText + "\n\n"; - + if (item.second->postText != "") output += item.second->postText + "\n"; } @@ -1026,11 +1104,11 @@ string ZFile::ProcessDeclarations() void ZFile::ProcessDeclarationText(Declaration* decl) { - int refIndex = 0; + size_t refIndex = 0; if (decl->references.size() > 0) { - for (int i = 0; i < decl->text.size() - 1; i++) + for (size_t i = 0; i < decl->text.size() - 1; i++) { char c = decl->text[i]; char c2 = decl->text[i + 1]; @@ -1052,11 +1130,14 @@ void ZFile::ProcessDeclarationText(Declaration* decl) int itemSize = refDecl->size / refDecl->arrayItemCnt; int itemIndex = (decl->references[refIndex] - refDeclAddr) / itemSize; - decl->text.replace(i, 2, StringHelper::Sprintf("&%s[%i]", refDecl->varName.c_str(), itemIndex)); + decl->text.replace(i, 2, + StringHelper::Sprintf( + "&%s[%i]", refDecl->varName.c_str(), itemIndex)); } else { - decl->text.replace(i, 2, StringHelper::Sprintf("ERROR ARRAYITEMCNT = 0")); + decl->text.replace(i, 2, + StringHelper::Sprintf("ERROR ARRAYITEMCNT = 0")); } } else @@ -1077,29 +1158,30 @@ string ZFile::ProcessExterns() { string output = ""; - auto declarationKeysSorted = vector>(declarations.begin(), declarations.end()); - sort(declarationKeysSorted.begin(), declarationKeysSorted.end(), [](const auto& lhs, const auto& rhs) + for (pair item : declarations) { - return lhs.first < rhs.first; - }); - - for (pair item : declarationKeysSorted) - { - if (item.first < rangeStart || item.first >= rangeEnd) { + if (item.first < rangeStart || item.first >= rangeEnd) + { continue; } - if (!StringHelper::StartsWith(item.second->varType, "static ") && item.second->varType != "")// && item.second->includePath == "") + if (!StringHelper::StartsWith(item.second->varType, "static ") && + item.second->varType != "") // && item.second->includePath == "") { if (item.second->isArray) { if (item.second->arrayItemCnt == 0) - output += StringHelper::Sprintf("extern %s %s[];\n", item.second->varType.c_str(), item.second->varName.c_str()); + output += + StringHelper::Sprintf("extern %s %s[];\n", item.second->varType.c_str(), + item.second->varName.c_str()); else - output += StringHelper::Sprintf("extern %s %s[%i];\n", item.second->varType.c_str(), item.second->varName.c_str(), item.second->arrayItemCnt); + output += StringHelper::Sprintf( + "extern %s %s[%i];\n", item.second->varType.c_str(), + item.second->varName.c_str(), item.second->arrayItemCnt); } else - output += StringHelper::Sprintf("extern %s %s;\n", item.second->varType.c_str(), item.second->varName.c_str()); + output += StringHelper::Sprintf("extern %s %s;\n", item.second->varType.c_str(), + item.second->varName.c_str()); } } diff --git a/tools/ZAPD/ZAPD/ZFile.h b/tools/ZAPD/ZAPD/ZFile.h index ca1c0cad97..668d9c6ea0 100644 --- a/tools/ZAPD/ZAPD/ZFile.h +++ b/tools/ZAPD/ZAPD/ZFile.h @@ -1,9 +1,9 @@ #pragma once -#include #include -#include "tinyxml2.h" +#include #include "ZResource.h" +#include "tinyxml2.h" enum class ZFileMode { @@ -28,13 +28,14 @@ enum class ZGame class ZFile { public: - std::map declarations; + std::map declarations; std::string defines; std::vector resources; uint32_t baseAddress, rangeStart, rangeEnd; ZFile(std::string nOutPath, std::string nName); - ZFile(ZFileMode mode, tinyxml2::XMLElement* reader, std::string nBasePath, std::string nOutPath, std::string filename, bool placeholderMode); + ZFile(ZFileMode mode, tinyxml2::XMLElement* reader, std::string nBasePath, std::string nOutPath, + std::string filename, bool placeholderMode); ~ZFile(); std::string GetVarName(int address); @@ -44,14 +45,24 @@ public: void BuildSourceFile(std::string outputDir); void AddResource(ZResource* res); - Declaration* AddDeclaration(uint32_t address, DeclarationAlignment alignment, uint32_t size, std::string varType, std::string varName, std::string body); - Declaration* AddDeclaration(uint32_t address, DeclarationAlignment alignment, DeclarationPadding padding, uint32_t size, std::string varType, std::string varName, std::string body); - Declaration* AddDeclarationArray(uint32_t address, DeclarationAlignment alignment, uint32_t size, std::string varType, std::string varName, int arrayItemCnt, std::string body); - Declaration* AddDeclarationArray(uint32_t address, DeclarationAlignment alignment, DeclarationPadding padding, uint32_t size, std::string varType, std::string varName, int arrayItemCnt, std::string body); + Declaration* AddDeclaration(uint32_t address, DeclarationAlignment alignment, uint32_t size, + std::string varType, std::string varName, std::string body); + Declaration* AddDeclaration(uint32_t address, DeclarationAlignment alignment, + DeclarationPadding padding, uint32_t size, std::string varType, + std::string varName, std::string body); + Declaration* AddDeclarationArray(uint32_t address, DeclarationAlignment alignment, + uint32_t size, std::string varType, std::string varName, + int arrayItemCnt, std::string body); + Declaration* AddDeclarationArray(uint32_t address, DeclarationAlignment alignment, + DeclarationPadding padding, uint32_t size, std::string varType, + std::string varName, int arrayItemCnt, std::string body); Declaration* AddDeclarationPlaceholder(uint32_t address); Declaration* AddDeclarationPlaceholder(uint32_t address, std::string varName); - Declaration* AddDeclarationInclude(uint32_t address, std::string includePath, uint32_t size, std::string varType, std::string varName); - Declaration* AddDeclarationIncludeArray(uint32_t address, std::string includePath, uint32_t size, std::string varType, std::string varName, int arrayItemCnt); + Declaration* AddDeclarationInclude(uint32_t address, std::string includePath, uint32_t size, + std::string varType, std::string varName); + Declaration* AddDeclarationIncludeArray(uint32_t address, std::string includePath, + uint32_t size, std::string varType, std::string varName, + int arrayItemCnt); std::string GetDeclarationName(uint32_t address); std::string GetDeclarationName(uint32_t address, std::string defaultResult); Declaration* GetDeclaration(uint32_t address); @@ -69,7 +80,8 @@ protected: std::string sourceOutput; ZFile(); - void ParseXML(ZFileMode mode, tinyxml2::XMLElement* reader, std::string filename, bool placeholderMode); + void ParseXML(ZFileMode mode, tinyxml2::XMLElement* reader, std::string filename, + bool placeholderMode); void GenerateSourceFiles(std::string outputDir); void GenerateHLIntermediette(); void AddDeclarationDebugChecks(uint32_t address); diff --git a/tools/ZAPD/ZAPD/ZLimb.cpp b/tools/ZAPD/ZAPD/ZLimb.cpp index b7e63988cd..087d496458 100644 --- a/tools/ZAPD/ZAPD/ZLimb.cpp +++ b/tools/ZAPD/ZAPD/ZLimb.cpp @@ -1,12 +1,11 @@ #include "ZLimb.h" -#include "BitConverter.h" -#include "StringHelper.h" -#include "Globals.h" #include +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" using namespace std; - Struct_800A57C0::Struct_800A57C0(const std::vector& rawData, uint32_t fileOffset) { unk_0 = BitConverter::ToUInt16BE(rawData, fileOffset + 0x00); @@ -17,15 +16,16 @@ Struct_800A57C0::Struct_800A57C0(const std::vector& rawData, uint32_t f unk_8 = BitConverter::ToInt8BE(rawData, fileOffset + 0x08); unk_9 = BitConverter::ToUInt8BE(rawData, fileOffset + 0x09); } -Struct_800A57C0::Struct_800A57C0(const std::vector& rawData, uint32_t fileOffset, size_t index) +Struct_800A57C0::Struct_800A57C0(const std::vector& rawData, uint32_t fileOffset, + size_t index) : Struct_800A57C0(rawData, fileOffset + index * GetRawDataSize()) { } std::string Struct_800A57C0::GetSourceOutputCode() const { - return StringHelper::Sprintf("0x%02X, %i, %i, %i, %i, %i, 0x%02X", - unk_0, unk_2, unk_4, unk_6, unk_7, unk_8, unk_9); + return StringHelper::Sprintf("0x%02X, %i, %i, %i, %i, %i, 0x%02X", unk_0, unk_2, unk_4, unk_6, + unk_7, unk_8, unk_9); } size_t Struct_800A57C0::GetRawDataSize() @@ -38,7 +38,6 @@ std::string Struct_800A57C0::GetSourceTypeName() return "Struct_800A57C0"; } - Struct_800A598C_2::Struct_800A598C_2(const std::vector& rawData, uint32_t fileOffset) { unk_0 = BitConverter::ToUInt8BE(rawData, fileOffset + 0x00); @@ -47,15 +46,15 @@ Struct_800A598C_2::Struct_800A598C_2(const std::vector& rawData, uint32 z = BitConverter::ToInt16BE(rawData, fileOffset + 0x06); unk_8 = BitConverter::ToUInt8BE(rawData, fileOffset + 0x08); } -Struct_800A598C_2::Struct_800A598C_2(const std::vector& rawData, uint32_t fileOffset, size_t index) +Struct_800A598C_2::Struct_800A598C_2(const std::vector& rawData, uint32_t fileOffset, + size_t index) : Struct_800A598C_2(rawData, fileOffset + index * GetRawDataSize()) { } std::string Struct_800A598C_2::GetSourceOutputCode() const { - return StringHelper::Sprintf("0x%02X, %i, %i, %i, 0x%02X", - unk_0, x, y, z, unk_8); + return StringHelper::Sprintf("0x%02X, %i, %i, %i, 0x%02X", unk_0, x, y, z, unk_8); } size_t Struct_800A598C_2::GetRawDataSize() @@ -68,8 +67,8 @@ std::string Struct_800A598C_2::GetSourceTypeName() return "Struct_800A598C_2"; } - -Struct_800A598C::Struct_800A598C(ZFile* parent, const std::vector& rawData, uint32_t fileOffset) +Struct_800A598C::Struct_800A598C(ZFile* parent, const std::vector& rawData, + uint32_t fileOffset) : parent(parent) { unk_0 = BitConverter::ToUInt16BE(rawData, fileOffset + 0x00); @@ -78,21 +77,26 @@ Struct_800A598C::Struct_800A598C(ZFile* parent, const std::vector& rawD unk_8 = BitConverter::ToUInt32BE(rawData, fileOffset + 0x08); unk_C = BitConverter::ToUInt32BE(rawData, fileOffset + 0x0C); - if (unk_8 != 0) { + if (unk_8 != 0) + { uint32_t unk_8_Offset = Seg2Filespace(unk_8, parent->baseAddress); - for (size_t i = 0; i < unk_0; i++) { + for (size_t i = 0; i < unk_0; i++) + { unk_8_arr.emplace_back(rawData, unk_8_Offset, i); } } - if (unk_C != 0) { + if (unk_C != 0) + { uint32_t unk_C_Offset = Seg2Filespace(unk_C, parent->baseAddress); - for (size_t i = 0; i < unk_2; i++) { + for (size_t i = 0; i < unk_2; i++) + { unk_C_arr.emplace_back(rawData, unk_C_Offset, i); } } } -Struct_800A598C::Struct_800A598C(ZFile* parent, const std::vector& rawData, uint32_t fileOffset, size_t index) +Struct_800A598C::Struct_800A598C(ZFile* parent, const std::vector& rawData, + uint32_t fileOffset, size_t index) : Struct_800A598C(parent, rawData, fileOffset + index * GetRawDataSize()) { } @@ -101,52 +105,62 @@ void Struct_800A598C::PreGenSourceFiles(const std::string& prefix) { string entryStr; - if (unk_8 != 0) { + if (unk_8 != 0) + { uint32_t unk_8_Offset = Seg2Filespace(unk_8, parent->baseAddress); - string unk_8_Str = StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), Struct_800A57C0::GetSourceTypeName().c_str(), unk_8_Offset); + string unk_8_Str = + StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), + Struct_800A57C0::GetSourceTypeName().c_str(), unk_8_Offset); size_t arrayItemCnt = unk_8_arr.size(); entryStr = ""; size_t i = 0; - for (auto& child: unk_8_arr) { - entryStr += StringHelper::Sprintf(" { %s },%s", - child.GetSourceOutputCode().c_str(), - (++i < arrayItemCnt) ? "\n" : ""); + for (auto& child : unk_8_arr) + { + entryStr += StringHelper::Sprintf(" { %s },%s", child.GetSourceOutputCode().c_str(), + (++i < arrayItemCnt) ? "\n" : ""); } Declaration* decl = parent->GetDeclaration(unk_8_Offset); - if (decl == nullptr) { - parent->AddDeclarationArray( - unk_8_Offset, DeclarationAlignment::None, - arrayItemCnt * Struct_800A57C0::GetRawDataSize(), Struct_800A57C0::GetSourceTypeName(), - unk_8_Str, arrayItemCnt, entryStr); + if (decl == nullptr) + { + parent->AddDeclarationArray(unk_8_Offset, DeclarationAlignment::None, + arrayItemCnt * Struct_800A57C0::GetRawDataSize(), + Struct_800A57C0::GetSourceTypeName(), unk_8_Str, + arrayItemCnt, entryStr); } - else { + else + { decl->text = entryStr; } } - if (unk_C != 0) { + if (unk_C != 0) + { uint32_t unk_C_Offset = Seg2Filespace(unk_C, parent->baseAddress); - string unk_C_Str = StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), Struct_800A598C_2::GetSourceTypeName().c_str(), unk_C_Offset); + string unk_C_Str = + StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), + Struct_800A598C_2::GetSourceTypeName().c_str(), unk_C_Offset); size_t arrayItemCnt = unk_C_arr.size(); entryStr = ""; size_t i = 0; - for (auto& child: unk_C_arr) { - entryStr += StringHelper::Sprintf(" { %s },%s", - child.GetSourceOutputCode().c_str(), - (++i < arrayItemCnt) ? "\n" : ""); + for (auto& child : unk_C_arr) + { + entryStr += StringHelper::Sprintf(" { %s },%s", child.GetSourceOutputCode().c_str(), + (++i < arrayItemCnt) ? "\n" : ""); } Declaration* decl = parent->GetDeclaration(unk_C_Offset); - if (decl == nullptr) { - parent->AddDeclarationArray( - unk_C_Offset, DeclarationAlignment::None, - arrayItemCnt * Struct_800A598C_2::GetRawDataSize(), Struct_800A598C_2::GetSourceTypeName(), - unk_C_Str, arrayItemCnt, entryStr); + if (decl == nullptr) + { + parent->AddDeclarationArray(unk_C_Offset, DeclarationAlignment::None, + arrayItemCnt * Struct_800A598C_2::GetRawDataSize(), + Struct_800A598C_2::GetSourceTypeName(), unk_C_Str, + arrayItemCnt, entryStr); } - else { + else + { decl->text = entryStr; } } @@ -157,21 +171,27 @@ std::string Struct_800A598C::GetSourceOutputCode(const std::string& prefix) cons string entryStr; string unk_8_Str = "NULL"; - if (unk_8 != 0) { + if (unk_8 != 0) + { uint32_t unk_8_Offset = Seg2Filespace(unk_8, parent->baseAddress); - unk_8_Str = StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), Struct_800A57C0::GetSourceTypeName().c_str(), unk_8_Offset); + unk_8_Str = + StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), + Struct_800A57C0::GetSourceTypeName().c_str(), unk_8_Offset); } string unk_C_Str = "NULL"; - if (unk_C != 0) { + if (unk_C != 0) + { uint32_t unk_C_Offset = Seg2Filespace(unk_C, parent->baseAddress); - unk_C_Str = StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), Struct_800A598C_2::GetSourceTypeName().c_str(), unk_C_Offset); + unk_C_Str = + StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), + Struct_800A598C_2::GetSourceTypeName().c_str(), unk_C_Offset); } entryStr = StringHelper::Sprintf("\n ARRAY_COUNTU(%s), ARRAY_COUNTU(%s),\n", - unk_8_Str.c_str(), unk_C_Str.c_str()); - entryStr += StringHelper::Sprintf(" %i, %s, %s\n ", unk_4, - unk_8_Str.c_str(), unk_C_Str.c_str()); + unk_8_Str.c_str(), unk_C_Str.c_str()); + entryStr += StringHelper::Sprintf(" %i, %s, %s\n ", unk_4, unk_8_Str.c_str(), + unk_C_Str.c_str()); return entryStr; } @@ -186,8 +206,8 @@ std::string Struct_800A598C::GetSourceTypeName() return "Struct_800A598C"; } - -Struct_800A5E28::Struct_800A5E28(ZFile* parent, const std::vector& nRawData, uint32_t fileOffset) +Struct_800A5E28::Struct_800A5E28(ZFile* parent, const std::vector& nRawData, + uint32_t fileOffset) : parent(parent), rawData(nRawData) { unk_0 = BitConverter::ToUInt16BE(nRawData, fileOffset + 0x00); @@ -195,14 +215,17 @@ Struct_800A5E28::Struct_800A5E28(ZFile* parent, const std::vector& nRaw unk_4 = BitConverter::ToUInt32BE(nRawData, fileOffset + 0x04); unk_8 = BitConverter::ToUInt32BE(nRawData, fileOffset + 0x08); - if (unk_4 != 0) { + if (unk_4 != 0) + { uint32_t unk_4_Offset = Seg2Filespace(unk_4, parent->baseAddress); - for (size_t i = 0; i < unk_2; i++) { + for (size_t i = 0; i < unk_2; i++) + { unk_4_arr.emplace_back(parent, nRawData, unk_4_Offset, i); } } } -Struct_800A5E28::Struct_800A5E28(ZFile* parent, const std::vector& rawData, uint32_t fileOffset, size_t index) +Struct_800A5E28::Struct_800A5E28(ZFile* parent, const std::vector& rawData, + uint32_t fileOffset, size_t index) : Struct_800A5E28(parent, rawData, fileOffset + index * GetRawDataSize()) { } @@ -214,38 +237,47 @@ Struct_800A5E28::~Struct_800A5E28() void Struct_800A5E28::PreGenSourceFiles(const std::string& prefix) { - if (unk_4 != 0) { + if (unk_4 != 0) + { uint32_t unk_4_Offset = Seg2Filespace(unk_4, parent->baseAddress); - string unk_4_Str = StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), Struct_800A598C::GetSourceTypeName().c_str(), unk_4_Offset); + string unk_4_Str = + StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), + Struct_800A598C::GetSourceTypeName().c_str(), unk_4_Offset); string entryStr = ""; uint16_t arrayItemCnt = unk_4_arr.size(); size_t i = 0; - for (auto& child: unk_4_arr) { + for (auto& child : unk_4_arr) + { child.PreGenSourceFiles(prefix); - entryStr += StringHelper::Sprintf(" { %s },%s", - child.GetSourceOutputCode(prefix).c_str(), - (++i < arrayItemCnt) ? "\n" : ""); + entryStr += + StringHelper::Sprintf(" { %s },%s", child.GetSourceOutputCode(prefix).c_str(), + (++i < arrayItemCnt) ? "\n" : ""); } Declaration* decl = parent->GetDeclaration(unk_4_Offset); - if (decl == nullptr) { - parent->AddDeclarationArray( - unk_4_Offset, DeclarationAlignment::None, - arrayItemCnt * Struct_800A598C::GetRawDataSize(), Struct_800A598C::GetSourceTypeName(), - unk_4_Str, arrayItemCnt, entryStr); + if (decl == nullptr) + { + parent->AddDeclarationArray(unk_4_Offset, DeclarationAlignment::None, + arrayItemCnt * Struct_800A598C::GetRawDataSize(), + Struct_800A598C::GetSourceTypeName(), unk_4_Str, + arrayItemCnt, entryStr); } - else { + else + { decl->text = entryStr; } } - if (unk_8 != 0) { + if (unk_8 != 0) + { uint32_t unk_8_Offset = Seg2Filespace(unk_8, parent->baseAddress); - int dlistLength = ZDisplayList::GetDListLength(rawData, unk_8_Offset, Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX); + int dlistLength = ZDisplayList::GetDListLength( + rawData, unk_8_Offset, + Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX); unk_8_dlist = new ZDisplayList(rawData, unk_8_Offset, dlistLength); unk_8_dlist->parent = parent; @@ -260,33 +292,40 @@ std::string Struct_800A5E28::GetSourceOutputCode(const std::string& prefix) cons string entryStr = ""; string unk_4_Str = "NULL"; - if (unk_4 != 0) { + if (unk_4 != 0) + { uint32_t unk_4_Offset = Seg2Filespace(unk_4, parent->baseAddress); Declaration* decl = parent->GetDeclaration(unk_4_Offset); - if (decl == nullptr) { - unk_4_Str = StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), Struct_800A598C::GetSourceTypeName().c_str(), unk_4_Offset); + if (decl == nullptr) + { + unk_4_Str = + StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), + Struct_800A598C::GetSourceTypeName().c_str(), unk_4_Offset); } - else { + else + { unk_4_Str = decl->varName; } } string unk_8_Str = "NULL"; - if (unk_8 != 0) { + if (unk_8 != 0) + { uint32_t unk_8_Offset = Seg2Filespace(unk_8, parent->baseAddress); Declaration* decl = parent->GetDeclaration(unk_8_Offset); - if (decl == nullptr) { + if (decl == nullptr) + { // Something went wrong... unk_8_Str = StringHelper::Sprintf("0x%08X", unk_8); } - else { + else + { unk_8_Str = decl->varName; } } - return StringHelper::Sprintf("\n %i, ARRAY_COUNTU(%s),\n %s, %s\n", - unk_0, unk_4_Str.c_str(), - unk_4_Str.c_str(), unk_8_Str.c_str()); + return StringHelper::Sprintf("\n %i, ARRAY_COUNTU(%s),\n %s, %s\n", unk_0, + unk_4_Str.c_str(), unk_4_Str.c_str(), unk_8_Str.c_str()); } size_t Struct_800A5E28::GetRawDataSize() @@ -299,8 +338,8 @@ std::string Struct_800A5E28::GetSourceTypeName() return "Struct_800A5E28"; } - -ZLimb::ZLimb(tinyxml2::XMLElement* reader, const std::vector& nRawData, int nRawDataIndex, ZFile* nParent) +ZLimb::ZLimb(tinyxml2::XMLElement* reader, const std::vector& nRawData, int nRawDataIndex, + ZFile* nParent) { rawData.assign(nRawData.begin(), nRawData.end()); rawDataIndex = nRawDataIndex; @@ -311,15 +350,18 @@ ZLimb::ZLimb(tinyxml2::XMLElement* reader, const std::vector& nRawData, ParseXML(reader); ParseRawData(); - if (type == ZLimbType::Skin) { - if (skinSegmentType == ZLimbSkinType::SkinType_4 && skinSegment != 0) { + if (type == ZLimbType::Skin) + { + if (skinSegmentType == ZLimbSkinType::SkinType_4 && skinSegment != 0) + { uint32_t skinSegmentOffset = Seg2Filespace(skinSegment, parent->baseAddress); segmentStruct = Struct_800A5E28(parent, rawData, skinSegmentOffset); } } } -ZLimb::ZLimb(ZLimbType limbType, const std::string& prefix, const std::vector& nRawData, int nRawDataIndex, ZFile* nParent) +ZLimb::ZLimb(ZLimbType limbType, const std::string& prefix, const std::vector& nRawData, + int nRawDataIndex, ZFile* nParent) { rawData.assign(nRawData.begin(), nRawData.end()); rawDataIndex = nRawDataIndex; @@ -338,28 +380,45 @@ void ZLimb::ParseXML(tinyxml2::XMLElement* reader) // Reading from a const char* limbType = reader->Attribute("LimbType"); - if (limbType == nullptr) { + if (limbType == nullptr) + { // Reading from a limbType = reader->Attribute("Type"); } - if (limbType == nullptr) { - fprintf(stderr, "ZLimb::ParseXML: Warning in '%s'.\n\t Missing 'LimbType' attribute in xml. Defaulting to 'Standard'.\n", name.c_str()); + if (limbType == nullptr) + { + fprintf(stderr, + "ZLimb::ParseXML: Warning in '%s'.\n\t Missing 'LimbType' attribute in xml. " + "Defaulting to 'Standard'.\n", + name.c_str()); type = ZLimbType::Standard; } - else { + else + { string limbTypeStr(limbType); - if (limbTypeStr == "Standard") { + if (limbTypeStr == "Standard") + { type = ZLimbType::Standard; } - else if(limbTypeStr == "LOD") { + else if (limbTypeStr == "LOD") + { type = ZLimbType::LOD; } - else if(limbTypeStr == "Skin") { + else if (limbTypeStr == "Skin") + { type = ZLimbType::Skin; } - else { - fprintf(stderr, "ZLimb::ParseXML: Warning in '%s'.\n\t Invalid LimbType found: '%s'. Defaulting to 'Standard'.\n", name.c_str(), limbType); + else if (limbTypeStr == "Curve") + { + type = ZLimbType::Curve; + } + else + { + fprintf(stderr, + "ZLimb::ParseXML: Warning in '%s'.\n\t Invalid LimbType found: '%s'. " + "Defaulting to 'Standard'.\n", + name.c_str(), limbType); type = ZLimbType::Standard; } } @@ -367,6 +426,16 @@ void ZLimb::ParseXML(tinyxml2::XMLElement* reader) void ZLimb::ParseRawData() { + if (type == ZLimbType::Curve) + { + childIndex = rawData.at(rawDataIndex + 0); + siblingIndex = rawData.at(rawDataIndex + 1); + + dListPtr = BitConverter::ToUInt32BE(rawData, rawDataIndex + 4); + dList2Ptr = BitConverter::ToUInt32BE(rawData, rawDataIndex + 8); + return; + } + transX = BitConverter::ToInt16BE(rawData, rawDataIndex + 0); transY = BitConverter::ToInt16BE(rawData, rawDataIndex + 2); transZ = BitConverter::ToInt16BE(rawData, rawDataIndex + 4); @@ -374,36 +443,39 @@ void ZLimb::ParseRawData() childIndex = rawData.at(rawDataIndex + 6); siblingIndex = rawData.at(rawDataIndex + 7); - switch (type) { + switch (type) + { case ZLimbType::LOD: - farDListPtr = BitConverter::ToUInt32BE(rawData, rawDataIndex + 12); + dList2Ptr = BitConverter::ToUInt32BE(rawData, rawDataIndex + 12); case ZLimbType::Standard: dListPtr = BitConverter::ToUInt32BE(rawData, rawDataIndex + 8); break; case ZLimbType::Skin: - skinSegmentType = static_cast(BitConverter::ToInt32BE(rawData, rawDataIndex + 8)); + skinSegmentType = + static_cast(BitConverter::ToInt32BE(rawData, rawDataIndex + 8)); skinSegment = BitConverter::ToUInt32BE(rawData, rawDataIndex + 12); break; } } -ZLimb* ZLimb::FromXML(tinyxml2::XMLElement* reader, vector nRawData, int rawDataIndex, string nRelPath, ZFile* parent) +ZLimb* ZLimb::FromXML(tinyxml2::XMLElement* reader, vector nRawData, int rawDataIndex, + string nRelPath, ZFile* parent) { ZLimb* limb = new ZLimb(reader, nRawData, rawDataIndex, parent); limb->relativePath = std::move(nRelPath); - limb->parent->AddDeclaration( - limb->GetFileAddress(), DeclarationAlignment::None, limb->GetRawDataSize(), - limb->GetSourceTypeName(), limb->name, ""); + limb->parent->AddDeclaration(limb->GetFileAddress(), DeclarationAlignment::None, + limb->GetRawDataSize(), limb->GetSourceTypeName(), limb->name, ""); return limb; } - int ZLimb::GetRawDataSize() { - switch (type) { + switch (type) + { case ZLimbType::Standard: + case ZLimbType::Curve: return 0x0C; case ZLimbType::LOD: case ZLimbType::Skin: @@ -417,23 +489,33 @@ string ZLimb::GetSourceOutputCode(const std::string& prefix) string dListStr = "NULL"; string dListStr2 = "NULL"; - if (dListPtr != 0) { - dListStr = GetLimbDListSourceOutputCode(prefix, "", dListPtr); + if (dListPtr != 0) + { + string limbPrefix = type == ZLimbType::Curve ? "Curve" : ""; + dListStr = GetLimbDListSourceOutputCode(prefix, limbPrefix, dListPtr); } - if (farDListPtr != 0) { - dListStr2 = GetLimbDListSourceOutputCode(prefix, "Far", farDListPtr); + if (dList2Ptr != 0) + { + string limbPrefix = type == ZLimbType::Curve ? "Curve" : "Far"; + dListStr2 = GetLimbDListSourceOutputCode(prefix, limbPrefix, dList2Ptr); } - string entryStr = StringHelper::Sprintf("\n { %i, %i, %i },\n 0x%02X, 0x%02X,\n", - transX, transY, transZ, childIndex, siblingIndex); + string entryStr = ""; + if (type != ZLimbType::Curve) + { + entryStr += StringHelper::Sprintf("\n { %i, %i, %i },", transX, transY, transZ); + } - switch (type) { + entryStr += StringHelper::Sprintf("\n 0x%02X, 0x%02X,\n", childIndex, siblingIndex); + + switch (type) + { case ZLimbType::Standard: entryStr += StringHelper::Sprintf(" %s\n", dListStr.c_str()); break; case ZLimbType::LOD: - entryStr += StringHelper::Sprintf(" { %s, %s }\n", - dListStr.c_str(), dListStr2.c_str()); + case ZLimbType::Curve: + entryStr += StringHelper::Sprintf(" { %s, %s }\n", dListStr.c_str(), dListStr2.c_str()); break; case ZLimbType::Skin: entryStr += GetSourceOutputCodeSkin(prefix); @@ -441,10 +523,13 @@ string ZLimb::GetSourceOutputCode(const std::string& prefix) } Declaration* decl = parent->GetDeclaration(GetFileAddress()); - if (decl == nullptr) { - parent->AddDeclaration(GetFileAddress(), DeclarationAlignment::None, GetRawDataSize(), GetSourceTypeName(), name, entryStr); + if (decl == nullptr) + { + parent->AddDeclaration(GetFileAddress(), DeclarationAlignment::None, GetRawDataSize(), + GetSourceTypeName(), name, entryStr); } - else { + else + { decl->text = entryStr; } @@ -468,13 +553,16 @@ ZLimbType ZLimb::GetLimbType() const char* ZLimb::GetSourceTypeName(ZLimbType limbType) { - switch (limbType) { + switch (limbType) + { case ZLimbType::Standard: return "StandardLimb"; case ZLimbType::LOD: return "LodLimb"; case ZLimbType::Skin: return "SkinLimb"; + case ZLimbType::Curve: + return "SkelCurveLimb"; } return "StandardLimb"; } @@ -484,9 +572,11 @@ uint32_t ZLimb::GetFileAddress() return Seg2Filespace(segAddress, parent->baseAddress); } -std::string ZLimb::GetLimbDListSourceOutputCode(const std::string& prefix, const std::string& limbPrefix, segptr_t dListPtr) +std::string ZLimb::GetLimbDListSourceOutputCode(const std::string& prefix, + const std::string& limbPrefix, segptr_t dListPtr) { - if (dListPtr == 0) { + if (dListPtr == 0) + { return "NULL"; } @@ -494,16 +584,21 @@ std::string ZLimb::GetLimbDListSourceOutputCode(const std::string& prefix, const string dListStr; Declaration* decl = parent->GetDeclaration(dListOffset); - if (decl == nullptr) { - dListStr = StringHelper::Sprintf("%s%sLimbDL_%06X", prefix.c_str(), limbPrefix.c_str(), dListOffset); + if (decl == nullptr) + { + dListStr = StringHelper::Sprintf("%s%sLimbDL_%06X", prefix.c_str(), limbPrefix.c_str(), + dListOffset); - int dlistLength = ZDisplayList::GetDListLength(rawData, dListOffset, Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX); + int dlistLength = ZDisplayList::GetDListLength( + rawData, dListOffset, + Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX); auto& dList = dLists.emplace_back(rawData, dListOffset, dlistLength); dList.parent = parent; dList.SetName(dListStr); dList.GetSourceOutputCode(prefix); } - else { + else + { dListStr = decl->varName; } @@ -515,7 +610,8 @@ std::string ZLimb::GetSourceOutputCodeSkin_Type_4(const std::string& prefix) assert(type == ZLimbType::Skin); assert(skinSegmentType == ZLimbSkinType::SkinType_4); - if (skinSegment == 0) { + if (skinSegment == 0) + { return "NULL"; } @@ -523,18 +619,21 @@ std::string ZLimb::GetSourceOutputCodeSkin_Type_4(const std::string& prefix) string struct_800A5E28_Str; Declaration* decl = parent->GetDeclaration(skinSegmentOffset); - if (decl == nullptr) { - struct_800A5E28_Str = StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), Struct_800A5E28::GetSourceTypeName().c_str(), skinSegmentOffset); + if (decl == nullptr) + { + struct_800A5E28_Str = + StringHelper::Sprintf("%sSkinLimb_%s_%06X", prefix.c_str(), + Struct_800A5E28::GetSourceTypeName().c_str(), skinSegmentOffset); segmentStruct.PreGenSourceFiles(prefix); string entryStr = segmentStruct.GetSourceOutputCode(prefix); - parent->AddDeclaration( - skinSegmentOffset, DeclarationAlignment::None, - Struct_800A5E28::GetRawDataSize(), Struct_800A5E28::GetSourceTypeName(), - struct_800A5E28_Str, entryStr); + parent->AddDeclaration(skinSegmentOffset, DeclarationAlignment::None, + Struct_800A5E28::GetRawDataSize(), + Struct_800A5E28::GetSourceTypeName(), struct_800A5E28_Str, entryStr); } - else { + else + { struct_800A5E28_Str = decl->varName; } @@ -547,8 +646,10 @@ std::string ZLimb::GetSourceOutputCodeSkin(const std::string& prefix) string skinSegmentStr = "NULL"; - if (skinSegment != 0) { - switch (skinSegmentType) { + if (skinSegment != 0) + { + switch (skinSegmentType) + { case ZLimbSkinType::SkinType_4: skinSegmentStr = "&" + GetSourceOutputCodeSkin_Type_4(prefix); break; @@ -556,17 +657,23 @@ std::string ZLimb::GetSourceOutputCodeSkin(const std::string& prefix) skinSegmentStr = GetLimbDListSourceOutputCode(prefix, "Skin", skinSegment); break; default: - fprintf(stderr, "ZLimb::GetSourceOutputCodeSkinType: Error in '%s'.\n\t Unknown segment type for SkinLimb: '%i'. \n\tPlease report this.\n", name.c_str(), static_cast(skinSegmentType)); + fprintf(stderr, + "ZLimb::GetSourceOutputCodeSkinType: Error in '%s'.\n\t Unknown segment type " + "for SkinLimb: '%i'. \n\tPlease report this.\n", + name.c_str(), static_cast(skinSegmentType)); case ZLimbSkinType::SkinType_0: case ZLimbSkinType::SkinType_5: - fprintf(stderr, "ZLimb::GetSourceOutputCodeSkinType: Error in '%s'.\n\t Segment type for SkinLimb not implemented: '%i'.\n", name.c_str(), static_cast(skinSegmentType)); + fprintf(stderr, + "ZLimb::GetSourceOutputCodeSkinType: Error in '%s'.\n\t Segment type for " + "SkinLimb not implemented: '%i'.\n", + name.c_str(), static_cast(skinSegmentType)); skinSegmentStr = StringHelper::Sprintf("0x%08X", skinSegment); break; } } - string entryStr = StringHelper::Sprintf(" 0x%02X, %s\n", - skinSegmentType, skinSegmentStr.c_str()); + string entryStr = + StringHelper::Sprintf(" 0x%02X, %s\n", skinSegmentType, skinSegmentStr.c_str()); return entryStr; } diff --git a/tools/ZAPD/ZAPD/ZLimb.h b/tools/ZAPD/ZAPD/ZLimb.h index cc5e9065d8..edff33542d 100644 --- a/tools/ZAPD/ZAPD/ZLimb.h +++ b/tools/ZAPD/ZAPD/ZLimb.h @@ -1,29 +1,28 @@ #pragma once -#include -#include #include -#include "ZFile.h" +#include +#include #include "ZDisplayList.h" - +#include "ZFile.h" enum class ZLimbType { Standard, LOD, - Skin + Skin, + Curve, }; // TODO: check if more types exists enum class ZLimbSkinType { - SkinType_0, // Segment = 0 - SkinType_4 = 4, // Segment = segmented address // Struct_800A5E28 - SkinType_5 = 5, // Segment = 0 - SkinType_DList = 11, // Segment = DList address + SkinType_0, // Segment = 0 + SkinType_4 = 4, // Segment = segmented address // Struct_800A5E28 + SkinType_5 = 5, // Segment = 0 + SkinType_DList = 11, // Segment = DList address }; - class Struct_800A57C0 { protected: @@ -39,14 +38,12 @@ public: Struct_800A57C0(const std::vector& rawData, uint32_t fileOffset); Struct_800A57C0(const std::vector& rawData, uint32_t fileOffset, size_t index); - [[nodiscard]] - std::string GetSourceOutputCode() const; + [[nodiscard]] std::string GetSourceOutputCode() const; static size_t GetRawDataSize(); static std::string GetSourceTypeName(); }; - class Struct_800A598C_2 { protected: @@ -60,51 +57,48 @@ public: Struct_800A598C_2(const std::vector& rawData, uint32_t fileOffset); Struct_800A598C_2(const std::vector& rawData, uint32_t fileOffset, size_t index); - [[nodiscard]] - std::string GetSourceOutputCode() const; + [[nodiscard]] std::string GetSourceOutputCode() const; static size_t GetRawDataSize(); static std::string GetSourceTypeName(); }; - class Struct_800A598C { protected: ZFile* parent; - uint16_t unk_0; // Length of unk_8 - uint16_t unk_2; // Length of unk_C - uint16_t unk_4; // 0 or 1 // Used as an index for unk_C - segptr_t unk_8; // Struct_800A57C0* - segptr_t unk_C; // Struct_800A598C_2* + uint16_t unk_0; // Length of unk_8 + uint16_t unk_2; // Length of unk_C + uint16_t unk_4; // 0 or 1 // Used as an index for unk_C + segptr_t unk_8; // Struct_800A57C0* + segptr_t unk_C; // Struct_800A598C_2* std::vector unk_8_arr; std::vector unk_C_arr; public: Struct_800A598C(ZFile* parent, const std::vector& rawData, uint32_t fileOffset); - Struct_800A598C(ZFile* parent, const std::vector& rawData, uint32_t fileOffset, size_t index); + Struct_800A598C(ZFile* parent, const std::vector& rawData, uint32_t fileOffset, + size_t index); void PreGenSourceFiles(const std::string& prefix); - [[nodiscard]] - std::string GetSourceOutputCode(const std::string& prefix) const; + [[nodiscard]] std::string GetSourceOutputCode(const std::string& prefix) const; static size_t GetRawDataSize(); static std::string GetSourceTypeName(); }; - class Struct_800A5E28 { protected: ZFile* parent; std::vector rawData; - uint16_t unk_0; // Vtx count - uint16_t unk_2; // Length of unk_4 - segptr_t unk_4; // Struct_800A598C* - segptr_t unk_8; // Gfx* + uint16_t unk_0; // Vtx count + uint16_t unk_2; // Length of unk_4 + segptr_t unk_4; // Struct_800A598C* + segptr_t unk_8; // Gfx* std::vector unk_4_arr; ZDisplayList* unk_8_dlist = nullptr; @@ -112,18 +106,17 @@ protected: public: Struct_800A5E28() = default; Struct_800A5E28(ZFile* parent, const std::vector& rawData, uint32_t fileOffset); - Struct_800A5E28(ZFile* parent, const std::vector& rawData, uint32_t fileOffset, size_t index); + Struct_800A5E28(ZFile* parent, const std::vector& rawData, uint32_t fileOffset, + size_t index); ~Struct_800A5E28(); void PreGenSourceFiles(const std::string& prefix); - [[nodiscard]] - std::string GetSourceOutputCode(const std::string& prefix) const; + [[nodiscard]] std::string GetSourceOutputCode(const std::string& prefix) const; static size_t GetRawDataSize(); static std::string GetSourceTypeName(); }; - class ZLimb : public ZResource { protected: @@ -136,24 +129,28 @@ protected: std::vector dLists; - segptr_t farDListPtr = 0; // LOD only + segptr_t dList2Ptr = 0; // LOD and Curve only - ZLimbSkinType skinSegmentType = ZLimbSkinType::SkinType_0; // Skin only - segptr_t skinSegment = 0; // Skin only - Struct_800A5E28 segmentStruct; // Skin only + ZLimbSkinType skinSegmentType = ZLimbSkinType::SkinType_0; // Skin only + segptr_t skinSegment = 0; // Skin only + Struct_800A5E28 segmentStruct; // Skin only - std::string GetLimbDListSourceOutputCode(const std::string& prefix, const std::string& limbPrefix, segptr_t dListPtr); + std::string GetLimbDListSourceOutputCode(const std::string& prefix, + const std::string& limbPrefix, segptr_t dListPtr); std::string GetSourceOutputCodeSkin(const std::string& prefix); std::string GetSourceOutputCodeSkin_Type_4(const std::string& prefix); public: - ZLimb(tinyxml2::XMLElement* reader, const std::vector& nRawData, int nRawDataIndex, ZFile* nParent); - ZLimb(ZLimbType limbType, const std::string& prefix, const std::vector& nRawData, int nRawDataIndex, ZFile* nParent); + ZLimb(tinyxml2::XMLElement* reader, const std::vector& nRawData, int nRawDataIndex, + ZFile* nParent); + ZLimb(ZLimbType limbType, const std::string& prefix, const std::vector& nRawData, + int nRawDataIndex, ZFile* nParent); void ParseXML(tinyxml2::XMLElement* reader) override; void ParseRawData() override; - static ZLimb* FromXML(tinyxml2::XMLElement* reader, std::vector nRawData, int rawDataIndex, std::string nRelPath, ZFile* parent); + static ZLimb* FromXML(tinyxml2::XMLElement* reader, std::vector nRawData, + int rawDataIndex, std::string nRelPath, ZFile* parent); int GetRawDataSize() override; std::string GetSourceOutputCode(const std::string& prefix) override; std::string GetSourceTypeName() override; diff --git a/tools/ZAPD/ZAPD/ZResource.cpp b/tools/ZAPD/ZAPD/ZResource.cpp index f906c7a794..7a8acb417a 100644 --- a/tools/ZAPD/ZAPD/ZResource.cpp +++ b/tools/ZAPD/ZAPD/ZResource.cpp @@ -29,7 +29,6 @@ void ZResource::ParseXML(tinyxml2::XMLElement* reader) void ZResource::Save(const std::string& outFolder) { - } void ZResource::PreGenSourceFiles() @@ -107,7 +106,6 @@ void ZResource::ParseRawData() void ZResource::GenerateHLIntermediette(HLFileIntermediette& hlFile) { - } std::string ZResource::GetSourceTypeName() @@ -125,12 +123,11 @@ void ZResource::CalcHash() hash = 0; } - uint32_t Seg2Filespace(segptr_t segmentedAddress, uint32_t parentBaseAddress) { uint32_t currentPtr = GETSEGOFFSET(segmentedAddress); - if (GETSEGNUM(segmentedAddress) == 0x80) // Is defined in code? + if (GETSEGNUM(segmentedAddress) == 0x80) // Is defined in code? currentPtr -= GETSEGOFFSET(parentBaseAddress); return currentPtr; diff --git a/tools/ZAPD/ZAPD/ZResource.h b/tools/ZAPD/ZAPD/ZResource.h index b34ccdcd22..78f69a6c82 100644 --- a/tools/ZAPD/ZAPD/ZResource.h +++ b/tools/ZAPD/ZAPD/ZResource.h @@ -1,9 +1,10 @@ #pragma once #include +#include +#include #include #include -#include #include "tinyxml2.h" #define SEGMENT_SCENE 2 @@ -39,7 +40,8 @@ enum class ZResourceType Scalar, Vector, Vertex, - CollisionHeader + CollisionHeader, + Symbol, }; class ZResource @@ -58,7 +60,7 @@ public: std::string GetRelativePath(); virtual std::vector GetRawData(); virtual bool IsExternalResource(); - virtual bool DoesSupportArray(); // Can this type be wrapped in an node? + virtual bool DoesSupportArray(); // Can this type be wrapped in an node? virtual std::string GetExternalExtension(); virtual int GetRawDataIndex(); virtual int GetRawDataSize(); @@ -116,15 +118,21 @@ public: int arrayItemCnt; std::vector references; - Declaration(DeclarationAlignment nAlignment, uint32_t nSize, std::string nVarType, std::string nVarName, bool nIsArray, std::string nText); - Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, uint32_t nSize, std::string nVarType, std::string nVarName, bool nIsArray, std::string nText); - Declaration(DeclarationAlignment nAlignment, uint32_t nSize, std::string nVarType, std::string nVarName, bool nIsArray, int nArrayItemCnt, std::string nText); - Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, uint32_t nSize, std::string nVarType, std::string nVarName, bool nIsArray, int nArrayItemCnt, std::string nText); - Declaration(std::string nIncludePath, uint32_t nSize, std::string nVarType, std::string nVarName); + Declaration(DeclarationAlignment nAlignment, uint32_t nSize, std::string nVarType, + std::string nVarName, bool nIsArray, std::string nText); + Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, uint32_t nSize, + std::string nVarType, std::string nVarName, bool nIsArray, std::string nText); + Declaration(DeclarationAlignment nAlignment, uint32_t nSize, std::string nVarType, + std::string nVarName, bool nIsArray, int nArrayItemCnt, std::string nText); + Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, uint32_t nSize, + std::string nVarType, std::string nVarName, bool nIsArray, int nArrayItemCnt, + std::string nText); + Declaration(std::string nIncludePath, uint32_t nSize, std::string nVarType, + std::string nVarName); protected: - Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, uint32_t nSize, std::string nText); + Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, uint32_t nSize, + std::string nText); }; - uint32_t Seg2Filespace(segptr_t segmentedAddress, uint32_t parentBaseAddress); diff --git a/tools/ZAPD/ZAPD/ZRoom/ActorList.h b/tools/ZAPD/ZAPD/ZRoom/ActorList.h index 742adc858d..24ba26efa3 100644 --- a/tools/ZAPD/ZAPD/ZRoom/ActorList.h +++ b/tools/ZAPD/ZAPD/ZRoom/ActorList.h @@ -2,478 +2,477 @@ #include -static const std::string ActorList[] = -{ - /* 0x0000 */ "ACTOR_PLAYER", - /* 0x0001 */ "ACTOR_UNSET_1", - /* 0x0002 */ "ACTOR_EN_TEST", - /* 0x0003 */ "ACTOR_UNSET_3", - /* 0x0004 */ "ACTOR_EN_GIRLA", - /* 0x0005 */ "ACTOR_UNSET_5", - /* 0x0006 */ "ACTOR_UNSET_6", - /* 0x0007 */ "ACTOR_EN_PART", - /* 0x0008 */ "ACTOR_EN_LIGHT", - /* 0x0009 */ "ACTOR_EN_DOOR", - /* 0x000A */ "ACTOR_EN_BOX", // Treasure Chest - /* 0x000B */ "ACTOR_BG_DY_YOSEIZO", - /* 0x000C */ "ACTOR_BG_HIDAN_FIREWALL", - /* 0x000D */ "ACTOR_EN_POH", - /* 0x000E */ "ACTOR_EN_OKUTA", - /* 0x000F */ "ACTOR_BG_YDAN_SP", - /* 0x0010 */ "ACTOR_EN_BOM", - /* 0x0011 */ "ACTOR_EN_WALLMAS", - /* 0x0012 */ "ACTOR_EN_DODONGO", - /* 0x0013 */ "ACTOR_EN_FIREFLY", - /* 0x0014 */ "ACTOR_EN_HORSE", - /* 0x0015 */ "ACTOR_EN_ITEM00", - /* 0x0016 */ "ACTOR_EN_ARROW", - /* 0x0017 */ "ACTOR_UNSET_17", - /* 0x0018 */ "ACTOR_EN_ELF", - /* 0x0019 */ "ACTOR_EN_NIW", - /* 0x001A */ "ACTOR_UNSET_1A", - /* 0x001B */ "ACTOR_EN_TITE", - /* 0x001C */ "ACTOR_EN_REEBA", - /* 0x001D */ "ACTOR_EN_PEEHAT", - /* 0x001E */ "ACTOR_EN_BUTTE", - /* 0x001F */ "ACTOR_UNSET_1F", - /* 0x0020 */ "ACTOR_EN_INSECT", - /* 0x0021 */ "ACTOR_EN_FISH", - /* 0x0022 */ "ACTOR_UNSET_22", - /* 0x0023 */ "ACTOR_EN_HOLL", - /* 0x0024 */ "ACTOR_EN_SCENE_CHANGE", - /* 0x0025 */ "ACTOR_EN_ZF", - /* 0x0026 */ "ACTOR_EN_HATA", - /* 0x0027 */ "ACTOR_BOSS_DODONGO", - /* 0x0028 */ "ACTOR_BOSS_GOMA", - /* 0x0029 */ "ACTOR_EN_ZL1", - /* 0x002A */ "ACTOR_EN_VIEWER", - /* 0x002B */ "ACTOR_EN_GOMA", - /* 0x002C */ "ACTOR_BG_PUSHBOX", - /* 0x002D */ "ACTOR_EN_BUBBLE", - /* 0x002E */ "ACTOR_DOOR_SHUTTER", - /* 0x002F */ "ACTOR_EN_DODOJR", - /* 0x0030 */ "ACTOR_EN_BDFIRE", - /* 0x0031 */ "ACTOR_UNSET_31", - /* 0x0032 */ "ACTOR_EN_BOOM", - /* 0x0033 */ "ACTOR_EN_TORCH2", - /* 0x0034 */ "ACTOR_EN_BILI", - /* 0x0035 */ "ACTOR_EN_TP", - /* 0x0036 */ "ACTOR_UNSET_36", - /* 0x0037 */ "ACTOR_EN_ST", - /* 0x0038 */ "ACTOR_EN_BW", - /* 0x0039 */ "ACTOR_EN_A_OBJ", - /* 0x003A */ "ACTOR_EN_EIYER", - /* 0x003B */ "ACTOR_EN_RIVER_SOUND", - /* 0x003C */ "ACTOR_EN_HORSE_NORMAL", - /* 0x003D */ "ACTOR_EN_OSSAN", - /* 0x003E */ "ACTOR_BG_TREEMOUTH", - /* 0x003F */ "ACTOR_BG_DODOAGO", - /* 0x0040 */ "ACTOR_BG_HIDAN_DALM", - /* 0x0041 */ "ACTOR_BG_HIDAN_HROCK", - /* 0x0042 */ "ACTOR_EN_HORSE_GANON", - /* 0x0043 */ "ACTOR_BG_HIDAN_ROCK", - /* 0x0044 */ "ACTOR_BG_HIDAN_RSEKIZOU", - /* 0x0045 */ "ACTOR_BG_HIDAN_SEKIZOU", - /* 0x0046 */ "ACTOR_BG_HIDAN_SIMA", - /* 0x0047 */ "ACTOR_BG_HIDAN_SYOKU", - /* 0x0048 */ "ACTOR_EN_XC", - /* 0x0049 */ "ACTOR_BG_HIDAN_CURTAIN", - /* 0x004A */ "ACTOR_BG_SPOT00_HANEBASI", - /* 0x004B */ "ACTOR_EN_MB", - /* 0x004C */ "ACTOR_EN_BOMBF", - /* 0x004D */ "ACTOR_EN_ZL2", - /* 0x004E */ "ACTOR_BG_HIDAN_FSLIFT", - /* 0x004F */ "ACTOR_EN_OE2", - /* 0x0050 */ "ACTOR_BG_YDAN_HASI", - /* 0x0051 */ "ACTOR_BG_YDAN_MARUTA", - /* 0x0052 */ "ACTOR_BOSS_GANONDROF", - /* 0x0053 */ "ACTOR_UNSET_53", - /* 0x0054 */ "ACTOR_EN_AM", - /* 0x0055 */ "ACTOR_EN_DEKUBABA", - /* 0x0056 */ "ACTOR_EN_M_FIRE1", - /* 0x0057 */ "ACTOR_EN_M_THUNDER", - /* 0x0058 */ "ACTOR_BG_DDAN_JD", - /* 0x0059 */ "ACTOR_BG_BREAKWALL", - /* 0x005A */ "ACTOR_EN_JJ", - /* 0x005B */ "ACTOR_EN_HORSE_ZELDA", - /* 0x005C */ "ACTOR_BG_DDAN_KD", - /* 0x005D */ "ACTOR_DOOR_WARP1", - /* 0x005E */ "ACTOR_OBJ_SYOKUDAI", - /* 0x005F */ "ACTOR_ITEM_B_HEART", - /* 0x0060 */ "ACTOR_EN_DEKUNUTS", - /* 0x0061 */ "ACTOR_BG_MENKURI_KAITEN", - /* 0x0062 */ "ACTOR_BG_MENKURI_EYE", - /* 0x0063 */ "ACTOR_EN_VALI", - /* 0x0064 */ "ACTOR_BG_MIZU_MOVEBG", - /* 0x0065 */ "ACTOR_BG_MIZU_WATER", - /* 0x0066 */ "ACTOR_ARMS_HOOK", - /* 0x0067 */ "ACTOR_EN_FHG", - /* 0x0068 */ "ACTOR_BG_MORI_HINERI", - /* 0x0069 */ "ACTOR_EN_BB", - /* 0x006A */ "ACTOR_BG_TOKI_HIKARI", - /* 0x006B */ "ACTOR_EN_YUKABYUN", - /* 0x006C */ "ACTOR_BG_TOKI_SWD", - /* 0x006D */ "ACTOR_EN_FHG_FIRE", - /* 0x006E */ "ACTOR_BG_MJIN", - /* 0x006F */ "ACTOR_BG_HIDAN_KOUSI", - /* 0x0070 */ "ACTOR_DOOR_TOKI", - /* 0x0071 */ "ACTOR_BG_HIDAN_HAMSTEP", - /* 0x0072 */ "ACTOR_EN_BIRD", - /* 0x0073 */ "ACTOR_UNSET_73", - /* 0x0074 */ "ACTOR_UNSET_74", - /* 0x0075 */ "ACTOR_UNSET_75", - /* 0x0076 */ "ACTOR_UNSET_76", - /* 0x0077 */ "ACTOR_EN_WOOD02", - /* 0x0078 */ "ACTOR_UNSET_78", - /* 0x0079 */ "ACTOR_UNSET_79", - /* 0x007A */ "ACTOR_UNSET_7A", - /* 0x007B */ "ACTOR_UNSET_7B", - /* 0x007C */ "ACTOR_EN_LIGHTBOX", - /* 0x007D */ "ACTOR_EN_PU_BOX", - /* 0x007E */ "ACTOR_UNSET_7E", - /* 0x007F */ "ACTOR_UNSET_7F", - /* 0x0080 */ "ACTOR_EN_TRAP", - /* 0x0081 */ "ACTOR_EN_AROW_TRAP", - /* 0x0082 */ "ACTOR_EN_VASE", - /* 0x0083 */ "ACTOR_UNSET_83", - /* 0x0084 */ "ACTOR_EN_TA", - /* 0x0085 */ "ACTOR_EN_TK", - /* 0x0086 */ "ACTOR_BG_MORI_BIGST", - /* 0x0087 */ "ACTOR_BG_MORI_ELEVATOR", - /* 0x0088 */ "ACTOR_BG_MORI_KAITENKABE", - /* 0x0089 */ "ACTOR_BG_MORI_RAKKATENJO", - /* 0x008A */ "ACTOR_EN_VM", - /* 0x008B */ "ACTOR_DEMO_EFFECT", - /* 0x008C */ "ACTOR_DEMO_KANKYO", - /* 0x008D */ "ACTOR_BG_HIDAN_FWBIG", - /* 0x008E */ "ACTOR_EN_FLOORMAS", - /* 0x008F */ "ACTOR_EN_HEISHI1", - /* 0x0090 */ "ACTOR_EN_RD", - /* 0x0091 */ "ACTOR_EN_PO_SISTERS", - /* 0x0092 */ "ACTOR_BG_HEAVY_BLOCK", - /* 0x0093 */ "ACTOR_BG_PO_EVENT", - /* 0x0094 */ "ACTOR_OBJ_MURE", - /* 0x0095 */ "ACTOR_EN_SW", - /* 0x0096 */ "ACTOR_BOSS_FD", - /* 0x0097 */ "ACTOR_OBJECT_KANKYO", - /* 0x0098 */ "ACTOR_EN_DU", - /* 0x0099 */ "ACTOR_EN_FD", - /* 0x009A */ "ACTOR_EN_HORSE_LINK_CHILD", - /* 0x009B */ "ACTOR_DOOR_ANA", - /* 0x009C */ "ACTOR_BG_SPOT02_OBJECTS", - /* 0x009D */ "ACTOR_BG_HAKA", - /* 0x009E */ "ACTOR_MAGIC_WIND", - /* 0x009F */ "ACTOR_MAGIC_FIRE", - /* 0x00A0 */ "ACTOR_UNSET_A0", - /* 0x00A1 */ "ACTOR_EN_RU1", - /* 0x00A2 */ "ACTOR_BOSS_FD2", - /* 0x00A3 */ "ACTOR_EN_FD_FIRE", - /* 0x00A4 */ "ACTOR_EN_DH", - /* 0x00A5 */ "ACTOR_EN_DHA", - /* 0x00A6 */ "ACTOR_EN_RL", - /* 0x00A7 */ "ACTOR_EN_ENCOUNT1", - /* 0x00A8 */ "ACTOR_DEMO_DU", - /* 0x00A9 */ "ACTOR_DEMO_IM", - /* 0x00AA */ "ACTOR_DEMO_TRE_LGT", - /* 0x00AB */ "ACTOR_EN_FW", - /* 0x00AC */ "ACTOR_BG_VB_SIMA", - /* 0x00AD */ "ACTOR_EN_VB_BALL", - /* 0x00AE */ "ACTOR_BG_HAKA_MEGANE", - /* 0x00AF */ "ACTOR_BG_HAKA_MEGANEBG", - /* 0x00B0 */ "ACTOR_BG_HAKA_SHIP", - /* 0x00B1 */ "ACTOR_BG_HAKA_SGAMI", - /* 0x00B2 */ "ACTOR_UNSET_B2", - /* 0x00B3 */ "ACTOR_EN_HEISHI2", - /* 0x00B4 */ "ACTOR_EN_ENCOUNT2", - /* 0x00B5 */ "ACTOR_EN_FIRE_ROCK", - /* 0x00B6 */ "ACTOR_EN_BROB", - /* 0x00B7 */ "ACTOR_MIR_RAY", - /* 0x00B8 */ "ACTOR_BG_SPOT09_OBJ", - /* 0x00B9 */ "ACTOR_BG_SPOT18_OBJ", - /* 0x00BA */ "ACTOR_BOSS_VA", - /* 0x00BB */ "ACTOR_BG_HAKA_TUBO", - /* 0x00BC */ "ACTOR_BG_HAKA_TRAP", - /* 0x00BD */ "ACTOR_BG_HAKA_HUTA", - /* 0x00BE */ "ACTOR_BG_HAKA_ZOU", - /* 0x00BF */ "ACTOR_BG_SPOT17_FUNEN", - /* 0x00C0 */ "ACTOR_EN_SYATEKI_ITM", - /* 0x00C1 */ "ACTOR_EN_SYATEKI_MAN", - /* 0x00C2 */ "ACTOR_EN_TANA", - /* 0x00C3 */ "ACTOR_EN_NB", - /* 0x00C4 */ "ACTOR_BOSS_MO", - /* 0x00C5 */ "ACTOR_EN_SB", - /* 0x00C6 */ "ACTOR_EN_BIGOKUTA", - /* 0x00C7 */ "ACTOR_EN_KAREBABA", - /* 0x00C8 */ "ACTOR_BG_BDAN_OBJECTS", - /* 0x00C9 */ "ACTOR_DEMO_SA", - /* 0x00CA */ "ACTOR_DEMO_GO", - /* 0x00CB */ "ACTOR_EN_IN", - /* 0x00CC */ "ACTOR_EN_TR", - /* 0x00CD */ "ACTOR_BG_SPOT16_BOMBSTONE", - /* 0x00CE */ "ACTOR_UNSET_CE", - /* 0x00CF */ "ACTOR_BG_HIDAN_KOWARERUKABE", - /* 0x00D0 */ "ACTOR_BG_BOMBWALL", - /* 0x00D1 */ "ACTOR_BG_SPOT08_ICEBLOCK", - /* 0x00D2 */ "ACTOR_EN_RU2", - /* 0x00D3 */ "ACTOR_OBJ_DEKUJR", - /* 0x00D4 */ "ACTOR_BG_MIZU_UZU", - /* 0x00D5 */ "ACTOR_BG_SPOT06_OBJECTS", - /* 0x00D6 */ "ACTOR_BG_ICE_OBJECTS", - /* 0x00D7 */ "ACTOR_BG_HAKA_WATER", - /* 0x00D8 */ "ACTOR_UNSET_D8", - /* 0x00D9 */ "ACTOR_EN_MA2", - /* 0x00DA */ "ACTOR_EN_BOM_CHU", - /* 0x00DB */ "ACTOR_EN_HORSE_GAME_CHECK", - /* 0x00DC */ "ACTOR_BOSS_TW", - /* 0x00DD */ "ACTOR_EN_RR", - /* 0x00DE */ "ACTOR_EN_BA", - /* 0x00DF */ "ACTOR_EN_BX", - /* 0x00E0 */ "ACTOR_EN_ANUBICE", - /* 0x00E1 */ "ACTOR_EN_ANUBICE_FIRE", - /* 0x00E2 */ "ACTOR_BG_MORI_HASHIGO", - /* 0x00E3 */ "ACTOR_BG_MORI_HASHIRA4", - /* 0x00E4 */ "ACTOR_BG_MORI_IDOMIZU", - /* 0x00E5 */ "ACTOR_BG_SPOT16_DOUGHNUT", - /* 0x00E6 */ "ACTOR_BG_BDAN_SWITCH", - /* 0x00E7 */ "ACTOR_EN_MA1", - /* 0x00E8 */ "ACTOR_BOSS_GANON", - /* 0x00E9 */ "ACTOR_BOSS_SST", - /* 0x00EA */ "ACTOR_UNSET_EA", - /* 0x00EB */ "ACTOR_UNSET_EB", - /* 0x00EC */ "ACTOR_EN_NY", - /* 0x00ED */ "ACTOR_EN_FR", - /* 0x00EE */ "ACTOR_ITEM_SHIELD", - /* 0x00EF */ "ACTOR_BG_ICE_SHELTER", - /* 0x00F0 */ "ACTOR_EN_ICE_HONO", - /* 0x00F1 */ "ACTOR_ITEM_OCARINA", - /* 0x00F2 */ "ACTOR_UNSET_F2", - /* 0x00F3 */ "ACTOR_UNSET_F3", - /* 0x00F4 */ "ACTOR_MAGIC_DARK", - /* 0x00F5 */ "ACTOR_DEMO_6K", - /* 0x00F6 */ "ACTOR_EN_ANUBICE_TAG", - /* 0x00F7 */ "ACTOR_BG_HAKA_GATE", - /* 0x00F8 */ "ACTOR_BG_SPOT15_SAKU", - /* 0x00F9 */ "ACTOR_BG_JYA_GOROIWA", - /* 0x00FA */ "ACTOR_BG_JYA_ZURERUKABE", - /* 0x00FB */ "ACTOR_UNSET_FB", - /* 0x00FC */ "ACTOR_BG_JYA_COBRA", - /* 0x00FD */ "ACTOR_BG_JYA_KANAAMI", - /* 0x00FE */ "ACTOR_FISHING", - /* 0x00FF */ "ACTOR_OBJ_OSHIHIKI", - /* 0x0100 */ "ACTOR_BG_GATE_SHUTTER", - /* 0x0101 */ "ACTOR_EFF_DUST", - /* 0x0102 */ "ACTOR_BG_SPOT01_FUSYA", - /* 0x0103 */ "ACTOR_BG_SPOT01_IDOHASHIRA", - /* 0x0104 */ "ACTOR_BG_SPOT01_IDOMIZU", - /* 0x0105 */ "ACTOR_BG_PO_SYOKUDAI", - /* 0x0106 */ "ACTOR_BG_GANON_OTYUKA", - /* 0x0107 */ "ACTOR_BG_SPOT15_RRBOX", - /* 0x0108 */ "ACTOR_BG_UMAJUMP", - /* 0x0109 */ "ACTOR_UNSET_109", - /* 0x010A */ "ACTOR_ARROW_FIRE", - /* 0x010B */ "ACTOR_ARROW_ICE", - /* 0x010C */ "ACTOR_ARROW_LIGHT", - /* 0x010D */ "ACTOR_UNSET_10D", - /* 0x010E */ "ACTOR_UNSET_10E", - /* 0x010F */ "ACTOR_ITEM_ETCETERA", - /* 0x0110 */ "ACTOR_OBJ_KIBAKO", - /* 0x0111 */ "ACTOR_OBJ_TSUBO", - /* 0x0112 */ "ACTOR_EN_WONDER_ITEM", - /* 0x0113 */ "ACTOR_EN_IK", - /* 0x0114 */ "ACTOR_DEMO_IK", - /* 0x0115 */ "ACTOR_EN_SKJ", - /* 0x0116 */ "ACTOR_EN_SKJNEEDLE", - /* 0x0117 */ "ACTOR_EN_G_SWITCH", - /* 0x0118 */ "ACTOR_DEMO_EXT", - /* 0x0119 */ "ACTOR_DEMO_SHD", - /* 0x011A */ "ACTOR_EN_DNS", - /* 0x011B */ "ACTOR_ELF_MSG", - /* 0x011C */ "ACTOR_EN_HONOTRAP", - /* 0x011D */ "ACTOR_EN_TUBO_TRAP", - /* 0x011E */ "ACTOR_OBJ_ICE_POLY", - /* 0x011F */ "ACTOR_BG_SPOT03_TAKI", - /* 0x0120 */ "ACTOR_BG_SPOT07_TAKI", - /* 0x0121 */ "ACTOR_EN_FZ", - /* 0x0122 */ "ACTOR_EN_PO_RELAY", - /* 0x0123 */ "ACTOR_BG_RELAY_OBJECTS", - /* 0x0124 */ "ACTOR_EN_DIVING_GAME", - /* 0x0125 */ "ACTOR_EN_KUSA", - /* 0x0126 */ "ACTOR_OBJ_BEAN", - /* 0x0127 */ "ACTOR_OBJ_BOMBIWA", - /* 0x0128 */ "ACTOR_UNSET_128", - /* 0x0129 */ "ACTOR_UNSET_129", - /* 0x012A */ "ACTOR_OBJ_SWITCH", - /* 0x012B */ "ACTOR_OBJ_ELEVATOR", - /* 0x012C */ "ACTOR_OBJ_LIFT", - /* 0x012D */ "ACTOR_OBJ_HSBLOCK", - /* 0x012E */ "ACTOR_EN_OKARINA_TAG", - /* 0x012F */ "ACTOR_EN_YABUSAME_MARK", - /* 0x0130 */ "ACTOR_EN_GOROIWA", - /* 0x0131 */ "ACTOR_EN_EX_RUPPY", - /* 0x0132 */ "ACTOR_EN_TORYO", - /* 0x0133 */ "ACTOR_EN_DAIKU", - /* 0x0134 */ "ACTOR_UNSET_134", - /* 0x0135 */ "ACTOR_EN_NWC", - /* 0x0136 */ "ACTOR_EN_BLKOBJ", - /* 0x0137 */ "ACTOR_ITEM_INBOX", - /* 0x0138 */ "ACTOR_EN_GE1", - /* 0x0139 */ "ACTOR_OBJ_BLOCKSTOP", - /* 0x013A */ "ACTOR_EN_SDA", - /* 0x013B */ "ACTOR_EN_CLEAR_TAG", - /* 0x013C */ "ACTOR_EN_NIW_LADY", - /* 0x013D */ "ACTOR_EN_GM", - /* 0x013E */ "ACTOR_EN_MS", - /* 0x013F */ "ACTOR_EN_HS", - /* 0x0140 */ "ACTOR_BG_INGATE", - /* 0x0141 */ "ACTOR_EN_KANBAN", - /* 0x0142 */ "ACTOR_EN_HEISHI3", - /* 0x0143 */ "ACTOR_EN_SYATEKI_NIW", - /* 0x0144 */ "ACTOR_EN_ATTACK_NIW", - /* 0x0145 */ "ACTOR_BG_SPOT01_IDOSOKO", - /* 0x0146 */ "ACTOR_EN_SA", - /* 0x0147 */ "ACTOR_EN_WONDER_TALK", - /* 0x0148 */ "ACTOR_BG_GJYO_BRIDGE", - /* 0x0149 */ "ACTOR_EN_DS", - /* 0x014A */ "ACTOR_EN_MK", - /* 0x014B */ "ACTOR_EN_BOM_BOWL_MAN", - /* 0x014C */ "ACTOR_EN_BOM_BOWL_PIT", - /* 0x014D */ "ACTOR_EN_OWL", - /* 0x014E */ "ACTOR_EN_ISHI", - /* 0x014F */ "ACTOR_OBJ_HANA", - /* 0x0150 */ "ACTOR_OBJ_LIGHTSWITCH", - /* 0x0151 */ "ACTOR_OBJ_MURE2", - /* 0x0152 */ "ACTOR_EN_GO", - /* 0x0153 */ "ACTOR_EN_FU", - /* 0x0154 */ "ACTOR_UNSET_154", - /* 0x0155 */ "ACTOR_EN_CHANGER", - /* 0x0156 */ "ACTOR_BG_JYA_MEGAMI", - /* 0x0157 */ "ACTOR_BG_JYA_LIFT", - /* 0x0158 */ "ACTOR_BG_JYA_BIGMIRROR", - /* 0x0159 */ "ACTOR_BG_JYA_BOMBCHUIWA", - /* 0x015A */ "ACTOR_BG_JYA_AMISHUTTER", - /* 0x015B */ "ACTOR_BG_JYA_BOMBIWA", - /* 0x015C */ "ACTOR_BG_SPOT18_BASKET", - /* 0x015D */ "ACTOR_UNSET_15D", - /* 0x015E */ "ACTOR_EN_GANON_ORGAN", - /* 0x015F */ "ACTOR_EN_SIOFUKI", - /* 0x0160 */ "ACTOR_EN_STREAM", - /* 0x0161 */ "ACTOR_UNSET_161", - /* 0x0162 */ "ACTOR_EN_MM", - /* 0x0163 */ "ACTOR_EN_KO", - /* 0x0164 */ "ACTOR_EN_KZ", - /* 0x0165 */ "ACTOR_EN_WEATHER_TAG", - /* 0x0166 */ "ACTOR_BG_SST_FLOOR", - /* 0x0167 */ "ACTOR_EN_ANI", - /* 0x0168 */ "ACTOR_EN_EX_ITEM", - /* 0x0169 */ "ACTOR_BG_JYA_IRONOBJ", - /* 0x016A */ "ACTOR_EN_JS", - /* 0x016B */ "ACTOR_EN_JSJUTAN", - /* 0x016C */ "ACTOR_EN_CS", - /* 0x016D */ "ACTOR_EN_MD", - /* 0x016E */ "ACTOR_EN_HY", - /* 0x016F */ "ACTOR_EN_GANON_MANT", - /* 0x0170 */ "ACTOR_EN_OKARINA_EFFECT", - /* 0x0171 */ "ACTOR_EN_MAG", - /* 0x0172 */ "ACTOR_DOOR_GERUDO", - /* 0x0173 */ "ACTOR_ELF_MSG2", - /* 0x0174 */ "ACTOR_DEMO_GT", - /* 0x0175 */ "ACTOR_EN_PO_FIELD", - /* 0x0176 */ "ACTOR_EFC_ERUPC", - /* 0x0177 */ "ACTOR_BG_ZG", - /* 0x0178 */ "ACTOR_EN_HEISHI4", - /* 0x0179 */ "ACTOR_EN_ZL3", - /* 0x017A */ "ACTOR_BOSS_GANON2", - /* 0x017B */ "ACTOR_EN_KAKASI", - /* 0x017C */ "ACTOR_EN_TAKARA_MAN", - /* 0x017D */ "ACTOR_OBJ_MAKEOSHIHIKI", - /* 0x017E */ "ACTOR_OCEFF_SPOT", - /* 0x017F */ "ACTOR_END_TITLE", - /* 0x0180 */ "ACTOR_UNSET_180", - /* 0x0181 */ "ACTOR_EN_TORCH", - /* 0x0182 */ "ACTOR_DEMO_EC", - /* 0x0183 */ "ACTOR_SHOT_SUN", - /* 0x0184 */ "ACTOR_EN_DY_EXTRA", - /* 0x0185 */ "ACTOR_EN_WONDER_TALK2", - /* 0x0186 */ "ACTOR_EN_GE2", - /* 0x0187 */ "ACTOR_OBJ_ROOMTIMER", - /* 0x0188 */ "ACTOR_EN_SSH", - /* 0x0189 */ "ACTOR_EN_STH", - /* 0x018A */ "ACTOR_OCEFF_WIPE", - /* 0x018B */ "ACTOR_OCEFF_STORM", - /* 0x018C */ "ACTOR_EN_WEIYER", - /* 0x018D */ "ACTOR_BG_SPOT05_SOKO", - /* 0x018E */ "ACTOR_BG_JYA_1FLIFT", - /* 0x018F */ "ACTOR_BG_JYA_HAHENIRON", - /* 0x0190 */ "ACTOR_BG_SPOT12_GATE", - /* 0x0191 */ "ACTOR_BG_SPOT12_SAKU", - /* 0x0192 */ "ACTOR_EN_HINTNUTS", - /* 0x0193 */ "ACTOR_EN_NUTSBALL", - /* 0x0194 */ "ACTOR_BG_SPOT00_BREAK", - /* 0x0195 */ "ACTOR_EN_SHOPNUTS", - /* 0x0196 */ "ACTOR_EN_IT", - /* 0x0197 */ "ACTOR_EN_GELDB", - /* 0x0198 */ "ACTOR_OCEFF_WIPE2", - /* 0x0199 */ "ACTOR_OCEFF_WIPE3", - /* 0x019A */ "ACTOR_EN_NIW_GIRL", - /* 0x019B */ "ACTOR_EN_DOG", - /* 0x019C */ "ACTOR_EN_SI", - /* 0x019D */ "ACTOR_BG_SPOT01_OBJECTS2", - /* 0x019E */ "ACTOR_OBJ_COMB", - /* 0x019F */ "ACTOR_BG_SPOT11_BAKUDANKABE", - /* 0x01A0 */ "ACTOR_OBJ_KIBAKO2", - /* 0x01A1 */ "ACTOR_EN_DNT_DEMO", - /* 0x01A2 */ "ACTOR_EN_DNT_JIJI", - /* 0x01A3 */ "ACTOR_EN_DNT_NOMAL", - /* 0x01A4 */ "ACTOR_EN_GUEST", - /* 0x01A5 */ "ACTOR_BG_BOM_GUARD", - /* 0x01A6 */ "ACTOR_EN_HS2", - /* 0x01A7 */ "ACTOR_DEMO_KEKKAI", - /* 0x01A8 */ "ACTOR_BG_SPOT08_BAKUDANKABE", - /* 0x01A9 */ "ACTOR_BG_SPOT17_BAKUDANKABE", - /* 0x01AA */ "ACTOR_UNSET_1AA", - /* 0x01AB */ "ACTOR_OBJ_MURE3", - /* 0x01AC */ "ACTOR_EN_TG", - /* 0x01AD */ "ACTOR_EN_MU", - /* 0x01AE */ "ACTOR_EN_GO2", - /* 0x01AF */ "ACTOR_EN_WF", - /* 0x01B0 */ "ACTOR_EN_SKB", - /* 0x01B1 */ "ACTOR_DEMO_GJ", - /* 0x01B2 */ "ACTOR_DEMO_GEFF", - /* 0x01B3 */ "ACTOR_BG_GND_FIREMEIRO", - /* 0x01B4 */ "ACTOR_BG_GND_DARKMEIRO", - /* 0x01B5 */ "ACTOR_BG_GND_SOULMEIRO", - /* 0x01B6 */ "ACTOR_BG_GND_NISEKABE", - /* 0x01B7 */ "ACTOR_BG_GND_ICEBLOCK", - /* 0x01B8 */ "ACTOR_EN_GB", - /* 0x01B9 */ "ACTOR_EN_GS", - /* 0x01BA */ "ACTOR_BG_MIZU_BWALL", - /* 0x01BB */ "ACTOR_BG_MIZU_SHUTTER", - /* 0x01BC */ "ACTOR_EN_DAIKU_KAKARIKO", - /* 0x01BD */ "ACTOR_BG_BOWL_WALL", - /* 0x01BE */ "ACTOR_EN_WALL_TUBO", - /* 0x01BF */ "ACTOR_EN_PO_DESERT", - /* 0x01C0 */ "ACTOR_EN_CROW", - /* 0x01C1 */ "ACTOR_DOOR_KILLER", - /* 0x01C2 */ "ACTOR_BG_SPOT11_OASIS", - /* 0x01C3 */ "ACTOR_BG_SPOT18_FUTA", - /* 0x01C4 */ "ACTOR_BG_SPOT18_SHUTTER", - /* 0x01C5 */ "ACTOR_EN_MA3", - /* 0x01C6 */ "ACTOR_EN_COW", - /* 0x01C7 */ "ACTOR_BG_ICE_TURARA", - /* 0x01C8 */ "ACTOR_BG_ICE_SHUTTER", - /* 0x01C9 */ "ACTOR_EN_KAKASI2", - /* 0x01CA */ "ACTOR_EN_KAKASI3", - /* 0x01CB */ "ACTOR_OCEFF_WIPE4", - /* 0x01CC */ "ACTOR_EN_EG", - /* 0x01CD */ "ACTOR_BG_MENKURI_NISEKABE", - /* 0x01CE */ "ACTOR_EN_ZO", - /* 0x01CF */ "ACTOR_OBJ_MAKEKINSUTA", - /* 0x01D0 */ "ACTOR_EN_GE3", - /* 0x01D1 */ "ACTOR_OBJ_TIMEBLOCK", - /* 0x01D2 */ "ACTOR_OBJ_HAMISHI", - /* 0x01D3 */ "ACTOR_EN_ZL4", - /* 0x01D4 */ "ACTOR_EN_MM2", - /* 0x01D5 */ "ACTOR_BG_JYA_BLOCK", - /* 0x01D6 */ "ACTOR_OBJ_WARP2BLOCK", - /* 0x01D7 */ "ACTOR_ID_MAX" // originally "ACTOR_DLF_MAX" +static const std::string ActorList[] = { + /* 0x0000 */ "ACTOR_PLAYER", + /* 0x0001 */ "ACTOR_UNSET_1", + /* 0x0002 */ "ACTOR_EN_TEST", + /* 0x0003 */ "ACTOR_UNSET_3", + /* 0x0004 */ "ACTOR_EN_GIRLA", + /* 0x0005 */ "ACTOR_UNSET_5", + /* 0x0006 */ "ACTOR_UNSET_6", + /* 0x0007 */ "ACTOR_EN_PART", + /* 0x0008 */ "ACTOR_EN_LIGHT", + /* 0x0009 */ "ACTOR_EN_DOOR", + /* 0x000A */ "ACTOR_EN_BOX", // Treasure Chest + /* 0x000B */ "ACTOR_BG_DY_YOSEIZO", + /* 0x000C */ "ACTOR_BG_HIDAN_FIREWALL", + /* 0x000D */ "ACTOR_EN_POH", + /* 0x000E */ "ACTOR_EN_OKUTA", + /* 0x000F */ "ACTOR_BG_YDAN_SP", + /* 0x0010 */ "ACTOR_EN_BOM", + /* 0x0011 */ "ACTOR_EN_WALLMAS", + /* 0x0012 */ "ACTOR_EN_DODONGO", + /* 0x0013 */ "ACTOR_EN_FIREFLY", + /* 0x0014 */ "ACTOR_EN_HORSE", + /* 0x0015 */ "ACTOR_EN_ITEM00", + /* 0x0016 */ "ACTOR_EN_ARROW", + /* 0x0017 */ "ACTOR_UNSET_17", + /* 0x0018 */ "ACTOR_EN_ELF", + /* 0x0019 */ "ACTOR_EN_NIW", + /* 0x001A */ "ACTOR_UNSET_1A", + /* 0x001B */ "ACTOR_EN_TITE", + /* 0x001C */ "ACTOR_EN_REEBA", + /* 0x001D */ "ACTOR_EN_PEEHAT", + /* 0x001E */ "ACTOR_EN_BUTTE", + /* 0x001F */ "ACTOR_UNSET_1F", + /* 0x0020 */ "ACTOR_EN_INSECT", + /* 0x0021 */ "ACTOR_EN_FISH", + /* 0x0022 */ "ACTOR_UNSET_22", + /* 0x0023 */ "ACTOR_EN_HOLL", + /* 0x0024 */ "ACTOR_EN_SCENE_CHANGE", + /* 0x0025 */ "ACTOR_EN_ZF", + /* 0x0026 */ "ACTOR_EN_HATA", + /* 0x0027 */ "ACTOR_BOSS_DODONGO", + /* 0x0028 */ "ACTOR_BOSS_GOMA", + /* 0x0029 */ "ACTOR_EN_ZL1", + /* 0x002A */ "ACTOR_EN_VIEWER", + /* 0x002B */ "ACTOR_EN_GOMA", + /* 0x002C */ "ACTOR_BG_PUSHBOX", + /* 0x002D */ "ACTOR_EN_BUBBLE", + /* 0x002E */ "ACTOR_DOOR_SHUTTER", + /* 0x002F */ "ACTOR_EN_DODOJR", + /* 0x0030 */ "ACTOR_EN_BDFIRE", + /* 0x0031 */ "ACTOR_UNSET_31", + /* 0x0032 */ "ACTOR_EN_BOOM", + /* 0x0033 */ "ACTOR_EN_TORCH2", + /* 0x0034 */ "ACTOR_EN_BILI", + /* 0x0035 */ "ACTOR_EN_TP", + /* 0x0036 */ "ACTOR_UNSET_36", + /* 0x0037 */ "ACTOR_EN_ST", + /* 0x0038 */ "ACTOR_EN_BW", + /* 0x0039 */ "ACTOR_EN_A_OBJ", + /* 0x003A */ "ACTOR_EN_EIYER", + /* 0x003B */ "ACTOR_EN_RIVER_SOUND", + /* 0x003C */ "ACTOR_EN_HORSE_NORMAL", + /* 0x003D */ "ACTOR_EN_OSSAN", + /* 0x003E */ "ACTOR_BG_TREEMOUTH", + /* 0x003F */ "ACTOR_BG_DODOAGO", + /* 0x0040 */ "ACTOR_BG_HIDAN_DALM", + /* 0x0041 */ "ACTOR_BG_HIDAN_HROCK", + /* 0x0042 */ "ACTOR_EN_HORSE_GANON", + /* 0x0043 */ "ACTOR_BG_HIDAN_ROCK", + /* 0x0044 */ "ACTOR_BG_HIDAN_RSEKIZOU", + /* 0x0045 */ "ACTOR_BG_HIDAN_SEKIZOU", + /* 0x0046 */ "ACTOR_BG_HIDAN_SIMA", + /* 0x0047 */ "ACTOR_BG_HIDAN_SYOKU", + /* 0x0048 */ "ACTOR_EN_XC", + /* 0x0049 */ "ACTOR_BG_HIDAN_CURTAIN", + /* 0x004A */ "ACTOR_BG_SPOT00_HANEBASI", + /* 0x004B */ "ACTOR_EN_MB", + /* 0x004C */ "ACTOR_EN_BOMBF", + /* 0x004D */ "ACTOR_EN_ZL2", + /* 0x004E */ "ACTOR_BG_HIDAN_FSLIFT", + /* 0x004F */ "ACTOR_EN_OE2", + /* 0x0050 */ "ACTOR_BG_YDAN_HASI", + /* 0x0051 */ "ACTOR_BG_YDAN_MARUTA", + /* 0x0052 */ "ACTOR_BOSS_GANONDROF", + /* 0x0053 */ "ACTOR_UNSET_53", + /* 0x0054 */ "ACTOR_EN_AM", + /* 0x0055 */ "ACTOR_EN_DEKUBABA", + /* 0x0056 */ "ACTOR_EN_M_FIRE1", + /* 0x0057 */ "ACTOR_EN_M_THUNDER", + /* 0x0058 */ "ACTOR_BG_DDAN_JD", + /* 0x0059 */ "ACTOR_BG_BREAKWALL", + /* 0x005A */ "ACTOR_EN_JJ", + /* 0x005B */ "ACTOR_EN_HORSE_ZELDA", + /* 0x005C */ "ACTOR_BG_DDAN_KD", + /* 0x005D */ "ACTOR_DOOR_WARP1", + /* 0x005E */ "ACTOR_OBJ_SYOKUDAI", + /* 0x005F */ "ACTOR_ITEM_B_HEART", + /* 0x0060 */ "ACTOR_EN_DEKUNUTS", + /* 0x0061 */ "ACTOR_BG_MENKURI_KAITEN", + /* 0x0062 */ "ACTOR_BG_MENKURI_EYE", + /* 0x0063 */ "ACTOR_EN_VALI", + /* 0x0064 */ "ACTOR_BG_MIZU_MOVEBG", + /* 0x0065 */ "ACTOR_BG_MIZU_WATER", + /* 0x0066 */ "ACTOR_ARMS_HOOK", + /* 0x0067 */ "ACTOR_EN_FHG", + /* 0x0068 */ "ACTOR_BG_MORI_HINERI", + /* 0x0069 */ "ACTOR_EN_BB", + /* 0x006A */ "ACTOR_BG_TOKI_HIKARI", + /* 0x006B */ "ACTOR_EN_YUKABYUN", + /* 0x006C */ "ACTOR_BG_TOKI_SWD", + /* 0x006D */ "ACTOR_EN_FHG_FIRE", + /* 0x006E */ "ACTOR_BG_MJIN", + /* 0x006F */ "ACTOR_BG_HIDAN_KOUSI", + /* 0x0070 */ "ACTOR_DOOR_TOKI", + /* 0x0071 */ "ACTOR_BG_HIDAN_HAMSTEP", + /* 0x0072 */ "ACTOR_EN_BIRD", + /* 0x0073 */ "ACTOR_UNSET_73", + /* 0x0074 */ "ACTOR_UNSET_74", + /* 0x0075 */ "ACTOR_UNSET_75", + /* 0x0076 */ "ACTOR_UNSET_76", + /* 0x0077 */ "ACTOR_EN_WOOD02", + /* 0x0078 */ "ACTOR_UNSET_78", + /* 0x0079 */ "ACTOR_UNSET_79", + /* 0x007A */ "ACTOR_UNSET_7A", + /* 0x007B */ "ACTOR_UNSET_7B", + /* 0x007C */ "ACTOR_EN_LIGHTBOX", + /* 0x007D */ "ACTOR_EN_PU_BOX", + /* 0x007E */ "ACTOR_UNSET_7E", + /* 0x007F */ "ACTOR_UNSET_7F", + /* 0x0080 */ "ACTOR_EN_TRAP", + /* 0x0081 */ "ACTOR_EN_AROW_TRAP", + /* 0x0082 */ "ACTOR_EN_VASE", + /* 0x0083 */ "ACTOR_UNSET_83", + /* 0x0084 */ "ACTOR_EN_TA", + /* 0x0085 */ "ACTOR_EN_TK", + /* 0x0086 */ "ACTOR_BG_MORI_BIGST", + /* 0x0087 */ "ACTOR_BG_MORI_ELEVATOR", + /* 0x0088 */ "ACTOR_BG_MORI_KAITENKABE", + /* 0x0089 */ "ACTOR_BG_MORI_RAKKATENJO", + /* 0x008A */ "ACTOR_EN_VM", + /* 0x008B */ "ACTOR_DEMO_EFFECT", + /* 0x008C */ "ACTOR_DEMO_KANKYO", + /* 0x008D */ "ACTOR_BG_HIDAN_FWBIG", + /* 0x008E */ "ACTOR_EN_FLOORMAS", + /* 0x008F */ "ACTOR_EN_HEISHI1", + /* 0x0090 */ "ACTOR_EN_RD", + /* 0x0091 */ "ACTOR_EN_PO_SISTERS", + /* 0x0092 */ "ACTOR_BG_HEAVY_BLOCK", + /* 0x0093 */ "ACTOR_BG_PO_EVENT", + /* 0x0094 */ "ACTOR_OBJ_MURE", + /* 0x0095 */ "ACTOR_EN_SW", + /* 0x0096 */ "ACTOR_BOSS_FD", + /* 0x0097 */ "ACTOR_OBJECT_KANKYO", + /* 0x0098 */ "ACTOR_EN_DU", + /* 0x0099 */ "ACTOR_EN_FD", + /* 0x009A */ "ACTOR_EN_HORSE_LINK_CHILD", + /* 0x009B */ "ACTOR_DOOR_ANA", + /* 0x009C */ "ACTOR_BG_SPOT02_OBJECTS", + /* 0x009D */ "ACTOR_BG_HAKA", + /* 0x009E */ "ACTOR_MAGIC_WIND", + /* 0x009F */ "ACTOR_MAGIC_FIRE", + /* 0x00A0 */ "ACTOR_UNSET_A0", + /* 0x00A1 */ "ACTOR_EN_RU1", + /* 0x00A2 */ "ACTOR_BOSS_FD2", + /* 0x00A3 */ "ACTOR_EN_FD_FIRE", + /* 0x00A4 */ "ACTOR_EN_DH", + /* 0x00A5 */ "ACTOR_EN_DHA", + /* 0x00A6 */ "ACTOR_EN_RL", + /* 0x00A7 */ "ACTOR_EN_ENCOUNT1", + /* 0x00A8 */ "ACTOR_DEMO_DU", + /* 0x00A9 */ "ACTOR_DEMO_IM", + /* 0x00AA */ "ACTOR_DEMO_TRE_LGT", + /* 0x00AB */ "ACTOR_EN_FW", + /* 0x00AC */ "ACTOR_BG_VB_SIMA", + /* 0x00AD */ "ACTOR_EN_VB_BALL", + /* 0x00AE */ "ACTOR_BG_HAKA_MEGANE", + /* 0x00AF */ "ACTOR_BG_HAKA_MEGANEBG", + /* 0x00B0 */ "ACTOR_BG_HAKA_SHIP", + /* 0x00B1 */ "ACTOR_BG_HAKA_SGAMI", + /* 0x00B2 */ "ACTOR_UNSET_B2", + /* 0x00B3 */ "ACTOR_EN_HEISHI2", + /* 0x00B4 */ "ACTOR_EN_ENCOUNT2", + /* 0x00B5 */ "ACTOR_EN_FIRE_ROCK", + /* 0x00B6 */ "ACTOR_EN_BROB", + /* 0x00B7 */ "ACTOR_MIR_RAY", + /* 0x00B8 */ "ACTOR_BG_SPOT09_OBJ", + /* 0x00B9 */ "ACTOR_BG_SPOT18_OBJ", + /* 0x00BA */ "ACTOR_BOSS_VA", + /* 0x00BB */ "ACTOR_BG_HAKA_TUBO", + /* 0x00BC */ "ACTOR_BG_HAKA_TRAP", + /* 0x00BD */ "ACTOR_BG_HAKA_HUTA", + /* 0x00BE */ "ACTOR_BG_HAKA_ZOU", + /* 0x00BF */ "ACTOR_BG_SPOT17_FUNEN", + /* 0x00C0 */ "ACTOR_EN_SYATEKI_ITM", + /* 0x00C1 */ "ACTOR_EN_SYATEKI_MAN", + /* 0x00C2 */ "ACTOR_EN_TANA", + /* 0x00C3 */ "ACTOR_EN_NB", + /* 0x00C4 */ "ACTOR_BOSS_MO", + /* 0x00C5 */ "ACTOR_EN_SB", + /* 0x00C6 */ "ACTOR_EN_BIGOKUTA", + /* 0x00C7 */ "ACTOR_EN_KAREBABA", + /* 0x00C8 */ "ACTOR_BG_BDAN_OBJECTS", + /* 0x00C9 */ "ACTOR_DEMO_SA", + /* 0x00CA */ "ACTOR_DEMO_GO", + /* 0x00CB */ "ACTOR_EN_IN", + /* 0x00CC */ "ACTOR_EN_TR", + /* 0x00CD */ "ACTOR_BG_SPOT16_BOMBSTONE", + /* 0x00CE */ "ACTOR_UNSET_CE", + /* 0x00CF */ "ACTOR_BG_HIDAN_KOWARERUKABE", + /* 0x00D0 */ "ACTOR_BG_BOMBWALL", + /* 0x00D1 */ "ACTOR_BG_SPOT08_ICEBLOCK", + /* 0x00D2 */ "ACTOR_EN_RU2", + /* 0x00D3 */ "ACTOR_OBJ_DEKUJR", + /* 0x00D4 */ "ACTOR_BG_MIZU_UZU", + /* 0x00D5 */ "ACTOR_BG_SPOT06_OBJECTS", + /* 0x00D6 */ "ACTOR_BG_ICE_OBJECTS", + /* 0x00D7 */ "ACTOR_BG_HAKA_WATER", + /* 0x00D8 */ "ACTOR_UNSET_D8", + /* 0x00D9 */ "ACTOR_EN_MA2", + /* 0x00DA */ "ACTOR_EN_BOM_CHU", + /* 0x00DB */ "ACTOR_EN_HORSE_GAME_CHECK", + /* 0x00DC */ "ACTOR_BOSS_TW", + /* 0x00DD */ "ACTOR_EN_RR", + /* 0x00DE */ "ACTOR_EN_BA", + /* 0x00DF */ "ACTOR_EN_BX", + /* 0x00E0 */ "ACTOR_EN_ANUBICE", + /* 0x00E1 */ "ACTOR_EN_ANUBICE_FIRE", + /* 0x00E2 */ "ACTOR_BG_MORI_HASHIGO", + /* 0x00E3 */ "ACTOR_BG_MORI_HASHIRA4", + /* 0x00E4 */ "ACTOR_BG_MORI_IDOMIZU", + /* 0x00E5 */ "ACTOR_BG_SPOT16_DOUGHNUT", + /* 0x00E6 */ "ACTOR_BG_BDAN_SWITCH", + /* 0x00E7 */ "ACTOR_EN_MA1", + /* 0x00E8 */ "ACTOR_BOSS_GANON", + /* 0x00E9 */ "ACTOR_BOSS_SST", + /* 0x00EA */ "ACTOR_UNSET_EA", + /* 0x00EB */ "ACTOR_UNSET_EB", + /* 0x00EC */ "ACTOR_EN_NY", + /* 0x00ED */ "ACTOR_EN_FR", + /* 0x00EE */ "ACTOR_ITEM_SHIELD", + /* 0x00EF */ "ACTOR_BG_ICE_SHELTER", + /* 0x00F0 */ "ACTOR_EN_ICE_HONO", + /* 0x00F1 */ "ACTOR_ITEM_OCARINA", + /* 0x00F2 */ "ACTOR_UNSET_F2", + /* 0x00F3 */ "ACTOR_UNSET_F3", + /* 0x00F4 */ "ACTOR_MAGIC_DARK", + /* 0x00F5 */ "ACTOR_DEMO_6K", + /* 0x00F6 */ "ACTOR_EN_ANUBICE_TAG", + /* 0x00F7 */ "ACTOR_BG_HAKA_GATE", + /* 0x00F8 */ "ACTOR_BG_SPOT15_SAKU", + /* 0x00F9 */ "ACTOR_BG_JYA_GOROIWA", + /* 0x00FA */ "ACTOR_BG_JYA_ZURERUKABE", + /* 0x00FB */ "ACTOR_UNSET_FB", + /* 0x00FC */ "ACTOR_BG_JYA_COBRA", + /* 0x00FD */ "ACTOR_BG_JYA_KANAAMI", + /* 0x00FE */ "ACTOR_FISHING", + /* 0x00FF */ "ACTOR_OBJ_OSHIHIKI", + /* 0x0100 */ "ACTOR_BG_GATE_SHUTTER", + /* 0x0101 */ "ACTOR_EFF_DUST", + /* 0x0102 */ "ACTOR_BG_SPOT01_FUSYA", + /* 0x0103 */ "ACTOR_BG_SPOT01_IDOHASHIRA", + /* 0x0104 */ "ACTOR_BG_SPOT01_IDOMIZU", + /* 0x0105 */ "ACTOR_BG_PO_SYOKUDAI", + /* 0x0106 */ "ACTOR_BG_GANON_OTYUKA", + /* 0x0107 */ "ACTOR_BG_SPOT15_RRBOX", + /* 0x0108 */ "ACTOR_BG_UMAJUMP", + /* 0x0109 */ "ACTOR_UNSET_109", + /* 0x010A */ "ACTOR_ARROW_FIRE", + /* 0x010B */ "ACTOR_ARROW_ICE", + /* 0x010C */ "ACTOR_ARROW_LIGHT", + /* 0x010D */ "ACTOR_UNSET_10D", + /* 0x010E */ "ACTOR_UNSET_10E", + /* 0x010F */ "ACTOR_ITEM_ETCETERA", + /* 0x0110 */ "ACTOR_OBJ_KIBAKO", + /* 0x0111 */ "ACTOR_OBJ_TSUBO", + /* 0x0112 */ "ACTOR_EN_WONDER_ITEM", + /* 0x0113 */ "ACTOR_EN_IK", + /* 0x0114 */ "ACTOR_DEMO_IK", + /* 0x0115 */ "ACTOR_EN_SKJ", + /* 0x0116 */ "ACTOR_EN_SKJNEEDLE", + /* 0x0117 */ "ACTOR_EN_G_SWITCH", + /* 0x0118 */ "ACTOR_DEMO_EXT", + /* 0x0119 */ "ACTOR_DEMO_SHD", + /* 0x011A */ "ACTOR_EN_DNS", + /* 0x011B */ "ACTOR_ELF_MSG", + /* 0x011C */ "ACTOR_EN_HONOTRAP", + /* 0x011D */ "ACTOR_EN_TUBO_TRAP", + /* 0x011E */ "ACTOR_OBJ_ICE_POLY", + /* 0x011F */ "ACTOR_BG_SPOT03_TAKI", + /* 0x0120 */ "ACTOR_BG_SPOT07_TAKI", + /* 0x0121 */ "ACTOR_EN_FZ", + /* 0x0122 */ "ACTOR_EN_PO_RELAY", + /* 0x0123 */ "ACTOR_BG_RELAY_OBJECTS", + /* 0x0124 */ "ACTOR_EN_DIVING_GAME", + /* 0x0125 */ "ACTOR_EN_KUSA", + /* 0x0126 */ "ACTOR_OBJ_BEAN", + /* 0x0127 */ "ACTOR_OBJ_BOMBIWA", + /* 0x0128 */ "ACTOR_UNSET_128", + /* 0x0129 */ "ACTOR_UNSET_129", + /* 0x012A */ "ACTOR_OBJ_SWITCH", + /* 0x012B */ "ACTOR_OBJ_ELEVATOR", + /* 0x012C */ "ACTOR_OBJ_LIFT", + /* 0x012D */ "ACTOR_OBJ_HSBLOCK", + /* 0x012E */ "ACTOR_EN_OKARINA_TAG", + /* 0x012F */ "ACTOR_EN_YABUSAME_MARK", + /* 0x0130 */ "ACTOR_EN_GOROIWA", + /* 0x0131 */ "ACTOR_EN_EX_RUPPY", + /* 0x0132 */ "ACTOR_EN_TORYO", + /* 0x0133 */ "ACTOR_EN_DAIKU", + /* 0x0134 */ "ACTOR_UNSET_134", + /* 0x0135 */ "ACTOR_EN_NWC", + /* 0x0136 */ "ACTOR_EN_BLKOBJ", + /* 0x0137 */ "ACTOR_ITEM_INBOX", + /* 0x0138 */ "ACTOR_EN_GE1", + /* 0x0139 */ "ACTOR_OBJ_BLOCKSTOP", + /* 0x013A */ "ACTOR_EN_SDA", + /* 0x013B */ "ACTOR_EN_CLEAR_TAG", + /* 0x013C */ "ACTOR_EN_NIW_LADY", + /* 0x013D */ "ACTOR_EN_GM", + /* 0x013E */ "ACTOR_EN_MS", + /* 0x013F */ "ACTOR_EN_HS", + /* 0x0140 */ "ACTOR_BG_INGATE", + /* 0x0141 */ "ACTOR_EN_KANBAN", + /* 0x0142 */ "ACTOR_EN_HEISHI3", + /* 0x0143 */ "ACTOR_EN_SYATEKI_NIW", + /* 0x0144 */ "ACTOR_EN_ATTACK_NIW", + /* 0x0145 */ "ACTOR_BG_SPOT01_IDOSOKO", + /* 0x0146 */ "ACTOR_EN_SA", + /* 0x0147 */ "ACTOR_EN_WONDER_TALK", + /* 0x0148 */ "ACTOR_BG_GJYO_BRIDGE", + /* 0x0149 */ "ACTOR_EN_DS", + /* 0x014A */ "ACTOR_EN_MK", + /* 0x014B */ "ACTOR_EN_BOM_BOWL_MAN", + /* 0x014C */ "ACTOR_EN_BOM_BOWL_PIT", + /* 0x014D */ "ACTOR_EN_OWL", + /* 0x014E */ "ACTOR_EN_ISHI", + /* 0x014F */ "ACTOR_OBJ_HANA", + /* 0x0150 */ "ACTOR_OBJ_LIGHTSWITCH", + /* 0x0151 */ "ACTOR_OBJ_MURE2", + /* 0x0152 */ "ACTOR_EN_GO", + /* 0x0153 */ "ACTOR_EN_FU", + /* 0x0154 */ "ACTOR_UNSET_154", + /* 0x0155 */ "ACTOR_EN_CHANGER", + /* 0x0156 */ "ACTOR_BG_JYA_MEGAMI", + /* 0x0157 */ "ACTOR_BG_JYA_LIFT", + /* 0x0158 */ "ACTOR_BG_JYA_BIGMIRROR", + /* 0x0159 */ "ACTOR_BG_JYA_BOMBCHUIWA", + /* 0x015A */ "ACTOR_BG_JYA_AMISHUTTER", + /* 0x015B */ "ACTOR_BG_JYA_BOMBIWA", + /* 0x015C */ "ACTOR_BG_SPOT18_BASKET", + /* 0x015D */ "ACTOR_UNSET_15D", + /* 0x015E */ "ACTOR_EN_GANON_ORGAN", + /* 0x015F */ "ACTOR_EN_SIOFUKI", + /* 0x0160 */ "ACTOR_EN_STREAM", + /* 0x0161 */ "ACTOR_UNSET_161", + /* 0x0162 */ "ACTOR_EN_MM", + /* 0x0163 */ "ACTOR_EN_KO", + /* 0x0164 */ "ACTOR_EN_KZ", + /* 0x0165 */ "ACTOR_EN_WEATHER_TAG", + /* 0x0166 */ "ACTOR_BG_SST_FLOOR", + /* 0x0167 */ "ACTOR_EN_ANI", + /* 0x0168 */ "ACTOR_EN_EX_ITEM", + /* 0x0169 */ "ACTOR_BG_JYA_IRONOBJ", + /* 0x016A */ "ACTOR_EN_JS", + /* 0x016B */ "ACTOR_EN_JSJUTAN", + /* 0x016C */ "ACTOR_EN_CS", + /* 0x016D */ "ACTOR_EN_MD", + /* 0x016E */ "ACTOR_EN_HY", + /* 0x016F */ "ACTOR_EN_GANON_MANT", + /* 0x0170 */ "ACTOR_EN_OKARINA_EFFECT", + /* 0x0171 */ "ACTOR_EN_MAG", + /* 0x0172 */ "ACTOR_DOOR_GERUDO", + /* 0x0173 */ "ACTOR_ELF_MSG2", + /* 0x0174 */ "ACTOR_DEMO_GT", + /* 0x0175 */ "ACTOR_EN_PO_FIELD", + /* 0x0176 */ "ACTOR_EFC_ERUPC", + /* 0x0177 */ "ACTOR_BG_ZG", + /* 0x0178 */ "ACTOR_EN_HEISHI4", + /* 0x0179 */ "ACTOR_EN_ZL3", + /* 0x017A */ "ACTOR_BOSS_GANON2", + /* 0x017B */ "ACTOR_EN_KAKASI", + /* 0x017C */ "ACTOR_EN_TAKARA_MAN", + /* 0x017D */ "ACTOR_OBJ_MAKEOSHIHIKI", + /* 0x017E */ "ACTOR_OCEFF_SPOT", + /* 0x017F */ "ACTOR_END_TITLE", + /* 0x0180 */ "ACTOR_UNSET_180", + /* 0x0181 */ "ACTOR_EN_TORCH", + /* 0x0182 */ "ACTOR_DEMO_EC", + /* 0x0183 */ "ACTOR_SHOT_SUN", + /* 0x0184 */ "ACTOR_EN_DY_EXTRA", + /* 0x0185 */ "ACTOR_EN_WONDER_TALK2", + /* 0x0186 */ "ACTOR_EN_GE2", + /* 0x0187 */ "ACTOR_OBJ_ROOMTIMER", + /* 0x0188 */ "ACTOR_EN_SSH", + /* 0x0189 */ "ACTOR_EN_STH", + /* 0x018A */ "ACTOR_OCEFF_WIPE", + /* 0x018B */ "ACTOR_OCEFF_STORM", + /* 0x018C */ "ACTOR_EN_WEIYER", + /* 0x018D */ "ACTOR_BG_SPOT05_SOKO", + /* 0x018E */ "ACTOR_BG_JYA_1FLIFT", + /* 0x018F */ "ACTOR_BG_JYA_HAHENIRON", + /* 0x0190 */ "ACTOR_BG_SPOT12_GATE", + /* 0x0191 */ "ACTOR_BG_SPOT12_SAKU", + /* 0x0192 */ "ACTOR_EN_HINTNUTS", + /* 0x0193 */ "ACTOR_EN_NUTSBALL", + /* 0x0194 */ "ACTOR_BG_SPOT00_BREAK", + /* 0x0195 */ "ACTOR_EN_SHOPNUTS", + /* 0x0196 */ "ACTOR_EN_IT", + /* 0x0197 */ "ACTOR_EN_GELDB", + /* 0x0198 */ "ACTOR_OCEFF_WIPE2", + /* 0x0199 */ "ACTOR_OCEFF_WIPE3", + /* 0x019A */ "ACTOR_EN_NIW_GIRL", + /* 0x019B */ "ACTOR_EN_DOG", + /* 0x019C */ "ACTOR_EN_SI", + /* 0x019D */ "ACTOR_BG_SPOT01_OBJECTS2", + /* 0x019E */ "ACTOR_OBJ_COMB", + /* 0x019F */ "ACTOR_BG_SPOT11_BAKUDANKABE", + /* 0x01A0 */ "ACTOR_OBJ_KIBAKO2", + /* 0x01A1 */ "ACTOR_EN_DNT_DEMO", + /* 0x01A2 */ "ACTOR_EN_DNT_JIJI", + /* 0x01A3 */ "ACTOR_EN_DNT_NOMAL", + /* 0x01A4 */ "ACTOR_EN_GUEST", + /* 0x01A5 */ "ACTOR_BG_BOM_GUARD", + /* 0x01A6 */ "ACTOR_EN_HS2", + /* 0x01A7 */ "ACTOR_DEMO_KEKKAI", + /* 0x01A8 */ "ACTOR_BG_SPOT08_BAKUDANKABE", + /* 0x01A9 */ "ACTOR_BG_SPOT17_BAKUDANKABE", + /* 0x01AA */ "ACTOR_UNSET_1AA", + /* 0x01AB */ "ACTOR_OBJ_MURE3", + /* 0x01AC */ "ACTOR_EN_TG", + /* 0x01AD */ "ACTOR_EN_MU", + /* 0x01AE */ "ACTOR_EN_GO2", + /* 0x01AF */ "ACTOR_EN_WF", + /* 0x01B0 */ "ACTOR_EN_SKB", + /* 0x01B1 */ "ACTOR_DEMO_GJ", + /* 0x01B2 */ "ACTOR_DEMO_GEFF", + /* 0x01B3 */ "ACTOR_BG_GND_FIREMEIRO", + /* 0x01B4 */ "ACTOR_BG_GND_DARKMEIRO", + /* 0x01B5 */ "ACTOR_BG_GND_SOULMEIRO", + /* 0x01B6 */ "ACTOR_BG_GND_NISEKABE", + /* 0x01B7 */ "ACTOR_BG_GND_ICEBLOCK", + /* 0x01B8 */ "ACTOR_EN_GB", + /* 0x01B9 */ "ACTOR_EN_GS", + /* 0x01BA */ "ACTOR_BG_MIZU_BWALL", + /* 0x01BB */ "ACTOR_BG_MIZU_SHUTTER", + /* 0x01BC */ "ACTOR_EN_DAIKU_KAKARIKO", + /* 0x01BD */ "ACTOR_BG_BOWL_WALL", + /* 0x01BE */ "ACTOR_EN_WALL_TUBO", + /* 0x01BF */ "ACTOR_EN_PO_DESERT", + /* 0x01C0 */ "ACTOR_EN_CROW", + /* 0x01C1 */ "ACTOR_DOOR_KILLER", + /* 0x01C2 */ "ACTOR_BG_SPOT11_OASIS", + /* 0x01C3 */ "ACTOR_BG_SPOT18_FUTA", + /* 0x01C4 */ "ACTOR_BG_SPOT18_SHUTTER", + /* 0x01C5 */ "ACTOR_EN_MA3", + /* 0x01C6 */ "ACTOR_EN_COW", + /* 0x01C7 */ "ACTOR_BG_ICE_TURARA", + /* 0x01C8 */ "ACTOR_BG_ICE_SHUTTER", + /* 0x01C9 */ "ACTOR_EN_KAKASI2", + /* 0x01CA */ "ACTOR_EN_KAKASI3", + /* 0x01CB */ "ACTOR_OCEFF_WIPE4", + /* 0x01CC */ "ACTOR_EN_EG", + /* 0x01CD */ "ACTOR_BG_MENKURI_NISEKABE", + /* 0x01CE */ "ACTOR_EN_ZO", + /* 0x01CF */ "ACTOR_OBJ_MAKEKINSUTA", + /* 0x01D0 */ "ACTOR_EN_GE3", + /* 0x01D1 */ "ACTOR_OBJ_TIMEBLOCK", + /* 0x01D2 */ "ACTOR_OBJ_HAMISHI", + /* 0x01D3 */ "ACTOR_EN_ZL4", + /* 0x01D4 */ "ACTOR_EN_MM2", + /* 0x01D5 */ "ACTOR_BG_JYA_BLOCK", + /* 0x01D6 */ "ACTOR_OBJ_WARP2BLOCK", + /* 0x01D7 */ "ACTOR_ID_MAX" // originally "ACTOR_DLF_MAX" }; \ No newline at end of file diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/EndMarker.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/EndMarker.cpp index a077ce9744..81320a99c4 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/EndMarker.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/EndMarker.cpp @@ -3,13 +3,15 @@ using namespace std; -EndMarker::EndMarker(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +EndMarker::EndMarker(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { } string EndMarker::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x00, 0x00", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str()); + return StringHelper::Sprintf( + "%s 0x00, 0x00", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str()); } string EndMarker::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetActorList.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetActorList.cpp index 30ed52e072..762105106e 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetActorList.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetActorList.cpp @@ -1,14 +1,15 @@ #include "SetActorList.h" -#include "../../ZFile.h" -#include "../ZRoom.h" -#include "../ActorList.h" #include "../../BitConverter.h" -#include "../../StringHelper.h" #include "../../Globals.h" +#include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ActorList.h" +#include "../ZRoom.h" using namespace std; -SetActorList::SetActorList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetActorList::SetActorList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { numActors = rawData[rawDataIndex + 1]; segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); @@ -38,15 +39,14 @@ string SetActorList::GenerateSourceCodePass1(string roomName, int baseAddress) return ""; } - string SetActorList::GenerateSourceCodePass2(string roomName, int baseAddress) { string sourceOutput = ""; - int numActorsReal = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 16; + size_t numActorsReal = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 16; actors = vector(); uint32_t currentPtr = segmentOffset; - for (int i = 0; i < numActorsReal; i++) + for (size_t i = 0; i < numActorsReal; i++) { ActorSpawnEntry* entry = new ActorSpawnEntry(_rawData, currentPtr); actors.push_back(entry); @@ -54,32 +54,47 @@ string SetActorList::GenerateSourceCodePass2(string roomName, int baseAddress) currentPtr += 16; } - sourceOutput += StringHelper::Sprintf("%s 0x%02X, (u32)%sActorList0x%06X };", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), numActors, roomName.c_str(), segmentOffset); + sourceOutput += + StringHelper::Sprintf("%s 0x%02X, (u32)%sActorList0x%06X };", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + numActors, roomName.c_str(), segmentOffset); - //zRoom->parent->AddDeclaration(segmentOffset, DeclarationAlignment::None, DeclarationPadding::None, GetRawDataSize(), - //"SCmdActorList", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress), sourceOutput); + // zRoom->parent->AddDeclaration(segmentOffset, DeclarationAlignment::None, + // DeclarationPadding::None, GetRawDataSize(), "SCmdActorList", + //ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress), sourceOutput); string declaration = ""; - int index = 0; + size_t index = 0; for (ActorSpawnEntry* entry : actors) { uint16_t actorNum = entry->actorNum; // SW97 Actor 0x22 was removed, so we want to not output a working actor. if (actorNum == 0x22 && Globals::Instance->game == ZGame::OOT_SW97) - declaration += StringHelper::Sprintf("\t//{ %s, %i, %i, %i, %i, %i, %i, 0x%04X }, //0x%06X", /*StringHelper::Sprintf("SW_REMOVED_0x%04X", actorNum).c_str()*/ "ACTOR_DUNGEON_KEEP", entry->posX, entry->posY, entry->posZ, entry->rotX, entry->rotY, entry->rotZ, (uint16_t)entry->initVar, segmentOffset + (index * 16)); + declaration += StringHelper::Sprintf( + "\t//{ %s, %i, %i, %i, %i, %i, %i, 0x%04X }, //0x%06X", + /*StringHelper::Sprintf("SW_REMOVED_0x%04X", actorNum).c_str()*/ + "ACTOR_DUNGEON_KEEP", entry->posX, entry->posY, entry->posZ, entry->rotX, + entry->rotY, entry->rotZ, (uint16_t)entry->initVar, segmentOffset + (index * 16)); else { - // SW97 Actor 0x23 and above are shifted up by one because 0x22 was removed between SW97 and retail. - // We need to shift down by one + // SW97 Actor 0x23 and above are shifted up by one because 0x22 was removed between SW97 + // and retail. We need to shift down by one if (Globals::Instance->game == ZGame::OOT_SW97 && actorNum >= 0x23) actorNum--; if (actorNum < sizeof(ActorList) / sizeof(ActorList[0])) - declaration += StringHelper::Sprintf("\t{ %s, %i, %i, %i, %i, %i, %i, 0x%04X }, //0x%06X", ActorList[actorNum].c_str(), entry->posX, entry->posY, entry->posZ, entry->rotX, entry->rotY, entry->rotZ, (uint16_t)entry->initVar, segmentOffset + (index * 16)); + declaration += + StringHelper::Sprintf("\t{ %s, %i, %i, %i, %i, %i, %i, 0x%04X }, //0x%06X", + ActorList[actorNum].c_str(), entry->posX, entry->posY, + entry->posZ, entry->rotX, entry->rotY, entry->rotZ, + (uint16_t)entry->initVar, segmentOffset + (index * 16)); else - declaration += StringHelper::Sprintf("\t{ 0x%04X, %i, %i, %i, %i, %i, %i, 0x%04X }, //0x%06X", actorNum, entry->posX, entry->posY, entry->posZ, entry->rotX, entry->rotY, entry->rotZ, (uint16_t)entry->initVar, segmentOffset + (index * 16)); + declaration += StringHelper::Sprintf( + "\t{ 0x%04X, %i, %i, %i, %i, %i, %i, 0x%04X }, //0x%06X", actorNum, entry->posX, + entry->posY, entry->posZ, entry->rotX, entry->rotY, entry->rotZ, + (uint16_t)entry->initVar, segmentOffset + (index * 16)); if (index < actors.size() - 1) declaration += "\n"; @@ -88,8 +103,10 @@ string SetActorList::GenerateSourceCodePass2(string roomName, int baseAddress) index++; } - zRoom->parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::None, DeclarationPadding::Pad16, actors.size() * 16, - "ActorEntry", StringHelper::Sprintf("%sActorList0x%06X", roomName.c_str(), segmentOffset), GetActorListArraySize(), declaration); + zRoom->parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, DeclarationPadding::Pad16, actors.size() * 16, + "ActorEntry", StringHelper::Sprintf("%sActorList0x%06X", roomName.c_str(), segmentOffset), + GetActorListArraySize(), declaration); return sourceOutput; } @@ -99,12 +116,13 @@ int32_t SetActorList::GetRawDataSize() return ZRoomCommand::GetRawDataSize() + ((int)actors.size() * 16); } -int SetActorList::GetActorListArraySize() +size_t SetActorList::GetActorListArraySize() { - int actorCount = 0; + size_t actorCount = 0; // Doing an else-if here so we only do the loop when the game is SW97. - // Actor 0x22 is removed from SW97, so we need to ensure that we don't increment the actor count for it. + // Actor 0x22 is removed from SW97, so we need to ensure that we don't increment the actor count + // for it. if (Globals::Instance->game == ZGame::OOT_SW97) { actorCount = 0; @@ -115,7 +133,7 @@ int SetActorList::GetActorListArraySize() } else { - actorCount = (int)actors.size(); + actorCount = actors.size(); } return actorCount; @@ -123,7 +141,8 @@ int SetActorList::GetActorListArraySize() string SetActorList::GenerateExterns() { - return StringHelper::Sprintf("extern ActorEntry %sActorList0x%06X[%i];\n", zRoom->GetName().c_str(), segmentOffset, GetActorListArraySize()); + return StringHelper::Sprintf("extern ActorEntry %sActorList0x%06X[%i];\n", + zRoom->GetName().c_str(), segmentOffset, GetActorListArraySize()); } string SetActorList::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetActorList.h b/tools/ZAPD/ZAPD/ZRoom/Commands/SetActorList.h index 3f59494c97..d18d6ba06b 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetActorList.h +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetActorList.h @@ -32,7 +32,7 @@ public: virtual std::string GenerateExterns(); private: - int GetActorListArraySize(); + size_t GetActorListArraySize(); int numActors; std::vector actors; uint32_t segmentOffset; diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp index 894a37c760..914d2d7da0 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp @@ -1,17 +1,19 @@ #include "SetAlternateHeaders.h" -#include "../../ZFile.h" #include "../../BitConverter.h" #include "../../StringHelper.h" +#include "../../ZFile.h" using namespace std; -SetAlternateHeaders::SetAlternateHeaders(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetAlternateHeaders::SetAlternateHeaders(ZRoom* nZRoom, std::vector rawData, + int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); if (segmentOffset != 0) zRoom->parent->AddDeclarationPlaceholder(segmentOffset); - + _rawData = rawData; _rawDataIndex = rawDataIndex; } @@ -30,22 +32,28 @@ string SetAlternateHeaders::GenerateSourceCodePass1(string roomName, int baseAdd zRoom->commandSets.push_back(CommandSet(address)); } - sourceOutput += StringHelper::Sprintf("%s 0, (u32)&%sAlternateHeaders0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), roomName.c_str(), segmentOffset); + sourceOutput += + StringHelper::Sprintf("%s 0, (u32)&%sAlternateHeaders0x%06X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + roomName.c_str(), segmentOffset); string declaration = ""; for (int i = 0; i < numHeaders; i++) { - //sprintf(line, "\t0x%06X,\n", headers[i]); + // sprintf(line, "\t0x%06X,\n", headers[i]); if (headers[i] == 0) declaration += StringHelper::Sprintf("\t0,\n"); else - declaration += StringHelper::Sprintf("\t(u32)&%sSet%04XCmd00,\n", roomName.c_str(), headers[i] & 0x00FFFFFF); + declaration += StringHelper::Sprintf("\t(u32)&%sSet%04XCmd00,\n", roomName.c_str(), + headers[i] & 0x00FFFFFF); } - zRoom->parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::None, headers.size() * 4, - "u32", StringHelper::Sprintf("%sAlternateHeaders0x%06X", roomName.c_str(), segmentOffset), 0, declaration); + zRoom->parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, headers.size() * 4, "u32", + StringHelper::Sprintf("%sAlternateHeaders0x%06X", roomName.c_str(), segmentOffset), 0, + declaration); return sourceOutput; } diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetAlternateHeaders.h b/tools/ZAPD/ZAPD/ZRoom/Commands/SetAlternateHeaders.h index d1dca33ca4..15a054312e 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetAlternateHeaders.h +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetAlternateHeaders.h @@ -1,7 +1,7 @@ #pragma once -#include "../ZRoomCommand.h" #include "../ZRoom.h" +#include "../ZRoomCommand.h" class SetAlternateHeaders : public ZRoomCommand { diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetCameraSettings.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetCameraSettings.cpp index 830aacc439..57f0dd71e8 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetCameraSettings.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetCameraSettings.cpp @@ -4,7 +4,8 @@ using namespace std; -SetCameraSettings::SetCameraSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetCameraSettings::SetCameraSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { cameraMovement = rawData[rawDataIndex + 0x01]; mapHighlight = BitConverter::ToInt32BE(rawData, rawDataIndex + 4); @@ -12,7 +13,9 @@ SetCameraSettings::SetCameraSettings(ZRoom* nZRoom, std::vector rawData string SetCameraSettings::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x%02X, 0x%08X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), cameraMovement, mapHighlight); + return StringHelper::Sprintf( + "%s 0x%02X, 0x%08X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + cameraMovement, mapHighlight); } string SetCameraSettings::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp index 7f037086f3..90b0c595ff 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp @@ -1,20 +1,28 @@ #include "SetCollisionHeader.h" -#include "../ZRoom.h" -#include "../../ZFile.h" #include "../../BitConverter.h" #include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ZRoom.h" using namespace std; -SetCollisionHeader::SetCollisionHeader(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetCollisionHeader::SetCollisionHeader(ZRoom* nZRoom, std::vector rawData, + int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); - collisionHeader = ZCollisionHeader(nZRoom->parent, StringHelper::Sprintf("%sCollisionHeader0x%06X", nZRoom->GetName().c_str(), segmentOffset), rawData, segmentOffset); + collisionHeader = ZCollisionHeader( + nZRoom->parent, + StringHelper::Sprintf("%sCollisionHeader0x%06X", nZRoom->GetName().c_str(), segmentOffset), + rawData, segmentOffset); } string SetCollisionHeader::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x00, (u32)&%sCollisionHeader0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), zRoom->GetName().c_str(), segmentOffset); + return StringHelper::Sprintf( + "%s 0x00, (u32)&%sCollisionHeader0x%06X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + zRoom->GetName().c_str(), segmentOffset); } string SetCollisionHeader::GenerateSourceCodePass2(string roomName, int baseAddress) diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetCollisionHeader.h b/tools/ZAPD/ZAPD/ZRoom/Commands/SetCollisionHeader.h index d9ba188eb0..f2b12644af 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetCollisionHeader.h +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetCollisionHeader.h @@ -1,7 +1,7 @@ #pragma once -#include "../ZRoomCommand.h" #include "../../ZCollision.h" +#include "../ZRoomCommand.h" class SetCollisionHeader : public ZRoomCommand { diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetCutscenes.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetCutscenes.cpp index 20c77c79a0..a253270f17 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetCutscenes.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetCutscenes.cpp @@ -1,16 +1,16 @@ #include "SetCutscenes.h" -#include "../ZRoom.h" -#include "../../ZFile.h" #include "../../BitConverter.h" #include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ZRoom.h" using namespace std; -SetCutscenes::SetCutscenes(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetCutscenes::SetCutscenes(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { segmentOffset = BitConverter::ToInt32BE(rawData, rawDataIndex + 4) & 0x00FFFFFF; - - uint32_t curPtr = segmentOffset; + string output = ""; cutscene = new ZCutscene(rawData, segmentOffset, 9999); @@ -18,8 +18,22 @@ SetCutscenes::SetCutscenes(ZRoom* nZRoom, std::vector rawData, int rawD output += cutscene->GetSourceOutputCode(zRoom->GetName()); if (segmentOffset != 0) - zRoom->parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::None, DeclarationPadding::Pad16, cutscene->GetRawDataSize(), "s32", - StringHelper::Sprintf("%sCutsceneData0x%06X", zRoom->GetName().c_str(), segmentOffset), 0, output); + { + Declaration* decl = zRoom->parent->GetDeclaration(segmentOffset); + if (decl == nullptr) + { + zRoom->parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, DeclarationPadding::Pad16, + cutscene->GetRawDataSize(), "s32", + StringHelper::Sprintf("%sCutsceneData0x%06X", zRoom->GetName().c_str(), + segmentOffset), + 0, output); + } + else if (decl->text == "") + { + decl->text = output; + } + } } SetCutscenes::~SetCutscenes() @@ -33,7 +47,14 @@ SetCutscenes::~SetCutscenes() string SetCutscenes::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0, (u32)%sCutsceneData0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), zRoom->GetName().c_str(), segmentOffset); + string pass1 = ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress); + Declaration* decl = zRoom->parent->GetDeclaration(segmentOffset); + if (decl != nullptr) + { + return StringHelper::Sprintf("%s 0, (u32)%s", pass1.c_str(), decl->varName.c_str()); + } + return StringHelper::Sprintf("%s 0, (u32)%sCutsceneData0x%06X", pass1.c_str(), + zRoom->GetName().c_str(), segmentOffset); } int32_t SetCutscenes::GetRawDataSize() @@ -43,7 +64,13 @@ int32_t SetCutscenes::GetRawDataSize() string SetCutscenes::GenerateExterns() { - return StringHelper::Sprintf("extern s32 %sCutsceneData0x%06X[];\n", zRoom->GetName().c_str(), segmentOffset); + Declaration* decl = zRoom->parent->GetDeclaration(segmentOffset); + if (decl != nullptr && decl->varName != "") + { + return StringHelper::Sprintf("extern s32 %s[];\n", decl->varName.c_str()); + } + return StringHelper::Sprintf("extern s32 %sCutsceneData0x%06X[];\n", zRoom->GetName().c_str(), + segmentOffset); } string SetCutscenes::GetCommandCName() @@ -59,4 +86,4 @@ RoomCommand SetCutscenes::GetRoomCommand() string SetCutscenes::GetSourceOutputCode(std::string prefix) { return ""; -} \ No newline at end of file +} diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetCutscenes.h b/tools/ZAPD/ZAPD/ZRoom/Commands/SetCutscenes.h index 2234bf6eb7..5e7e6985a3 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetCutscenes.h +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetCutscenes.h @@ -1,7 +1,7 @@ #pragma once -#include "../ZRoomCommand.h" #include "../../ZCutscene.h" +#include "../ZRoomCommand.h" class SetCutscenes : public ZRoomCommand { diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetEchoSettings.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetEchoSettings.cpp index 1d4c9826b2..40a11cfd3c 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetEchoSettings.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetEchoSettings.cpp @@ -3,14 +3,17 @@ using namespace std; -SetEchoSettings::SetEchoSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetEchoSettings::SetEchoSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { echo = rawData[rawDataIndex + 0x07]; } string SetEchoSettings::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0, { 0 }, 0x%02X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), echo); + return StringHelper::Sprintf( + "%s 0, { 0 }, 0x%02X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + echo); } string SetEchoSettings::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetEntranceList.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetEntranceList.cpp index f9b48cd7d6..6e81552450 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetEntranceList.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetEntranceList.cpp @@ -1,13 +1,14 @@ #include "SetEntranceList.h" -#include "SetStartPositionList.h" -#include "../../ZFile.h" -#include "../ZRoom.h" #include "../../BitConverter.h" #include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ZRoom.h" +#include "SetStartPositionList.h" using namespace std; -SetEntranceList::SetEntranceList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetEntranceList::SetEntranceList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { segmentOffset = BitConverter::ToInt32BE(rawData, rawDataIndex + 4) & 0x00FFFFFF; entrances = vector(); @@ -24,10 +25,13 @@ SetEntranceList::~SetEntranceList() string SetEntranceList::GenerateSourceCodePass1(string roomName, int baseAddress) { - string sourceOutput = StringHelper::Sprintf("%s 0x00, (u32)&%sEntranceList0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), zRoom->GetName().c_str(), segmentOffset); + string sourceOutput = + StringHelper::Sprintf("%s 0x00, (u32)&%sEntranceList0x%06X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + zRoom->GetName().c_str(), segmentOffset); // Parse Entrances and Generate Declaration - zRoom->parent->AddDeclarationPlaceholder(segmentOffset); // Make sure this segment is defined + zRoom->parent->AddDeclarationPlaceholder(segmentOffset); // Make sure this segment is defined int numEntrances = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 2; uint32_t currentPtr = segmentOffset; @@ -45,19 +49,24 @@ string SetEntranceList::GenerateSourceCodePass1(string roomName, int baseAddress for (EntranceEntry* entry : entrances) { - declaration += StringHelper::Sprintf("\t{ 0x%02X, 0x%02X }, //0x%06X \n", entry->startPositionIndex, entry->roomToLoad, segmentOffset + (index * 2)); + declaration += + StringHelper::Sprintf("\t{ 0x%02X, 0x%02X }, //0x%06X \n", entry->startPositionIndex, + entry->roomToLoad, segmentOffset + (index * 2)); index++; } - zRoom->parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::None, entrances.size() * 2, "EntranceEntry", - StringHelper::Sprintf("%sEntranceList0x%06X", zRoom->GetName().c_str(), segmentOffset), entrances.size(), declaration); + zRoom->parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, entrances.size() * 2, "EntranceEntry", + StringHelper::Sprintf("%sEntranceList0x%06X", zRoom->GetName().c_str(), segmentOffset), + entrances.size(), declaration); return sourceOutput; } string SetEntranceList::GenerateExterns() { - return StringHelper::Sprintf("extern EntranceEntry %sEntranceList0x%06X[];\n", zRoom->GetName().c_str(), segmentOffset); + return StringHelper::Sprintf("extern EntranceEntry %sEntranceList0x%06X[];\n", + zRoom->GetName().c_str(), segmentOffset); } string SetEntranceList::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetExitList.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetExitList.cpp index 89c7ddb08f..23b89e2290 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetExitList.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetExitList.cpp @@ -1,12 +1,13 @@ #include "SetExitList.h" -#include "../ZRoom.h" -#include "../../ZFile.h" #include "../../BitConverter.h" #include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ZRoom.h" using namespace std; -SetExitList::SetExitList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetExitList::SetExitList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); exits = vector(); @@ -20,10 +21,13 @@ SetExitList::SetExitList(ZRoom* nZRoom, std::vector rawData, int rawDat string SetExitList::GenerateSourceCodePass1(string roomName, int baseAddress) { - string sourceOutput = StringHelper::Sprintf("%s 0x00, (u32)&%sExitList0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), zRoom->GetName().c_str(), segmentOffset); + string sourceOutput = + StringHelper::Sprintf("%s 0x00, (u32)&%sExitList0x%06X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + zRoom->GetName().c_str(), segmentOffset); // Parse Entrances and Generate Declaration - zRoom->parent->AddDeclarationPlaceholder(segmentOffset); // Make sure this segment is defined + zRoom->parent->AddDeclarationPlaceholder(segmentOffset); // Make sure this segment is defined int numEntrances = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 2; uint32_t currentPtr = segmentOffset; @@ -38,9 +42,12 @@ string SetExitList::GenerateSourceCodePass1(string roomName, int baseAddress) string declaration = ""; for (uint16_t exit : exits) - declaration += StringHelper::Sprintf("\t0x%04X,\n", exit);; + declaration += StringHelper::Sprintf("\t0x%04X,\n", exit); + ; - zRoom->parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::None, exits.size() * 2, "u16", StringHelper::Sprintf("%sExitList0x%06X", zRoom->GetName().c_str(), segmentOffset), + zRoom->parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, exits.size() * 2, "u16", + StringHelper::Sprintf("%sExitList0x%06X", zRoom->GetName().c_str(), segmentOffset), exits.size(), declaration); return sourceOutput; @@ -48,7 +55,9 @@ string SetExitList::GenerateSourceCodePass1(string roomName, int baseAddress) string SetExitList::GenerateExterns() { - return StringHelper::Sprintf("extern u16 %sExitList0x%06X[];\n", zRoom->GetName().c_str(), segmentOffset);; + return StringHelper::Sprintf("extern u16 %sExitList0x%06X[];\n", zRoom->GetName().c_str(), + segmentOffset); + ; } string SetExitList::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightList.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightList.cpp index 57b5430664..2018c2e5a6 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightList.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightList.cpp @@ -4,13 +4,15 @@ using namespace std; -SetLightList::SetLightList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetLightList::SetLightList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { this->ptrRoom = nZRoom; this->numLights = rawData[rawDataIndex + 1]; this->segment = BitConverter::ToInt32BE(rawData, rawDataIndex + 4) & 0x00FFFFFF; - //std::string declarations = StringHelper::Sprintf("LightInfo %sLightInfo0x%06X[] =\n{\n", this->ptrRoom->GetName().c_str(), this->segment); + // std::string declarations = StringHelper::Sprintf("LightInfo %sLightInfo0x%06X[] =\n{\n", + // this->ptrRoom->GetName().c_str(), this->segment); string declarations = ""; for (int i = 0; i < this->numLights; i++) @@ -20,21 +22,29 @@ SetLightList::SetLightList(ZRoom* nZRoom, std::vector rawData, int rawD for (int y = 0; y < 6; y++) { - params.push_back(BitConverter::ToInt16BE(rawData, this->segment + ((0xE * i) + 2 + (y * 2)))); + params.push_back( + BitConverter::ToInt16BE(rawData, this->segment + ((0xE * i) + 2 + (y * 2)))); } - declarations += StringHelper::Sprintf("\t{ 0x%02X, { 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X } },\n", type, params[0], params[1], params[2], params[3], params[4], params[5]); + declarations += StringHelper::Sprintf( + "\t{ 0x%02X, { 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X } },\n", type, params[0], + params[1], params[2], params[3], params[4], params[5]); } declarations += "};\n"; - this->ptrRoom->parent->AddDeclarationArray(this->segment, DeclarationAlignment::None, this->numLights * 0xE, "LightInfo", - StringHelper::Sprintf("%sLightInfo0x%06X", this->ptrRoom->GetName().c_str(), this->segment), this->numLights, declarations); + this->ptrRoom->parent->AddDeclarationArray( + this->segment, DeclarationAlignment::None, this->numLights * 0xE, "LightInfo", + StringHelper::Sprintf("%sLightInfo0x%06X", this->ptrRoom->GetName().c_str(), this->segment), + this->numLights, declarations); } string SetLightList::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s %i, &%sLightInfo0x%06X};", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), this->numLights, this->ptrRoom->GetName().c_str(), this->segment); + return StringHelper::Sprintf( + "%s %i, &%sLightInfo0x%06X};", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), this->numLights, + this->ptrRoom->GetName().c_str(), this->segment); } string SetLightList::GetCommandCName() @@ -44,7 +54,8 @@ string SetLightList::GetCommandCName() string SetLightList::GenerateExterns() { - return StringHelper::Sprintf("extern LightInfo %sLightInfo0x%06X[];\n", this->ptrRoom->GetName().c_str(), this->segment); + return StringHelper::Sprintf("extern LightInfo %sLightInfo0x%06X[];\n", + this->ptrRoom->GetName().c_str(), this->segment); } RoomCommand SetLightList::GetRoomCommand() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightList.h b/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightList.h index 625d3b8e9d..b3383aa5ce 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightList.h +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightList.h @@ -2,9 +2,9 @@ #include -#include "ZFile.h" #include "../ZRoom.h" #include "../ZRoomCommand.h" +#include "ZFile.h" class SetLightList : public ZRoomCommand { diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightingSettings.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightingSettings.cpp index 5f8d4d4145..8436feeb53 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightingSettings.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetLightingSettings.cpp @@ -1,12 +1,14 @@ #include "SetLightingSettings.h" -#include "../ZRoom.h" -#include "../../ZFile.h" #include "../../BitConverter.h" #include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ZRoom.h" using namespace std; -SetLightingSettings::SetLightingSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetLightingSettings::SetLightingSettings(ZRoom* nZRoom, std::vector rawData, + int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { uint8_t numLights = rawData[rawDataIndex + 1]; segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); @@ -20,18 +22,24 @@ SetLightingSettings::SetLightingSettings(ZRoom* nZRoom, std::vector raw for (int i = 0; i < numLights; i++) { - declaration += StringHelper::Sprintf("\t{ 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%04X, 0x%04X }, // 0x%06X \n", + declaration += StringHelper::Sprintf( + "\t{ 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, " + "0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%04X, " + "0x%04X }, // 0x%06X \n", settings[i]->ambientClrR, settings[i]->ambientClrG, settings[i]->ambientClrB, settings[i]->diffuseClrA_R, settings[i]->diffuseClrA_G, settings[i]->diffuseClrA_B, settings[i]->diffuseDirA_X, settings[i]->diffuseDirA_Y, settings[i]->diffuseDirA_Z, settings[i]->diffuseClrB_R, settings[i]->diffuseClrB_G, settings[i]->diffuseClrB_B, settings[i]->diffuseDirB_X, settings[i]->diffuseDirB_Y, settings[i]->diffuseDirB_Z, - settings[i]->fogClrR, settings[i]->fogClrG, settings[i]->fogClrB, - settings[i]->unk, settings[i]->drawDistance, segmentOffset + (i * 22)); + settings[i]->fogClrR, settings[i]->fogClrG, settings[i]->fogClrB, settings[i]->unk, + settings[i]->drawDistance, segmentOffset + (i * 22)); } - zRoom->parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::None, DeclarationPadding::None, numLights * 22, "LightSettings", - StringHelper::Sprintf("%sLightSettings0x%06X", zRoom->GetName().c_str(), segmentOffset), numLights, declaration); + zRoom->parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, DeclarationPadding::None, numLights * 22, + "LightSettings", + StringHelper::Sprintf("%sLightSettings0x%06X", zRoom->GetName().c_str(), segmentOffset), + numLights, declaration); } } @@ -43,7 +51,10 @@ SetLightingSettings::~SetLightingSettings() string SetLightingSettings::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s %i, (u32)&%sLightSettings0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), settings.size(), zRoom->GetName().c_str(), segmentOffset); + return StringHelper::Sprintf( + "%s %i, (u32)&%sLightSettings0x%06X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), settings.size(), + zRoom->GetName().c_str(), segmentOffset); } string SetLightingSettings::GenerateSourceCodePass2(string roomName, int baseAddress) @@ -58,7 +69,8 @@ string SetLightingSettings::GetCommandCName() string SetLightingSettings::GenerateExterns() { - return StringHelper::Sprintf("extern LightSettings %sLightSettings0x%06X[];\n", zRoom->GetName().c_str(), segmentOffset); + return StringHelper::Sprintf("extern LightSettings %sLightSettings0x%06X[];\n", + zRoom->GetName().c_str(), segmentOffset); } RoomCommand SetLightingSettings::GetRoomCommand() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetMesh.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetMesh.cpp index 50baed3d72..4884e3e50c 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetMesh.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetMesh.cpp @@ -1,14 +1,16 @@ #include "SetMesh.h" -#include "../../ZFile.h" -#include "../ZRoom.h" +#include +#include #include "../../BitConverter.h" #include "../../StringHelper.h" -#include -#include +#include "../../ZFile.h" +#include "../ZRoom.h" using namespace std; -SetMesh::SetMesh(ZRoom* nZRoom, std::vector rawData, int rawDataIndex, int segAddressOffset) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetMesh::SetMesh(ZRoom* nZRoom, std::vector rawData, int rawDataIndex, + int segAddressOffset) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { data = rawData[rawDataIndex + 1]; segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); @@ -39,11 +41,17 @@ SetMesh::SetMesh(ZRoom* nZRoom, std::vector rawData, int rawDataIndex, { MeshEntry0* entry = new MeshEntry0(); entry->opaqueDListAddr = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, currentPtr + 0)); - entry->translucentDListAddr = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, currentPtr + 4)); + entry->translucentDListAddr = + GETSEGOFFSET(BitConverter::ToInt32BE(rawData, currentPtr + 4)); if (entry->opaqueDListAddr != 0) { - entry->opaqueDList = new ZDisplayList(rawData, entry->opaqueDListAddr, ZDisplayList::GetDListLength(rawData, entry->opaqueDListAddr, Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX)); + entry->opaqueDList = new ZDisplayList( + rawData, entry->opaqueDListAddr, + ZDisplayList::GetDListLength(rawData, entry->opaqueDListAddr, + Globals::Instance->game == ZGame::OOT_SW97 ? + DListType::F3DEX : + DListType::F3DZEX)); entry->opaqueDList->scene = zRoom->scene; entry->opaqueDList->parent = zRoom->parent; GenDListDeclarations(rawData, entry->opaqueDList); @@ -51,7 +59,12 @@ SetMesh::SetMesh(ZRoom* nZRoom, std::vector rawData, int rawDataIndex, if (entry->translucentDListAddr != 0) { - entry->translucentDList = new ZDisplayList(rawData, entry->translucentDListAddr, ZDisplayList::GetDListLength(rawData, entry->translucentDListAddr, Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX)); + entry->translucentDList = new ZDisplayList( + rawData, entry->translucentDListAddr, + ZDisplayList::GetDListLength(rawData, entry->translucentDListAddr, + Globals::Instance->game == ZGame::OOT_SW97 ? + DListType::F3DEX : + DListType::F3DZEX)); entry->translucentDList->scene = zRoom->scene; entry->translucentDList->parent = zRoom->parent; GenDListDeclarations(rawData, entry->translucentDList); @@ -65,56 +78,74 @@ SetMesh::SetMesh(ZRoom* nZRoom, std::vector rawData, int rawDataIndex, declaration += StringHelper::Sprintf("{ 0 }, 0x%02X, ", meshHeader0->entries.size()); if (meshHeader0->dListStart != 0) - declaration += StringHelper::Sprintf("(u32)&%sMeshDListEntry0x%06X, ", zRoom->GetName().c_str(), meshHeader0->dListStart); + declaration += StringHelper::Sprintf("(u32)&%sMeshDListEntry0x%06X, ", + zRoom->GetName().c_str(), meshHeader0->dListStart); else declaration += "0, "; if (meshHeader0->dListEnd != 0) - declaration += StringHelper::Sprintf("(u32)&(%sMeshDListEntry0x%06X) + sizeof(%sMeshDListEntry0x%06X)", zRoom->GetName().c_str(), meshHeader0->dListStart, zRoom->GetName().c_str(), meshHeader0->dListStart); + declaration += StringHelper::Sprintf( + "(u32)&(%sMeshDListEntry0x%06X) + sizeof(%sMeshDListEntry0x%06X)", + zRoom->GetName().c_str(), meshHeader0->dListStart, zRoom->GetName().c_str(), + meshHeader0->dListStart); else declaration += "0"; - zRoom->parent->AddDeclaration(segmentOffset, DeclarationAlignment::Align16, 12, "MeshHeader0", StringHelper::Sprintf("%sMeshHeader0x%06X", zRoom->GetName().c_str(), segmentOffset), + zRoom->parent->AddDeclaration( + segmentOffset, DeclarationAlignment::Align16, 12, "MeshHeader0", + StringHelper::Sprintf("%sMeshHeader0x%06X", zRoom->GetName().c_str(), segmentOffset), declaration); declaration = ""; - for (int i = 0; i < meshHeader0->entries.size(); i++) + for (size_t i = 0; i < meshHeader0->entries.size(); i++) { if (meshHeader0->entries[i]->opaqueDListAddr != 0) - declaration += StringHelper::Sprintf("\t{ (u32)%sDL_%06X, ", zRoom->GetName().c_str(), meshHeader0->entries[i]->opaqueDListAddr); + declaration += + StringHelper::Sprintf("\t{ (u32)%sDL_%06X, ", zRoom->GetName().c_str(), + meshHeader0->entries[i]->opaqueDListAddr); else declaration += "\t{ 0, "; if (meshHeader0->entries[i]->translucentDListAddr != 0) - declaration += StringHelper::Sprintf("(u32)%sDL_%06X },\n", zRoom->GetName().c_str(), meshHeader0->entries[i]->translucentDListAddr); + declaration += + StringHelper::Sprintf("(u32)%sDL_%06X },\n", zRoom->GetName().c_str(), + meshHeader0->entries[i]->translucentDListAddr); else declaration += "0 },\n"; } - zRoom->parent->AddDeclarationArray(meshHeader0->dListStart, DeclarationAlignment::None, DeclarationPadding::None, (meshHeader0->entries.size() * 8) + 0, "MeshEntry0", - StringHelper::Sprintf("%sMeshDListEntry0x%06X", zRoom->GetName().c_str(), meshHeader0->dListStart), meshHeader0->entries.size(), declaration); + zRoom->parent->AddDeclarationArray( + meshHeader0->dListStart, DeclarationAlignment::None, DeclarationPadding::None, + (meshHeader0->entries.size() * 8) + 0, "MeshEntry0", + StringHelper::Sprintf("%sMeshDListEntry0x%06X", zRoom->GetName().c_str(), + meshHeader0->dListStart), + meshHeader0->entries.size(), declaration); - zRoom->parent->AddDeclaration(meshHeader0->dListStart + (meshHeader0->entries.size() * 8) + 0, DeclarationAlignment::None, DeclarationPadding::Pad16, 4, "static s32", - "terminatorMaybe", " 0x01000000 "); + zRoom->parent->AddDeclaration(meshHeader0->dListStart + (meshHeader0->entries.size() * 8) + + 0, + DeclarationAlignment::None, DeclarationPadding::Pad16, 4, + "static s32", "terminatorMaybe", " 0x01000000 "); meshHeader = meshHeader0; } else if (meshHeaderType == 1) { MeshHeader1Base* meshHeader1 = nullptr; - + uint8_t fmt = rawData[segmentOffset + 1]; - if (fmt == 1) // Single Format + if (fmt == 1) // Single Format { MeshHeader1Single* headerSingle = new MeshHeader1Single(); headerSingle->headerType = 1; headerSingle->format = fmt; - headerSingle->entryRecord = BitConverter::ToInt32BE(rawData, segmentOffset + 4);// &0x00FFFFFF; + headerSingle->entryRecord = + BitConverter::ToInt32BE(rawData, segmentOffset + 4); // &0x00FFFFFF; - headerSingle->imagePtr = BitConverter::ToInt32BE(rawData, segmentOffset + 8);// &0x00FFFFFF; + headerSingle->imagePtr = + BitConverter::ToInt32BE(rawData, segmentOffset + 8); // &0x00FFFFFF; headerSingle->unknown = BitConverter::ToInt32BE(rawData, segmentOffset + 12); headerSingle->unknown2 = BitConverter::ToInt32BE(rawData, segmentOffset + 16); headerSingle->bgWidth = BitConverter::ToInt16BE(rawData, segmentOffset + 20); @@ -124,37 +155,50 @@ SetMesh::SetMesh(ZRoom* nZRoom, std::vector rawData, int rawDataIndex, headerSingle->imagePal = BitConverter::ToInt16BE(rawData, segmentOffset + 26); headerSingle->imageFlip = BitConverter::ToInt16BE(rawData, segmentOffset + 28); - declaration += StringHelper::Sprintf("{ { 1 }, 1, 0x%06X }, 0x%06X, ", - headerSingle->entryRecord, headerSingle->imagePtr); + declaration += StringHelper::Sprintf("{ { 1 }, 1, 0x%06X }, 0x%06X, ", + headerSingle->entryRecord, headerSingle->imagePtr); declaration += StringHelper::Sprintf("0x%06X, 0x%06X, %i, %i, %i, %i, %i, %i\n", - headerSingle->unknown, headerSingle->unknown2, headerSingle->bgWidth, headerSingle->bgHeight, headerSingle->imageFormat, headerSingle->imageSize, headerSingle->imagePal, headerSingle->imageFlip); + headerSingle->unknown, headerSingle->unknown2, + headerSingle->bgWidth, headerSingle->bgHeight, + headerSingle->imageFormat, headerSingle->imageSize, + headerSingle->imagePal, headerSingle->imageFlip); - zRoom->parent->AddDeclaration(segmentOffset, DeclarationAlignment::None, DeclarationPadding::Pad16, 0x1E, "MeshHeader1Single", - StringHelper::Sprintf("%sMeshHeader0x%06X", zRoom->GetName().c_str(), segmentOffset), declaration); + zRoom->parent->AddDeclaration(segmentOffset, DeclarationAlignment::None, + DeclarationPadding::Pad16, 0x1E, "MeshHeader1Single", + StringHelper::Sprintf("%sMeshHeader0x%06X", + zRoom->GetName().c_str(), + segmentOffset), + declaration); meshHeader1 = headerSingle; } - else if (fmt == 2) // Multi-Format + else if (fmt == 2) // Multi-Format { MeshHeader1Multi* headerMulti = new MeshHeader1Multi(); headerMulti->headerType = 1; headerMulti->format = fmt; - headerMulti->entryRecord = BitConverter::ToInt32BE(rawData, segmentOffset + 4);// &0x00FFFFFF; + headerMulti->entryRecord = + BitConverter::ToInt32BE(rawData, segmentOffset + 4); // &0x00FFFFFF; headerMulti->bgCnt = rawData[segmentOffset + 8]; headerMulti->bgRecordPtr = BitConverter::ToInt32BE(rawData, segmentOffset + 12); declaration += StringHelper::Sprintf("{ { 1 }, 2, 0x%06X }, 0x%06X, 0x%06X", - headerMulti->entryRecord, headerMulti->bgCnt, headerMulti->bgRecordPtr); + headerMulti->entryRecord, headerMulti->bgCnt, + headerMulti->bgRecordPtr); - zRoom->parent->AddDeclaration(segmentOffset, DeclarationAlignment::None, DeclarationPadding::Pad16, 16, "MeshHeader1Multi", - StringHelper::Sprintf("%sMeshHeader0x%06X", zRoom->GetName().c_str(), segmentOffset), declaration); + zRoom->parent->AddDeclaration(segmentOffset, DeclarationAlignment::None, + DeclarationPadding::Pad16, 16, "MeshHeader1Multi", + StringHelper::Sprintf("%sMeshHeader0x%06X", + zRoom->GetName().c_str(), + segmentOffset), + declaration); meshHeader1 = headerMulti; } - else // UH OH + else // UH OH { if (Globals::Instance->verbosity >= VERBOSITY_INFO) printf("WARNING: MeshHeader FMT %i not implemented!\n", fmt); @@ -164,14 +208,13 @@ SetMesh::SetMesh(ZRoom* nZRoom, std::vector rawData, int rawDataIndex, meshHeader1->format = fmt; meshHeader1->entryRecord = BitConverter::ToInt32BE(rawData, segmentOffset + 4) & 0x00FFFFFF; - meshHeader = meshHeader1; } else if (meshHeaderType == 2) { MeshHeader2* meshHeader2 = new MeshHeader2(); meshHeader2->headerType = 2; - + meshHeader2->entries = vector(); meshHeader2->dListStart = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, segmentOffset + 4)); meshHeader2->dListEnd = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, segmentOffset + 8)); @@ -189,22 +232,33 @@ SetMesh::SetMesh(ZRoom* nZRoom, std::vector rawData, int rawDataIndex, entry->playerZMin = BitConverter::ToInt16BE(rawData, currentPtr + 6); entry->opaqueDListAddr = BitConverter::ToInt32BE(rawData, currentPtr + 8) & 0x00FFFFFF; - entry->translucentDListAddr = BitConverter::ToInt32BE(rawData, currentPtr + 12) & 0x00FFFFFF; + entry->translucentDListAddr = + BitConverter::ToInt32BE(rawData, currentPtr + 12) & 0x00FFFFFF; if (entry->opaqueDListAddr != 0) { - entry->opaqueDList = new ZDisplayList(rawData, entry->opaqueDListAddr, ZDisplayList::GetDListLength(rawData, entry->opaqueDListAddr, Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX)); + entry->opaqueDList = new ZDisplayList( + rawData, entry->opaqueDListAddr, + ZDisplayList::GetDListLength(rawData, entry->opaqueDListAddr, + Globals::Instance->game == ZGame::OOT_SW97 ? + DListType::F3DEX : + DListType::F3DZEX)); entry->opaqueDList->scene = zRoom->scene; entry->opaqueDList->parent = zRoom->parent; - GenDListDeclarations(rawData, entry->opaqueDList); // HOTSPOT + GenDListDeclarations(rawData, entry->opaqueDList); // HOTSPOT } if (entry->translucentDListAddr != 0) { - entry->translucentDList = new ZDisplayList(rawData, entry->translucentDListAddr, ZDisplayList::GetDListLength(rawData, entry->translucentDListAddr, Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX)); + entry->translucentDList = new ZDisplayList( + rawData, entry->translucentDListAddr, + ZDisplayList::GetDListLength(rawData, entry->translucentDListAddr, + Globals::Instance->game == ZGame::OOT_SW97 ? + DListType::F3DEX : + DListType::F3DZEX)); entry->translucentDList->scene = zRoom->scene; entry->translucentDList->parent = zRoom->parent; - GenDListDeclarations(rawData, entry->translucentDList); // HOTSPOT + GenDListDeclarations(rawData, entry->translucentDList); // HOTSPOT } meshHeader2->entries.push_back(entry); @@ -215,40 +269,57 @@ SetMesh::SetMesh(ZRoom* nZRoom, std::vector rawData, int rawDataIndex, declaration += StringHelper::Sprintf("{ 2 }, 0x%02lX, ", meshHeader2->entries.size()); if (meshHeader2->dListStart != 0) - declaration += StringHelper::Sprintf("(u32)&%sMeshDListEntry0x%06X, ", zRoom->GetName().c_str(), meshHeader2->dListStart); + declaration += StringHelper::Sprintf("(u32)&%sMeshDListEntry0x%06X, ", + zRoom->GetName().c_str(), meshHeader2->dListStart); else declaration += "0, "; if (meshHeader2->dListEnd != 0) - declaration += StringHelper::Sprintf("(u32)&(%sMeshDListEntry0x%06X) + sizeof(%sMeshDListEntry0x%06X)", zRoom->GetName().c_str(), meshHeader2->dListStart, zRoom->GetName().c_str(), meshHeader2->dListStart); + declaration += StringHelper::Sprintf( + "(u32)&(%sMeshDListEntry0x%06X) + sizeof(%sMeshDListEntry0x%06X)", + zRoom->GetName().c_str(), meshHeader2->dListStart, zRoom->GetName().c_str(), + meshHeader2->dListStart); else declaration += "0"; - zRoom->parent->AddDeclaration(segmentOffset, DeclarationAlignment::None, 12, "MeshHeader2", - StringHelper::Sprintf("%sMeshHeader0x%06X", zRoom->GetName().c_str(), segmentOffset), declaration); + zRoom->parent->AddDeclaration( + segmentOffset, DeclarationAlignment::None, 12, "MeshHeader2", + StringHelper::Sprintf("%sMeshHeader0x%06X", zRoom->GetName().c_str(), segmentOffset), + declaration); declaration = ""; - for (int i = 0; i < meshHeader2->entries.size(); i++) + for (size_t i = 0; i < meshHeader2->entries.size(); i++) { - declaration += StringHelper::Sprintf("\t{ %i, %i, %i, %i, ", meshHeader2->entries[i]->playerXMax, meshHeader2->entries[i]->playerZMax, meshHeader2->entries[i]->playerXMin, meshHeader2->entries[i]->playerZMin); + declaration += StringHelper::Sprintf( + "\t{ %i, %i, %i, %i, ", meshHeader2->entries[i]->playerXMax, + meshHeader2->entries[i]->playerZMax, meshHeader2->entries[i]->playerXMin, + meshHeader2->entries[i]->playerZMin); if (meshHeader2->entries[i]->opaqueDListAddr != 0) - declaration += StringHelper::Sprintf("(u32)%sDL_%06X, ", zRoom->GetName().c_str(), meshHeader2->entries[i]->opaqueDListAddr); + declaration += StringHelper::Sprintf("(u32)%sDL_%06X, ", zRoom->GetName().c_str(), + meshHeader2->entries[i]->opaqueDListAddr); else declaration += "0, "; if (meshHeader2->entries[i]->translucentDListAddr != 0) - declaration += StringHelper::Sprintf("(u32)%sDL_%06X },\n", zRoom->GetName().c_str(), meshHeader2->entries[i]->translucentDListAddr); + declaration += + StringHelper::Sprintf("(u32)%sDL_%06X },\n", zRoom->GetName().c_str(), + meshHeader2->entries[i]->translucentDListAddr); else declaration += "0 },\n"; } - zRoom->parent->AddDeclarationArray(meshHeader2->dListStart, DeclarationAlignment::None, DeclarationPadding::None, (meshHeader2->entries.size() * 16) + 0, - "MeshEntry2", StringHelper::Sprintf("%sMeshDListEntry0x%06X", zRoom->GetName().c_str(), meshHeader2->dListStart, meshHeader2->entries.size()), meshHeader2->entries.size(), declaration); + zRoom->parent->AddDeclarationArray( + meshHeader2->dListStart, DeclarationAlignment::None, DeclarationPadding::None, + (meshHeader2->entries.size() * 16) + 0, "MeshEntry2", + StringHelper::Sprintf("%sMeshDListEntry0x%06X", zRoom->GetName().c_str(), + meshHeader2->dListStart, meshHeader2->entries.size()), + meshHeader2->entries.size(), declaration); - zRoom->parent->AddDeclaration(meshHeader2->dListStart + (meshHeader2->entries.size() * 16), DeclarationAlignment::None, DeclarationPadding::Pad16, 4, "static s32", - "terminatorMaybe", "0x01000000"); + zRoom->parent->AddDeclaration(meshHeader2->dListStart + (meshHeader2->entries.size() * 16), + DeclarationAlignment::None, DeclarationPadding::Pad16, 4, + "static s32", "terminatorMaybe", "0x01000000"); meshHeader = meshHeader2; } @@ -267,23 +338,27 @@ void SetMesh::GenDListDeclarations(std::vector rawData, ZDisplayList* d { string srcVarName = ""; - //if (Globals::Instance->includeFilePrefix) - srcVarName = StringHelper::Sprintf("%s%s", zRoom->GetName().c_str(), dList->GetName().c_str()); - //else - //srcVarName = StringHelper::Sprintf("%s", dList->GetName().c_str()); + // if (Globals::Instance->includeFilePrefix) + srcVarName = StringHelper::Sprintf("%s%s", zRoom->GetName().c_str(), dList->GetName().c_str()); + // else + // srcVarName = StringHelper::Sprintf("%s", dList->GetName().c_str()); dList->SetName(srcVarName); - string sourceOutput = dList->GetSourceOutputCode(zRoom->GetName()); // HOTSPOT + string sourceOutput = dList->GetSourceOutputCode(zRoom->GetName()); // HOTSPOT - //zRoom->parent->AddDeclarationArray(dList->GetRawDataIndex(), DeclarationAlignment::None, dList->GetRawDataSize(), "static Gfx", srcVarName, dList->GetRawDataSize() / 8, sourceOutput); + // zRoom->parent->AddDeclarationArray(dList->GetRawDataIndex(), DeclarationAlignment::None, + // dList->GetRawDataSize(), "static Gfx", srcVarName, dList->GetRawDataSize() / 8, sourceOutput); for (ZDisplayList* otherDList : dList->otherDLists) GenDListDeclarations(rawData, otherDList); for (pair vtxEntry : dList->vtxDeclarations) { - zRoom->parent->AddDeclarationArray(vtxEntry.first, DeclarationAlignment::Align8, dList->vertices[vtxEntry.first].size() * 16, "static Vtx", - StringHelper::Sprintf("%sVtx_%06X", zRoom->GetName().c_str(), vtxEntry.first), dList->vertices[vtxEntry.first].size(), vtxEntry.second); + zRoom->parent->AddDeclarationArray( + vtxEntry.first, DeclarationAlignment::Align8, + dList->vertices[vtxEntry.first].size() * 16, "static Vtx", + StringHelper::Sprintf("%sVtx_%06X", zRoom->GetName().c_str(), vtxEntry.first), + dList->vertices[vtxEntry.first].size(), vtxEntry.second); } for (pair texEntry : dList->texDeclarations) @@ -292,21 +367,30 @@ void SetMesh::GenDListDeclarations(std::vector rawData, ZDisplayList* d if (Globals::Instance->verbosity >= VERBOSITY_DEBUG) printf("SAVING IMAGE TO %s\n", Globals::Instance->outputPath.c_str()); - + zRoom->textures[texEntry.first]->Save(Globals::Instance->outputPath); - zRoom->parent->AddDeclarationIncludeArray(texEntry.first, StringHelper::Sprintf("%s/%s.%s.inc.c", - Globals::Instance->outputPath.c_str(), Path::GetFileNameWithoutExtension(zRoom->textures[texEntry.first]->GetName()).c_str(), zRoom->textures[texEntry.first]->GetExternalExtension().c_str()), - zRoom->textures[texEntry.first]->GetRawDataSize(), "u64", StringHelper::Sprintf("%s", zRoom->textures[texEntry.first]->GetName().c_str(), texEntry.first), 0); + zRoom->parent->AddDeclarationIncludeArray( + texEntry.first, + StringHelper::Sprintf( + "%s/%s.%s.inc.c", Globals::Instance->outputPath.c_str(), + Path::GetFileNameWithoutExtension(zRoom->textures[texEntry.first]->GetName()) + .c_str(), + zRoom->textures[texEntry.first]->GetExternalExtension().c_str()), + zRoom->textures[texEntry.first]->GetRawDataSize(), "u64", + StringHelper::Sprintf("%s", zRoom->textures[texEntry.first]->GetName().c_str(), + texEntry.first), + 0); } } std::string SetMesh::GenDListExterns(ZDisplayList* dList) { string sourceOutput = ""; - + if (Globals::Instance->includeFilePrefix) - sourceOutput += StringHelper::Sprintf("extern Gfx %sDL_%06X[];\n", zRoom->GetName().c_str(), dList->GetRawDataIndex()); + sourceOutput += StringHelper::Sprintf("extern Gfx %sDL_%06X[];\n", zRoom->GetName().c_str(), + dList->GetRawDataIndex()); else sourceOutput += StringHelper::Sprintf("extern Gfx DL_%06X[];\n", dList->GetRawDataIndex()); @@ -314,7 +398,8 @@ std::string SetMesh::GenDListExterns(ZDisplayList* dList) sourceOutput += GenDListExterns(otherDList); for (pair texEntry : dList->texDeclarations) - sourceOutput += StringHelper::Sprintf("extern u64 %sTex_%06X[];\n", zRoom->GetName().c_str(), texEntry.first); + sourceOutput += StringHelper::Sprintf("extern u64 %sTex_%06X[];\n", + zRoom->GetName().c_str(), texEntry.first); sourceOutput += dList->defines; @@ -324,17 +409,20 @@ std::string SetMesh::GenDListExterns(ZDisplayList* dList) string SetMesh::GenerateSourceCodePass1(string roomName, int baseAddress) { string sourceOutput = ""; - - sourceOutput += StringHelper::Sprintf("%s %i, (u32)&%sMeshHeader0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), data, zRoom->GetName().c_str(), segmentOffset); + + sourceOutput += + StringHelper::Sprintf("%s %i, (u32)&%sMeshHeader0x%06X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + data, zRoom->GetName().c_str(), segmentOffset); /*if (meshHeader->headerType == 0) { - MeshHeader0* meshHeader0 = (MeshHeader0*)meshHeader; + MeshHeader0* meshHeader0 = (MeshHeader0*)meshHeader; } else { - sourceOutput += "// SetMesh UNIMPLEMENTED HEADER TYPE!\n"; + sourceOutput += "// SetMesh UNIMPLEMENTED HEADER TYPE!\n"; } */ return sourceOutput; @@ -348,9 +436,12 @@ string SetMesh::GenerateExterns() { MeshHeader0* meshHeader0 = (MeshHeader0*)meshHeader; - sourceOutput += StringHelper::Sprintf("extern MeshHeader0 %sMeshHeader0x%06X;\n", zRoom->GetName().c_str(), segmentOffset); - sourceOutput += StringHelper::Sprintf("extern MeshEntry0 %sMeshDListEntry0x%06X[%i];\n", zRoom->GetName().c_str(), meshHeader0->dListStart, meshHeader0->entries.size()); - + sourceOutput += StringHelper::Sprintf("extern MeshHeader0 %sMeshHeader0x%06X;\n", + zRoom->GetName().c_str(), segmentOffset); + sourceOutput += StringHelper::Sprintf("extern MeshEntry0 %sMeshDListEntry0x%06X[%i];\n", + zRoom->GetName().c_str(), meshHeader0->dListStart, + meshHeader0->entries.size()); + for (MeshEntry0* entry : meshHeader0->entries) { if (entry->opaqueDList != nullptr) @@ -365,16 +456,21 @@ string SetMesh::GenerateExterns() MeshHeader1Base* meshHeader1 = (MeshHeader1Base*)meshHeader; if (meshHeader1->format == 1) - sourceOutput += StringHelper::Sprintf("extern MeshHeader1Single %sMeshHeader0x%06X;\n", zRoom->GetName().c_str(), segmentOffset); + sourceOutput += StringHelper::Sprintf("extern MeshHeader1Single %sMeshHeader0x%06X;\n", + zRoom->GetName().c_str(), segmentOffset); else if (meshHeader1->format == 2) - sourceOutput += StringHelper::Sprintf("extern MeshHeader1Multi %sMeshHeader0x%06X;\n", zRoom->GetName().c_str(), segmentOffset); + sourceOutput += StringHelper::Sprintf("extern MeshHeader1Multi %sMeshHeader0x%06X;\n", + zRoom->GetName().c_str(), segmentOffset); } else if (meshHeader->headerType == 2) { MeshHeader2* meshHeader2 = (MeshHeader2*)meshHeader; - sourceOutput += StringHelper::Sprintf("extern MeshHeader2 %sMeshHeader0x%06X;\n", zRoom->GetName().c_str(), segmentOffset); - sourceOutput += StringHelper::Sprintf("extern MeshEntry2 %sMeshDListEntry0x%06X[%i];\n", zRoom->GetName().c_str(), meshHeader2->dListStart, meshHeader2->entries.size()); + sourceOutput += StringHelper::Sprintf("extern MeshHeader2 %sMeshHeader0x%06X;\n", + zRoom->GetName().c_str(), segmentOffset); + sourceOutput += StringHelper::Sprintf("extern MeshEntry2 %sMeshDListEntry0x%06X[%i];\n", + zRoom->GetName().c_str(), meshHeader2->dListStart, + meshHeader2->entries.size()); for (MeshEntry2* entry : meshHeader2->entries) { @@ -387,7 +483,7 @@ string SetMesh::GenerateExterns() } else { - //sourceOutput += "// SetMesh UNIMPLEMENTED HEADER TYPE!\n"; + // sourceOutput += "// SetMesh UNIMPLEMENTED HEADER TYPE!\n"; } return sourceOutput; diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetMesh.h b/tools/ZAPD/ZAPD/ZRoom/Commands/SetMesh.h index cf102885c3..1105e0b59e 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetMesh.h +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetMesh.h @@ -1,12 +1,12 @@ #pragma once -#include "../ZRoomCommand.h" #include "../../ZDisplayList.h" +#include "../ZRoomCommand.h" class MeshHeaderBase { public: - int8_t headerType; // 0x00 + int8_t headerType; // 0x00 }; class MeshEntry0 @@ -30,51 +30,51 @@ public: class MeshHeader1Base : public MeshHeaderBase { public: - int8_t format; // 0x01 - uint32_t entryRecord; // 0x04 + int8_t format; // 0x01 + uint32_t entryRecord; // 0x04 }; class MeshHeader1Single : public MeshHeader1Base { public: - uint32_t imagePtr; // 0x08 + uint32_t imagePtr; // 0x08 - uint32_t unknown; // 0x0C - uint32_t unknown2; // 0x10 + uint32_t unknown; // 0x0C + uint32_t unknown2; // 0x10 - uint16_t bgWidth; // 0x14 - uint16_t bgHeight; // 0x16 - - uint8_t imageFormat; // 0x18 - uint8_t imageSize; // 0x19 - uint16_t imagePal; // 0x1A - uint16_t imageFlip; // 0x1C + uint16_t bgWidth; // 0x14 + uint16_t bgHeight; // 0x16 + + uint8_t imageFormat; // 0x18 + uint8_t imageSize; // 0x19 + uint16_t imagePal; // 0x1A + uint16_t imageFlip; // 0x1C }; class MeshHeader1Multi : public MeshHeader1Base { public: - uint8_t bgCnt; // 0x08 - uint32_t bgRecordPtr; // 0x0C + uint8_t bgCnt; // 0x08 + uint32_t bgRecordPtr; // 0x0C }; class BackgroundRecord { public: - uint16_t unknown; // 0x00 - int8_t bgID; // 0x02 + uint16_t unknown; // 0x00 + int8_t bgID; // 0x02 - uint32_t imagePtr; // 0x04 - uint32_t unknown2; // 0x08 - uint32_t unknown3; // 0x0C + uint32_t imagePtr; // 0x04 + uint32_t unknown2; // 0x08 + uint32_t unknown3; // 0x0C - uint16_t bgWidth; // 0x10 - uint16_t bgHeight; // 0x12 + uint16_t bgWidth; // 0x10 + uint16_t bgHeight; // 0x12 - uint8_t imageFmt; // 0x14 - uint8_t imageSize; // 0x15 - uint16_t imagePal; // 0x16 - uint16_t imageFlip; // 0x18 + uint8_t imageFmt; // 0x14 + uint8_t imageSize; // 0x15 + uint16_t imagePal; // 0x16 + uint16_t imageFlip; // 0x18 }; class MeshEntry2 @@ -105,8 +105,8 @@ public: ~SetMesh(); virtual std::string GenerateSourceCodePass1(std::string roomName, int baseAddress); - //virtual std::string GenerateSourceCodePass2(std::string roomName, int baseAddress); - //virtual std::string GenerateSourceCodePass3(std::string roomName); + // virtual std::string GenerateSourceCodePass2(std::string roomName, int baseAddress); + // virtual std::string GenerateSourceCodePass3(std::string roomName); virtual std::string GenerateExterns(); virtual std::string GetCommandCName(); virtual RoomCommand GetRoomCommand(); diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetObjectList.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetObjectList.cpp index e91b0e98e1..f8d00a101e 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetObjectList.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetObjectList.cpp @@ -1,20 +1,21 @@ #include "SetObjectList.h" -#include "../ZRoom.h" -#include "../ObjectList.h" -#include "../../ZFile.h" #include "../../BitConverter.h" #include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ObjectList.h" +#include "../ZRoom.h" using namespace std; -SetObjectList::SetObjectList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetObjectList::SetObjectList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { objects = vector(); uint8_t objectCnt = rawData[rawDataIndex + 1]; segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); uint32_t currentPtr = segmentOffset; - for (int i = 0; i < objectCnt; i++) + for (uint8_t i = 0; i < objectCnt; i++) { uint16_t objectIndex = BitConverter::ToInt16BE(rawData, currentPtr); objects.push_back(objectIndex); @@ -27,18 +28,22 @@ SetObjectList::SetObjectList(ZRoom* nZRoom, std::vector rawData, int ra string SetObjectList::GenerateExterns() { - return StringHelper::Sprintf("s16 %sObjectList0x%06X[];\n", zRoom->GetName().c_str(), segmentOffset); + return StringHelper::Sprintf("s16 %sObjectList0x%06X[];\n", zRoom->GetName().c_str(), + segmentOffset); } string SetObjectList::GenerateSourceCodePass1(string roomName, int baseAddress) { string sourceOutput = ""; - sourceOutput += StringHelper::Sprintf("%s 0x%02X, (u32)%sObjectList0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), objects.size(), zRoom->GetName().c_str(), segmentOffset); + sourceOutput += + StringHelper::Sprintf("%s 0x%02X, (u32)%sObjectList0x%06X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + objects.size(), zRoom->GetName().c_str(), segmentOffset); string declaration = ""; - for (int i = 0; i < objects.size(); i++) + for (size_t i = 0; i < objects.size(); i++) { uint16_t objectIndex = objects[i]; declaration += StringHelper::Sprintf("\t%s,", ObjectList[objectIndex].c_str()); @@ -47,8 +52,10 @@ string SetObjectList::GenerateSourceCodePass1(string roomName, int baseAddress) declaration += "\n"; } - zRoom->parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::None, objects.size() * 2, "s16", - StringHelper::Sprintf("%sObjectList0x%06X", zRoom->GetName().c_str(), segmentOffset), objects.size(), declaration); + zRoom->parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, objects.size() * 2, "s16", + StringHelper::Sprintf("%sObjectList0x%06X", zRoom->GetName().c_str(), segmentOffset), + objects.size(), declaration); return sourceOutput; } diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetPathways.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetPathways.cpp index 6795d99e92..9d70e273cf 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetPathways.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetPathways.cpp @@ -1,12 +1,13 @@ #include "SetPathways.h" -#include "../ZRoom.h" -#include "../../ZFile.h" #include "../../BitConverter.h" #include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ZRoom.h" using namespace std; -SetPathways::SetPathways(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetPathways::SetPathways(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { _rawData = rawData; _rawDataIndex = rawDataIndex; @@ -16,8 +17,6 @@ SetPathways::SetPathways(ZRoom* nZRoom, std::vector rawData, int rawDat InitList(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))); - uint32_t currentPtr = listSegmentOffset; - if (segmentOffset != 0) zRoom->parent->AddDeclarationPlaceholder(segmentOffset); } @@ -42,7 +41,7 @@ string SetPathways::GetSourceOutputCode(std::string prefix) string SetPathways::GenerateSourceCodePass1(string roomName, int baseAddress) { - //int numPathsReal = zRoom->GetDeclarationSizeFromNeighbor(listSegmentOffset) / 6; + // int numPathsReal = zRoom->GetDeclarationSizeFromNeighbor(listSegmentOffset) / 6; uint32_t currentPtr = listSegmentOffset; uint8_t* data = _rawData.data(); @@ -59,7 +58,7 @@ string SetPathways::GenerateSourceCodePass1(string roomName, int baseAddress) currentPtr += 6; } - if (numPoints == 0) // Hack for SharpOcarina + if (numPoints == 0) // Hack for SharpOcarina { for (int i = 0; i < 3; i++) { @@ -71,36 +70,44 @@ string SetPathways::GenerateSourceCodePass1(string roomName, int baseAddress) return ""; } - string SetPathways::GenerateSourceCodePass2(string roomName, int baseAddress) { string sourceOutput = ""; - sourceOutput += StringHelper::Sprintf("%s 0, (u32)&%sPathway0x%06X };", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), roomName.c_str(), segmentOffset); + sourceOutput += + StringHelper::Sprintf("%s 0, (u32)&%sPathway0x%06X };", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + roomName.c_str(), segmentOffset); { - string declaration = StringHelper::Sprintf("%i, (u32)%sPathwayList0x%06X", numPoints, roomName.c_str(), listSegmentOffset); - - zRoom->parent->AddDeclaration(segmentOffset, DeclarationAlignment::None, DeclarationPadding::None, 8, "Path", + string declaration = StringHelper::Sprintf("%i, (u32)%sPathwayList0x%06X", numPoints, + roomName.c_str(), listSegmentOffset); + + zRoom->parent->AddDeclaration( + segmentOffset, DeclarationAlignment::None, DeclarationPadding::None, 8, "Path", StringHelper::Sprintf("%sPathway0x%06X", roomName.c_str(), segmentOffset), declaration); } { string declaration = ""; - int index = 0; + size_t index = 0; for (PathwayEntry* entry : pathways) { - declaration += StringHelper::Sprintf(" { %i, %i, %i }, //0x%06X", entry->x, entry->y, entry->z, listSegmentOffset + (index * 6)); + declaration += StringHelper::Sprintf(" { %i, %i, %i }, //0x%06X", entry->x, entry->y, + entry->z, listSegmentOffset + (index * 6)); if (index < pathways.size() - 1) declaration += "\n"; - + index++; } - zRoom->parent->AddDeclarationArray(listSegmentOffset, DeclarationAlignment::None, DeclarationPadding::None, pathways.size() * 6, - "Vec3s", StringHelper::Sprintf("%sPathwayList0x%06X", roomName.c_str(), listSegmentOffset), pathways.size(), declaration); + zRoom->parent->AddDeclarationArray( + listSegmentOffset, DeclarationAlignment::None, DeclarationPadding::None, + pathways.size() * 6, "Vec3s", + StringHelper::Sprintf("%sPathwayList0x%06X", roomName.c_str(), listSegmentOffset), + pathways.size(), declaration); } return sourceOutput; @@ -113,7 +120,8 @@ int32_t SetPathways::GetRawDataSize() string SetPathways::GenerateExterns() { - return StringHelper::Sprintf("extern Vec3s %sPathwayList0x%06X[];\n", zRoom->GetName().c_str(), segmentOffset); + return StringHelper::Sprintf("extern Vec3s %sPathwayList0x%06X[];\n", zRoom->GetName().c_str(), + segmentOffset); } string SetPathways::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetPathways.h b/tools/ZAPD/ZAPD/ZRoom/Commands/SetPathways.h index 67d0322d8e..7c085fbf2c 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetPathways.h +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetPathways.h @@ -1,7 +1,7 @@ #pragma once -#include "../ZRoomCommand.h" #include "../../Vec3s.h" +#include "../ZRoomCommand.h" class PathwayEntry { diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetRoomBehavior.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetRoomBehavior.cpp index b73335ca6c..1ae7ae5652 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetRoomBehavior.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetRoomBehavior.cpp @@ -4,7 +4,8 @@ using namespace std; -SetRoomBehavior::SetRoomBehavior(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetRoomBehavior::SetRoomBehavior(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { gameplayFlags = rawData[rawDataIndex + 0x01]; gameplayFlags2 = BitConverter::ToInt32BE(rawData, rawDataIndex + 0x04); @@ -12,7 +13,10 @@ SetRoomBehavior::SetRoomBehavior(ZRoom* nZRoom, std::vector rawData, in string SetRoomBehavior::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x%02X, 0x%08X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), gameplayFlags, gameplayFlags2);; + return StringHelper::Sprintf( + "%s 0x%02X, 0x%08X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + gameplayFlags, gameplayFlags2); + ; } string SetRoomBehavior::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetRoomList.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetRoomList.cpp index e6c1889a30..823ca9a408 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetRoomList.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetRoomList.cpp @@ -1,13 +1,14 @@ #include "SetRoomList.h" -#include "../ZRoom.h" -#include "../../ZFile.h" -#include "../../Globals.h" #include "../../BitConverter.h" +#include "../../Globals.h" #include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ZRoom.h" using namespace std; -SetRoomList::SetRoomList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetRoomList::SetRoomList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { int numRooms = rawData[rawDataIndex + 1]; segmentOffset = BitConverter::ToInt32BE(rawData, rawDataIndex + 4) & 0x00FFFFFF; @@ -33,7 +34,10 @@ SetRoomList::~SetRoomList() string SetRoomList::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x%02X, (u32)&%sRoomList0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), rooms.size(), zRoom->GetName().c_str(), segmentOffset); + return StringHelper::Sprintf( + "%s 0x%02X, (u32)&%sRoomList0x%06X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), rooms.size(), + zRoom->GetName().c_str(), segmentOffset); } string SetRoomList::GenerateSourceCodePass2(string roomName, int baseAddress) @@ -43,7 +47,8 @@ string SetRoomList::GenerateSourceCodePass2(string roomName, int baseAddress) string SetRoomList::GenerateExterns() { - return StringHelper::Sprintf("extern RomFile %sRoomList0x%06X[];\n", zRoom->GetName().c_str(), segmentOffset); + return StringHelper::Sprintf("extern RomFile %sRoomList0x%06X[];\n", zRoom->GetName().c_str(), + segmentOffset); } string SetRoomList::GetCommandCName() @@ -67,13 +72,17 @@ std::string SetRoomList::PreGenSourceFiles() if (res->GetResourceType() == ZResourceType::Room && res != zRoom) { string roomName = res->GetName(); - declaration += StringHelper::Sprintf("\t{ (u32)_%sSegmentRomStart, (u32)_%sSegmentRomEnd },\n", roomName.c_str(), roomName.c_str()); + declaration += + StringHelper::Sprintf("\t{ (u32)_%sSegmentRomStart, (u32)_%sSegmentRomEnd },\n", + roomName.c_str(), roomName.c_str()); } } } - zRoom->parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::None, rooms.size() * 8, - "RomFile", StringHelper::Sprintf("%sRoomList0x%06X", zRoom->GetName().c_str(), segmentOffset), 0, declaration); + zRoom->parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, rooms.size() * 8, "RomFile", + StringHelper::Sprintf("%sRoomList0x%06X", zRoom->GetName().c_str(), segmentOffset), 0, + declaration); return std::string(); } @@ -89,6 +98,8 @@ RoomEntry::RoomEntry(int32_t nVAS, int32_t nVAE) virtualAddressEnd = nVAE; } -RoomEntry::RoomEntry(std::vector rawData, int rawDataIndex) : RoomEntry(BitConverter::ToInt32BE(rawData, rawDataIndex + 0), BitConverter::ToInt32BE(rawData, rawDataIndex + 4)) +RoomEntry::RoomEntry(std::vector rawData, int rawDataIndex) + : RoomEntry(BitConverter::ToInt32BE(rawData, rawDataIndex + 0), + BitConverter::ToInt32BE(rawData, rawDataIndex + 4)) { } \ No newline at end of file diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetSkyboxModifier.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetSkyboxModifier.cpp index 08f50c1844..a0d03c3155 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetSkyboxModifier.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetSkyboxModifier.cpp @@ -3,7 +3,8 @@ using namespace std; -SetSkyboxModifier::SetSkyboxModifier(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetSkyboxModifier::SetSkyboxModifier(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { disableSky = rawData[rawDataIndex + 0x04]; disableSunMoon = rawData[rawDataIndex + 0x05]; @@ -11,7 +12,11 @@ SetSkyboxModifier::SetSkyboxModifier(ZRoom* nZRoom, std::vector rawData string SetSkyboxModifier::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0, 0, 0, 0x%02X, 0x%02X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), disableSky, disableSunMoon);; + return StringHelper::Sprintf( + "%s 0, 0, 0, 0x%02X, 0x%02X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), disableSky, + disableSunMoon); + ; } string SetSkyboxModifier::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetSkyboxSettings.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetSkyboxSettings.cpp index 18c16365b0..f5c05e682d 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetSkyboxSettings.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetSkyboxSettings.cpp @@ -3,7 +3,8 @@ using namespace std; -SetSkyboxSettings::SetSkyboxSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetSkyboxSettings::SetSkyboxSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { skyboxNumber = rawData[rawDataIndex + 0x04]; cloudsType = rawData[rawDataIndex + 0x05]; @@ -12,8 +13,10 @@ SetSkyboxSettings::SetSkyboxSettings(ZRoom* nZRoom, std::vector rawData string SetSkyboxSettings::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x00, 0x00, 0x00, 0x%02X, 0x%02X, 0x%02X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), skyboxNumber, cloudsType, lightingSettingsControl); + return StringHelper::Sprintf( + "%s 0x00, 0x00, 0x00, 0x%02X, 0x%02X, 0x%02X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), skyboxNumber, + cloudsType, lightingSettingsControl); } string SetSkyboxSettings::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetSoundSettings.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetSoundSettings.cpp index 3fc1985d95..4668060f90 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetSoundSettings.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetSoundSettings.cpp @@ -3,7 +3,8 @@ using namespace std; -SetSoundSettings::SetSoundSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetSoundSettings::SetSoundSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { reverb = rawData[rawDataIndex + 0x01]; nightTimeSFX = rawData[rawDataIndex + 0x06]; @@ -12,7 +13,10 @@ SetSoundSettings::SetSoundSettings(ZRoom* nZRoom, std::vector rawData, string SetSoundSettings::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x%02X, 0x00, 0x00, 0x00, 0x00, 0x%02X, 0x%02X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), reverb, nightTimeSFX, musicSequence); + return StringHelper::Sprintf( + "%s 0x%02X, 0x00, 0x00, 0x00, 0x00, 0x%02X, 0x%02X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), reverb, nightTimeSFX, + musicSequence); } string SetSoundSettings::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetSpecialObjects.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetSpecialObjects.cpp index e22f6179e3..fccd1bacab 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetSpecialObjects.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetSpecialObjects.cpp @@ -4,7 +4,8 @@ using namespace std; -SetSpecialObjects::SetSpecialObjects(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetSpecialObjects::SetSpecialObjects(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { elfMessage = rawData[rawDataIndex + 0x01]; globalObject = BitConverter::ToInt16BE(rawData, rawDataIndex + 6); @@ -12,7 +13,9 @@ SetSpecialObjects::SetSpecialObjects(ZRoom* nZRoom, std::vector rawData string SetSpecialObjects::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x%02X, 0x%04X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), elfMessage, globalObject); + return StringHelper::Sprintf( + "%s 0x%02X, 0x%04X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + elfMessage, globalObject); } string SetSpecialObjects::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetStartPositionList.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetStartPositionList.cpp index e16373f546..be9bb8219a 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetStartPositionList.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetStartPositionList.cpp @@ -1,17 +1,19 @@ #include "SetStartPositionList.h" -#include "../ZRoom.h" -#include "../ActorList.h" -#include "../../ZFile.h" #include "../../BitConverter.h" #include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ActorList.h" +#include "../ZRoom.h" using namespace std; -SetStartPositionList::SetStartPositionList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetStartPositionList::SetStartPositionList(ZRoom* nZRoom, std::vector rawData, + int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { - int numActors = rawData[rawDataIndex + 1]; + uint8_t numActors = rawData[rawDataIndex + 1]; segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); - + if (segmentOffset != 0) zRoom->parent->AddDeclarationPlaceholder(segmentOffset); @@ -35,20 +37,26 @@ SetStartPositionList::~SetStartPositionList() string SetStartPositionList::GenerateSourceCodePass1(string roomName, int baseAddress) { string sourceOutput = ""; - char line[2048]; - sourceOutput += StringHelper::Sprintf("%s 0x%02X, (u32)&%sStartPositionList0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), actors.size(), zRoom->GetName().c_str(), segmentOffset); + sourceOutput += + StringHelper::Sprintf("%s 0x%02X, (u32)&%sStartPositionList0x%06X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + actors.size(), zRoom->GetName().c_str(), segmentOffset); string declaration = ""; for (ActorSpawnEntry* entry : actors) { - declaration += StringHelper::Sprintf("\t{ %s, %i, %i, %i, %i, %i, %i, 0x%04X },\n", ActorList[entry->actorNum].c_str(), entry->posX, entry->posY, entry->posZ, - entry->rotX, entry->rotY, entry->rotZ, entry->initVar); + declaration += StringHelper::Sprintf("\t{ %s, %i, %i, %i, %i, %i, %i, 0x%04X },\n", + ActorList[entry->actorNum].c_str(), entry->posX, + entry->posY, entry->posZ, entry->rotX, entry->rotY, + entry->rotZ, entry->initVar); } - zRoom->parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::None, actors.size() * 16, "ActorEntry", - StringHelper::Sprintf("%sStartPositionList0x%06X", zRoom->GetName().c_str(), segmentOffset), 0, declaration); + zRoom->parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, actors.size() * 16, "ActorEntry", + StringHelper::Sprintf("%sStartPositionList0x%06X", zRoom->GetName().c_str(), segmentOffset), + 0, declaration); return sourceOutput; } @@ -60,7 +68,8 @@ string SetStartPositionList::GenerateSourceCodePass2(string roomName, int baseAd string SetStartPositionList::GenerateExterns() { - return StringHelper::Sprintf("extern ActorEntry %sStartPositionList0x%06X[];\n", zRoom->GetName().c_str(), segmentOffset); + return StringHelper::Sprintf("extern ActorEntry %sStartPositionList0x%06X[];\n", + zRoom->GetName().c_str(), segmentOffset); } string SetStartPositionList::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetStartPositionList.h b/tools/ZAPD/ZAPD/ZRoom/Commands/SetStartPositionList.h index 90316d4e89..9452ca3db2 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetStartPositionList.h +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetStartPositionList.h @@ -3,7 +3,6 @@ #include "../ZRoomCommand.h" #include "SetActorList.h" - class SetStartPositionList : public ZRoomCommand { public: @@ -17,7 +16,7 @@ public: virtual std::string GetCommandCName(); virtual std::string GenerateExterns(); virtual RoomCommand GetRoomCommand(); + private: - uint32_t segmentOffset; }; \ No newline at end of file diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetTimeSettings.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetTimeSettings.cpp index 97e752a973..6e3272d71d 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetTimeSettings.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetTimeSettings.cpp @@ -4,7 +4,8 @@ using namespace std; -SetTimeSettings::SetTimeSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetTimeSettings::SetTimeSettings(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { hour = rawData[rawDataIndex + 4]; min = rawData[rawDataIndex + 5]; @@ -13,7 +14,9 @@ SetTimeSettings::SetTimeSettings(ZRoom* nZRoom, std::vector rawData, in string SetTimeSettings::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x00, 0x00, 0x00, 0x%02X, 0x%02X, 0x%02X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), hour, min, unk); + return StringHelper::Sprintf( + "%s 0x00, 0x00, 0x00, 0x%02X, 0x%02X, 0x%02X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), hour, min, unk); } string SetTimeSettings::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetTimeSettings.h b/tools/ZAPD/ZAPD/ZRoom/Commands/SetTimeSettings.h index fbdfc23335..de5c3bcee5 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetTimeSettings.h +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetTimeSettings.h @@ -12,8 +12,8 @@ public: virtual RoomCommand GetRoomCommand(); private: - //uint16_t time; - //int8_t speed; + // uint16_t time; + // int8_t speed; uint8_t hour; uint8_t min; diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp index fb0c299165..f73664050b 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp @@ -1,13 +1,15 @@ #include "SetTransitionActorList.h" -#include "../ZRoom.h" -#include "../ActorList.h" -#include "../../ZFile.h" #include "../../BitConverter.h" #include "../../StringHelper.h" +#include "../../ZFile.h" +#include "../ActorList.h" +#include "../ZRoom.h" using namespace std; -SetTransitionActorList::SetTransitionActorList(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetTransitionActorList::SetTransitionActorList(ZRoom* nZRoom, std::vector rawData, + int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { int numActors = rawData[rawDataIndex + 1]; segmentOffset = BitConverter::ToInt32BE(rawData, rawDataIndex + 4) & 0x00FFFFFF; @@ -38,7 +40,10 @@ string SetTransitionActorList::GetSourceOutputCode(std::string prefix) string SetTransitionActorList::GenerateSourceCodePass1(string roomName, int baseAddress) { - string sourceOutput = StringHelper::Sprintf("%s 0x%02X, (u32)%sTransitionActorList0x%06X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), transitionActors.size(), roomName.c_str(), segmentOffset); + string sourceOutput = + StringHelper::Sprintf("%s 0x%02X, (u32)%sTransitionActorList0x%06X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + transitionActors.size(), roomName.c_str(), segmentOffset); string declaration = ""; for (TransitionActorEntry* entry : transitionActors) @@ -50,16 +55,22 @@ string SetTransitionActorList::GenerateSourceCodePass1(string roomName, int base else actorStr = StringHelper::Sprintf("0x%04X", entry->actorNum); - declaration += StringHelper::Sprintf("\t{ %i, %i, %i, %i, %s, %i, %i, %i, %i, 0x%04X }, \n", entry->frontObjectRoom, entry->frontTransitionReaction, entry->backObjectRoom, entry->backTransitionReaction, actorStr.c_str(), entry->posX, entry->posY, entry->posZ, entry->rotY, (uint16_t)entry->initVar); + declaration += StringHelper::Sprintf("\t{ %i, %i, %i, %i, %s, %i, %i, %i, %i, 0x%04X }, \n", + entry->frontObjectRoom, entry->frontTransitionReaction, + entry->backObjectRoom, entry->backTransitionReaction, + actorStr.c_str(), entry->posX, entry->posY, + entry->posZ, entry->rotY, (uint16_t)entry->initVar); } - zRoom->parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::None, transitionActors.size() * 16, "TransitionActorEntry", - StringHelper::Sprintf("%sTransitionActorList0x%06X", roomName.c_str(), segmentOffset), 0, declaration); + zRoom->parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, transitionActors.size() * 16, + "TransitionActorEntry", + StringHelper::Sprintf("%sTransitionActorList0x%06X", roomName.c_str(), segmentOffset), 0, + declaration); return sourceOutput; } - string SetTransitionActorList::GenerateSourceCodePass2(string roomName, int baseAddress) { return ""; @@ -72,7 +83,8 @@ int32_t SetTransitionActorList::GetRawDataSize() string SetTransitionActorList::GenerateExterns() { - return StringHelper::Sprintf("extern TransitionActorEntry %sTransitionActorList0x%06X[];\n", zRoom->GetName().c_str(), segmentOffset); + return StringHelper::Sprintf("extern TransitionActorEntry %sTransitionActorList0x%06X[];\n", + zRoom->GetName().c_str(), segmentOffset); } string SetTransitionActorList::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/SetWind.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/SetWind.cpp index 88f12667da..8efbbbc83f 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/SetWind.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/SetWind.cpp @@ -3,7 +3,8 @@ using namespace std; -SetWind::SetWind(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetWind::SetWind(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { windWest = rawData[rawDataIndex + 0x04]; windVertical = rawData[rawDataIndex + 0x05]; @@ -13,7 +14,10 @@ SetWind::SetWind(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) string SetWind::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x00, 0x00, 0x00, 0x%02X, 0x%02X, 0x%02X, 0x%02X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), windWest, windVertical, windSouth, clothFlappingStrength); + return StringHelper::Sprintf( + "%s 0x00, 0x00, 0x00, 0x%02X, 0x%02X, 0x%02X, 0x%02X", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), windWest, + windVertical, windSouth, clothFlappingStrength); } string SetWind::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/Unused09.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/Unused09.cpp index d8b5a45fa9..9dc014d4cf 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/Unused09.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/Unused09.cpp @@ -3,13 +3,15 @@ using namespace std; -Unused09::Unused09(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +Unused09::Unused09(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { } string Unused09::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s 0x00, 0x00", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str()); + return StringHelper::Sprintf( + "%s 0x00, 0x00", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str()); } string Unused09::GetCommandCName() diff --git a/tools/ZAPD/ZAPD/ZRoom/Commands/ZRoomCommandUnk.cpp b/tools/ZAPD/ZAPD/ZRoom/Commands/ZRoomCommandUnk.cpp index c536169654..c256b26ed6 100644 --- a/tools/ZAPD/ZAPD/ZRoom/Commands/ZRoomCommandUnk.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/Commands/ZRoomCommandUnk.cpp @@ -1,10 +1,11 @@ #include "ZRoomCommandUnk.h" -#include "BitConverter.h" #include "../../StringHelper.h" +#include "BitConverter.h" using namespace std; -ZRoomCommandUnk::ZRoomCommandUnk(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) : ZRoomCommand(nZRoom, rawData, rawDataIndex) +ZRoomCommandUnk::ZRoomCommandUnk(ZRoom* nZRoom, std::vector rawData, int rawDataIndex) + : ZRoomCommand(nZRoom, rawData, rawDataIndex) { cmdID = (RoomCommand)rawData[rawDataIndex]; cmdAddress = rawDataIndex; @@ -16,7 +17,10 @@ ZRoomCommandUnk::ZRoomCommandUnk(ZRoom* nZRoom, std::vector rawData, in string ZRoomCommandUnk::GenerateSourceCodePass1(string roomName, int baseAddress) { - return StringHelper::Sprintf("%s %sSet%04XCmd%02X = { 0x%02X, 0x%02X, 0x%06X }; /* WARNING: UNIMPLEMENTED ROOM COMMAND */", GetCommandCName().c_str(), roomName.c_str(), baseAddress, data2, cmdID, data1, data2); + return StringHelper::Sprintf("%s %sSet%04XCmd%02X = { 0x%02X, 0x%02X, 0x%06X }; /* WARNING: " + "UNIMPLEMENTED ROOM COMMAND */", + GetCommandCName().c_str(), roomName.c_str(), baseAddress, data2, + cmdID, data1, data2); } string ZRoomCommandUnk::GenerateSourceCodePass2(string roomName, int baseAddress) diff --git a/tools/ZAPD/ZAPD/ZRoom/ObjectList.h b/tools/ZAPD/ZAPD/ZRoom/ObjectList.h index 57d908de34..5b40cada52 100644 --- a/tools/ZAPD/ZAPD/ZRoom/ObjectList.h +++ b/tools/ZAPD/ZAPD/ZRoom/ObjectList.h @@ -2,408 +2,407 @@ #include -static const std::string ObjectList[] = -{ - /* 0x0000 */ "OBJECT_UNSET_0", - /* 0x0001 */ "OBJECT_GAMEPLAY_KEEP", - /* 0x0002 */ "OBJECT_GAMEPLAY_FIELD_KEEP", - /* 0x0003 */ "OBJECT_GAMEPLAY_DANGEON_KEEP", - /* 0x0004 */ "OBJECT_UNSET_4", - /* 0x0005 */ "OBJECT_UNSET_5", - /* 0x0006 */ "OBJECT_HUMAN", - /* 0x0007 */ "OBJECT_OKUTA", - /* 0x0008 */ "OBJECT_CROW", - /* 0x0009 */ "OBJECT_POH", - /* 0x000A */ "OBJECT_DY_OBJ", - /* 0x000B */ "OBJECT_WALLMASTER", - /* 0x000C */ "OBJECT_DODONGO", - /* 0x000D */ "OBJECT_FIREFLY", - /* 0x000E */ "OBJECT_BOX", - /* 0x000F */ "OBJECT_FIRE", - /* 0x0010 */ "OBJECT_UNSET_10", - /* 0x0011 */ "OBJECT_UNSET_11", - /* 0x0012 */ "OBJECT_BUBBLE", - /* 0x0013 */ "OBJECT_NIW", - /* 0x0014 */ "OBJECT_LINK_BOY", - /* 0x0015 */ "OBJECT_LINK_CHILD", - /* 0x0016 */ "OBJECT_TITE", - /* 0x0017 */ "OBJECT_REEBA", - /* 0x0018 */ "OBJECT_PEEHAT", - /* 0x0019 */ "OBJECT_KINGDODONGO", - /* 0x001A */ "OBJECT_HORSE", - /* 0x001B */ "OBJECT_ZF", - /* 0x001C */ "OBJECT_GOMA", - /* 0x001D */ "OBJECT_ZL1", - /* 0x001E */ "OBJECT_GOL", - /* 0x001F */ "OBJECT_DODOJR", - /* 0x0020 */ "OBJECT_TORCH2", - /* 0x0021 */ "OBJECT_BL", - /* 0x0022 */ "OBJECT_TP", - /* 0x0023 */ "OBJECT_OA1", - /* 0x0024 */ "OBJECT_ST", - /* 0x0025 */ "OBJECT_BW", - /* 0x0026 */ "OBJECT_EI", - /* 0x0027 */ "OBJECT_HORSE_NORMAL", - /* 0x0028 */ "OBJECT_OB1", - /* 0x0029 */ "OBJECT_O_ANIME", - /* 0x002A */ "OBJECT_SPOT04_OBJECTS", - /* 0x002B */ "OBJECT_DDAN_OBJECTS", - /* 0x002C */ "OBJECT_HIDAN_OBJECTS", - /* 0x002D */ "OBJECT_HORSE_GANON", - /* 0x002E */ "OBJECT_OA2", - /* 0x002F */ "OBJECT_SPOT00_OBJECTS", - /* 0x0030 */ "OBJECT_MB", - /* 0x0031 */ "OBJECT_BOMBF", - /* 0x0032 */ "OBJECT_SK2", - /* 0x0033 */ "OBJECT_OE1", - /* 0x0034 */ "OBJECT_OE_ANIME", - /* 0x0035 */ "OBJECT_OE2", - /* 0x0036 */ "OBJECT_YDAN_OBJECTS", - /* 0x0037 */ "OBJECT_GND", - /* 0x0038 */ "OBJECT_AM", - /* 0x0039 */ "OBJECT_DEKUBABA", - /* 0x003A */ "OBJECT_UNSET_3A", - /* 0x003B */ "OBJECT_OA3", - /* 0x003C */ "OBJECT_OA4", - /* 0x003D */ "OBJECT_OA5", - /* 0x003E */ "OBJECT_OA6", - /* 0x003F */ "OBJECT_OA7", - /* 0x0040 */ "OBJECT_JJ", - /* 0x0041 */ "OBJECT_OA8", - /* 0x0042 */ "OBJECT_OA9", - /* 0x0043 */ "OBJECT_OB2", - /* 0x0044 */ "OBJECT_OB3", - /* 0x0045 */ "OBJECT_OB4", - /* 0x0046 */ "OBJECT_HORSE_ZELDA", - /* 0x0047 */ "OBJECT_OPENING_DEMO1", - /* 0x0048 */ "OBJECT_WARP1", - /* 0x0049 */ "OBJECT_B_HEART", - /* 0x004A */ "OBJECT_DEKUNUTS", - /* 0x004B */ "OBJECT_OE3", - /* 0x004C */ "OBJECT_OE4", - /* 0x004D */ "OBJECT_MENKURI_OBJECTS", - /* 0x004E */ "OBJECT_OE5", - /* 0x004F */ "OBJECT_OE6", - /* 0x0050 */ "OBJECT_OE7", - /* 0x0051 */ "OBJECT_OE8", - /* 0x0052 */ "OBJECT_OE9", - /* 0x0053 */ "OBJECT_OE10", - /* 0x0054 */ "OBJECT_OE11", - /* 0x0055 */ "OBJECT_OE12", - /* 0x0056 */ "OBJECT_VALI", - /* 0x0057 */ "OBJECT_OA10", - /* 0x0058 */ "OBJECT_OA11", - /* 0x0059 */ "OBJECT_MIZU_OBJECTS", - /* 0x005A */ "OBJECT_FHG", - /* 0x005B */ "OBJECT_OSSAN", - /* 0x005C */ "OBJECT_MORI_HINERI1", - /* 0x005D */ "OBJECT_BB", - /* 0x005E */ "OBJECT_TOKI_OBJECTS", - /* 0x005F */ "OBJECT_YUKABYUN", - /* 0x0060 */ "OBJECT_ZL2", - /* 0x0061 */ "OBJECT_MJIN", - /* 0x0062 */ "OBJECT_MJIN_FLASH", - /* 0x0063 */ "OBJECT_MJIN_DARK", - /* 0x0064 */ "OBJECT_MJIN_FLAME", - /* 0x0065 */ "OBJECT_MJIN_ICE", - /* 0x0066 */ "OBJECT_MJIN_SOUL", - /* 0x0067 */ "OBJECT_MJIN_WIND", - /* 0x0068 */ "OBJECT_MJIN_OKA", - /* 0x0069 */ "OBJECT_HAKA_OBJECTS", - /* 0x006A */ "OBJECT_SPOT06_OBJECTS", - /* 0x006B */ "OBJECT_ICE_OBJECTS", - /* 0x006C */ "OBJECT_RELAY_OBJECTS", - /* 0x006D */ "OBJECT_PO_FIELD", - /* 0x006E */ "OBJECT_PO_COMPOSER", - /* 0x006F */ "OBJECT_MORI_HINERI1A", - /* 0x0070 */ "OBJECT_MORI_HINERI2", - /* 0x0071 */ "OBJECT_MORI_HINERI2A", - /* 0x0072 */ "OBJECT_MORI_OBJECTS", - /* 0x0073 */ "OBJECT_MORI_TEX", - /* 0x0074 */ "OBJECT_SPOT08_OBJ", - /* 0x0075 */ "OBJECT_WARP2", - /* 0x0076 */ "OBJECT_HATA", - /* 0x0077 */ "OBJECT_BIRD", - /* 0x0078 */ "OBJECT_UNSET_78", - /* 0x0079 */ "OBJECT_UNSET_79", - /* 0x007A */ "OBJECT_UNSET_7A", - /* 0x007B */ "OBJECT_UNSET_7B", - /* 0x007C */ "OBJECT_WOOD02", - /* 0x007D */ "OBJECT_UNSET_7D", - /* 0x007E */ "OBJECT_UNSET_7E", - /* 0x007F */ "OBJECT_UNSET_7F", - /* 0x0080 */ "OBJECT_UNSET_80", - /* 0x0081 */ "OBJECT_LIGHTBOX", - /* 0x0082 */ "OBJECT_PU_BOX", - /* 0x0083 */ "OBJECT_UNSET_83", - /* 0x0084 */ "OBJECT_UNSET_84", - /* 0x0085 */ "OBJECT_TRAP", - /* 0x0086 */ "OBJECT_VASE", - /* 0x0087 */ "OBJECT_IM", - /* 0x0088 */ "OBJECT_TA", - /* 0x0089 */ "OBJECT_TK", - /* 0x008A */ "OBJECT_XC", - /* 0x008B */ "OBJECT_VM", - /* 0x008C */ "OBJECT_BV", - /* 0x008D */ "OBJECT_HAKACH_OBJECTS", - /* 0x008E */ "OBJECT_EFC_CRYSTAL_LIGHT", - /* 0x008F */ "OBJECT_EFC_FIRE_BALL", - /* 0x0090 */ "OBJECT_EFC_FLASH", - /* 0x0091 */ "OBJECT_EFC_LGT_SHOWER", - /* 0x0092 */ "OBJECT_EFC_STAR_FIELD", - /* 0x0093 */ "OBJECT_GOD_LGT", - /* 0x0094 */ "OBJECT_LIGHT_RING", - /* 0x0095 */ "OBJECT_TRIFORCE_SPOT", - /* 0x0096 */ "OBJECT_BDAN_OBJECTS", - /* 0x0097 */ "OBJECT_SD", - /* 0x0098 */ "OBJECT_RD", - /* 0x0099 */ "OBJECT_PO_SISTERS", - /* 0x009A */ "OBJECT_HEAVY_OBJECT", - /* 0x009B */ "OBJECT_GNDD", - /* 0x009C */ "OBJECT_FD", - /* 0x009D */ "OBJECT_DU", - /* 0x009E */ "OBJECT_FW", - /* 0x009F */ "OBJECT_MEDAL", - /* 0x00A0 */ "OBJECT_HORSE_LINK_CHILD", - /* 0x00A1 */ "OBJECT_SPOT02_OBJECTS", - /* 0x00A2 */ "OBJECT_HAKA", - /* 0x00A3 */ "OBJECT_RU1", - /* 0x00A4 */ "OBJECT_SYOKUDAI", - /* 0x00A5 */ "OBJECT_FD2", - /* 0x00A6 */ "OBJECT_DH", - /* 0x00A7 */ "OBJECT_RL", - /* 0x00A8 */ "OBJECT_EFC_TW", - /* 0x00A9 */ "OBJECT_DEMO_TRE_LGT", - /* 0x00AA */ "OBJECT_GI_KEY", - /* 0x00AB */ "OBJECT_MIR_RAY", - /* 0x00AC */ "OBJECT_BROB", - /* 0x00AD */ "OBJECT_GI_JEWEL", - /* 0x00AE */ "OBJECT_SPOT09_OBJ", - /* 0x00AF */ "OBJECT_SPOT18_OBJ", - /* 0x00B0 */ "OBJECT_BDOOR", - /* 0x00B1 */ "OBJECT_SPOT17_OBJ", - /* 0x00B2 */ "OBJECT_SHOP_DUNGEN", - /* 0x00B3 */ "OBJECT_NB", - /* 0x00B4 */ "OBJECT_MO", - /* 0x00B5 */ "OBJECT_SB", - /* 0x00B6 */ "OBJECT_GI_MELODY", - /* 0x00B7 */ "OBJECT_GI_HEART", - /* 0x00B8 */ "OBJECT_GI_COMPASS", - /* 0x00B9 */ "OBJECT_GI_BOSSKEY", - /* 0x00BA */ "OBJECT_GI_MEDAL", - /* 0x00BB */ "OBJECT_GI_NUTS", - /* 0x00BC */ "OBJECT_SA", - /* 0x00BD */ "OBJECT_GI_HEARTS", - /* 0x00BE */ "OBJECT_GI_ARROWCASE", - /* 0x00BF */ "OBJECT_GI_BOMBPOUCH", - /* 0x00C0 */ "OBJECT_IN", - /* 0x00C1 */ "OBJECT_TR", - /* 0x00C2 */ "OBJECT_SPOT16_OBJ", - /* 0x00C3 */ "OBJECT_OE1S", - /* 0x00C4 */ "OBJECT_OE4S", - /* 0x00C5 */ "OBJECT_OS_ANIME", - /* 0x00C6 */ "OBJECT_GI_BOTTLE", - /* 0x00C7 */ "OBJECT_GI_STICK", - /* 0x00C8 */ "OBJECT_GI_MAP", - /* 0x00C9 */ "OBJECT_OF1D_MAP", - /* 0x00CA */ "OBJECT_RU2", - /* 0x00CB */ "OBJECT_GI_SHIELD_1", - /* 0x00CC */ "OBJECT_DEKUJR", - /* 0x00CD */ "OBJECT_GI_MAGICPOT", - /* 0x00CE */ "OBJECT_GI_BOMB_1", - /* 0x00CF */ "OBJECT_OF1S", - /* 0x00D0 */ "OBJECT_MA2", - /* 0x00D1 */ "OBJECT_GI_PURSE", - /* 0x00D2 */ "OBJECT_HNI", - /* 0x00D3 */ "OBJECT_TW", - /* 0x00D4 */ "OBJECT_RR", - /* 0x00D5 */ "OBJECT_BXA", - /* 0x00D6 */ "OBJECT_ANUBICE", - /* 0x00D7 */ "OBJECT_GI_GERUDO", - /* 0x00D8 */ "OBJECT_GI_ARROW", - /* 0x00D9 */ "OBJECT_GI_BOMB_2", - /* 0x00DA */ "OBJECT_GI_EGG", - /* 0x00DB */ "OBJECT_GI_SCALE", - /* 0x00DC */ "OBJECT_GI_SHIELD_2", - /* 0x00DD */ "OBJECT_GI_HOOKSHOT", - /* 0x00DE */ "OBJECT_GI_OCARINA", - /* 0x00DF */ "OBJECT_GI_MILK", - /* 0x00E0 */ "OBJECT_MA1", - /* 0x00E1 */ "OBJECT_GANON", - /* 0x00E2 */ "OBJECT_SST", - /* 0x00E3 */ "OBJECT_NY_UNUSED", - /* 0x00E4 */ "OBJECT_UNSET_E4", - /* 0x00E5 */ "OBJECT_NY", - /* 0x00E6 */ "OBJECT_FR", - /* 0x00E7 */ "OBJECT_GI_PACHINKO", - /* 0x00E8 */ "OBJECT_GI_BOOMERANG", - /* 0x00E9 */ "OBJECT_GI_BOW", - /* 0x00EA */ "OBJECT_GI_GLASSES", - /* 0x00EB */ "OBJECT_GI_LIQUID", - /* 0x00EC */ "OBJECT_ANI", - /* 0x00ED */ "OBJECT_DEMO_6K", - /* 0x00EE */ "OBJECT_GI_SHIELD_3", - /* 0x00EF */ "OBJECT_GI_LETTER", - /* 0x00F0 */ "OBJECT_SPOT15_OBJ", - /* 0x00F1 */ "OBJECT_JYA_OBJ", - /* 0x00F2 */ "OBJECT_GI_CLOTHES", - /* 0x00F3 */ "OBJECT_GI_BEAN", - /* 0x00F4 */ "OBJECT_GI_FISH", - /* 0x00F5 */ "OBJECT_GI_SAW", - /* 0x00F6 */ "OBJECT_GI_HAMMER", - /* 0x00F7 */ "OBJECT_GI_GRASS", - /* 0x00F8 */ "OBJECT_GI_LONGSWORD", - /* 0x00F9 */ "OBJECT_SPOT01_OBJECTS", - /* 0x00FA */ "OBJECT_MD_UNUSED", - /* 0x00FB */ "OBJECT_MD", - /* 0x00FC */ "OBJECT_KM1", - /* 0x00FD */ "OBJECT_KW1", - /* 0x00FE */ "OBJECT_ZO", - /* 0x00FF */ "OBJECT_KZ", - /* 0x0100 */ "OBJECT_UMAJUMP", - /* 0x0101 */ "OBJECT_MASTERKOKIRI", - /* 0x0102 */ "OBJECT_MASTERKOKIRIHEAD", - /* 0x0103 */ "OBJECT_MASTERGOLON", - /* 0x0104 */ "OBJECT_MASTERZOORA", - /* 0x0105 */ "OBJECT_AOB", - /* 0x0106 */ "OBJECT_IK", - /* 0x0107 */ "OBJECT_AHG", - /* 0x0108 */ "OBJECT_CNE", - /* 0x0109 */ "OBJECT_GI_NIWATORI", - /* 0x010A */ "OBJECT_SKJ", - /* 0x010B */ "OBJECT_GI_BOTTLE_LETTER", - /* 0x010C */ "OBJECT_BJI", - /* 0x010D */ "OBJECT_BBA", - /* 0x010E */ "OBJECT_GI_OCARINA_0", - /* 0x010F */ "OBJECT_DS", - /* 0x0110 */ "OBJECT_ANE", - /* 0x0111 */ "OBJECT_BOJ", - /* 0x0112 */ "OBJECT_SPOT03_OBJECT", - /* 0x0113 */ "OBJECT_SPOT07_OBJECT", - /* 0x0114 */ "OBJECT_FZ", - /* 0x0115 */ "OBJECT_BOB", - /* 0x0116 */ "OBJECT_GE1", - /* 0x0117 */ "OBJECT_YABUSAME_POINT", - /* 0x0118 */ "OBJECT_GI_BOOTS_2", - /* 0x0119 */ "OBJECT_GI_SEED", - /* 0x011A */ "OBJECT_GND_MAGIC", - /* 0x011B */ "OBJECT_D_ELEVATOR", - /* 0x011C */ "OBJECT_D_HSBLOCK", - /* 0x011D */ "OBJECT_D_LIFT", - /* 0x011E */ "OBJECT_MAMENOKI", - /* 0x011F */ "OBJECT_GOROIWA", - /* 0x0120 */ "OBJECT_UNSET_120", - /* 0x0121 */ "OBJECT_TORYO", - /* 0x0122 */ "OBJECT_DAIKU", - /* 0x0123 */ "OBJECT_UNSET_123", - /* 0x0124 */ "OBJECT_NWC", - /* 0x0125 */ "OBJECT_BLKOBJ", - /* 0x0126 */ "OBJECT_GM", - /* 0x0127 */ "OBJECT_MS", - /* 0x0128 */ "OBJECT_HS", - /* 0x0129 */ "OBJECT_INGATE", - /* 0x012A */ "OBJECT_LIGHTSWITCH", - /* 0x012B */ "OBJECT_KUSA", - /* 0x012C */ "OBJECT_TSUBO", - /* 0x012D */ "OBJECT_GI_GLOVES", - /* 0x012E */ "OBJECT_GI_COIN", - /* 0x012F */ "OBJECT_KANBAN", - /* 0x0130 */ "OBJECT_GJYO_OBJECTS", - /* 0x0131 */ "OBJECT_OWL", - /* 0x0132 */ "OBJECT_MK", - /* 0x0133 */ "OBJECT_FU", - /* 0x0134 */ "OBJECT_GI_KI_TAN_MASK", - /* 0x0135 */ "OBJECT_GI_REDEAD_MASK", - /* 0x0136 */ "OBJECT_GI_SKJ_MASK", - /* 0x0137 */ "OBJECT_GI_RABIT_MASK", - /* 0x0138 */ "OBJECT_GI_TRUTH_MASK", - /* 0x0139 */ "OBJECT_GANON_OBJECTS", - /* 0x013A */ "OBJECT_SIOFUKI", - /* 0x013B */ "OBJECT_STREAM", - /* 0x013C */ "OBJECT_MM", - /* 0x013D */ "OBJECT_FA", - /* 0x013E */ "OBJECT_OS", - /* 0x013F */ "OBJECT_GI_EYE_LOTION", - /* 0x0140 */ "OBJECT_GI_POWDER", - /* 0x0141 */ "OBJECT_GI_MUSHROOM", - /* 0x0142 */ "OBJECT_GI_TICKETSTONE", - /* 0x0143 */ "OBJECT_GI_BROKENSWORD", - /* 0x0144 */ "OBJECT_JS", - /* 0x0145 */ "OBJECT_CS", - /* 0x0146 */ "OBJECT_GI_PRESCRIPTION", - /* 0x0147 */ "OBJECT_GI_BRACELET", - /* 0x0148 */ "OBJECT_GI_SOLDOUT", - /* 0x0149 */ "OBJECT_GI_FROG", - /* 0x014A */ "OBJECT_MAG", - /* 0x014B */ "OBJECT_DOOR_GERUDO", - /* 0x014C */ "OBJECT_GT", - /* 0x014D */ "OBJECT_EFC_ERUPC", - /* 0x014E */ "OBJECT_ZL2_ANIME1", - /* 0x014F */ "OBJECT_ZL2_ANIME2", - /* 0x0150 */ "OBJECT_GI_GOLONMASK", - /* 0x0151 */ "OBJECT_GI_ZORAMASK", - /* 0x0152 */ "OBJECT_GI_GERUDOMASK", - /* 0x0153 */ "OBJECT_GANON2", - /* 0x0154 */ "OBJECT_KA", - /* 0x0155 */ "OBJECT_TS", - /* 0x0156 */ "OBJECT_ZG", - /* 0x0157 */ "OBJECT_GI_HOVERBOOTS", - /* 0x0158 */ "OBJECT_GI_M_ARROW", - /* 0x0159 */ "OBJECT_DS2", - /* 0x015A */ "OBJECT_EC", - /* 0x015B */ "OBJECT_FISH", - /* 0x015C */ "OBJECT_GI_SUTARU", - /* 0x015D */ "OBJECT_GI_GODDESS", - /* 0x015E */ "OBJECT_SSH", - /* 0x015F */ "OBJECT_BIGOKUTA", - /* 0x0160 */ "OBJECT_BG", - /* 0x0161 */ "OBJECT_SPOT05_OBJECTS", - /* 0x0162 */ "OBJECT_SPOT12_OBJ", - /* 0x0163 */ "OBJECT_BOMBIWA", - /* 0x0164 */ "OBJECT_HINTNUTS", - /* 0x0165 */ "OBJECT_RS", - /* 0x0166 */ "OBJECT_SPOT00_BREAK", - /* 0x0167 */ "OBJECT_GLA", - /* 0x0168 */ "OBJECT_SHOPNUTS", - /* 0x0169 */ "OBJECT_GELDB", - /* 0x016A */ "OBJECT_GR", - /* 0x016B */ "OBJECT_DOG", - /* 0x016C */ "OBJECT_JYA_IRON", - /* 0x016D */ "OBJECT_JYA_DOOR", - /* 0x016E */ "OBJECT_UNSET_16E", - /* 0x016F */ "OBJECT_SPOT11_OBJ", - /* 0x0170 */ "OBJECT_KIBAKO2", - /* 0x0171 */ "OBJECT_DNS", - /* 0x0172 */ "OBJECT_DNK", - /* 0x0173 */ "OBJECT_GI_FIRE", - /* 0x0174 */ "OBJECT_GI_INSECT", - /* 0x0175 */ "OBJECT_GI_BUTTERFLY", - /* 0x0176 */ "OBJECT_GI_GHOST", - /* 0x0177 */ "OBJECT_GI_SOUL", - /* 0x0178 */ "OBJECT_BOWL", - /* 0x0179 */ "OBJECT_DEMO_KEKKAI", - /* 0x017A */ "OBJECT_EFC_DOUGHNUT", - /* 0x017B */ "OBJECT_GI_DEKUPOUCH", - /* 0x017C */ "OBJECT_GANON_ANIME1", - /* 0x017D */ "OBJECT_GANON_ANIME2", - /* 0x017E */ "OBJECT_GANON_ANIME3", - /* 0x017F */ "OBJECT_GI_RUPY", - /* 0x0180 */ "OBJECT_SPOT01_MATOYA", - /* 0x0181 */ "OBJECT_SPOT01_MATOYAB", - /* 0x0182 */ "OBJECT_MU", - /* 0x0183 */ "OBJECT_WF", - /* 0x0184 */ "OBJECT_SKB", - /* 0x0185 */ "OBJECT_GJ", - /* 0x0186 */ "OBJECT_GEFF", - /* 0x0187 */ "OBJECT_HAKA_DOOR", - /* 0x0188 */ "OBJECT_GS", - /* 0x0189 */ "OBJECT_PS", - /* 0x018A */ "OBJECT_BWALL", - /* 0x018B */ "OBJECT_COW", - /* 0x018C */ "OBJECT_COB", - /* 0x018D */ "OBJECT_GI_SWORD_1", - /* 0x018E */ "OBJECT_DOOR_KILLER", - /* 0x018F */ "OBJECT_OUKE_HAKA", - /* 0x0190 */ "OBJECT_TIMEBLOCK", - /* 0x0191 */ "OBJECT_ZL4", +static const std::string ObjectList[] = { + /* 0x0000 */ "OBJECT_UNSET_0", + /* 0x0001 */ "OBJECT_GAMEPLAY_KEEP", + /* 0x0002 */ "OBJECT_GAMEPLAY_FIELD_KEEP", + /* 0x0003 */ "OBJECT_GAMEPLAY_DANGEON_KEEP", + /* 0x0004 */ "OBJECT_UNSET_4", + /* 0x0005 */ "OBJECT_UNSET_5", + /* 0x0006 */ "OBJECT_HUMAN", + /* 0x0007 */ "OBJECT_OKUTA", + /* 0x0008 */ "OBJECT_CROW", + /* 0x0009 */ "OBJECT_POH", + /* 0x000A */ "OBJECT_DY_OBJ", + /* 0x000B */ "OBJECT_WALLMASTER", + /* 0x000C */ "OBJECT_DODONGO", + /* 0x000D */ "OBJECT_FIREFLY", + /* 0x000E */ "OBJECT_BOX", + /* 0x000F */ "OBJECT_FIRE", + /* 0x0010 */ "OBJECT_UNSET_10", + /* 0x0011 */ "OBJECT_UNSET_11", + /* 0x0012 */ "OBJECT_BUBBLE", + /* 0x0013 */ "OBJECT_NIW", + /* 0x0014 */ "OBJECT_LINK_BOY", + /* 0x0015 */ "OBJECT_LINK_CHILD", + /* 0x0016 */ "OBJECT_TITE", + /* 0x0017 */ "OBJECT_REEBA", + /* 0x0018 */ "OBJECT_PEEHAT", + /* 0x0019 */ "OBJECT_KINGDODONGO", + /* 0x001A */ "OBJECT_HORSE", + /* 0x001B */ "OBJECT_ZF", + /* 0x001C */ "OBJECT_GOMA", + /* 0x001D */ "OBJECT_ZL1", + /* 0x001E */ "OBJECT_GOL", + /* 0x001F */ "OBJECT_DODOJR", + /* 0x0020 */ "OBJECT_TORCH2", + /* 0x0021 */ "OBJECT_BL", + /* 0x0022 */ "OBJECT_TP", + /* 0x0023 */ "OBJECT_OA1", + /* 0x0024 */ "OBJECT_ST", + /* 0x0025 */ "OBJECT_BW", + /* 0x0026 */ "OBJECT_EI", + /* 0x0027 */ "OBJECT_HORSE_NORMAL", + /* 0x0028 */ "OBJECT_OB1", + /* 0x0029 */ "OBJECT_O_ANIME", + /* 0x002A */ "OBJECT_SPOT04_OBJECTS", + /* 0x002B */ "OBJECT_DDAN_OBJECTS", + /* 0x002C */ "OBJECT_HIDAN_OBJECTS", + /* 0x002D */ "OBJECT_HORSE_GANON", + /* 0x002E */ "OBJECT_OA2", + /* 0x002F */ "OBJECT_SPOT00_OBJECTS", + /* 0x0030 */ "OBJECT_MB", + /* 0x0031 */ "OBJECT_BOMBF", + /* 0x0032 */ "OBJECT_SK2", + /* 0x0033 */ "OBJECT_OE1", + /* 0x0034 */ "OBJECT_OE_ANIME", + /* 0x0035 */ "OBJECT_OE2", + /* 0x0036 */ "OBJECT_YDAN_OBJECTS", + /* 0x0037 */ "OBJECT_GND", + /* 0x0038 */ "OBJECT_AM", + /* 0x0039 */ "OBJECT_DEKUBABA", + /* 0x003A */ "OBJECT_UNSET_3A", + /* 0x003B */ "OBJECT_OA3", + /* 0x003C */ "OBJECT_OA4", + /* 0x003D */ "OBJECT_OA5", + /* 0x003E */ "OBJECT_OA6", + /* 0x003F */ "OBJECT_OA7", + /* 0x0040 */ "OBJECT_JJ", + /* 0x0041 */ "OBJECT_OA8", + /* 0x0042 */ "OBJECT_OA9", + /* 0x0043 */ "OBJECT_OB2", + /* 0x0044 */ "OBJECT_OB3", + /* 0x0045 */ "OBJECT_OB4", + /* 0x0046 */ "OBJECT_HORSE_ZELDA", + /* 0x0047 */ "OBJECT_OPENING_DEMO1", + /* 0x0048 */ "OBJECT_WARP1", + /* 0x0049 */ "OBJECT_B_HEART", + /* 0x004A */ "OBJECT_DEKUNUTS", + /* 0x004B */ "OBJECT_OE3", + /* 0x004C */ "OBJECT_OE4", + /* 0x004D */ "OBJECT_MENKURI_OBJECTS", + /* 0x004E */ "OBJECT_OE5", + /* 0x004F */ "OBJECT_OE6", + /* 0x0050 */ "OBJECT_OE7", + /* 0x0051 */ "OBJECT_OE8", + /* 0x0052 */ "OBJECT_OE9", + /* 0x0053 */ "OBJECT_OE10", + /* 0x0054 */ "OBJECT_OE11", + /* 0x0055 */ "OBJECT_OE12", + /* 0x0056 */ "OBJECT_VALI", + /* 0x0057 */ "OBJECT_OA10", + /* 0x0058 */ "OBJECT_OA11", + /* 0x0059 */ "OBJECT_MIZU_OBJECTS", + /* 0x005A */ "OBJECT_FHG", + /* 0x005B */ "OBJECT_OSSAN", + /* 0x005C */ "OBJECT_MORI_HINERI1", + /* 0x005D */ "OBJECT_BB", + /* 0x005E */ "OBJECT_TOKI_OBJECTS", + /* 0x005F */ "OBJECT_YUKABYUN", + /* 0x0060 */ "OBJECT_ZL2", + /* 0x0061 */ "OBJECT_MJIN", + /* 0x0062 */ "OBJECT_MJIN_FLASH", + /* 0x0063 */ "OBJECT_MJIN_DARK", + /* 0x0064 */ "OBJECT_MJIN_FLAME", + /* 0x0065 */ "OBJECT_MJIN_ICE", + /* 0x0066 */ "OBJECT_MJIN_SOUL", + /* 0x0067 */ "OBJECT_MJIN_WIND", + /* 0x0068 */ "OBJECT_MJIN_OKA", + /* 0x0069 */ "OBJECT_HAKA_OBJECTS", + /* 0x006A */ "OBJECT_SPOT06_OBJECTS", + /* 0x006B */ "OBJECT_ICE_OBJECTS", + /* 0x006C */ "OBJECT_RELAY_OBJECTS", + /* 0x006D */ "OBJECT_PO_FIELD", + /* 0x006E */ "OBJECT_PO_COMPOSER", + /* 0x006F */ "OBJECT_MORI_HINERI1A", + /* 0x0070 */ "OBJECT_MORI_HINERI2", + /* 0x0071 */ "OBJECT_MORI_HINERI2A", + /* 0x0072 */ "OBJECT_MORI_OBJECTS", + /* 0x0073 */ "OBJECT_MORI_TEX", + /* 0x0074 */ "OBJECT_SPOT08_OBJ", + /* 0x0075 */ "OBJECT_WARP2", + /* 0x0076 */ "OBJECT_HATA", + /* 0x0077 */ "OBJECT_BIRD", + /* 0x0078 */ "OBJECT_UNSET_78", + /* 0x0079 */ "OBJECT_UNSET_79", + /* 0x007A */ "OBJECT_UNSET_7A", + /* 0x007B */ "OBJECT_UNSET_7B", + /* 0x007C */ "OBJECT_WOOD02", + /* 0x007D */ "OBJECT_UNSET_7D", + /* 0x007E */ "OBJECT_UNSET_7E", + /* 0x007F */ "OBJECT_UNSET_7F", + /* 0x0080 */ "OBJECT_UNSET_80", + /* 0x0081 */ "OBJECT_LIGHTBOX", + /* 0x0082 */ "OBJECT_PU_BOX", + /* 0x0083 */ "OBJECT_UNSET_83", + /* 0x0084 */ "OBJECT_UNSET_84", + /* 0x0085 */ "OBJECT_TRAP", + /* 0x0086 */ "OBJECT_VASE", + /* 0x0087 */ "OBJECT_IM", + /* 0x0088 */ "OBJECT_TA", + /* 0x0089 */ "OBJECT_TK", + /* 0x008A */ "OBJECT_XC", + /* 0x008B */ "OBJECT_VM", + /* 0x008C */ "OBJECT_BV", + /* 0x008D */ "OBJECT_HAKACH_OBJECTS", + /* 0x008E */ "OBJECT_EFC_CRYSTAL_LIGHT", + /* 0x008F */ "OBJECT_EFC_FIRE_BALL", + /* 0x0090 */ "OBJECT_EFC_FLASH", + /* 0x0091 */ "OBJECT_EFC_LGT_SHOWER", + /* 0x0092 */ "OBJECT_EFC_STAR_FIELD", + /* 0x0093 */ "OBJECT_GOD_LGT", + /* 0x0094 */ "OBJECT_LIGHT_RING", + /* 0x0095 */ "OBJECT_TRIFORCE_SPOT", + /* 0x0096 */ "OBJECT_BDAN_OBJECTS", + /* 0x0097 */ "OBJECT_SD", + /* 0x0098 */ "OBJECT_RD", + /* 0x0099 */ "OBJECT_PO_SISTERS", + /* 0x009A */ "OBJECT_HEAVY_OBJECT", + /* 0x009B */ "OBJECT_GNDD", + /* 0x009C */ "OBJECT_FD", + /* 0x009D */ "OBJECT_DU", + /* 0x009E */ "OBJECT_FW", + /* 0x009F */ "OBJECT_MEDAL", + /* 0x00A0 */ "OBJECT_HORSE_LINK_CHILD", + /* 0x00A1 */ "OBJECT_SPOT02_OBJECTS", + /* 0x00A2 */ "OBJECT_HAKA", + /* 0x00A3 */ "OBJECT_RU1", + /* 0x00A4 */ "OBJECT_SYOKUDAI", + /* 0x00A5 */ "OBJECT_FD2", + /* 0x00A6 */ "OBJECT_DH", + /* 0x00A7 */ "OBJECT_RL", + /* 0x00A8 */ "OBJECT_EFC_TW", + /* 0x00A9 */ "OBJECT_DEMO_TRE_LGT", + /* 0x00AA */ "OBJECT_GI_KEY", + /* 0x00AB */ "OBJECT_MIR_RAY", + /* 0x00AC */ "OBJECT_BROB", + /* 0x00AD */ "OBJECT_GI_JEWEL", + /* 0x00AE */ "OBJECT_SPOT09_OBJ", + /* 0x00AF */ "OBJECT_SPOT18_OBJ", + /* 0x00B0 */ "OBJECT_BDOOR", + /* 0x00B1 */ "OBJECT_SPOT17_OBJ", + /* 0x00B2 */ "OBJECT_SHOP_DUNGEN", + /* 0x00B3 */ "OBJECT_NB", + /* 0x00B4 */ "OBJECT_MO", + /* 0x00B5 */ "OBJECT_SB", + /* 0x00B6 */ "OBJECT_GI_MELODY", + /* 0x00B7 */ "OBJECT_GI_HEART", + /* 0x00B8 */ "OBJECT_GI_COMPASS", + /* 0x00B9 */ "OBJECT_GI_BOSSKEY", + /* 0x00BA */ "OBJECT_GI_MEDAL", + /* 0x00BB */ "OBJECT_GI_NUTS", + /* 0x00BC */ "OBJECT_SA", + /* 0x00BD */ "OBJECT_GI_HEARTS", + /* 0x00BE */ "OBJECT_GI_ARROWCASE", + /* 0x00BF */ "OBJECT_GI_BOMBPOUCH", + /* 0x00C0 */ "OBJECT_IN", + /* 0x00C1 */ "OBJECT_TR", + /* 0x00C2 */ "OBJECT_SPOT16_OBJ", + /* 0x00C3 */ "OBJECT_OE1S", + /* 0x00C4 */ "OBJECT_OE4S", + /* 0x00C5 */ "OBJECT_OS_ANIME", + /* 0x00C6 */ "OBJECT_GI_BOTTLE", + /* 0x00C7 */ "OBJECT_GI_STICK", + /* 0x00C8 */ "OBJECT_GI_MAP", + /* 0x00C9 */ "OBJECT_OF1D_MAP", + /* 0x00CA */ "OBJECT_RU2", + /* 0x00CB */ "OBJECT_GI_SHIELD_1", + /* 0x00CC */ "OBJECT_DEKUJR", + /* 0x00CD */ "OBJECT_GI_MAGICPOT", + /* 0x00CE */ "OBJECT_GI_BOMB_1", + /* 0x00CF */ "OBJECT_OF1S", + /* 0x00D0 */ "OBJECT_MA2", + /* 0x00D1 */ "OBJECT_GI_PURSE", + /* 0x00D2 */ "OBJECT_HNI", + /* 0x00D3 */ "OBJECT_TW", + /* 0x00D4 */ "OBJECT_RR", + /* 0x00D5 */ "OBJECT_BXA", + /* 0x00D6 */ "OBJECT_ANUBICE", + /* 0x00D7 */ "OBJECT_GI_GERUDO", + /* 0x00D8 */ "OBJECT_GI_ARROW", + /* 0x00D9 */ "OBJECT_GI_BOMB_2", + /* 0x00DA */ "OBJECT_GI_EGG", + /* 0x00DB */ "OBJECT_GI_SCALE", + /* 0x00DC */ "OBJECT_GI_SHIELD_2", + /* 0x00DD */ "OBJECT_GI_HOOKSHOT", + /* 0x00DE */ "OBJECT_GI_OCARINA", + /* 0x00DF */ "OBJECT_GI_MILK", + /* 0x00E0 */ "OBJECT_MA1", + /* 0x00E1 */ "OBJECT_GANON", + /* 0x00E2 */ "OBJECT_SST", + /* 0x00E3 */ "OBJECT_NY_UNUSED", + /* 0x00E4 */ "OBJECT_UNSET_E4", + /* 0x00E5 */ "OBJECT_NY", + /* 0x00E6 */ "OBJECT_FR", + /* 0x00E7 */ "OBJECT_GI_PACHINKO", + /* 0x00E8 */ "OBJECT_GI_BOOMERANG", + /* 0x00E9 */ "OBJECT_GI_BOW", + /* 0x00EA */ "OBJECT_GI_GLASSES", + /* 0x00EB */ "OBJECT_GI_LIQUID", + /* 0x00EC */ "OBJECT_ANI", + /* 0x00ED */ "OBJECT_DEMO_6K", + /* 0x00EE */ "OBJECT_GI_SHIELD_3", + /* 0x00EF */ "OBJECT_GI_LETTER", + /* 0x00F0 */ "OBJECT_SPOT15_OBJ", + /* 0x00F1 */ "OBJECT_JYA_OBJ", + /* 0x00F2 */ "OBJECT_GI_CLOTHES", + /* 0x00F3 */ "OBJECT_GI_BEAN", + /* 0x00F4 */ "OBJECT_GI_FISH", + /* 0x00F5 */ "OBJECT_GI_SAW", + /* 0x00F6 */ "OBJECT_GI_HAMMER", + /* 0x00F7 */ "OBJECT_GI_GRASS", + /* 0x00F8 */ "OBJECT_GI_LONGSWORD", + /* 0x00F9 */ "OBJECT_SPOT01_OBJECTS", + /* 0x00FA */ "OBJECT_MD_UNUSED", + /* 0x00FB */ "OBJECT_MD", + /* 0x00FC */ "OBJECT_KM1", + /* 0x00FD */ "OBJECT_KW1", + /* 0x00FE */ "OBJECT_ZO", + /* 0x00FF */ "OBJECT_KZ", + /* 0x0100 */ "OBJECT_UMAJUMP", + /* 0x0101 */ "OBJECT_MASTERKOKIRI", + /* 0x0102 */ "OBJECT_MASTERKOKIRIHEAD", + /* 0x0103 */ "OBJECT_MASTERGOLON", + /* 0x0104 */ "OBJECT_MASTERZOORA", + /* 0x0105 */ "OBJECT_AOB", + /* 0x0106 */ "OBJECT_IK", + /* 0x0107 */ "OBJECT_AHG", + /* 0x0108 */ "OBJECT_CNE", + /* 0x0109 */ "OBJECT_GI_NIWATORI", + /* 0x010A */ "OBJECT_SKJ", + /* 0x010B */ "OBJECT_GI_BOTTLE_LETTER", + /* 0x010C */ "OBJECT_BJI", + /* 0x010D */ "OBJECT_BBA", + /* 0x010E */ "OBJECT_GI_OCARINA_0", + /* 0x010F */ "OBJECT_DS", + /* 0x0110 */ "OBJECT_ANE", + /* 0x0111 */ "OBJECT_BOJ", + /* 0x0112 */ "OBJECT_SPOT03_OBJECT", + /* 0x0113 */ "OBJECT_SPOT07_OBJECT", + /* 0x0114 */ "OBJECT_FZ", + /* 0x0115 */ "OBJECT_BOB", + /* 0x0116 */ "OBJECT_GE1", + /* 0x0117 */ "OBJECT_YABUSAME_POINT", + /* 0x0118 */ "OBJECT_GI_BOOTS_2", + /* 0x0119 */ "OBJECT_GI_SEED", + /* 0x011A */ "OBJECT_GND_MAGIC", + /* 0x011B */ "OBJECT_D_ELEVATOR", + /* 0x011C */ "OBJECT_D_HSBLOCK", + /* 0x011D */ "OBJECT_D_LIFT", + /* 0x011E */ "OBJECT_MAMENOKI", + /* 0x011F */ "OBJECT_GOROIWA", + /* 0x0120 */ "OBJECT_UNSET_120", + /* 0x0121 */ "OBJECT_TORYO", + /* 0x0122 */ "OBJECT_DAIKU", + /* 0x0123 */ "OBJECT_UNSET_123", + /* 0x0124 */ "OBJECT_NWC", + /* 0x0125 */ "OBJECT_BLKOBJ", + /* 0x0126 */ "OBJECT_GM", + /* 0x0127 */ "OBJECT_MS", + /* 0x0128 */ "OBJECT_HS", + /* 0x0129 */ "OBJECT_INGATE", + /* 0x012A */ "OBJECT_LIGHTSWITCH", + /* 0x012B */ "OBJECT_KUSA", + /* 0x012C */ "OBJECT_TSUBO", + /* 0x012D */ "OBJECT_GI_GLOVES", + /* 0x012E */ "OBJECT_GI_COIN", + /* 0x012F */ "OBJECT_KANBAN", + /* 0x0130 */ "OBJECT_GJYO_OBJECTS", + /* 0x0131 */ "OBJECT_OWL", + /* 0x0132 */ "OBJECT_MK", + /* 0x0133 */ "OBJECT_FU", + /* 0x0134 */ "OBJECT_GI_KI_TAN_MASK", + /* 0x0135 */ "OBJECT_GI_REDEAD_MASK", + /* 0x0136 */ "OBJECT_GI_SKJ_MASK", + /* 0x0137 */ "OBJECT_GI_RABIT_MASK", + /* 0x0138 */ "OBJECT_GI_TRUTH_MASK", + /* 0x0139 */ "OBJECT_GANON_OBJECTS", + /* 0x013A */ "OBJECT_SIOFUKI", + /* 0x013B */ "OBJECT_STREAM", + /* 0x013C */ "OBJECT_MM", + /* 0x013D */ "OBJECT_FA", + /* 0x013E */ "OBJECT_OS", + /* 0x013F */ "OBJECT_GI_EYE_LOTION", + /* 0x0140 */ "OBJECT_GI_POWDER", + /* 0x0141 */ "OBJECT_GI_MUSHROOM", + /* 0x0142 */ "OBJECT_GI_TICKETSTONE", + /* 0x0143 */ "OBJECT_GI_BROKENSWORD", + /* 0x0144 */ "OBJECT_JS", + /* 0x0145 */ "OBJECT_CS", + /* 0x0146 */ "OBJECT_GI_PRESCRIPTION", + /* 0x0147 */ "OBJECT_GI_BRACELET", + /* 0x0148 */ "OBJECT_GI_SOLDOUT", + /* 0x0149 */ "OBJECT_GI_FROG", + /* 0x014A */ "OBJECT_MAG", + /* 0x014B */ "OBJECT_DOOR_GERUDO", + /* 0x014C */ "OBJECT_GT", + /* 0x014D */ "OBJECT_EFC_ERUPC", + /* 0x014E */ "OBJECT_ZL2_ANIME1", + /* 0x014F */ "OBJECT_ZL2_ANIME2", + /* 0x0150 */ "OBJECT_GI_GOLONMASK", + /* 0x0151 */ "OBJECT_GI_ZORAMASK", + /* 0x0152 */ "OBJECT_GI_GERUDOMASK", + /* 0x0153 */ "OBJECT_GANON2", + /* 0x0154 */ "OBJECT_KA", + /* 0x0155 */ "OBJECT_TS", + /* 0x0156 */ "OBJECT_ZG", + /* 0x0157 */ "OBJECT_GI_HOVERBOOTS", + /* 0x0158 */ "OBJECT_GI_M_ARROW", + /* 0x0159 */ "OBJECT_DS2", + /* 0x015A */ "OBJECT_EC", + /* 0x015B */ "OBJECT_FISH", + /* 0x015C */ "OBJECT_GI_SUTARU", + /* 0x015D */ "OBJECT_GI_GODDESS", + /* 0x015E */ "OBJECT_SSH", + /* 0x015F */ "OBJECT_BIGOKUTA", + /* 0x0160 */ "OBJECT_BG", + /* 0x0161 */ "OBJECT_SPOT05_OBJECTS", + /* 0x0162 */ "OBJECT_SPOT12_OBJ", + /* 0x0163 */ "OBJECT_BOMBIWA", + /* 0x0164 */ "OBJECT_HINTNUTS", + /* 0x0165 */ "OBJECT_RS", + /* 0x0166 */ "OBJECT_SPOT00_BREAK", + /* 0x0167 */ "OBJECT_GLA", + /* 0x0168 */ "OBJECT_SHOPNUTS", + /* 0x0169 */ "OBJECT_GELDB", + /* 0x016A */ "OBJECT_GR", + /* 0x016B */ "OBJECT_DOG", + /* 0x016C */ "OBJECT_JYA_IRON", + /* 0x016D */ "OBJECT_JYA_DOOR", + /* 0x016E */ "OBJECT_UNSET_16E", + /* 0x016F */ "OBJECT_SPOT11_OBJ", + /* 0x0170 */ "OBJECT_KIBAKO2", + /* 0x0171 */ "OBJECT_DNS", + /* 0x0172 */ "OBJECT_DNK", + /* 0x0173 */ "OBJECT_GI_FIRE", + /* 0x0174 */ "OBJECT_GI_INSECT", + /* 0x0175 */ "OBJECT_GI_BUTTERFLY", + /* 0x0176 */ "OBJECT_GI_GHOST", + /* 0x0177 */ "OBJECT_GI_SOUL", + /* 0x0178 */ "OBJECT_BOWL", + /* 0x0179 */ "OBJECT_DEMO_KEKKAI", + /* 0x017A */ "OBJECT_EFC_DOUGHNUT", + /* 0x017B */ "OBJECT_GI_DEKUPOUCH", + /* 0x017C */ "OBJECT_GANON_ANIME1", + /* 0x017D */ "OBJECT_GANON_ANIME2", + /* 0x017E */ "OBJECT_GANON_ANIME3", + /* 0x017F */ "OBJECT_GI_RUPY", + /* 0x0180 */ "OBJECT_SPOT01_MATOYA", + /* 0x0181 */ "OBJECT_SPOT01_MATOYAB", + /* 0x0182 */ "OBJECT_MU", + /* 0x0183 */ "OBJECT_WF", + /* 0x0184 */ "OBJECT_SKB", + /* 0x0185 */ "OBJECT_GJ", + /* 0x0186 */ "OBJECT_GEFF", + /* 0x0187 */ "OBJECT_HAKA_DOOR", + /* 0x0188 */ "OBJECT_GS", + /* 0x0189 */ "OBJECT_PS", + /* 0x018A */ "OBJECT_BWALL", + /* 0x018B */ "OBJECT_COW", + /* 0x018C */ "OBJECT_COB", + /* 0x018D */ "OBJECT_GI_SWORD_1", + /* 0x018E */ "OBJECT_DOOR_KILLER", + /* 0x018F */ "OBJECT_OUKE_HAKA", + /* 0x0190 */ "OBJECT_TIMEBLOCK", + /* 0x0191 */ "OBJECT_ZL4", }; \ No newline at end of file diff --git a/tools/ZAPD/ZAPD/ZRoom/ZRoom.cpp b/tools/ZAPD/ZAPD/ZRoom/ZRoom.cpp index b8ea40b029..9d8528c870 100644 --- a/tools/ZAPD/ZAPD/ZRoom/ZRoom.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/ZRoom.cpp @@ -1,40 +1,40 @@ +#include "ZRoom.h" +#include #include #include -#include "ZRoom.h" -#include "ZFile.h" -#include "ZCutscene.h" -#include "../ZBlob.h" -#include "ObjectList.h" #include "../File.h" -#include "../StringHelper.h" #include "../Globals.h" -#include "Commands/SetRoomList.h" -#include "Commands/SetEchoSettings.h" -#include "Commands/SetSoundSettings.h" -#include "Commands/SetWind.h" -#include "Commands/SetTimeSettings.h" -#include "Commands/SetSpecialObjects.h" -#include "Commands/SetSkyboxSettings.h" -#include "Commands/SetSkyboxModifier.h" -#include "Commands/SetRoomBehavior.h" -#include "Commands/SetCameraSettings.h" -#include "Commands/SetStartPositionList.h" +#include "../StringHelper.h" +#include "../ZBlob.h" +#include "Commands/EndMarker.h" #include "Commands/SetActorList.h" -#include "Commands/SetTransitionActorList.h" +#include "Commands/SetAlternateHeaders.h" +#include "Commands/SetCameraSettings.h" +#include "Commands/SetCollisionHeader.h" +#include "Commands/SetCutscenes.h" +#include "Commands/SetEchoSettings.h" #include "Commands/SetEntranceList.h" #include "Commands/SetExitList.h" -#include "Commands/SetAlternateHeaders.h" -#include "Commands/SetCollisionHeader.h" -#include "Commands/SetObjectList.h" -#include "Commands/SetMesh.h" -#include "Commands/SetLightingSettings.h" -#include "Commands/SetPathways.h" -#include "Commands/Unused09.h" -#include "Commands/SetCutscenes.h" -#include "Commands/EndMarker.h" #include "Commands/SetLightList.h" +#include "Commands/SetLightingSettings.h" +#include "Commands/SetMesh.h" +#include "Commands/SetObjectList.h" +#include "Commands/SetPathways.h" +#include "Commands/SetRoomBehavior.h" +#include "Commands/SetRoomList.h" +#include "Commands/SetSkyboxModifier.h" +#include "Commands/SetSkyboxSettings.h" +#include "Commands/SetSoundSettings.h" +#include "Commands/SetSpecialObjects.h" +#include "Commands/SetStartPositionList.h" +#include "Commands/SetTimeSettings.h" +#include "Commands/SetTransitionActorList.h" +#include "Commands/SetWind.h" +#include "Commands/Unused09.h" #include "Commands/ZRoomCommandUnk.h" -#include +#include "ObjectList.h" +#include "ZCutscene.h" +#include "ZFile.h" using namespace std; using namespace tinyxml2; @@ -54,7 +54,8 @@ ZRoom::~ZRoom() delete cmd; } -ZRoom* ZRoom::ExtractFromXML(XMLElement* reader, vector nRawData, int rawDataIndex, string nRelPath, ZFile* nParent, ZRoom* nScene) +ZRoom* ZRoom::ExtractFromXML(XMLElement* reader, vector nRawData, int rawDataIndex, + string nRelPath, ZFile* nParent, ZRoom* nScene) { ZRoom* room = new ZRoom(); @@ -62,7 +63,7 @@ ZRoom* ZRoom::ExtractFromXML(XMLElement* reader, vector nRawData, int r room->rawData = nRawData; room->name = reader->Attribute("Name"); - //printf("ZRoom: %s\n", name.c_str()); + // printf("ZRoom: %s\n", name.c_str()); room->scene = nScene; @@ -75,7 +76,7 @@ ZRoom* ZRoom::ExtractFromXML(XMLElement* reader, vector nRawData, int r Globals::Instance->AddSegment(SEGMENT_ROOM); Globals::Instance->AddSegment(SEGMENT_SCENE); - //GenDefinitions(); + // GenDefinitions(); int cmdCount = 999999; @@ -85,7 +86,8 @@ ZRoom* ZRoom::ExtractFromXML(XMLElement* reader, vector nRawData, int r cmdCount = 0; } - for (XMLElement* child = reader->FirstChildElement(); child != NULL; child = child->NextSiblingElement()) + for (XMLElement* child = reader->FirstChildElement(); child != NULL; + child = child->NextSiblingElement()) { // TODO: Bunch of repeated code between all of these that needs to be combined. if (string(child->Name()) == "DListHint") @@ -99,7 +101,12 @@ ZRoom* ZRoom::ExtractFromXML(XMLElement* reader, vector nRawData, int r string addressStr = child->Attribute("Offset"); int address = strtol(StringHelper::Split(addressStr, "0x")[1].c_str(), NULL, 16); - ZDisplayList* dList = new ZDisplayList(room->rawData, address, ZDisplayList::GetDListLength(room->rawData, address, Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX)); + ZDisplayList* dList = new ZDisplayList( + room->rawData, address, + ZDisplayList::GetDListLength(room->rawData, address, + Globals::Instance->game == ZGame::OOT_SW97 ? + DListType::F3DEX : + DListType::F3DZEX)); if (child->Attribute("Name") != NULL) name = string(child->Attribute("Name")); @@ -123,14 +130,18 @@ ZRoom* ZRoom::ExtractFromXML(XMLElement* reader, vector nRawData, int r string sizeStr = child->Attribute("Size"); int size = strtol(StringHelper::Split(sizeStr, "0x")[1].c_str(), NULL, 16); - ZBlob* blob = new ZBlob(room->rawData, address, size, StringHelper::Sprintf("%sBlob0x%06X", room->name.c_str(), address)); - + ZBlob* blob = + new ZBlob(room->rawData, address, size, + StringHelper::Sprintf("%sBlob0x%06X", room->name.c_str(), address)); + if (child->Attribute("Name") != NULL) name = string(child->Attribute("Name")); else name = StringHelper::Sprintf("%s_%s", room->name.c_str(), blob->GetName().c_str()); - - room->parent->AddDeclarationArray(address, DeclarationAlignment::None, blob->GetRawDataSize(), "u8", name, 0, blob->GetSourceOutputCode(room->name)); + + room->parent->AddDeclarationArray(address, DeclarationAlignment::None, + blob->GetRawDataSize(), "u8", name, 0, + blob->GetSourceOutputCode(room->name)); delete blob; } else if (string(child->Name()) == "CutsceneHint") @@ -149,10 +160,13 @@ ZRoom* ZRoom::ExtractFromXML(XMLElement* reader, vector nRawData, int r if (child->Attribute("Name") != NULL) name = string(child->Attribute("Name")); else - name = StringHelper::Sprintf("%sCutsceneData0x%06X", room->name.c_str(), cutscene->segmentOffset); + name = StringHelper::Sprintf("%sCutsceneData0x%06X", room->name.c_str(), + cutscene->segmentOffset); - room->parent->AddDeclarationArray(address, DeclarationAlignment::None, DeclarationPadding::Pad16, cutscene->GetRawDataSize(), "s32", - name, 0, cutscene->GetSourceOutputCode(room->name)); + room->parent->AddDeclarationArray(address, DeclarationAlignment::None, + DeclarationPadding::Pad16, cutscene->GetRawDataSize(), + "s32", name, 0, + cutscene->GetSourceOutputCode(room->name)); delete cutscene; } else if (string(child->Name()) == "AltHeaderHint") @@ -207,14 +221,18 @@ ZRoom* ZRoom::ExtractFromXML(XMLElement* reader, vector nRawData, int r int width = strtol(string(child->Attribute("Width")).c_str(), NULL, 10); int height = strtol(string(child->Attribute("Height")).c_str(), NULL, 10); - ZTexture* tex = ZTexture::FromBinary(ZTexture::GetTextureTypeFromString(typeStr), room->rawData, address, StringHelper::Sprintf("%sTex_%06X", room->name.c_str(), address), width, height); - room->parent->AddDeclarationArray(address, DeclarationAlignment::None, tex->GetRawDataSize(), "u64", StringHelper::Sprintf("%s", tex->GetName().c_str()), 0, - tex->GetSourceOutputCode(room->name)); + ZTexture* tex = ZTexture::FromBinary( + ZTexture::GetTextureTypeFromString(typeStr), room->rawData, address, + StringHelper::Sprintf("%sTex_%06X", room->name.c_str(), address), width, height); + room->parent->AddDeclarationArray(address, DeclarationAlignment::None, + tex->GetRawDataSize(), "u64", + StringHelper::Sprintf("%s", tex->GetName().c_str()), + 0, tex->GetSourceOutputCode(room->name)); delete tex; } } - //ParseCommands(rawDataIndex); + // ParseCommands(rawDataIndex); room->commandSets.push_back(CommandSet(rawDataIndex, cmdCount)); room->ProcessCommandSets(); @@ -242,32 +260,83 @@ void ZRoom::ParseCommands(std::vector& commandList, CommandSet co switch (opcode) { - case RoomCommand::SetStartPositionList: cmd = new SetStartPositionList(this, rawData, rawDataIndex); break; // 0x00 - case RoomCommand::SetActorList: cmd = new SetActorList(this, rawData, rawDataIndex); break; // 0x01 - case RoomCommand::SetCollisionHeader: cmd = new SetCollisionHeader(this, rawData, rawDataIndex); break; // 0x03 - case RoomCommand::SetRoomList: cmd = new SetRoomList(this, rawData, rawDataIndex); break; // 0x04 - case RoomCommand::SetWind: cmd = new SetWind(this, rawData, rawDataIndex); break; // 0x05 - case RoomCommand::SetEntranceList: cmd = new SetEntranceList(this, rawData, rawDataIndex); break; // 0x06 - case RoomCommand::SetSpecialObjects: cmd = new SetSpecialObjects(this, rawData, rawDataIndex); break; // 0x07 - case RoomCommand::SetRoomBehavior: cmd = new SetRoomBehavior(this, rawData, rawDataIndex); break; // 0x08 - case RoomCommand::Unused09: cmd = new Unused09(this, rawData, rawDataIndex); break; // 0x09 - case RoomCommand::SetMesh: cmd = new SetMesh(this, rawData, rawDataIndex, 0); break; // 0x0A - case RoomCommand::SetObjectList: cmd = new SetObjectList(this, rawData, rawDataIndex); break; // 0x0B - case RoomCommand::SetLightList: cmd = new SetLightList(this, rawData, rawDataIndex); break; // 0x0C (MM-ONLY) - case RoomCommand::SetPathways: cmd = new SetPathways(this, rawData, rawDataIndex); break; // 0x0D - case RoomCommand::SetTransitionActorList: cmd = new SetTransitionActorList(this, rawData, rawDataIndex); break; // 0x0E - case RoomCommand::SetLightingSettings: cmd = new SetLightingSettings(this, rawData, rawDataIndex); break; // 0x0F - case RoomCommand::SetTimeSettings: cmd = new SetTimeSettings(this, rawData, rawDataIndex); break; // 0x10 - case RoomCommand::SetSkyboxSettings: cmd = new SetSkyboxSettings(this, rawData, rawDataIndex); break; // 0x11 - case RoomCommand::SetSkyboxModifier: cmd = new SetSkyboxModifier(this, rawData, rawDataIndex); break; // 0x12 - case RoomCommand::SetExitList: cmd = new SetExitList(this, rawData, rawDataIndex); break; // 0x13 - case RoomCommand::EndMarker: cmd = new EndMarker(this, rawData, rawDataIndex); break; // 0x14 - case RoomCommand::SetSoundSettings: cmd = new SetSoundSettings(this, rawData, rawDataIndex); break; // 0x15 - case RoomCommand::SetEchoSettings: cmd = new SetEchoSettings(this, rawData, rawDataIndex); break; // 0x16 - case RoomCommand::SetCutscenes: cmd = new SetCutscenes(this, rawData, rawDataIndex); break; // 0x17 - case RoomCommand::SetAlternateHeaders: cmd = new SetAlternateHeaders(this, rawData, rawDataIndex); break; // 0x18 - case RoomCommand::SetCameraSettings: cmd = new SetCameraSettings(this, rawData, rawDataIndex); break; // 0x19 - default: cmd = new ZRoomCommandUnk(this, rawData, rawDataIndex); + case RoomCommand::SetStartPositionList: + cmd = new SetStartPositionList(this, rawData, rawDataIndex); + break; // 0x00 + case RoomCommand::SetActorList: + cmd = new SetActorList(this, rawData, rawDataIndex); + break; // 0x01 + case RoomCommand::SetCollisionHeader: + cmd = new SetCollisionHeader(this, rawData, rawDataIndex); + break; // 0x03 + case RoomCommand::SetRoomList: + cmd = new SetRoomList(this, rawData, rawDataIndex); + break; // 0x04 + case RoomCommand::SetWind: + cmd = new SetWind(this, rawData, rawDataIndex); + break; // 0x05 + case RoomCommand::SetEntranceList: + cmd = new SetEntranceList(this, rawData, rawDataIndex); + break; // 0x06 + case RoomCommand::SetSpecialObjects: + cmd = new SetSpecialObjects(this, rawData, rawDataIndex); + break; // 0x07 + case RoomCommand::SetRoomBehavior: + cmd = new SetRoomBehavior(this, rawData, rawDataIndex); + break; // 0x08 + case RoomCommand::Unused09: + cmd = new Unused09(this, rawData, rawDataIndex); + break; // 0x09 + case RoomCommand::SetMesh: + cmd = new SetMesh(this, rawData, rawDataIndex, 0); + break; // 0x0A + case RoomCommand::SetObjectList: + cmd = new SetObjectList(this, rawData, rawDataIndex); + break; // 0x0B + case RoomCommand::SetLightList: + cmd = new SetLightList(this, rawData, rawDataIndex); + break; // 0x0C (MM-ONLY) + case RoomCommand::SetPathways: + cmd = new SetPathways(this, rawData, rawDataIndex); + break; // 0x0D + case RoomCommand::SetTransitionActorList: + cmd = new SetTransitionActorList(this, rawData, rawDataIndex); + break; // 0x0E + case RoomCommand::SetLightingSettings: + cmd = new SetLightingSettings(this, rawData, rawDataIndex); + break; // 0x0F + case RoomCommand::SetTimeSettings: + cmd = new SetTimeSettings(this, rawData, rawDataIndex); + break; // 0x10 + case RoomCommand::SetSkyboxSettings: + cmd = new SetSkyboxSettings(this, rawData, rawDataIndex); + break; // 0x11 + case RoomCommand::SetSkyboxModifier: + cmd = new SetSkyboxModifier(this, rawData, rawDataIndex); + break; // 0x12 + case RoomCommand::SetExitList: + cmd = new SetExitList(this, rawData, rawDataIndex); + break; // 0x13 + case RoomCommand::EndMarker: + cmd = new EndMarker(this, rawData, rawDataIndex); + break; // 0x14 + case RoomCommand::SetSoundSettings: + cmd = new SetSoundSettings(this, rawData, rawDataIndex); + break; // 0x15 + case RoomCommand::SetEchoSettings: + cmd = new SetEchoSettings(this, rawData, rawDataIndex); + break; // 0x16 + case RoomCommand::SetCutscenes: + cmd = new SetCutscenes(this, rawData, rawDataIndex); + break; // 0x17 + case RoomCommand::SetAlternateHeaders: + cmd = new SetAlternateHeaders(this, rawData, rawDataIndex); + break; // 0x18 + case RoomCommand::SetCameraSettings: + cmd = new SetCameraSettings(this, rawData, rawDataIndex); + break; // 0x19 + default: + cmd = new ZRoomCommandUnk(this, rawData, rawDataIndex); } auto end = chrono::steady_clock::now(); @@ -279,7 +348,7 @@ void ZRoom::ParseCommands(std::vector& commandList, CommandSet co printf("OP: %s, TIME: %lims\n", cmd->GetCommandCName().c_str(), diff); } - //printf("OP: %s\n", cmd->GetCommandCName().c_str()); + // printf("OP: %s\n", cmd->GetCommandCName().c_str()); cmd->cmdIndex = currentIndex; cmd->cmdSet = rawDataIndex; @@ -306,14 +375,18 @@ void ZRoom::ProcessCommandSets() ParseCommands(setCommands, commandSets[0]); commandSets.erase(commandSets.begin()); - for (int i = 0; i < setCommands.size(); i++) + for (size_t i = 0; i < setCommands.size(); i++) { ZRoomCommand* cmd = setCommands[i]; cmd->commandSet = commandSet & 0x00FFFFFF; string pass1 = cmd->GenerateSourceCodePass1(name, cmd->commandSet); - Declaration* decl = parent->AddDeclaration(cmd->cmdAddress, i == 0 ? DeclarationAlignment::Align16 : DeclarationAlignment::None, 8, StringHelper::Sprintf("static %s", cmd->GetCommandCName().c_str()), - StringHelper::Sprintf("%sSet%04XCmd%02X", name.c_str(), commandSet & 0x00FFFFFF, cmd->cmdIndex, cmd->cmdID), + Declaration* decl = parent->AddDeclaration( + cmd->cmdAddress, + i == 0 ? DeclarationAlignment::Align16 : DeclarationAlignment::None, 8, + StringHelper::Sprintf("static %s", cmd->GetCommandCName().c_str()), + StringHelper::Sprintf("%sSet%04XCmd%02X", name.c_str(), commandSet & 0x00FFFFFF, + cmd->cmdIndex, cmd->cmdID), StringHelper::Sprintf("%s", pass1.c_str())); decl->rightText = StringHelper::Sprintf("// 0x%04X", cmd->cmdAddress); @@ -330,27 +403,30 @@ void ZRoom::ProcessCommandSets() string pass2 = cmd->GenerateSourceCodePass2(name, cmd->commandSet); if (pass2 != "") - parent->AddDeclaration(cmd->cmdAddress, DeclarationAlignment::None, 8, StringHelper::Sprintf("static %s", cmd->GetCommandCName().c_str()), StringHelper::Sprintf("%sSet%04XCmd%02X", name.c_str(), cmd->commandSet & 0x00FFFFFF, cmd->cmdIndex, cmd->cmdID), StringHelper::Sprintf("%s // 0x%04X", pass2.c_str(), cmd->cmdAddress)); + parent->AddDeclaration( + cmd->cmdAddress, DeclarationAlignment::None, 8, + StringHelper::Sprintf("static %s", cmd->GetCommandCName().c_str()), + StringHelper::Sprintf("%sSet%04XCmd%02X", name.c_str(), + cmd->commandSet & 0x00FFFFFF, cmd->cmdIndex, cmd->cmdID), + StringHelper::Sprintf("%s // 0x%04X", pass2.c_str(), cmd->cmdAddress)); } } /* - * There is one room in Ocarina of Time that lacks a header. Room 120, "Syotes", dates back to very early in the game's development. - * Since this room is a special case, this hack adds back a header so that the room can be processed properly. + * There is one room in Ocarina of Time that lacks a header. Room 120, "Syotes", dates back to very + * early in the game's development. Since this room is a special case, this hack adds back a header + * so that the room can be processed properly. */ void ZRoom::SyotesRoomHack() { - char headerData[] = - { - 0x0A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08 - }; + char headerData[] = {0x0A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08}; - for (int i = 0; i < sizeof(headerData); i++) + for (size_t i = 0; i < sizeof(headerData); i++) rawData.insert(rawData.begin() + i, headerData[i]); SetMesh* cmdSetMesh = new SetMesh(this, rawData, 0, -8); - for (int i = 0; i < sizeof(headerData); i++) + for (size_t i = 0; i < sizeof(headerData); i++) rawData.erase(rawData.begin()); cmdSetMesh->cmdIndex = 0; @@ -361,7 +437,7 @@ void ZRoom::SyotesRoomHack() ZRoomCommand* ZRoom::FindCommandOfType(RoomCommand cmdType) { - for (int i = 0; i < commands.size(); i++) + for (size_t i = 0; i < commands.size(); i++) { if (commands[i]->cmdID == cmdType) return commands[i]; @@ -372,15 +448,17 @@ ZRoomCommand* ZRoom::FindCommandOfType(RoomCommand cmdType) size_t ZRoom::GetDeclarationSizeFromNeighbor(int declarationAddress) { - int declarationIndex = -1; + size_t declarationIndex = -1; // Copy it into a vector. - vector> declarationKeysSorted(parent->declarations.begin(), parent->declarations.end()); + vector> declarationKeysSorted(parent->declarations.begin(), + parent->declarations.end()); // Sort the vector according to the word count in descending order. - sort(declarationKeysSorted.begin(), declarationKeysSorted.end(), [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); + sort(declarationKeysSorted.begin(), declarationKeysSorted.end(), + [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); - for (int i = 0; i < declarationKeysSorted.size(); i++) + for (size_t i = 0; i < declarationKeysSorted.size(); i++) { if (declarationKeysSorted[i].first == declarationAddress) { @@ -389,10 +467,11 @@ size_t ZRoom::GetDeclarationSizeFromNeighbor(int declarationAddress) } } - if (declarationIndex != -1) + if ((int)declarationIndex != -1) { if (declarationIndex + 1 < declarationKeysSorted.size()) - return declarationKeysSorted[declarationIndex + 1].first - declarationKeysSorted[declarationIndex].first; + return declarationKeysSorted[declarationIndex + 1].first - + declarationKeysSorted[declarationIndex].first; else return rawData.size() - declarationKeysSorted[declarationIndex].first; } @@ -402,9 +481,9 @@ size_t ZRoom::GetDeclarationSizeFromNeighbor(int declarationAddress) size_t ZRoom::GetCommandSizeFromNeighbor(ZRoomCommand* cmd) { - int cmdIndex = -1; + size_t cmdIndex = -1; - for (int i = 0; i < commands.size(); i++) + for (size_t i = 0; i < commands.size(); i++) { if (commands[i] == cmd) { @@ -413,7 +492,7 @@ size_t ZRoom::GetCommandSizeFromNeighbor(ZRoomCommand* cmd) } } - if (cmdIndex != -1) + if ((int)cmdIndex != -1) { if (cmdIndex + 1 < commands.size()) return commands[cmdIndex + 1]->cmdAddress - commands[cmdIndex]->cmdAddress; @@ -443,7 +522,7 @@ string ZRoom::GetSourceOutputCode(const std::string& prefix) { sourceOutput = ""; - //sourceOutput += "#include \n"; + // sourceOutput += "#include \n"; sourceOutput += "#include \"segment_symbols.h\"\n"; sourceOutput += "#include \"command_macros_base.h\"\n"; sourceOutput += "#include \"z64cutscene_commands.h\"\n"; @@ -452,7 +531,7 @@ string ZRoom::GetSourceOutputCode(const std::string& prefix) if (scene != nullptr) sourceOutput += scene->parent->GetHeaderInclude(); - //sourceOutput += "\n"; + // sourceOutput += "\n"; ProcessCommandSets(); @@ -463,21 +542,22 @@ string ZRoom::GetSourceOutputCode(const std::string& prefix) { vector> texturesSorted(textures.begin(), textures.end()); - sort(texturesSorted.begin(), texturesSorted.end(), [](const auto& lhs, const auto& rhs) - { - return lhs.first < rhs.first; - }); + sort(texturesSorted.begin(), texturesSorted.end(), + [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); - for (int i = 0; i < texturesSorted.size() - 1; i++) + for (size_t i = 0; i < texturesSorted.size() - 1; i++) { int texSize = textures[texturesSorted[i].first]->GetRawDataSize(); if ((texturesSorted[i].first + texSize) > texturesSorted[i + 1].first) { - int intersectAmt = (texturesSorted[i].first + texSize) - texturesSorted[i + 1].first; + // int intersectAmt = (texturesSorted[i].first + texSize) - texturesSorted[i + + // 1].first; - defines += StringHelper::Sprintf("#define %sTex_%06X ((u32)%sTex_%06X + 0x%06X)\n", prefix.c_str(), texturesSorted[i + 1].first, prefix.c_str(), - texturesSorted[i].first, texturesSorted[i + 1].first - texturesSorted[i].first); + defines += StringHelper::Sprintf( + "#define %sTex_%06X ((u32)%sTex_%06X + 0x%06X)\n", prefix.c_str(), + texturesSorted[i + 1].first, prefix.c_str(), texturesSorted[i].first, + texturesSorted[i + 1].first - texturesSorted[i].first); parent->declarations.erase(texturesSorted[i + 1].first); textures.erase(texturesSorted[i + 1].first); @@ -489,7 +569,7 @@ string ZRoom::GetSourceOutputCode(const std::string& prefix) } parent->defines += defines; - //parent->externs[0xFFFFFFFF] = defines; + // parent->externs[0xFFFFFFFF] = defines; } for (pair item : textures) @@ -503,12 +583,16 @@ string ZRoom::GetSourceOutputCode(const std::string& prefix) item.second->Save(Globals::Instance->outputPath); - parent->AddDeclarationIncludeArray(item.first, StringHelper::Sprintf("%s/%s.%s.inc.c", - Globals::Instance->outputPath.c_str(), Path::GetFileNameWithoutExtension(item.second->GetName()).c_str(), item.second->GetExternalExtension().c_str()), item.second->GetRawDataSize(), - "u64", StringHelper::Sprintf("%sTex_%06X", prefix.c_str(), item.first), 0); + parent->AddDeclarationIncludeArray( + item.first, + StringHelper::Sprintf("%s/%s.%s.inc.c", Globals::Instance->outputPath.c_str(), + Path::GetFileNameWithoutExtension(item.second->GetName()).c_str(), + item.second->GetExternalExtension().c_str()), + item.second->GetRawDataSize(), "u64", + StringHelper::Sprintf("%sTex_%06X", prefix.c_str(), item.first), 0); } - //sourceOutput += "\n"; + // sourceOutput += "\n"; return sourceOutput; } @@ -545,7 +629,8 @@ void ZRoom::PreGenSourceFiles() cmd->PreGenSourceFiles(); } -Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, uint32_t nSize, string nText) +Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, + uint32_t nSize, string nText) { alignment = nAlignment; padding = nPadding; @@ -564,21 +649,28 @@ Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPa references = vector(); } -Declaration::Declaration(DeclarationAlignment nAlignment, uint32_t nSize, string nVarType, string nVarName, bool nIsArray, string nText) : Declaration(nAlignment, DeclarationPadding::None, nSize, nText) +Declaration::Declaration(DeclarationAlignment nAlignment, uint32_t nSize, string nVarType, + string nVarName, bool nIsArray, string nText) + : Declaration(nAlignment, DeclarationPadding::None, nSize, nText) { varType = nVarType; varName = nVarName; isArray = nIsArray; } -Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, uint32_t nSize, string nVarType, string nVarName, bool nIsArray, string nText) : Declaration(nAlignment, nPadding, nSize, nText) +Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, + uint32_t nSize, string nVarType, string nVarName, bool nIsArray, + string nText) + : Declaration(nAlignment, nPadding, nSize, nText) { varType = nVarType; varName = nVarName; isArray = nIsArray; } -Declaration::Declaration(DeclarationAlignment nAlignment, uint32_t nSize, string nVarType, string nVarName, bool nIsArray, int nArrayItemCnt, string nText) : Declaration(nAlignment, DeclarationPadding::None, nSize, nText) +Declaration::Declaration(DeclarationAlignment nAlignment, uint32_t nSize, string nVarType, + string nVarName, bool nIsArray, int nArrayItemCnt, string nText) + : Declaration(nAlignment, DeclarationPadding::None, nSize, nText) { varType = nVarType; varName = nVarName; @@ -586,7 +678,10 @@ Declaration::Declaration(DeclarationAlignment nAlignment, uint32_t nSize, string arrayItemCnt = nArrayItemCnt; } -Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, uint32_t nSize, string nVarType, string nVarName, bool nIsArray, int nArrayItemCnt, string nText) : Declaration(nAlignment, nPadding, nSize, nText) +Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, + uint32_t nSize, string nVarType, string nVarName, bool nIsArray, + int nArrayItemCnt, string nText) + : Declaration(nAlignment, nPadding, nSize, nText) { varType = nVarType; varName = nVarName; @@ -594,7 +689,8 @@ Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPa arrayItemCnt = nArrayItemCnt; } -Declaration::Declaration(std::string nIncludePath, uint32_t nSize, string nVarType, string nVarName) : Declaration(DeclarationAlignment::None, DeclarationPadding::None, nSize, "") +Declaration::Declaration(std::string nIncludePath, uint32_t nSize, string nVarType, string nVarName) + : Declaration(DeclarationAlignment::None, DeclarationPadding::None, nSize, "") { includePath = nIncludePath; varType = nVarType; diff --git a/tools/ZAPD/ZAPD/ZRoom/ZRoom.h b/tools/ZAPD/ZAPD/ZRoom/ZRoom.h index 7324248e2d..b0b4a503e3 100644 --- a/tools/ZAPD/ZAPD/ZRoom/ZRoom.h +++ b/tools/ZAPD/ZAPD/ZRoom/ZRoom.h @@ -1,13 +1,13 @@ #pragma once +#include #include "../ZResource.h" #include "ZRoomCommand.h" #include "ZTexture.h" -#include -#include #include #include +#include class ZRoom : public ZResource { @@ -29,7 +29,9 @@ public: std::string extDefines; - static ZRoom* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, int rawDataIndex, std::string nRelPath, ZFile* nParent, ZRoom* nScene); + static ZRoom* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, + int rawDataIndex, std::string nRelPath, ZFile* nParent, + ZRoom* nScene); void ParseCommands(std::vector& commandList, CommandSet commandSet); size_t GetDeclarationSizeFromNeighbor(int declarationAddress); size_t GetCommandSizeFromNeighbor(ZRoomCommand* cmd); @@ -44,7 +46,7 @@ public: struct CommandSet { int32_t address; - int32_t commandCount; // Only used if explicitly specified in the XML + int32_t commandCount; // Only used if explicitly specified in the XML CommandSet(int32_t nAddress); CommandSet(int32_t nAddress, int32_t nCommandCount); diff --git a/tools/ZAPD/ZAPD/ZRoom/ZRoomCommand.cpp b/tools/ZAPD/ZAPD/ZRoom/ZRoomCommand.cpp index 6b42adec94..8d3baeb728 100644 --- a/tools/ZAPD/ZAPD/ZRoom/ZRoomCommand.cpp +++ b/tools/ZAPD/ZAPD/ZRoom/ZRoomCommand.cpp @@ -13,7 +13,8 @@ string ZRoomCommand::GenerateSourceCodePass1(string roomName, int baseAddress) { char line[2048]; - //sprintf(line, "%s _%s_set%04X_cmd%02X = { 0x%02X,", GetCommandCName().c_str(), roomName.c_str(), baseAddress, cmdIndex, cmdID); + // sprintf(line, "%s _%s_set%04X_cmd%02X = { 0x%02X,", GetCommandCName().c_str(), + // roomName.c_str(), baseAddress, cmdIndex, cmdID); sprintf(line, " 0x%02X,", (uint8_t)cmdID); return string(line); diff --git a/tools/ZAPD/ZAPD/ZRoom/ZRoomCommand.h b/tools/ZAPD/ZAPD/ZRoom/ZRoomCommand.h index c7020ca1ab..3389d9e121 100644 --- a/tools/ZAPD/ZAPD/ZRoom/ZRoomCommand.h +++ b/tools/ZAPD/ZAPD/ZRoom/ZRoomCommand.h @@ -2,8 +2,8 @@ #include -#include #include +#include class ZRoom; diff --git a/tools/ZAPD/ZAPD/ZScalar.cpp b/tools/ZAPD/ZAPD/ZScalar.cpp index 10866f1ef4..e523562ee9 100644 --- a/tools/ZAPD/ZAPD/ZScalar.cpp +++ b/tools/ZAPD/ZAPD/ZScalar.cpp @@ -1,11 +1,12 @@ #include "ZScalar.h" -#include "ZFile.h" #include "BitConverter.h" -#include "StringHelper.h" #include "File.h" #include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" -ZScalar* ZScalar::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, const int rawDataIndex, const std::string& nRelPath) +ZScalar* ZScalar::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, + const int rawDataIndex, const std::string& nRelPath) { ZScalar* scalar = new ZScalar(); scalar->rawData = nRawData; @@ -35,7 +36,7 @@ void ZScalar::ParseXML(tinyxml2::XMLElement* reader) scalarType = ZScalar::MapOutputTypeToScalarType(type); } -ZScalarType ZScalar::MapOutputTypeToScalarType(const std::string& type) +ZScalarType ZScalar::MapOutputTypeToScalarType(const std::string& type) { if (type == "s8") { @@ -83,7 +84,8 @@ ZScalarType ZScalar::MapOutputTypeToScalarType(const std::string& type) std::string ZScalar::MapScalarTypeToOutputType(const ZScalarType scalarType) { - switch (scalarType) { + switch (scalarType) + { case ZSCALAR_S8: return "s8"; case ZSCALAR_U8: @@ -111,7 +113,8 @@ std::string ZScalar::MapScalarTypeToOutputType(const ZScalarType scalarType) int ZScalar::MapTypeToSize(const ZScalarType scalarType) { - switch (scalarType) { + switch (scalarType) + { case ZSCALAR_S8: return sizeof(scalarData.s8); case ZSCALAR_U8: @@ -149,7 +152,8 @@ void ZScalar::ParseRawData() void ZScalar::ParseRawData(const std::vector& data, const int offset) { - switch (scalarType) { + switch (scalarType) + { case ZSCALAR_S8: scalarData.s8 = BitConverter::ToInt8BE(data, offset); break; @@ -180,6 +184,10 @@ void ZScalar::ParseRawData(const std::vector& data, const int offset) case ZSCALAR_F64: scalarData.f64 = BitConverter::ToDoubleBE(data, offset); break; + case ZSCALAR_NONE: + fprintf(stderr, "Warning in ZScalar: Invalid type. %d %s %d\n", (int)scalarType, __FILE__, + __LINE__); + break; } } @@ -190,7 +198,8 @@ std::string ZScalar::GetSourceTypeName() std::string ZScalar::GetSourceValue() { - switch (scalarType) { + switch (scalarType) + { case ZSCALAR_S8: return StringHelper::Sprintf("%hhd", scalarData.s8); case ZSCALAR_U8: @@ -219,7 +228,8 @@ std::string ZScalar::GetSourceValue() std::string ZScalar::GetSourceOutputCode(const std::string& prefix) { if (parent != nullptr) - parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), GetSourceTypeName(), GetName(), GetSourceValue()); + parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), + GetSourceTypeName(), GetName(), GetSourceValue()); return ""; } diff --git a/tools/ZAPD/ZAPD/ZScalar.h b/tools/ZAPD/ZAPD/ZScalar.h index 26e6a9d8dc..e5109ca16e 100644 --- a/tools/ZAPD/ZAPD/ZScalar.h +++ b/tools/ZAPD/ZAPD/ZScalar.h @@ -1,12 +1,13 @@ #pragma once -#include -#include #include +#include +#include #include "ZResource.h" #include "tinyxml2.h" -typedef enum ZScalarType { +typedef enum ZScalarType +{ ZSCALAR_NONE, ZSCALAR_S8, ZSCALAR_U8, @@ -20,7 +21,8 @@ typedef enum ZScalarType { ZSCALAR_F64 } ZScalarType; -typedef union ZScalarData { +typedef union ZScalarData +{ uint8_t u8; int8_t s8; uint16_t u16; @@ -35,7 +37,8 @@ typedef union ZScalarData { class ZScalar : public ZResource { -friend class ZVector; + friend class ZVector; + public: ZScalarData scalarData; ZScalarType scalarType; @@ -52,7 +55,9 @@ public: bool DoesSupportArray() override; void ParseRawData() override; - static ZScalar* ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, const int rawDataIndex, const std::string& nRelPath); + static ZScalar* ExtractFromXML(tinyxml2::XMLElement* reader, + const std::vector& nRawData, const int rawDataIndex, + const std::string& nRelPath); static int MapTypeToSize(const ZScalarType scalarType); static ZScalarType MapOutputTypeToScalarType(const std::string& type); static std::string MapScalarTypeToOutputType(const ZScalarType scalarType); diff --git a/tools/ZAPD/ZAPD/ZSkeleton.cpp b/tools/ZAPD/ZAPD/ZSkeleton.cpp index 37d9f46ff1..e100e2333a 100644 --- a/tools/ZAPD/ZAPD/ZSkeleton.cpp +++ b/tools/ZAPD/ZAPD/ZSkeleton.cpp @@ -1,12 +1,12 @@ #include "ZSkeleton.h" #include "BitConverter.h" -#include "StringHelper.h" #include "HighLevel/HLModelIntermediette.h" +#include "StringHelper.h" using namespace std; - -ZSkeleton::ZSkeleton(tinyxml2::XMLElement* reader, const std::vector& nRawData, int nRawDataIndex, ZFile* nParent) +ZSkeleton::ZSkeleton(tinyxml2::XMLElement* reader, const std::vector& nRawData, + int nRawDataIndex, ZFile* nParent) { rawData.assign(nRawData.begin(), nRawData.end()); rawDataIndex = nRawDataIndex; @@ -16,14 +16,44 @@ ZSkeleton::ZSkeleton(tinyxml2::XMLElement* reader, const std::vector& n ParseRawData(); string defaultPrefix = name; - defaultPrefix.replace(0, 1, "s"); // replace g prefix with s for local variables + defaultPrefix.replace(0, 1, "s"); // replace g prefix with s for local variables uint32_t ptr = Seg2Filespace(limbsArrayAddress, parent->baseAddress); - for (size_t i = 0; i < limbCount; i++) { + for (size_t i = 0; i < limbCount; i++) + { uint32_t ptr2 = Seg2Filespace(BitConverter::ToUInt32BE(rawData, ptr), parent->baseAddress); ZLimb* limb = new ZLimb(reader, rawData, ptr2, parent); - limb->SetName(StringHelper::Sprintf("%sLimb_%06X", defaultPrefix.c_str(), limb->GetFileAddress())); + limb->SetName( + StringHelper::Sprintf("%sLimb_%06X", defaultPrefix.c_str(), limb->GetFileAddress())); + limbs.push_back(limb); + + ptr += 4; + } +} + +ZSkeleton::ZSkeleton(ZSkeletonType nType, ZLimbType nLimbType, const std::string& prefix, + const std::vector& nRawData, int nRawDataIndex, ZFile* nParent) +{ + rawData.assign(nRawData.begin(), nRawData.end()); + rawDataIndex = nRawDataIndex; + parent = nParent; + + name = StringHelper::Sprintf("%sSkel_%06X", prefix.c_str(), rawDataIndex); + type = nType; + limbType = nLimbType; + + ParseRawData(); + + string defaultPrefix = name; + defaultPrefix.replace(0, 1, "s"); // replace g prefix with s for local variables + uint32_t ptr = Seg2Filespace(limbsArrayAddress, parent->baseAddress); + + for (size_t i = 0; i < limbCount; i++) + { + uint32_t ptr2 = Seg2Filespace(BitConverter::ToUInt32BE(rawData, ptr), parent->baseAddress); + + ZLimb* limb = new ZLimb(limbType, prefix, rawData, ptr2, parent); limbs.push_back(limb); ptr += 4; @@ -32,7 +62,8 @@ ZSkeleton::ZSkeleton(tinyxml2::XMLElement* reader, const std::vector& n ZSkeleton::~ZSkeleton() { - for (auto& limb: limbs) { + for (auto& limb : limbs) + { delete limb; } } @@ -42,39 +73,69 @@ void ZSkeleton::ParseXML(tinyxml2::XMLElement* reader) ZResource::ParseXML(reader); const char* skelTypeXml = reader->Attribute("Type"); - if (skelTypeXml == nullptr) { - fprintf(stderr, "ZSkeleton::ParseXML: Warning in '%s'.\n\t Type not found found. Defaulting to 'Normal'.\n", name.c_str()); + if (skelTypeXml == nullptr) + { + fprintf(stderr, + "ZSkeleton::ParseXML: Warning in '%s'.\n\t Type not found found. Defaulting to " + "'Normal'.\n", + name.c_str()); type = ZSkeletonType::Normal; } - else { + else + { string skelTypeStr(skelTypeXml); - if (skelTypeStr == "Flex") { + if (skelTypeStr == "Flex") + { type = ZSkeletonType::Flex; } - else if (skelTypeStr != "Normal") { - fprintf(stderr, "ZSkeleton::ParseXML: Warning in '%s'.\n\t Invalid Type found: '%s'. Defaulting to 'Normal'.\n", name.c_str(), skelTypeXml); + else if (skelTypeStr == "Curve") + { + type = ZSkeletonType::Curve; + } + else if (skelTypeStr != "Normal" && skelTypeStr != "Standard") + { + fprintf(stderr, + "ZSkeleton::ParseXML: Warning in '%s'.\n\t Invalid Type found: '%s'. " + "Defaulting to 'Normal'.\n", + name.c_str(), skelTypeXml); type = ZSkeletonType::Normal; } } const char* limbTypeXml = reader->Attribute("LimbType"); - if (limbTypeXml == nullptr) { - fprintf(stderr, "ZSkeleton::ParseXML: Warning in '%s'.\n\t LimbType not found found. Defaulting to 'Standard'.\n", name.c_str()); + if (limbTypeXml == nullptr) + { + fprintf(stderr, + "ZSkeleton::ParseXML: Warning in '%s'.\n\t LimbType not found found. Defaulting to " + "'Standard'.\n", + name.c_str()); limbType = ZLimbType::Standard; } - else { + else + { string limbTypeStr(limbTypeXml); - if (limbTypeStr == "Standard") { + if (limbTypeStr == "Standard") + { limbType = ZLimbType::Standard; } - else if (limbTypeStr == "LOD") { + else if (limbTypeStr == "LOD") + { limbType = ZLimbType::LOD; } - else if (limbTypeStr == "Skin") { + else if (limbTypeStr == "Skin") + { limbType = ZLimbType::Skin; } - else { - fprintf(stderr, "ZSkeleton::ParseXML: Warning in '%s'.\n\t Invalid LimbType found: '%s'. Defaulting to 'Standard'.\n", name.c_str(), limbTypeXml); + else if (limbTypeStr == "Curve") + { + limbType = ZLimbType::Curve; + } + else + { + fprintf(stderr, + "ZSkeleton::ParseXML: Warning in '%s'.\n\t Invalid LimbType found: '%s'. " + "Defaulting to 'Standard'.\n", + name.c_str(), limbTypeXml); limbType = ZLimbType::Standard; } } @@ -89,14 +150,15 @@ void ZSkeleton::ParseRawData() dListCount = BitConverter::ToUInt8BE(rawData, rawDataIndex + 8); } -ZSkeleton* ZSkeleton::FromXML(tinyxml2::XMLElement* reader, vector nRawData, int rawDataIndex, string nRelPath, ZFile* nParent) +ZSkeleton* ZSkeleton::FromXML(tinyxml2::XMLElement* reader, vector nRawData, + int rawDataIndex, string nRelPath, ZFile* nParent) { ZSkeleton* skeleton = new ZSkeleton(reader, nRawData, rawDataIndex, nParent); skeleton->relativePath = std::move(nRelPath); - skeleton->parent->AddDeclaration( - skeleton->rawDataIndex, DeclarationAlignment::Align16, skeleton->GetRawDataSize(), - skeleton->GetSourceTypeName(), skeleton->name, ""); + skeleton->parent->AddDeclaration(skeleton->rawDataIndex, DeclarationAlignment::Align16, + skeleton->GetRawDataSize(), skeleton->GetSourceTypeName(), + skeleton->name, ""); return skeleton; } @@ -109,16 +171,17 @@ void ZSkeleton::GenerateHLIntermediette(HLFileIntermediette& hlFile) { HLModelIntermediette* mdl = (HLModelIntermediette*)&hlFile; HLModelIntermediette::FromZSkeleton(mdl, this); - //mdl->blocks.push_back(new HLTerminator()); + // mdl->blocks.push_back(new HLTerminator()); } int ZSkeleton::GetRawDataSize() { - switch (type) { - case ZSkeletonType::Normal: - return 0x8; + switch (type) + { case ZSkeletonType::Flex: return 0xC; + case ZSkeletonType::Normal: + case ZSkeletonType::Curve: default: return 0x8; } @@ -126,14 +189,16 @@ int ZSkeleton::GetRawDataSize() std::string ZSkeleton::GetSourceOutputCode(const std::string& prefix) { - if (parent == nullptr) { + if (parent == nullptr) + { return ""; } string defaultPrefix = name.c_str(); - defaultPrefix.replace(0, 1, "s"); // replace g prefix with s for local variables + defaultPrefix.replace(0, 1, "s"); // replace g prefix with s for local variables - for (auto& limb: limbs) { + for (auto& limb : limbs) + { limb->GetSourceOutputCode(defaultPrefix); } @@ -147,35 +212,42 @@ std::string ZSkeleton::GetSourceOutputCode(const std::string& prefix) { ZLimb* limb = limbs.at(i); - string decl = StringHelper::Sprintf(" &%s,", parent->GetDeclarationName(limb->GetFileAddress()).c_str()); - if (i != (limbs.size() - 1)) { + string decl = StringHelper::Sprintf( + " &%s,", parent->GetDeclarationName(limb->GetFileAddress()).c_str()); + if (i != (limbs.size() - 1)) + { decl += "\n"; } tblStr += decl; } - parent->AddDeclarationArray(ptr, DeclarationAlignment::None, 4 * limbCount, - StringHelper::Sprintf("static %s*", ZLimb::GetSourceTypeName(limbType)), - StringHelper::Sprintf("%sLimbs", defaultPrefix.c_str()), limbCount, tblStr); + parent->AddDeclarationArray(ptr, DeclarationAlignment::None, 4 * limbCount, "static void*", + StringHelper::Sprintf("%sLimbs", defaultPrefix.c_str()), + limbCount, tblStr); } string headerStr; - switch (type) { + switch (type) + { case ZSkeletonType::Normal: + case ZSkeletonType::Curve: headerStr = StringHelper::Sprintf("%sLimbs, %i", defaultPrefix.c_str(), limbCount); break; case ZSkeletonType::Flex: - headerStr = StringHelper::Sprintf("%sLimbs, %i, %i", defaultPrefix.c_str(), limbCount, dListCount); + headerStr = + StringHelper::Sprintf("%sLimbs, %i, %i", defaultPrefix.c_str(), limbCount, dListCount); break; } Declaration* decl = parent->GetDeclaration(GetAddress()); - if (decl == nullptr) { - parent->AddDeclaration(GetAddress(), DeclarationAlignment::Align16, - GetRawDataSize(), GetSourceTypeName(), name, headerStr); + if (decl == nullptr) + { + parent->AddDeclaration(GetAddress(), DeclarationAlignment::Align16, GetRawDataSize(), + GetSourceTypeName(), name, headerStr); } - else { + else + { decl->text = headerStr; } @@ -184,11 +256,14 @@ std::string ZSkeleton::GetSourceOutputCode(const std::string& prefix) std::string ZSkeleton::GetSourceTypeName() { - switch (type) { + switch (type) + { case ZSkeletonType::Normal: return "SkeletonHeader"; case ZSkeletonType::Flex: return "FlexSkeletonHeader"; + case ZSkeletonType::Curve: + return "SkelCurveLimbList"; } return "SkeletonHeader"; } @@ -202,3 +277,8 @@ segptr_t ZSkeleton::GetAddress() { return rawDataIndex; } + +uint8_t ZSkeleton::GetLimbCount() +{ + return limbCount; +} diff --git a/tools/ZAPD/ZAPD/ZSkeleton.h b/tools/ZAPD/ZAPD/ZSkeleton.h index 2cafd56ceb..06ad628412 100644 --- a/tools/ZAPD/ZAPD/ZSkeleton.h +++ b/tools/ZAPD/ZAPD/ZSkeleton.h @@ -1,16 +1,17 @@ #pragma once -#include -#include #include -#include "ZFile.h" +#include +#include #include "ZDisplayList.h" +#include "ZFile.h" #include "ZLimb.h" enum ZSkeletonType { Normal, - Flex + Flex, + Curve, }; class ZSkeleton : public ZResource @@ -21,13 +22,18 @@ public: std::vector limbs; segptr_t limbsArrayAddress; uint8_t limbCount; - uint8_t dListCount; // FLEX SKELETON ONLY + uint8_t dListCount; // FLEX SKELETON ONLY - ZSkeleton(tinyxml2::XMLElement* reader, const std::vector& nRawData, int nRawDataIndex, ZFile* nParent); + ZSkeleton() = default; + ZSkeleton(tinyxml2::XMLElement* reader, const std::vector& nRawData, int nRawDataIndex, + ZFile* nParent); + ZSkeleton(ZSkeletonType nType, ZLimbType nLimbType, const std::string& prefix, + const std::vector& nRawData, int nRawDataIndex, ZFile* nParent); ~ZSkeleton(); void ParseXML(tinyxml2::XMLElement* reader) override; void ParseRawData() override; - static ZSkeleton* FromXML(tinyxml2::XMLElement* reader, std::vector nRawData, int rawDataIndex, std::string nRelPath, ZFile* nParent); + static ZSkeleton* FromXML(tinyxml2::XMLElement* reader, std::vector nRawData, + int rawDataIndex, std::string nRelPath, ZFile* nParent); void Save(const std::string& outFolder) override; void GenerateHLIntermediette(HLFileIntermediette& hlFile) override; @@ -38,4 +44,5 @@ public: ZResourceType GetResourceType() override; segptr_t GetAddress(); + uint8_t GetLimbCount(); }; diff --git a/tools/ZAPD/ZAPD/ZSymbol.cpp b/tools/ZAPD/ZAPD/ZSymbol.cpp new file mode 100644 index 0000000000..44613c545a --- /dev/null +++ b/tools/ZAPD/ZAPD/ZSymbol.cpp @@ -0,0 +1,105 @@ +#include "ZSymbol.h" +#include "StringHelper.h" + +ZSymbol::ZSymbol(const std::string& nName, int nRawDataIndex, const std::string& nType, + uint32_t nTypeSize, bool nIsArray, uint32_t nCount) + : type(nType), typeSize(nTypeSize), isArray(nIsArray), count(nCount) +{ + name = nName; + rawDataIndex = nRawDataIndex; +} + +ZSymbol::ZSymbol(tinyxml2::XMLElement* reader, const std::vector& nRawData, + int nRawDataIndex, ZFile* nParent) +{ + rawData.assign(nRawData.begin(), nRawData.end()); + rawDataIndex = nRawDataIndex; + parent = nParent; + + ParseXML(reader); +} + +ZSymbol* ZSymbol::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, + int nRawDataIndex, ZFile* parent) +{ + ZSymbol* symbol = new ZSymbol(reader, nRawData, nRawDataIndex, parent); + + return symbol; +} + +void ZSymbol::ParseXML(tinyxml2::XMLElement* reader) +{ + ZResource::ParseXML(reader); + + const char* typeXml = reader->Attribute("Type"); + if (typeXml == nullptr) + { + fprintf(stderr, + "ZSymbol::ParseXML: Warning in '%s'.\n\t Missing 'Type' attribute in xml. " + "Defaulting to 'void*'.\n", + name.c_str()); + type = "void*"; + } + else + { + type = std::string(typeXml); + } + + const char* typeSizeXml = reader->Attribute("TypeSize"); + if (typeSizeXml == nullptr) + { + fprintf(stderr, + "ZSymbol::ParseXML: Warning in '%s'.\n\t Missing 'TypeSize' attribute in xml. " + "Defaulting to '4'.\n", + name.c_str()); + typeSize = 4; // Size of a word. + } + else + { + typeSize = std::strtoul(typeSizeXml, nullptr, 0); + } + + const char* countXml = reader->Attribute("Count"); + if (countXml != nullptr) + { + isArray = true; + if (!std::string(countXml).empty()) + { + count = std::strtoul(countXml, nullptr, 0); + } + } +} + +int ZSymbol::GetRawDataSize() +{ + if (isArray) + { + return count * typeSize; + } + return typeSize; +} + +std::string ZSymbol::GetSourceOutputHeader(const std::string& prefix) +{ + if (isArray) + { + if (count == 0) + { + return StringHelper::Sprintf("extern %s %s%s[];\n", type.c_str(), prefix.c_str(), + name.c_str()); + } + return StringHelper::Sprintf("extern %s %s%s[%i];\n", type.c_str(), prefix.c_str(), + name.c_str(), count); + } + return StringHelper::Sprintf("extern %s %s%s;\n", type.c_str(), prefix.c_str(), name.c_str()); +} + +std::string ZSymbol::GetSourceTypeName() +{ + return type; +} + +ZResourceType ZSymbol::GetResourceType() +{ + return ZResourceType::Symbol; +} diff --git a/tools/ZAPD/ZAPD/ZSymbol.h b/tools/ZAPD/ZAPD/ZSymbol.h new file mode 100644 index 0000000000..4513f8ff30 --- /dev/null +++ b/tools/ZAPD/ZAPD/ZSymbol.h @@ -0,0 +1,33 @@ +#pragma once + +#include "ZResource.h" +#include "tinyxml2.h" + +class ZSymbol : public ZResource +{ +protected: + std::string type; + uint32_t typeSize; + bool isArray = false; + uint32_t count = 0; + +public: + ZSymbol() = default; + ZSymbol(const std::string& nName, int nRawDataIndex, const std::string& nType, + uint32_t nTypeSize, bool nIsArray, uint32_t nCount); + ZSymbol(tinyxml2::XMLElement* reader, const std::vector& nRawData, int nRawDataIndex, + ZFile* nParent); + + static ZSymbol* ExtractFromXML(tinyxml2::XMLElement* reader, + const std::vector& nRawData, int nRawDataIndex, + ZFile* parent); + + void ParseXML(tinyxml2::XMLElement* reader) override; + + int GetRawDataSize() override; + + std::string GetSourceOutputHeader(const std::string& prefix) override; + + std::string GetSourceTypeName() override; + ZResourceType GetResourceType() override; +}; diff --git a/tools/ZAPD/ZAPD/ZTexture.cpp b/tools/ZAPD/ZAPD/ZTexture.cpp index 21d01df79a..ab2ee55461 100644 --- a/tools/ZAPD/ZAPD/ZTexture.cpp +++ b/tools/ZAPD/ZAPD/ZTexture.cpp @@ -3,10 +3,10 @@ #define TINYGLTF_IMPLEMENTATION #include "ZTexture.h" -#include "StringHelper.h" #include "BitConverter.h" -#include "Path.h" #include "File.h" +#include "Path.h" +#include "StringHelper.h" #include "stb_image.h" #include "stb_image_write.h" @@ -44,13 +44,15 @@ ZTexture::~ZTexture() } // EXTRACT MODE -ZTexture* ZTexture::ExtractFromXML(XMLElement* reader, vector nRawData, int nRawDataIndex, string nRelPath) +ZTexture* ZTexture::ExtractFromXML(XMLElement* reader, vector nRawData, int nRawDataIndex, + string nRelPath) { ZTexture* tex = new ZTexture(); tex->ParseXML(reader); tex->rawDataIndex = nRawDataIndex; - tex->rawData = vector(nRawData.data() + tex->rawDataIndex, nRawData.data() + tex->rawDataIndex + tex->GetRawDataSize()); + tex->rawData = vector(nRawData.data() + tex->rawDataIndex, + nRawData.data() + tex->rawDataIndex + tex->GetRawDataSize()); tex->relativePath = nRelPath; @@ -60,7 +62,8 @@ ZTexture* ZTexture::ExtractFromXML(XMLElement* reader, vector nRawData, return tex; } -ZTexture* ZTexture::FromBinary(TextureType nType, std::vector nRawData, int nRawDataIndex, std::string nName, int nWidth, int nHeight) +ZTexture* ZTexture::FromBinary(TextureType nType, std::vector nRawData, int nRawDataIndex, + std::string nName, int nWidth, int nHeight) { ZTexture* tex = new ZTexture(); @@ -99,23 +102,44 @@ ZTexture* ZTexture::FromPNG(string pngFilePath, TextureType texType) ZTexture* tex = new ZTexture(); tex->type = texType; tex->name = StringHelper::Split(Path::GetFileNameWithoutExtension(pngFilePath), ".")[0]; - - tex->bmpRgb = (uint8_t*)stbi_load((pngFilePath).c_str(), &tex->width, &tex->height, &comp, STBI_rgb); + + tex->bmpRgb = + (uint8_t*)stbi_load((pngFilePath).c_str(), &tex->width, &tex->height, &comp, STBI_rgb); stbi_image_free(tex->bmpRgb); tex->bmpRgb = nullptr; tex->rawData = vector(tex->GetRawDataSize()); switch (texType) { - case TextureType::RGBA16bpp: tex->PrepareRawDataRGBA16(pngFilePath); break; - case TextureType::RGBA32bpp: tex->PrepareRawDataRGBA32(pngFilePath); break; - case TextureType::Grayscale4bpp: tex->PrepareRawDataGrayscale4(pngFilePath); break; - case TextureType::Grayscale8bpp: tex->PrepareRawDataGrayscale8(pngFilePath); break; - case TextureType::GrayscaleAlpha4bpp: tex->PrepareRawDataGrayscaleAlpha4(pngFilePath); break; - case TextureType::GrayscaleAlpha8bpp: tex->PrepareRawDataGrayscaleAlpha8(pngFilePath); break; - case TextureType::GrayscaleAlpha16bpp: tex->PrepareRawDataGrayscaleAlpha16(pngFilePath); break; - case TextureType::Palette4bpp: tex->PrepareRawDataPalette4(pngFilePath); break; - case TextureType::Palette8bpp: tex->PrepareRawDataPalette8(pngFilePath); break; + case TextureType::RGBA16bpp: + tex->PrepareRawDataRGBA16(pngFilePath); + break; + case TextureType::RGBA32bpp: + tex->PrepareRawDataRGBA32(pngFilePath); + break; + case TextureType::Grayscale4bpp: + tex->PrepareRawDataGrayscale4(pngFilePath); + break; + case TextureType::Grayscale8bpp: + tex->PrepareRawDataGrayscale8(pngFilePath); + break; + case TextureType::GrayscaleAlpha4bpp: + tex->PrepareRawDataGrayscaleAlpha4(pngFilePath); + break; + case TextureType::GrayscaleAlpha8bpp: + tex->PrepareRawDataGrayscaleAlpha8(pngFilePath); + break; + case TextureType::GrayscaleAlpha16bpp: + tex->PrepareRawDataGrayscaleAlpha16(pngFilePath); + break; + case TextureType::Palette4bpp: + tex->PrepareRawDataPalette4(pngFilePath); + break; + case TextureType::Palette8bpp: + tex->PrepareRawDataPalette8(pngFilePath); + break; + default: + throw std::runtime_error("Format is not supported!"); } tex->FixRawData(); @@ -149,23 +173,23 @@ void ZTexture::ParseXML(XMLElement* reader) type = GetTextureTypeFromString(formatStr); if (type == TextureType::Error) - throw "Format " + formatStr + " is not supported!"; + throw std::runtime_error("Format " + formatStr + " is not supported!"); } void ZTexture::FixRawData() { if (type == TextureType::RGBA32bpp) { - for (int i = 0; i < rawData.size(); i += 4) + for (size_t i = 0; i < rawData.size(); i += 4) { uint8_t tmp = rawData[i]; rawData[i] = rawData[i + 2]; rawData[i + 2] = tmp; } } - else if (type == TextureType::RGBA16bpp)// || type == TextureType::GrayscaleAlpha16bpp) + else if (type == TextureType::RGBA16bpp) // || type == TextureType::GrayscaleAlpha16bpp) { - for (int i = 0; i < rawData.size(); i += 2) + for (size_t i = 0; i < rawData.size(); i += 2) { uint8_t tmp = rawData[i]; rawData[i] = rawData[i + 1]; @@ -181,15 +205,35 @@ void ZTexture::PrepareBitmap() switch (type) { - case TextureType::RGBA16bpp: PrepareBitmapRGBA16(); break; - case TextureType::RGBA32bpp: PrepareBitmapRGBA32(); break; - case TextureType::Grayscale4bpp: PrepareBitmapGrayscale4(); break; - case TextureType::Grayscale8bpp: PrepareBitmapGrayscale8(); break; - case TextureType::GrayscaleAlpha4bpp: PrepareBitmapGrayscaleAlpha4(); break; - case TextureType::GrayscaleAlpha8bpp: PrepareBitmapGrayscaleAlpha8(); break; - case TextureType::GrayscaleAlpha16bpp: PrepareBitmapGrayscaleAlpha16(); break; - case TextureType::Palette4bpp: PrepareBitmapPalette4(); break; - case TextureType::Palette8bpp: PrepareBitmapPalette8(); break; + case TextureType::RGBA16bpp: + PrepareBitmapRGBA16(); + break; + case TextureType::RGBA32bpp: + PrepareBitmapRGBA32(); + break; + case TextureType::Grayscale4bpp: + PrepareBitmapGrayscale4(); + break; + case TextureType::Grayscale8bpp: + PrepareBitmapGrayscale8(); + break; + case TextureType::GrayscaleAlpha4bpp: + PrepareBitmapGrayscaleAlpha4(); + break; + case TextureType::GrayscaleAlpha8bpp: + PrepareBitmapGrayscaleAlpha8(); + break; + case TextureType::GrayscaleAlpha16bpp: + PrepareBitmapGrayscaleAlpha16(); + break; + case TextureType::Palette4bpp: + PrepareBitmapPalette4(); + break; + case TextureType::Palette8bpp: + PrepareBitmapPalette8(); + break; + default: + throw std::runtime_error("Format is not supported!"); } } @@ -378,17 +422,35 @@ void ZTexture::PrepareRawData(string inFolder) switch (type) { - case TextureType::RGBA16bpp: PrepareRawDataRGBA16(inFolder + "/" + outName + ".rgba5a1.png"); break; - case TextureType::RGBA32bpp: PrepareRawDataRGBA32(inFolder + "/" + outName + ".rgba32.png"); break; - case TextureType::Grayscale4bpp: PrepareRawDataGrayscale4(inFolder + "/" + outName + ".i4.png"); break; - case TextureType::Grayscale8bpp: PrepareRawDataGrayscale8(inFolder + "/" + outName + ".i8.png"); break; - case TextureType::GrayscaleAlpha4bpp: PrepareRawDataGrayscaleAlpha4(inFolder + "/" + outName + ".ia4.png"); break; - case TextureType::GrayscaleAlpha8bpp: PrepareRawDataGrayscaleAlpha8(inFolder + "/" + outName + ".ia8.png"); break; - case TextureType::GrayscaleAlpha16bpp: PrepareRawDataGrayscaleAlpha16(inFolder + "/" + outName + ".ia16.png"); break; - case TextureType::Palette4bpp: PrepareRawDataPalette4(inFolder + "/" + outName + ".ci4.png"); break; - case TextureType::Palette8bpp: PrepareRawDataPalette8(inFolder + "/" + outName + ".ci8.png"); break; + case TextureType::RGBA16bpp: + PrepareRawDataRGBA16(inFolder + "/" + outName + ".rgba5a1.png"); + break; + case TextureType::RGBA32bpp: + PrepareRawDataRGBA32(inFolder + "/" + outName + ".rgba32.png"); + break; + case TextureType::Grayscale4bpp: + PrepareRawDataGrayscale4(inFolder + "/" + outName + ".i4.png"); + break; + case TextureType::Grayscale8bpp: + PrepareRawDataGrayscale8(inFolder + "/" + outName + ".i8.png"); + break; + case TextureType::GrayscaleAlpha4bpp: + PrepareRawDataGrayscaleAlpha4(inFolder + "/" + outName + ".ia4.png"); + break; + case TextureType::GrayscaleAlpha8bpp: + PrepareRawDataGrayscaleAlpha8(inFolder + "/" + outName + ".ia8.png"); + break; + case TextureType::GrayscaleAlpha16bpp: + PrepareRawDataGrayscaleAlpha16(inFolder + "/" + outName + ".ia16.png"); + break; + case TextureType::Palette4bpp: + PrepareRawDataPalette4(inFolder + "/" + outName + ".ci4.png"); + break; + case TextureType::Palette8bpp: + PrepareRawDataPalette8(inFolder + "/" + outName + ".ci8.png"); + break; default: - throw "Build Mode: Format is not supported!"; + throw std::runtime_error("Build Mode: Format is not supported!"); } } @@ -603,13 +665,22 @@ float ZTexture::GetPixelMultiplyer() { switch (type) { - case TextureType::Grayscale4bpp: case TextureType::GrayscaleAlpha4bpp: case TextureType::Palette4bpp: return 0.5f; - case TextureType::Grayscale8bpp: case TextureType::GrayscaleAlpha8bpp: case TextureType::Palette8bpp: return 1; - case TextureType::GrayscaleAlpha16bpp: case TextureType::RGBA16bpp: return 2; - case TextureType::RGBA32bpp: return 4; + case TextureType::Grayscale4bpp: + case TextureType::GrayscaleAlpha4bpp: + case TextureType::Palette4bpp: + return 0.5f; + case TextureType::Grayscale8bpp: + case TextureType::GrayscaleAlpha8bpp: + case TextureType::Palette8bpp: + return 1; + case TextureType::GrayscaleAlpha16bpp: + case TextureType::RGBA16bpp: + return 2; + case TextureType::RGBA32bpp: + return 4; + default: + return -1; } - - return -1; } vector ZTexture::GetRawData() @@ -626,26 +697,43 @@ std::string ZTexture::GetIMFmtFromType() { switch (type) { - case TextureType::RGBA32bpp: case TextureType::RGBA16bpp: return "G_IM_FMT_RGBA"; - case TextureType::Grayscale4bpp: case TextureType::Grayscale8bpp: return "G_IM_FMT_I"; - case TextureType::Palette4bpp: case TextureType::Palette8bpp: return "G_IM_FMT_CI"; - case TextureType::GrayscaleAlpha4bpp: case TextureType::GrayscaleAlpha8bpp: case TextureType::GrayscaleAlpha16bpp: return "G_IM_FMT_IA"; + case TextureType::RGBA32bpp: + case TextureType::RGBA16bpp: + return "G_IM_FMT_RGBA"; + case TextureType::Grayscale4bpp: + case TextureType::Grayscale8bpp: + return "G_IM_FMT_I"; + case TextureType::Palette4bpp: + case TextureType::Palette8bpp: + return "G_IM_FMT_CI"; + case TextureType::GrayscaleAlpha4bpp: + case TextureType::GrayscaleAlpha8bpp: + case TextureType::GrayscaleAlpha16bpp: + return "G_IM_FMT_IA"; + default: + return "ERROR"; } - - return "ERROR"; } std::string ZTexture::GetIMSizFromType() { switch (type) { - case TextureType::Grayscale4bpp: case TextureType::Palette4bpp: case TextureType::GrayscaleAlpha4bpp: return "G_IM_SIZ_4b"; - case TextureType::Palette8bpp: case TextureType::Grayscale8bpp: return "G_IM_SIZ_8b"; - case TextureType::GrayscaleAlpha16bpp: case TextureType::RGBA16bpp: return "G_IM_SIZ_16b"; - case TextureType::RGBA32bpp: return "G_IM_SIZ_32b"; + case TextureType::Grayscale4bpp: + case TextureType::Palette4bpp: + case TextureType::GrayscaleAlpha4bpp: + return "G_IM_SIZ_4b"; + case TextureType::Palette8bpp: + case TextureType::Grayscale8bpp: + return "G_IM_SIZ_8b"; + case TextureType::GrayscaleAlpha16bpp: + case TextureType::RGBA16bpp: + return "G_IM_SIZ_16b"; + case TextureType::RGBA32bpp: + return "G_IM_SIZ_32b"; + default: + return "ERROR"; } - - return "ERROR"; } int ZTexture::GetWidth() @@ -676,26 +764,35 @@ TextureType ZTexture::GetTextureType() void ZTexture::Save(const std::string& outFolder) { if (type == TextureType::RGBA32bpp) - stbi_write_png((outFolder + "/" + outName + ".rgba32.png").c_str(), width, height, 4, bmpRgba, width * 4); + stbi_write_png((outFolder + "/" + outName + ".rgba32.png").c_str(), width, height, 4, + bmpRgba, width * 4); else if (type == TextureType::RGBA16bpp) - stbi_write_png((outFolder + "/" + outName + ".rgb5a1.png").c_str(), width, height, 4, bmpRgba, width * 4); + stbi_write_png((outFolder + "/" + outName + ".rgb5a1.png").c_str(), width, height, 4, + bmpRgba, width * 4); else if (type == TextureType::Grayscale8bpp) - stbi_write_png((outFolder + "/" + outName + ".i8.png").c_str(), width, height, 3, bmpRgb, width * 3); + stbi_write_png((outFolder + "/" + outName + ".i8.png").c_str(), width, height, 3, bmpRgb, + width * 3); else if (type == TextureType::Grayscale4bpp) - stbi_write_png((outFolder + "/" + outName + ".i4.png").c_str(), width, height, 3, bmpRgb, width * 3); + stbi_write_png((outFolder + "/" + outName + ".i4.png").c_str(), width, height, 3, bmpRgb, + width * 3); else if (type == TextureType::GrayscaleAlpha16bpp) - stbi_write_png((outFolder + "/" + outName + ".ia16.png").c_str(), width, height, 4, bmpRgba, width * 4); + stbi_write_png((outFolder + "/" + outName + ".ia16.png").c_str(), width, height, 4, bmpRgba, + width * 4); else if (type == TextureType::GrayscaleAlpha8bpp) - stbi_write_png((outFolder + "/" + outName + ".ia8.png").c_str(), width, height, 4, bmpRgba, width * 4); + stbi_write_png((outFolder + "/" + outName + ".ia8.png").c_str(), width, height, 4, bmpRgba, + width * 4); else if (type == TextureType::GrayscaleAlpha4bpp) - stbi_write_png((outFolder + "/" + outName + ".ia4.png").c_str(), width, height, 4, bmpRgba, width * 4); + stbi_write_png((outFolder + "/" + outName + ".ia4.png").c_str(), width, height, 4, bmpRgba, + width * 4); else if (type == TextureType::Palette4bpp) - stbi_write_png((outFolder + "/" + outName + ".ci4.png").c_str(), width, height, 3, bmpRgb, width * 3); + stbi_write_png((outFolder + "/" + outName + ".ci4.png").c_str(), width, height, 3, bmpRgb, + width * 3); else if (type == TextureType::Palette8bpp) - stbi_write_png((outFolder + "/" + outName + ".ci8.png").c_str(), width, height, 3, bmpRgb, width * 3); + stbi_write_png((outFolder + "/" + outName + ".ci8.png").c_str(), width, height, 3, bmpRgb, + width * 3); - //if (outName != name && outName != "") - //File::WriteAllText(outFolder + "/" + outName + ".cfg", name.c_str()); + // if (outName != name && outName != "") + // File::WriteAllText(outFolder + "/" + outName + ".cfg", name.c_str()); } // HOTSPOT @@ -703,29 +800,33 @@ string ZTexture::GetSourceOutputCode(const std::string& prefix) { sourceOutput = ""; - //sprintf(line, "%s:\n", name.c_str()); - //sourceOutput += line; + // sprintf(line, "%s:\n", name.c_str()); + // sourceOutput += line; // TODO: TEMP relativePath = "build/assets/" + relativePath; FixRawData(); - //sourceOutput += StringHelper::Sprintf("u64 %s[] = \n{\n", name.c_str()); + // sourceOutput += StringHelper::Sprintf("u64 %s[] = \n{\n", name.c_str()); uint8_t* rawDataArr = rawData.data(); - for (int i = 0; i < rawData.size(); i += 8) + for (size_t i = 0; i < rawData.size(); i += 8) { if (i % 32 == 0) sourceOutput += "\t"; - sourceOutput += StringHelper::Sprintf("0x%016llX, ", BitConverter::ToUInt64BE(rawDataArr, i)); + sourceOutput += + StringHelper::Sprintf("0x%016llX, ", BitConverter::ToUInt64BE(rawDataArr, i)); if (i % 32 == 24) sourceOutput += StringHelper::Sprintf(" // 0x%06X \n", rawDataIndex + ((i / 32) * 32)); } - //sourceOutput += "};\n"; + // Ensure there's always a trailing line feed to prevent dumb warnings. + sourceOutput += "\n"; + + // sourceOutput += "};\n"; return sourceOutput; } @@ -749,24 +850,32 @@ std::string ZTexture::GetExternalExtension() { switch (type) { - case TextureType::RGBA32bpp: return "rgba32"; - case TextureType::RGBA16bpp: return "rgb5a1"; - case TextureType::Grayscale4bpp: return "i4"; - case TextureType::Grayscale8bpp: return "i8"; - case TextureType::GrayscaleAlpha4bpp: return "ia4"; - case TextureType::GrayscaleAlpha8bpp: return "ia8"; - case TextureType::GrayscaleAlpha16bpp: return "ia16"; - case TextureType::Palette4bpp: return "ci4"; - case TextureType::Palette8bpp: return "ci8"; + case TextureType::RGBA32bpp: + return "rgba32"; + case TextureType::RGBA16bpp: + return "rgb5a1"; + case TextureType::Grayscale4bpp: + return "i4"; + case TextureType::Grayscale8bpp: + return "i8"; + case TextureType::GrayscaleAlpha4bpp: + return "ia4"; + case TextureType::GrayscaleAlpha8bpp: + return "ia8"; + case TextureType::GrayscaleAlpha16bpp: + return "ia16"; + case TextureType::Palette4bpp: + return "ci4"; + case TextureType::Palette8bpp: + return "ci8"; + default: + return "ERROR"; } - - return ""; } - string ZTexture::GetSourceOutputHeader(const std::string& prefix) { - //return StringHelper::Sprintf("extern u64 %s[];\n", name.c_str()); + // return StringHelper::Sprintf("extern u64 %s[];\n", name.c_str()); return ""; } @@ -792,7 +901,7 @@ TextureType ZTexture::GetTextureTypeFromString(string str) texType = TextureType::Palette4bpp; else if (str == "ci8") texType = TextureType::Palette8bpp; - else - printf("Encountered Unknown Texture Type %s \n",str.c_str()); + else + fprintf(stderr, "Encountered Unknown Texture Type %s \n", str.c_str()); return texType; } diff --git a/tools/ZAPD/ZAPD/ZTexture.h b/tools/ZAPD/ZAPD/ZTexture.h index faf7d68fdc..3b66d083be 100644 --- a/tools/ZAPD/ZAPD/ZTexture.h +++ b/tools/ZAPD/ZAPD/ZTexture.h @@ -1,7 +1,7 @@ #pragma once -#include "ZResource.h" #include "HighLevel/HLTexture.h" +#include "ZResource.h" #include "tinyxml2.h" #include @@ -62,9 +62,12 @@ public: bool isPalette; - static ZTexture* BuildFromXML(tinyxml2::XMLElement* reader, std::string inFolder, bool readFile); - static ZTexture* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, int rawDataIndex, std::string nRelPath); - static ZTexture* FromBinary(TextureType nType, std::vector nRawData, int rawDataIndex, std::string nName, int nWidth, int nHeight); + static ZTexture* BuildFromXML(tinyxml2::XMLElement* reader, std::string inFolder, + bool readFile); + static ZTexture* ExtractFromXML(tinyxml2::XMLElement* reader, std::vector nRawData, + int rawDataIndex, std::string nRelPath); + static ZTexture* FromBinary(TextureType nType, std::vector nRawData, int rawDataIndex, + std::string nName, int nWidth, int nHeight); static ZTexture* FromPNG(std::string pngFilePath, TextureType texType); static ZTexture* FromHLTexture(HLTexture* hlTex); static TextureType GetTextureTypeFromString(std::string str); diff --git a/tools/ZAPD/ZAPD/ZVector.cpp b/tools/ZAPD/ZAPD/ZVector.cpp index 23de24fc39..68f3739e73 100644 --- a/tools/ZAPD/ZAPD/ZVector.cpp +++ b/tools/ZAPD/ZAPD/ZVector.cpp @@ -1,10 +1,10 @@ #include "ZVector.h" -#include "ZFile.h" +#include #include "BitConverter.h" -#include "StringHelper.h" #include "File.h" #include "Globals.h" -#include +#include "StringHelper.h" +#include "ZFile.h" ZVector::ZVector() : ZResource() { @@ -13,7 +13,8 @@ ZVector::ZVector() : ZResource() this->dimensions = 0; } -ZVector* ZVector::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, const int rawDataIndex, const std::string& nRelPath) +ZVector* ZVector::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, + const int rawDataIndex, const std::string& nRelPath) { ZVector* vector = new ZVector(); vector->rawData = nRawData; @@ -41,7 +42,7 @@ void ZVector::ParseRawData() scalars.clear(); - for (int i = 0; i < this->dimensions; i++) + for (uint32_t i = 0; i < this->dimensions; i++) { ZScalar* scalar = new ZScalar(this->scalarType); scalar->rawDataIndex = currentRawDataIndex; @@ -59,7 +60,7 @@ void ZVector::ParseRawData() int ZVector::GetRawDataSize() { int size = 0; - for (int i = 0; i < this->scalars.size(); i++) + for (size_t i = 0; i < this->scalars.size(); i++) size += this->scalars[i]->GetRawDataSize(); return size; } @@ -85,7 +86,9 @@ std::string ZVector::GetSourceTypeName() } else { - std::string output = StringHelper::Sprintf("Encountered unsupported vector type: %d dimensions, %s type", dimensions, ZScalar::MapScalarTypeToOutputType(scalarType).c_str()); + std::string output = StringHelper::Sprintf( + "Encountered unsupported vector type: %d dimensions, %s type", dimensions, + ZScalar::MapScalarTypeToOutputType(scalarType).c_str()); if (Globals::Instance->verbosity >= VERBOSITY_DEBUG) printf("%s\n", output.c_str()); @@ -97,7 +100,7 @@ std::string ZVector::GetSourceTypeName() std::string ZVector::GetSourceValue() { std::vector strings = std::vector(); - for (int i = 0; i < this->scalars.size(); i++) + for (size_t i = 0; i < this->scalars.size(); i++) strings.push_back(scalars[i]->GetSourceValue()); return "{ " + StringHelper::Implode(strings, ", ") + " }"; } @@ -105,7 +108,8 @@ std::string ZVector::GetSourceValue() std::string ZVector::GetSourceOutputCode(const std::string& prefix) { if (parent != nullptr) - parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), GetSourceTypeName(), GetName(), GetSourceValue()); + parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), + GetSourceTypeName(), GetName(), GetSourceValue()); return ""; } diff --git a/tools/ZAPD/ZAPD/ZVector.h b/tools/ZAPD/ZAPD/ZVector.h index 0d6ea06eb3..a12ee47a5b 100644 --- a/tools/ZAPD/ZAPD/ZVector.h +++ b/tools/ZAPD/ZAPD/ZVector.h @@ -1,8 +1,8 @@ #pragma once -#include -#include #include +#include +#include #include "ZResource.h" #include "ZScalar.h" #include "tinyxml2.h" @@ -16,16 +16,18 @@ public: ZVector(); - void ParseXML(tinyxml2::XMLElement* reader); + void ParseXML(tinyxml2::XMLElement* reader) override; std::string GetSourceTypeName() override; std::string GetSourceValue(); - std::string GetSourceOutputCode(const std::string& prefix); + std::string GetSourceOutputCode(const std::string& prefix) override; void ParseRawData() override; - int GetRawDataSize(); + int GetRawDataSize() override; bool DoesSupportArray() override; - ZResourceType GetResourceType(); + ZResourceType GetResourceType() override; - static ZVector* ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, const int rawDataIndex, const std::string& nRelPath); + static ZVector* ExtractFromXML(tinyxml2::XMLElement* reader, + const std::vector& nRawData, const int rawDataIndex, + const std::string& nRelPath); protected: }; \ No newline at end of file diff --git a/tools/ZAPD/ZAPD/ZVtx.cpp b/tools/ZAPD/ZAPD/ZVtx.cpp index b951310429..c551e0d573 100644 --- a/tools/ZAPD/ZAPD/ZVtx.cpp +++ b/tools/ZAPD/ZAPD/ZVtx.cpp @@ -1,7 +1,7 @@ #include "ZVtx.h" -#include "ZFile.h" -#include "StringHelper.h" #include "BitConverter.h" +#include "StringHelper.h" +#include "ZFile.h" ZVtx::ZVtx() { @@ -28,12 +28,14 @@ std::string ZVtx::GetSourceTypeName() std::string ZVtx::GetSourceOutputCode(const std::string& prefix) { - std::string output = StringHelper::Sprintf("VTX(%i, %i, %i, %i, %i, %i, %i, %i, %i)", x, y, z, s, t, r, g, b, a); + std::string output = + StringHelper::Sprintf("VTX(%i, %i, %i, %i, %i, %i, %i, %i, %i)", x, y, z, s, t, r, g, b, a); if (parent != nullptr) - parent->AddDeclaration(rawDataIndex, DeclarationAlignment::Align16, GetRawDataSize(), GetSourceTypeName(), name, output); + parent->AddDeclaration(rawDataIndex, DeclarationAlignment::Align16, GetRawDataSize(), + GetSourceTypeName(), name, output); - return ""; + return ""; } void ZVtx::ParseRawData() @@ -54,25 +56,26 @@ void ZVtx::ParseRawData() int ZVtx::GetRawDataSize() { - return 16; + return 16; } bool ZVtx::DoesSupportArray() { - return true; + return true; } ZResourceType ZVtx::GetResourceType() { - return ZResourceType::Vertex; + return ZResourceType::Vertex; } -ZVtx* ZVtx::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, const int rawDataIndex, const std::string& nRelPath) +ZVtx* ZVtx::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, + const int rawDataIndex, const std::string& nRelPath) { - ZVtx* vtx = new ZVtx(); + ZVtx* vtx = new ZVtx(); vtx->rawData = nRawData; vtx->rawDataIndex = rawDataIndex; - vtx->ParseRawData(); + vtx->ParseRawData(); - return vtx; + return vtx; } diff --git a/tools/ZAPD/ZAPD/ZVtx.h b/tools/ZAPD/ZAPD/ZVtx.h index 83eb734d73..bd40b07e93 100644 --- a/tools/ZAPD/ZAPD/ZVtx.h +++ b/tools/ZAPD/ZAPD/ZVtx.h @@ -1,8 +1,8 @@ #pragma once -#include -#include #include +#include +#include #include "ZResource.h" #include "ZScalar.h" #include "tinyxml2.h" @@ -17,15 +17,16 @@ public: ZVtx(); - void ParseXML(tinyxml2::XMLElement* reader); + void ParseXML(tinyxml2::XMLElement* reader) override; std::string GetSourceTypeName() override; - std::string GetSourceOutputCode(const std::string& prefix); + std::string GetSourceOutputCode(const std::string& prefix) override; void ParseRawData() override; - int GetRawDataSize(); + int GetRawDataSize() override; bool DoesSupportArray() override; - ZResourceType GetResourceType(); + ZResourceType GetResourceType() override; - static ZVtx* ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, const int rawDataIndex, const std::string& nRelPath); + static ZVtx* ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector& nRawData, + const int rawDataIndex, const std::string& nRelPath); protected: }; \ No newline at end of file diff --git a/tools/ZAPD/lib/libgfxd/LICENSE b/tools/ZAPD/lib/libgfxd/LICENSE new file mode 100644 index 0000000000..a7655f829d --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016-2021 glank (glankk@github.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/tools/ZAPD/lib/libgfxd/Makefile b/tools/ZAPD/lib/libgfxd/Makefile new file mode 100644 index 0000000000..b340ff5c0a --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/Makefile @@ -0,0 +1,25 @@ +CFLAGS = -Wall -O2 -g +UC_OBJ = uc_f3d.o uc_f3db.o uc_f3dex.o uc_f3dexb.o uc_f3dex2.o +OBJ = gfxd.o $(UC_OBJ) +LIB = libgfxd.a + +CPPFLAGS-$(MT) += -DCONFIG_MT +CPPFLAGS += $(CPPFLAGS-y) + +.PHONY: all +all: $(LIB) + +.PHONY: clean +clean: + rm -f $(OBJ) $(LIB) + +.INTERMEDIATE: $(OBJ) + +$(OBJ): gbi.h gfxd.h priv.h +$(UC_OBJ): uc.c uc_argfn.c uc_argtbl.c uc_macrofn.c uc_macrotbl.c + +$(LIB): $(OBJ) + $(AR) rcs $@ $^ + +%.o: %.c + $(COMPILE.c) $(OUTPUT_OPTION) $< diff --git a/tools/ZAPD/lib/libgfxd/README.md b/tools/ZAPD/lib/libgfxd/README.md new file mode 100644 index 0000000000..2e82589439 --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/README.md @@ -0,0 +1,478 @@ +## Installing +Run `make` for a single-threaded build, or `make MT=y` for a multi-threaded +build. Copy `libgfxd.a` to your lib directory, and `gfxd.h` to your include +directory. + +## Example usage +Example source code: +``` +#include +#include + +static int macro_fn(void) +{ + /* Print a tab before each macro, and a comma and newline after each + macro */ + gfxd_puts("\t"); + gfxd_macro_dflt(); /* Execute the default macro handler */ + gfxd_puts(",\n"); + + return 0; +} + +int main() +{ + /* Read from stdin and write to stdout */ + gfxd_input_fd(fileno(stdin)); + gfxd_output_fd(fileno(stdout)); + + /* Override the default macro handler to make the output prettier */ + gfxd_macro_fn(macro_fn); + + /* Select F3DEX as the target microcode */ + gfxd_target(gfxd_f3dex); + + /* Set the input endianness to big endian, and the word size to 4 */ + gfxd_endian(gfxd_endian_big, 4); + + /* Print an opening brace */ + gfxd_puts("{\n"); + + /* Execute until the end of input, or until encountering an invalid + command */ + gfxd_execute(); + + /* Print a closing brace */ + gfxd_puts("}\n"); +} +``` + +Example input (binary): +``` +0xe7000000, 0x00000000, +0xfc127e03, 0xfffffdf8, +0xb900031d, 0xc8112078, +0xb6000000, 0x000e0000, +0xb7000000, 0x00012000, +0xfa000000, 0xffffffff, +0x040030bf, 0x000002e0, +0xb1000204, 0x00020604, +0xb1080a0c, 0x000a0e0c, +0xb10a1012, 0x000a120e, +0xb1140200, 0x00140016, +0xb8000000, 0x00000000, +``` + +Example output: +``` +{ + gsDPPipeSync(), + gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, 0, 0, 0, 1, COMBINED, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED), + gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2), + gsSPClearGeometryMode(G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR), + gsSPSetGeometryMode(G_CULL_BACK | G_FOG), + gsDPSetPrimColor(0, 0, 0xFF, 0xFF, 0xFF, 0xFF), + gsSPVertex(0x000002E0, 12, 0), + gsSP2Triangles(0, 1, 2, 0, 1, 3, 2, 0), + gsSP2Triangles(4, 5, 6, 0, 5, 7, 6, 0), + gsSP1Quadrangle(5, 8, 9, 7, 0), + gsSP1Quadrangle(10, 1, 0, 11, 0), + gsSPEndDisplayList(), +} +``` + +## Input/output methods +The input consists of any number of `Gfx` packets, and the output is the +decompiled macros in plain-text. The endianness and microcode type of the input +can be set using `gfxd_endian` and `gfxd_target`. + +Several methods of doing I/O are available. No method is selected by default, +meaning there will be no input, and any output will be discarded. + +--- + +##### `void gfxd_input_buffer(const void *buf, int size)` +##### `void gfxd_output_buffer(char *buf, int size)` +Use the buffer pointed to by `buf`, of `size` bytes. + +--- + +##### `void gfxd_input_fd(int fd)` +##### `void gfxd_output_fd(int fd)` +Use `read()` / `write()` with the provided file descriptor, `fd`. + +--- + +##### `typedef int gfxd_input_fn_t(void *buf, int count)` +##### `typedef int gfxd_output_fn_t(const char *buf, int count)` +##### `void gfxd_input_callback(gfxd_input_fn_t *fn)` +##### `void gfxd_output_callback(gfxd_output_fn_t *fn)` +Use the provided callback function, `fn`. `fn` should copy at most `count` +bytes to/from `buf`, and return the number of bytes actually copied. The input +callback should return 0 to signal end of input. + +## Handlers +The macro handler function is responsible for writing the output of each +decompiled macro. The default macro handler is `gfxd_macro_dflt`, but this can +be changed with `gfxd_macro_fn`. The new handler can extend the default +function by calling `gfxd_macro_dflt` within it, or it can override it +completely. + +--- + +##### `int gfxd_macro_dflt()` +The default macro handler. Outputs the macro name, dynamic display list pointer +if one has been specified, and then each argument in order using the function +registered using `gfxd_arg_fn` (`gfxd_arg_dflt` by default), and returns zero. +Because it is designed to be extended, it only outputs the macro text, without +any whitespace or punctuation before or after. When this function is used as +the sole macro handler, it will output the entire display list on one line +without any separation between macros, which is probably not what you want. + +--- + +##### `void gfxd_macro_fn(gfxd_macro_fn_t *fn)` +Set `fn` to be the macro handler function. `fn` can be null, in which case the +handler is reset to the default. + +--- + +##### `void gfxd_arg_dflt(int arg_num)` +The default argument handler for `gfxd_macro_dflt`. For the argument with index +`arg_num`, calls `gfxd_arg_callbacks`, and prints the argument value if the +callback returns zero, or if there is no callback for the given argument. + +--- + +##### `void gfxd_arg_fn(gfxd_arg_fn_t *fn)` +Set `fn` to be the argument handler function, called by `gfxd_macro_dflt`, +for each argument in the current macro, not counting the dynamic display list +pointer if one has been specified. `fn` can be null, in which case the handler +is reset to the default. This only affects the output of `gfxd_macro_dflt`, and +has no observable effect if `gfxd_macro_dflt` is overridden (not extended). + +## Argument callbacks +Callbacks can be registered that will be executed when an argument of a certain +type is encountered. The default argument handler `gfxd_arg_dflt` will execute +callbacks as needed using `gfxd_arg_callbacks`. If a callback returns non-zero, +`gfxd_arg_dflt` will not output anything. This is to allow callbacks to +override the default argument output. Otherwise, `gfxd_arg_dflt` will output +the argument value after the callback function's output. + +--- + +##### `int gfxd_arg_callbacks(int arg_num)` +Examines the argument with index `arg_num` and executes the callback function +for that argument type, if such a callback is supported and has been +registered. This function returns the value that was returned by the callback +function. If no callback function has been registered for the argument type, +zero is returned. + +Most argument callbacks have some extra parameters containing information that +might be relevant to the argument that triggered the callback. The extra +information is extracted only from the current macro, as gfxd does not retain +any context information from previous or subsequent macros. If any of the extra +parameter values is not available in the current macro, the value for that +parameter is substituted with `-1` for signed parameters, and zero for unsigned +parameters. + +--- + +##### `typedef int gfxd_tlut_fn_t(uint32_t tlut, int32_t idx, int32_t count)` +##### `void gfxd_tlut_callback(gfxd_tlut_fn_t *fn)` +Set the callback function for palette arguments. The argument type is +`gfxd_Tlut`. The palette index is in `idx` and the number of colors in `count`. + +--- + +##### `typedef int gfxd_timg_fn_t(uint32_t timg, int32_t fmt, int32_t siz, int32_t width, int32_t height, int32_t pal)` +##### `void gfxd_timg_callback(gfxd_timg_fn_t *fn)` +Set the callback function for texture arguments. The argument type is +`gfxd_Timg`. The image format is in `fmt` and `siz`, the dimensions in `width` +and `height`, and the palette index in `pal`. + +--- + +##### `typedef int gfxd_cimg_fn_t(uint32_t cimg, int32_t fmt, int32_t siz, int32_t width)` +##### `void gfxd_cimg_callback(gfxd_cimg_fn_t *fn)` +Set the callback function for frame buffer arguments. The argument type is +`gfxd_Cimg`. The image format is in `fmt` and `siz`, and the horizontal +resolution in `width`. + +--- + +##### `typedef int gfxd_zimg_fn_t(uint32_t zimg)` +##### `void gfxd_zimg_callback(gfxd_zimg_fn_t *fn)` +Set the callback function for depth buffer arguments. The argument type is +`gfxd_Zimg`. + +--- + +##### `typedef int gfxd_dl_fn_t(uint32_t dl)` +##### `void gfxd_dl_callback(gfxd_dl_fn_t *fn)` +Set the callback function for display list arguments. The argument type is +`gfxd_Dl`. + +--- + +##### `typedef int gfxd_mtx_fn_t(uint32_t mtx)` +##### `void gfxd_mtx_callback(gfxd_mtx_fn_t *fn)` +Set the callback function for matrix arguments. The argument type is +`gfxd_Mtxptr`. + +--- + +##### `typedef int gfxd_lookat_fn_t(uint32_t lookat, int32_t count)` +##### `void gfxd_lookat_callback(gfxd_lookat_fn_t *fn)` +Set the callback function for lookat array arguments. The argument type is +`gfxd_Lookatptr`. The number of lookat structures (1 or 2) is in `count`. + +--- + +##### `typedef int gfxd_light_fn_t(uint32_t light, int32_t count)` +##### `void gfxd_light_callback(gfxd_light_fn_t *fn)` +Set the callback function for light array arguments. The argument type is +`gfxd_Lightptr`. The number of light structures is in `count`. + +--- + +##### `typedef int gfxd_seg_fn_t(uint32_t seg, int32_t num)` +##### `void gfxd_seg_callback(gfxd_seg_fn_t *fn)` +Set the callback function for segment base arguments. The argument type is +`gfxd_Segptr`. The segment number is in `num`. + +--- + +##### `typedef int gfxd_vtx_fn_t(uint32_t vtx, int32_t num)` +##### `void gfxd_vtx_callback(gfxd_vtx_fn_t *fn)` +Set the callback function for vertex array arguments. The argument type is +`gfxd_Vtxptr`. The number of vertex structures is in `num`. + +--- + +##### `typedef int gfxd_vp_fn_t(uint32_t vp)` +##### `void gfxd_vp_callback(gfxd_vp_fn_t *fn)` +Set the callback function for viewport arguments. The argument type is +`gfxd_Vp`. + +--- + +##### `typedef int gfxd_uctext_fn_t(uint32_t text, uint32_t size)` +##### `void gfxd_uctext_callback(gfxd_uctext_fn_t *fn)` +Set the callback function for microcode text arguments. The argument type is +`gfxd_Uctext`. The size of the text segment is in `size`. + +--- + +##### `typedef int gfxd_ucdata_fn_t(uint32_t data, uint32_t size)` +##### `void gfxd_ucdata_callback(gfxd_ucdata_fn_t *fn)` +Set the callback function for microcode data arguments. The argument type is +`gfxd_Ucdata`. The size of the data segment is in `size`. + +--- + +##### `typedef int gfxd_dram_fn_t(uint32_t dram, uint32_t size)` +##### `void gfxd_dram_callback(gfxd_dram_fn_t *fn)` +Set the callback function for generic pointer arguments. The argument type is +`gfxd_Dram`. The size of the data is in `size`. + +## General settings +These functions control general input and output settings. + +--- + +##### `void gfxd_target(gfxd_ucode_t ucode)` +Select `ucode` as the target microcode. `ucode` can be `gfxd_f3d`, `gfxd_f3db`, +`gfxd_f3dex`, `gfxd_f3dexb`, or `gfxd_f3dex2`. The microcode must be selected +before `gfxd_execute`, as no microcode is selected by default. + +--- + +##### `void gfxd_endian(int endian, int wordsize)` +Select `endian` as the endianness of the input, and `wordsize` as the size of +each word in number of bytes. `endian` can be `gfxd_endian_big`, +`gfxd_endian_little`, or `gfxd_endian_host` (the endianness of the host +machine). `wordsize` can be 1, 2, 4, or 8. Big endian is selected by default, +with a word size of 4. + +--- + +##### `void gfxd_dynamic(const char *arg)` +Enable or disable the use of dynamic `g` macros instead of static `gs` macros, +and select the dynamic display list pointer argument to be used. `arg` will be +used by `gfxd_macro_dflt` as the first argument to dynamic macros. If `arg` is +null, dynamic macros are disabled, and `gs` macros are used. Also affects the +result of `gfxd_macro_name`, as it will return either the dynamic or static +version of the macro name as selected by this setting. + +--- + +##### `void gfxd_enable(int cap)` +##### `void gfxd_disable(int cap)` +Enable or disable the feature specified by `cap`. Can be one of the following; +- `gfxd_stop_on_invalid`: Stop execution when encountering an invalid macro. +Enabled by default. +- `gfxd_stop_on_end`: Stop execution when encountering a `SPBranchList` or +`SPEndDisplayList`. Enabled by default. +- `gfxd_emit_dec_color`: Print color components as decimal instead of +hexadecimal. Disabled by default. +- `gfxd_emit_q_macro`: Print fixed-point conversion `q` macros for fixed-point +values. Disabled by default. +- `gfxd_emit_ext_macro`: Emit non-standard macros. Some commands are valid +(though possibly meaningless), but have no macros associated with them, such as +a standalone `G_RDPHALF_1`. When this feature is enabled, such a command will +produce a non-standard `gsDPHalf1` macro instead of a raw hexadecimal command. +Also enables some non-standard multi-packet texture loading macros. Disabled by +default. + +--- + +##### `void gfxd_udata_set(void *ptr)` +##### `void *gfxd_udata_get(void)` +Set or get a generic pointer that can be used to pass user-defined data in and +out of callback functions. + +## Execution +Decompilation is started using the `gfxd_execute` function. When gfxd is +executing (i.e. after `gfxd_execute` has been entered, and before it returns), +the general settings and the I/O settings should not be changed. + +--- + +##### `int gfxd_execute()` +Start executing gfxd with the current settings. For each macro, the macro +handler registered with `gfxd_macro_fn` is called. Execution ends when the +input ends, the macro handler returns non-zero, when an invalid macro is +encountered and `gfxd_stop_on_invalid` is enabled, or when `SPBranchList` or +`SPEndDisplayList` is encountered and `gfxd_stop_on_end` is enabled. If +execution ends due to an invalid macro, `-1` is returned. If execution ends +because the macro handler returns non-zero, the return value from the macro +handler is returned. Otherwise zero is returned. + +## Macro information +The following functions can be used to obtain information about the current +macro and its arguments. They should only be used in custom handlers and +callbacks from within `gfxd_execute`. If used elsewhere, their behavior is +undefined. + +--- + +##### `int gfxd_macro_offset()` +Returns the offset in the input data of the current macro. The offset starts +at zero when `gfxd_execute` is called. + +--- + +##### `int gfxd_macro_packets()` +Returns the number of `Gfx` packets within the current macro. + +--- + +##### `const void *gfxd_macro_data()` +Returns a pointer to the input data for the current macro. The data is not +byte-swapped. The data has a length of `sizeof(Gfx) * gfxd_macro_packets()`. + +--- + +##### `int gfxd_macro_id()` +Returns a number that uniquely identifies the current macro. The number will +be one of the constants in `gfxd.h`. + +--- + +##### `const char *gfxd_macro_name()` +Returns the name of the current macro. If the macro does not have a name (i.e. +it's invalid), null is returned. If a dynamic display list pointer has been +specified, the dynamic `g` version is returned. Otherwise the static `gs` +version is returned. The returned pointer is invalidated by a subsequent call +to `gfxd_macro_name`. + +--- + +##### `int gfxd_arg_count()` +Returns the number of arguments to the current macro, not including a dynamic +display list pointer if one has been specified. + +--- + +##### `int gfxd_arg_type(int arg_num)` +Returns a number that identifies the type of the argument with index `arg_num`. +The number will be one of the constants in `gfxd.h`. + +--- + +##### `const char *gfxd_arg_name(int arg_num)` +Returns the name of the argument with index `arg_num`. Argument names are not +canonical, nor are they needed for macro disassembly, but they can be useful +for informational and diagnostic purposes. + +--- + +##### `int gfxd_arg_fmt(int arg_num)` +Returns the data format of the argument with index `arg_num`. The return value +will be `gfxd_argfmt_i` for `int32_t`, `gfxd_argfmt_u` for `uint32_t`, or +`gfxd_argfmt_f` for `float`. When accessing the value of the argument with +`gfxd_arg_value`, the member with the corresponding type should be used. + +--- + +##### `const gfxd_value_t *gfxd_arg_value(int arg_num)` +Returns a pointer to the value of the argument with index `arg_num`. The value +is a union of type `gfxd_value_t` with the following layout; +``` +typedef union +{ + int32_t i; + uint32_t u; + float f; +} gfxd_value_t +``` + +--- + +##### `const gfxd_value_t *gfxd_value_by_type(int type, int idx)` +Returns a pointer to the value of the argument that is of `type`, and has order +`idx` in all arguments of that type. An `idx` of zero returns the first +argument that has the specified type. If there is no argument with the given +type and order, null is returned. + +--- + +##### `int gfxd_arg_valid(int arg_num)` +Returns non-zero if the argument with index `arg_num` is "valid", for some +definition of valid. An invalid argument generally means that the disassembler +found inconsistencies in the input data, or that the data can not be reproduced +by the current macro type. The argument still has a value that can be printed, +though the value is not guaranteed to make any sense. + +## Custom output +When the default handlers are overridden or extended, the custom handler +functions will want to do some output of their own. The following methods are +available for inserting custom text into the gfxd output. + +--- + +##### `int gfxd_write(const void *buf, int count)` +Insert `count` bytes from the buffer at `buf` into the output. The number of +characters written is returned. + +--- + +##### `int gfxd_puts(const char *str)` +Insert the null-terminated string at `str` into the output. The number of +characters written is returned. + +--- + +##### `int gfxd_printf(const char *fmt, ...)` +Insert the printf-formatted string described by `fmt` and additional arguments +into the output. Limited to 255 characters. The number of characters written is +returned. + +--- + +##### `int gfxd_print_value(int type, const gfxd_value_t *value)` +Insert the type-formatted value into the output. The type should be one of the +constants in `gfxd.h`. The number of characters written is returned. The +macro argument with index `n` can be printed with +`gfxd_print_value(gfxd_arg_type(n), gfxd_arg_value(n))`. diff --git a/tools/ZAPD/lib/libgfxd/gbi.h b/tools/ZAPD/lib/libgfxd/gbi.h new file mode 100644 index 0000000000..e502ee9508 --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/gbi.h @@ -0,0 +1,3808 @@ +/** + * gbi.h version 0.3.3 + * n64 graphics microcode interface library + * compatible with fast3d, f3dex, f3dex2, s2dex, and s2dex2 + * + * select a microcode with one of these preprocessor definitions; + * #define F3D_GBI + * for fast3d (selected automatically by default), or + * #define F3DEX_GBI + * for f3dex/s2dex, or + * #define F3DEX_GBI_2 + * for f3dex2/s2dex2 + * + * for early versions of fast3d and f3dex, also define the following; + * #define F3D_BETA + * + * ido incompatibilities; + * - use of c99 variadic macros + * - use of c99 fixed-width integer types + * - use of c99 designated initializers + * - use of c99 compound literals + * - use of c11 _Alignas + * - use of gnu c compound expressions + * - use of gnu c __typeof__ + * + * libultra incompatibilities; + * - many private, undocumented, or obsolete macros not commonly used by + * programmers are missing + * - many different implementation details that will produce matching gbi, + * but not matching code +**/ + +#ifndef N64_GBI_H +#define N64_GBI_H + +#include + +/* use fast3d by default */ +#if !defined(F3D_GBI) && !defined(F3DEX_GBI) && !defined(F3DEX_GBI_2) +# define F3D_GBI +#endif + +/* commands for fast3d and f3dex */ +#if defined(F3D_GBI) || defined(F3DEX_GBI) +# define G_SPNOOP 0x00 +# define G_MTX 0x01 +# define G_MOVEMEM 0x03 +# define G_VTX 0x04 +# define G_DL 0x06 +# if defined(F3D_BETA) +# define G_RDPHALF_2 0xB2 +# define G_RDPHALF_1 0xB3 +# define G_PERSPNORM 0xB4 +# else +# define G_RDPHALF_2 0xB3 +# define G_RDPHALF_1 0xB4 +# endif +# define G_LINE3D 0xB5 +# define G_CLEARGEOMETRYMODE 0xB6 +# define G_SETGEOMETRYMODE 0xB7 +# define G_ENDDL 0xB8 +# define G_SETOTHERMODE_L 0xB9 +# define G_SETOTHERMODE_H 0xBA +# define G_TEXTURE 0xBB +# define G_MOVEWORD 0xBC +# define G_POPMTX 0xBD +# define G_CULLDL 0xBE +# define G_TRI1 0xBF +# define G_NOOP 0xC0 +#endif + +/* commands for f3dex */ +#if defined(F3DEX_GBI) +# define G_LOAD_UCODE 0xAF +# define G_BRANCH_Z 0xB0 +# define G_TRI2 0xB1 +# if !defined(F3D_BETA) +# define G_MODIFYVTX 0xB2 +# endif +#endif + +/* commands for f3dex2 */ +#if defined(F3DEX_GBI_2) +# define G_NOOP 0x00 +# define G_VTX 0x01 +# define G_MODIFYVTX 0x02 +# define G_CULLDL 0x03 +# define G_BRANCH_Z 0x04 +# define G_TRI1 0x05 +# define G_TRI2 0x06 +# define G_QUAD 0x07 +# define G_LINE3D 0x08 +# define G_SPECIAL_3 0xD3 +# define G_SPECIAL_2 0xD4 +# define G_SPECIAL_1 0xD5 +# define G_DMA_IO 0xD6 +# define G_TEXTURE 0xD7 +# define G_POPMTX 0xD8 +# define G_GEOMETRYMODE 0xD9 +# define G_MTX 0xDA +# define G_MOVEWORD 0xDB +# define G_MOVEMEM 0xDC +# define G_LOAD_UCODE 0xDD +# define G_DL 0xDE +# define G_ENDDL 0xDF +# define G_SPNOOP 0xE0 +# define G_RDPHALF_1 0xE1 +# define G_SETOTHERMODE_L 0xE2 +# define G_SETOTHERMODE_H 0xE3 +# define G_RDPHALF_2 0xF1 +#endif + +/* rdp commands */ +#define G_TEXRECT 0xE4 +#define G_TEXRECTFLIP 0xE5 +#define G_RDPLOADSYNC 0xE6 +#define G_RDPPIPESYNC 0xE7 +#define G_RDPTILESYNC 0xE8 +#define G_RDPFULLSYNC 0xE9 +#define G_SETKEYGB 0xEA +#define G_SETKEYR 0xEB +#define G_SETCONVERT 0xEC +#define G_SETSCISSOR 0xED +#define G_SETPRIMDEPTH 0xEE +#define G_RDPSETOTHERMODE 0xEF +#define G_LOADTLUT 0xF0 +#define G_SETTILESIZE 0xF2 +#define G_LOADBLOCK 0xF3 +#define G_LOADTILE 0xF4 +#define G_SETTILE 0xF5 +#define G_FILLRECT 0xF6 +#define G_SETFILLCOLOR 0xF7 +#define G_SETFOGCOLOR 0xF8 +#define G_SETBLENDCOLOR 0xF9 +#define G_SETPRIMCOLOR 0xFA +#define G_SETENVCOLOR 0xFB +#define G_SETCOMBINE 0xFC +#define G_SETTIMG 0xFD +#define G_SETZIMG 0xFE +#define G_SETCIMG 0xFF + +/* commands for s2dex */ +#if defined(F3DEX_GBI) +# define G_BG_1CYC 0x01 +# define G_BG_COPY 0x02 +# define G_OBJ_RECTANGLE 0x03 +# define G_OBJ_SPRITE 0x04 +# define G_OBJ_MOVEMEM 0x05 +# define G_SELECT_DL 0xB0 +# define G_OBJ_RENDERMODE 0xB1 +# define G_OBJ_RECTANGLE_R 0xB2 +# define G_OBJ_LOADTXTR 0xC1 +# define G_OBJ_LDTX_SPRITE 0xC2 +# define G_OBJ_LDTX_RECT 0xC3 +# define G_OBJ_LDTX_RECT_R 0xC4 +#endif + +/* commands for s2dex2 */ +#if defined(F3DEX_GBI_2) +# define G_OBJ_RECTANGLE 0x01 +# define G_OBJ_SPRITE 0x02 +# define G_SELECT_DL 0x04 +# define G_OBJ_LOADTXTR 0x05 +# define G_OBJ_LDTX_SPRITE 0x06 +# define G_OBJ_LDTX_RECT 0x07 +# define G_OBJ_LDTX_RECT_R 0x08 +# define G_BG_1CYC 0x09 +# define G_BG_COPY 0x0A +# define G_OBJ_RENDERMODE 0x0B +# define G_OBJ_RECTANGLE_R 0xDA +# define G_OBJ_MOVEMEM 0xDC +#endif + +/* commands for s2dex and s2dex2 */ +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +# define G_RDPHALF_0 0xE4 +#endif + +/* image formats */ +#define G_IM_FMT_RGBA 0 +#define G_IM_FMT_YUV 1 +#define G_IM_FMT_CI 2 +#define G_IM_FMT_IA 3 +#define G_IM_FMT_I 4 +#define G_IM_SIZ_4b 0 +#define G_IM_SIZ_8b 1 +#define G_IM_SIZ_16b 2 +#define G_IM_SIZ_32b 3 + +/* texture settings */ +#define G_TX_NOMIRROR (gI_(0b0) << 0) +#define G_TX_MIRROR (gI_(0b1) << 0) +#define G_TX_WRAP (gI_(0b0) << 1) +#define G_TX_CLAMP (gI_(0b1) << 1) +#define G_TX_NOMASK gI_(0) +#define G_TX_NOLOD gI_(0) +#define G_OFF gI_(0) +#define G_ON gI_(1) + +/* tile indices */ +#define G_TX_LOADTILE 7 +#define G_TX_RENDERTILE 0 + +/* geometry mode */ +#define G_ZBUFFER (gI_(0b1) << 0) +#define G_SHADE (gI_(0b1) << 2) +#define G_CULL_BOTH (G_CULL_FRONT | G_CULL_BACK) +#define G_FOG (gI_(0b1) << 16) +#define G_LIGHTING (gI_(0b1) << 17) +#define G_TEXTURE_GEN (gI_(0b1) << 18) +#define G_TEXTURE_GEN_LINEAR (gI_(0b1) << 19) +#define G_LOD (gI_(0b1) << 20) + +/* geometry mode for fast3d */ +#if defined(F3D_GBI) +# define G_CLIPPING (gI_(0b0) << 0) +#endif + +/* geometry mode for fast3d and f3dex */ +#if defined(F3D_GBI) || defined(F3DEX_GBI) +# define G_TEXTURE_ENABLE (gI_(0b1) << 1) +# define G_SHADING_SMOOTH (gI_(0b1) << 9) +# define G_CULL_FRONT (gI_(0b1) << 12) +# define G_CULL_BACK (gI_(0b1) << 13) +#endif + +/* geometry mode for f3dex and f3dex2 */ +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +# define G_CLIPPING (gI_(0b1) << 23) +#endif + +/* geometry mode for f3dex2 */ +#if defined(F3DEX_GBI_2) +# define G_TEXTURE_ENABLE (gI_(0b0) << 0) +# define G_CULL_FRONT (gI_(0b1) << 9) +# define G_CULL_BACK (gI_(0b1) << 10) +# define G_SHADING_SMOOTH (gI_(0b1) << 21) +#endif + +/* othermode lo */ +#define G_MDSFT_ALPHACOMPARE 0 +#define G_MDSFT_ZSRCSEL 2 +#define G_MDSFT_RENDERMODE 3 +#define G_MDSFT_BLENDER 16 +#define G_MDSIZ_ALPHACOMPARE 2 +#define G_MDSIZ_ZSRCSEL 1 +#define G_MDSIZ_RENDERMODE 29 +#define G_MDSIZ_BLENDER 13 + +#define G_AC_NONE (gI_(0b00) << G_MDSFT_ALPHACOMPARE) +#define G_AC_THRESHOLD (gI_(0b01) << G_MDSFT_ALPHACOMPARE) +#define G_AC_DITHER (gI_(0b11) << G_MDSFT_ALPHACOMPARE) +#define G_ZS_PIXEL (gI_(0b0) << G_MDSFT_ZSRCSEL) +#define G_ZS_PRIM (gI_(0b1) << G_MDSFT_ZSRCSEL) +#define AA_EN (gI_(0b1) << (G_MDSFT_RENDERMODE + 0)) +#define Z_CMP (gI_(0b1) << (G_MDSFT_RENDERMODE + 1)) +#define Z_UPD (gI_(0b1) << (G_MDSFT_RENDERMODE + 2)) +#define IM_RD (gI_(0b1) << (G_MDSFT_RENDERMODE + 3)) +#define CLR_ON_CVG (gI_(0b1) << (G_MDSFT_RENDERMODE + 4)) +#define CVG_DST_CLAMP (gI_(0b00) << (G_MDSFT_RENDERMODE + 5)) +#define CVG_DST_WRAP (gI_(0b01) << (G_MDSFT_RENDERMODE + 5)) +#define CVG_DST_FULL (gI_(0b10) << (G_MDSFT_RENDERMODE + 5)) +#define CVG_DST_SAVE (gI_(0b11) << (G_MDSFT_RENDERMODE + 5)) +#define ZMODE_OPA (gI_(0b00) << (G_MDSFT_RENDERMODE + 7)) +#define ZMODE_INTER (gI_(0b01) << (G_MDSFT_RENDERMODE + 7)) +#define ZMODE_XLU (gI_(0b10) << (G_MDSFT_RENDERMODE + 7)) +#define ZMODE_DEC (gI_(0b11) << (G_MDSFT_RENDERMODE + 7)) +#define CVG_X_ALPHA (gI_(0b1) << (G_MDSFT_RENDERMODE + 9)) +#define ALPHA_CVG_SEL (gI_(0b1) << (G_MDSFT_RENDERMODE + 10)) +#define FORCE_BL (gI_(0b1) << (G_MDSFT_RENDERMODE + 11)) + +#define G_BL_1MA gI_(0b00) +#define G_BL_1 gI_(0b10) +#define G_BL_0 gI_(0b11) +#define G_BL_CLR_IN gI_(0b00) +#define G_BL_CLR_MEM gI_(0b01) +#define G_BL_CLR_BL gI_(0b10) +#define G_BL_CLR_FOG gI_(0b11) +#define G_BL_A_IN gI_(0b00) +#define G_BL_A_FOG gI_(0b01) +#define G_BL_A_MEM gI_(0b01) +#define G_BL_A_SHADE gI_(0b10) + +#define GBL_c1(p, a, m, b) \ + ( \ + gF_(p, 2, 30) | \ + gF_(a, 2, 26) | \ + gF_(m, 2, 22) | \ + gF_(b, 2, 18) \ + ) +#define GBL_c2(p, a, m, b) \ + ( \ + gF_(p, 2, 28) | \ + gF_(a, 2, 24) | \ + gF_(m, 2, 20) | \ + gF_(b, 2, 16) \ + ) + +/* render modes */ +#define G_RM_OPA_SURF \ + ( \ + CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \ + ) +#define G_RM_OPA_SURF2 \ + ( \ + CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \ + ) +#define G_RM_AA_OPA_SURF \ + ( \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_OPA_SURF2 \ + ( \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_RA_OPA_SURF \ + ( \ + AA_EN | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_RA_OPA_SURF2 \ + ( \ + AA_EN | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_ZB_OPA_SURF \ + ( \ + Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_ZB_OPA_SURF2 \ + ( \ + Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_ZB_OPA_SURF \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_ZB_OPA_SURF2 \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_RA_ZB_OPA_SURF \ + ( \ + AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_OPA | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_RA_ZB_OPA_SURF2 \ + ( \ + AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_OPA | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) + +#define G_RM_XLU_SURF \ + ( \ + IM_RD | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_XLU_SURF2 \ + ( \ + IM_RD | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_XLU_SURF \ + ( \ + AA_EN | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_OPA | \ + FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_XLU_SURF2 \ + ( \ + AA_EN | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_OPA | \ + FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_ZB_XLU_SURF \ + ( \ + Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_XLU | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_ZB_XLU_SURF2 \ + ( \ + Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_XLU | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_XLU_SURF \ + ( \ + AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \ + ZMODE_XLU | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_XLU_SURF2 \ + ( \ + AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \ + ZMODE_XLU | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + +#define G_RM_ZB_OPA_DECAL \ + ( \ + Z_CMP | CVG_DST_FULL | ZMODE_DEC | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_ZB_OPA_DECAL2 \ + ( \ + Z_CMP | CVG_DST_FULL | ZMODE_DEC | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_ZB_OPA_DECAL \ + ( \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ZMODE_DEC | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_ZB_OPA_DECAL2 \ + ( \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ZMODE_DEC | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_RA_ZB_OPA_DECAL \ + ( \ + AA_EN | Z_CMP | CVG_DST_WRAP | ZMODE_DEC | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_RA_ZB_OPA_DECAL2 \ + ( \ + AA_EN | Z_CMP | CVG_DST_WRAP | ZMODE_DEC | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) + +#define G_RM_ZB_XLU_DECAL \ + ( \ + Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_DEC | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_ZB_XLU_DECAL2 \ + ( \ + Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_DEC | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_XLU_DECAL \ + ( \ + AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \ + ZMODE_DEC | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_XLU_DECAL2 \ + ( \ + AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \ + ZMODE_DEC | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + +#define G_RM_AA_ZB_OPA_INTER \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_ZB_OPA_INTER2 \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_RA_ZB_OPA_INTER \ + ( \ + AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_INTER | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_RA_ZB_OPA_INTER2 \ + ( \ + AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_INTER | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) + +#define G_RM_AA_ZB_XLU_INTER \ + ( \ + AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \ + ZMODE_INTER | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_XLU_INTER2 \ + ( \ + AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \ + ZMODE_INTER | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + +#define G_RM_AA_XLU_LINE \ + ( \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_XLU_LINE2 \ + ( \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_XLU_LINE \ + ( \ + AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | ZMODE_XLU | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_XLU_LINE2 \ + ( \ + AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | ZMODE_XLU | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + +#define G_RM_AA_DEC_LINE \ + ( \ + AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_DEC_LINE2 \ + ( \ + AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_DEC_LINE \ + ( \ + AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_DEC_LINE2 \ + ( \ + AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + + +#define G_RM_TEX_EDGE \ + ( \ + AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \ + ) +#define G_RM_TEX_EDGE2 \ + ( \ + AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \ + ) +#define G_RM_AA_TEX_EDGE \ + ( \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_TEX_EDGE2 \ + ( \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_ZB_TEX_EDGE \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_ZB_TEX_EDGE2 \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) + +#define G_RM_AA_ZB_TEX_INTER \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_ZB_TEX_INTER2 \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) + +#define G_RM_AA_SUB_SURF \ + ( \ + AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_SUB_SURF2 \ + ( \ + AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_ZB_SUB_SURF \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) +#define G_RM_AA_ZB_SUB_SURF2 \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \ + ) + +#define G_RM_PCL_SURF \ + ( \ + G_AC_DITHER | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \ + ) +#define G_RM_PCL_SURF2 \ + ( \ + G_AC_DITHER | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \ + ) +#define G_RM_AA_PCL_SURF \ + ( \ + G_AC_DITHER | AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_PCL_SURF2 \ + ( \ + G_AC_DITHER | AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_ZB_PCL_SURF \ + ( \ + G_AC_DITHER | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \ + GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \ + ) +#define G_RM_ZB_PCL_SURF2 \ + ( \ + G_AC_DITHER | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \ + GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \ + ) +#define G_RM_AA_ZB_PCL_SURF \ + ( \ + G_AC_DITHER | AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_PCL_SURF2 \ + ( \ + G_AC_DITHER | AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + +#define G_RM_AA_OPA_TERR \ + ( \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_OPA_TERR2 \ + ( \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_OPA_TERR \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_OPA_TERR2 \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + +#define G_RM_AA_TEX_TERR \ + ( \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_TEX_TERR2 \ + ( \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_TEX_TERR \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_TEX_TERR2 \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + +#define G_RM_AA_SUB_TERR \ + ( \ + AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_SUB_TERR2 \ + ( \ + AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_SUB_TERR \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_ZB_SUB_TERR2 \ + ( \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + +#define G_RM_CLD_SURF \ + ( \ + IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_CLD_SURF2 \ + ( \ + IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_ZB_CLD_SURF \ + ( \ + Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_XLU | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_ZB_CLD_SURF2 \ + ( \ + Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_XLU | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + +#define G_RM_ZB_OVL_SURF \ + ( \ + Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_ZB_OVL_SURF2 \ + ( \ + Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) + +#define G_RM_ADD \ + ( \ + IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) \ + ) +#define G_RM_ADD2 \ + ( \ + IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) \ + ) + +#define G_RM_FOG_SHADE_A \ + GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA) + +#define G_RM_FOG_PRIM_A \ + GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA) + +#define G_RM_PASS \ + GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define G_RM_VISCVG \ + ( \ + IM_RD | FORCE_BL | \ + GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) \ + ) +#define G_RM_VISCVG2 \ + ( \ + IM_RD | FORCE_BL | \ + GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) \ + ) + +#define G_RM_OPA_CI \ + ( \ + CVG_DST_CLAMP | ZMODE_OPA | \ + GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \ + ) +#define G_RM_OPA_CI2 \ + ( \ + CVG_DST_CLAMP | ZMODE_OPA | \ + GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \ + ) + +#define G_RM_NOOP GBL_c1(0, 0, 0, 0) +#define G_RM_NOOP2 GBL_c2(0, 0, 0, 0) + +#define G_RM_SPRITE G_RM_OPA_SURF +#define G_RM_SPRITE2 G_RM_OPA_SURF2 +#define G_RM_RA_SPRITE \ + ( \ + AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | \ + GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_RA_SPRITE2 \ + ( \ + AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | \ + GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \ + ) +#define G_RM_AA_SPRITE G_RM_AA_TEX_TERR +#define G_RM_AA_SPRITE2 G_RM_AA_TEX_TERR2 +#define G_RM_XLU_SPRITE G_RM_XLU_SURF +#define G_RM_XLU_SPRITE2 G_RM_XLU_SURF2 +#define G_RM_AA_XLU_SPRITE G_RM_AA_XLU_SURF +#define G_RM_AA_XLU_SPRITE2 G_RM_AA_XLU_SURF2 + +#define G_OBJRM_NOTXCLAMP (gI_(0b1) << 0) +#define G_OBJRM_XLU (gI_(0b1) << 1) +#define G_OBJRM_ANTIALIAS (gI_(0b1) << 2) +#define G_OBJRM_BILERP (gI_(0b1) << 3) +#define G_OBJRM_SHRINKSIZE_1 (gI_(0b1) << 4) +#define G_OBJRM_SHRINKSIZE_2 (gI_(0b1) << 5) +#define G_OBJRM_WIDEN (gI_(0b1) << 6) + +/* othermode hi */ +#define G_MDSFT_ALPHADITHER 4 +#define G_MDSFT_RGBDITHER 6 +#define G_MDSFT_COMBKEY 8 +#define G_MDSFT_TEXTCONV 9 +#define G_MDSFT_TEXTFILT 12 +#define G_MDSFT_TEXTLUT 14 +#define G_MDSFT_TEXTLOD 16 +#define G_MDSFT_TEXTDETAIL 17 +#define G_MDSFT_TEXTPERSP 19 +#define G_MDSFT_CYCLETYPE 20 +#define G_MDSFT_PIPELINE 23 +#define G_MDSIZ_ALPHADITHER 2 +#define G_MDSIZ_RGBDITHER 2 +#define G_MDSIZ_COMBKEY 1 +#define G_MDSIZ_TEXTCONV 3 +#define G_MDSIZ_TEXTFILT 2 +#define G_MDSIZ_TEXTLUT 2 +#define G_MDSIZ_TEXTLOD 1 +#define G_MDSIZ_TEXTDETAIL 2 +#define G_MDSIZ_TEXTPERSP 1 +#define G_MDSIZ_CYCLETYPE 2 +#define G_MDSIZ_PIPELINE 1 + +#define G_AD_PATTERN (gI_(0b00) << G_MDSFT_ALPHADITHER) +#define G_AD_NOTPATTERN (gI_(0b01) << G_MDSFT_ALPHADITHER) +#define G_AD_NOISE (gI_(0b10) << G_MDSFT_ALPHADITHER) +#define G_AD_DISABLE (gI_(0b11) << G_MDSFT_ALPHADITHER) +#define G_CD_MAGICSQ (gI_(0b00) << G_MDSFT_RGBDITHER) +#define G_CD_BAYER (gI_(0b01) << G_MDSFT_RGBDITHER) +#define G_CD_NOISE (gI_(0b10) << G_MDSFT_RGBDITHER) +#define G_CD_DISABLE (gI_(0b11) << G_MDSFT_RGBDITHER) +#define G_CD_ENABLE (gI_(0b10) << G_MDSFT_RGBDITHER) +#define G_CK_NONE (gI_(0b0) << G_MDSFT_COMBKEY) +#define G_CK_KEY (gI_(0b1) << G_MDSFT_COMBKEY) +#define G_TC_CONV (gI_(0b000) << G_MDSFT_TEXTCONV) +#define G_TC_FILTCONV (gI_(0b101) << G_MDSFT_TEXTCONV) +#define G_TC_FILT (gI_(0b110) << G_MDSFT_TEXTCONV) +#define G_TF_POINT (gI_(0b00) << G_MDSFT_TEXTFILT) +#define G_TF_BILERP (gI_(0b10) << G_MDSFT_TEXTFILT) +#define G_TF_AVERAGE (gI_(0b11) << G_MDSFT_TEXTFILT) +#define G_TT_NONE (gI_(0b00) << G_MDSFT_TEXTLUT) +#define G_TT_RGBA16 (gI_(0b10) << G_MDSFT_TEXTLUT) +#define G_TT_IA16 (gI_(0b11) << G_MDSFT_TEXTLUT) +#define G_TL_TILE (gI_(0b0) << G_MDSFT_TEXTLOD) +#define G_TL_LOD (gI_(0b1) << G_MDSFT_TEXTLOD) +#define G_TD_CLAMP (gI_(0b00) << G_MDSFT_TEXTDETAIL) +#define G_TD_SHARPEN (gI_(0b01) << G_MDSFT_TEXTDETAIL) +#define G_TD_DETAIL (gI_(0b10) << G_MDSFT_TEXTDETAIL) +#define G_TP_NONE (gI_(0b0) << G_MDSFT_TEXTPERSP) +#define G_TP_PERSP (gI_(0b1) << G_MDSFT_TEXTPERSP) +#define G_CYC_1CYCLE (gI_(0b00) << G_MDSFT_CYCLETYPE) +#define G_CYC_2CYCLE (gI_(0b01) << G_MDSFT_CYCLETYPE) +#define G_CYC_COPY (gI_(0b10) << G_MDSFT_CYCLETYPE) +#define G_CYC_FILL (gI_(0b11) << G_MDSFT_CYCLETYPE) +#define G_PM_NPRIMITIVE (gI_(0b0) << G_MDSFT_PIPELINE) +#define G_PM_1PRIMITIVE (gI_(0b1) << G_MDSFT_PIPELINE) + +/* color conversion constants */ +#define G_CV_K0 (175) +#define G_CV_K1 (-43) +#define G_CV_K2 (-89) +#define G_CV_K3 (222) +#define G_CV_K4 (114) +#define G_CV_K5 (42) + +/* color combiner */ +#define G_CCMUX_COMBINED 0 +#define G_CCMUX_TEXEL0 1 +#define G_CCMUX_TEXEL1 2 +#define G_CCMUX_PRIMITIVE 3 +#define G_CCMUX_SHADE 4 +#define G_CCMUX_ENVIRONMENT 5 +#define G_CCMUX_1 6 +#define G_CCMUX_NOISE 7 +#define G_CCMUX_0 31 +#define G_CCMUX_CENTER 6 +#define G_CCMUX_K4 7 +#define G_CCMUX_SCALE 6 +#define G_CCMUX_COMBINED_ALPHA 7 +#define G_CCMUX_TEXEL0_ALPHA 8 +#define G_CCMUX_TEXEL1_ALPHA 9 +#define G_CCMUX_PRIMITIVE_ALPHA 10 +#define G_CCMUX_SHADE_ALPHA 11 +#define G_CCMUX_ENV_ALPHA 12 +#define G_CCMUX_LOD_FRACTION 13 +#define G_CCMUX_PRIM_LOD_FRAC 14 +#define G_CCMUX_K5 15 +#define G_ACMUX_COMBINED 0 +#define G_ACMUX_TEXEL0 1 +#define G_ACMUX_TEXEL1 2 +#define G_ACMUX_PRIMITIVE 3 +#define G_ACMUX_SHADE 4 +#define G_ACMUX_ENVIRONMENT 5 +#define G_ACMUX_1 6 +#define G_ACMUX_0 7 +#define G_ACMUX_LOD_FRACTION 0 +#define G_ACMUX_PRIM_LOD_FRAC 6 + +/* + * combine modes + * ( A - B ) * C + D +*/ +#define G_CC_MODULATEI \ + TEXEL0, 0, SHADE, 0, \ + 0, 0, 0, SHADE +#define G_CC_MODULATEIA \ + TEXEL0, 0, SHADE, 0, \ + TEXEL0, 0, SHADE, 0 +#define G_CC_MODULATEIDECALA \ + TEXEL0, 0, SHADE, 0, \ + 0, 0, 0, TEXEL0 +#define G_CC_MODULATERGB \ + G_CC_MODULATEI +#define G_CC_MODULATERGBA \ + G_CC_MODULATEIA +#define G_CC_MODULATERGBDECALA \ + G_CC_MODULATEIDECALA +#define G_CC_MODULATEI_PRIM \ + TEXEL0, 0, PRIMITIVE, 0, \ + 0, 0, 0, PRIMITIVE +#define G_CC_MODULATEIA_PRIM \ + TEXEL0, 0, PRIMITIVE, 0, \ + TEXEL0, 0, PRIMITIVE, 0 +#define G_CC_MODULATEIDECALA_PRIM \ + TEXEL0, 0, PRIMITIVE, 0, \ + 0, 0, 0, TEXEL0 +#define G_CC_MODULATERGB_PRIM \ + G_CC_MODULATEI_PRIM +#define G_CC_MODULATERGBA_PRIM \ + G_CC_MODULATEIA_PRIM +#define G_CC_MODULATERGBDECALA_PRIM \ + G_CC_MODULATEIDECALA_PRIM +#define G_CC_DECALRGB \ + 0, 0, 0, TEXEL0, \ + 0, 0, 0, SHADE +#define G_CC_DECALRGBA \ + 0, 0, 0, TEXEL0, \ + 0, 0, 0, TEXEL0 +#define G_CC_BLENDI \ + ENVIRONMENT, SHADE, TEXEL0, SHADE, \ + 0, 0, 0, SHADE +#define G_CC_BLENDIA \ + ENVIRONMENT, SHADE, TEXEL0, SHADE, \ + TEXEL0, 0, SHADE, 0 +#define G_CC_BLENDIDECALA \ + ENVIRONMENT, SHADE, TEXEL0, SHADE, \ + 0, 0, 0, TEXEL0 +#define G_CC_BLENDRGBA \ + TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, \ + 0, 0, 0, SHADE +#define G_CC_BLENDRGBDECALA \ + TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, \ + 0, 0, 0, TEXEL0 +#define G_CC_REFLECTRGB \ + ENVIRONMENT, 0, TEXEL0, SHADE, \ + 0, 0, 0, SHADE +#define G_CC_REFLECTRGBDECALA \ + ENVIRONMENT, 0, TEXEL0, SHADE, \ + 0, 0, 0, TEXEL0 +#define G_CC_HILITERGB \ + PRIMITIVE, SHADE, TEXEL0, SHADE, \ + 0, 0, 0, SHADE +#define G_CC_HILITERGBA \ + PRIMITIVE, SHADE, TEXEL0, SHADE, \ + PRIMITIVE, SHADE, TEXEL0, SHADE +#define G_CC_HILITERGBDECALA \ + PRIMITIVE, SHADE, TEXEL0, SHADE, \ + 0, 0, 0, TEXEL0 +#define G_CC_1CYUV2RGB \ + TEXEL0, K4, K5, TEXEL0, \ + 0, 0, 0, SHADE +#define G_CC_PRIMITIVE \ + 0, 0, 0, PRIMITIVE, \ + 0, 0, 0, PRIMITIVE +#define G_CC_SHADE \ + 0, 0, 0, SHADE, \ + 0, 0, 0, SHADE +#define G_CC_ADDRGB \ + 1, 0, TEXEL0, SHADE, \ + 0, 0, 0, SHADE +#define G_CC_ADDRGBDECALA \ + 1, 0, TEXEL0, SHADE, \ + 0, 0, 0, TEXEL0 +#define G_CC_SHADEDECALA \ + 0, 0, 0, SHADE, \ + 0, 0, 0, TEXEL0 +#define G_CC_BLENDPE \ + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, \ + TEXEL0, 0, SHADE, 0 +#define G_CC_BLENDPEDECALA \ + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, \ + 0, 0, 0, TEXEL0 +#define G_CC_TRILERP \ + TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0, \ + TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0 +#define G_CC_TEMPLERP \ + TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, \ + TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0 +#define G_CC_INTERFERENCE \ + TEXEL0, 0, TEXEL1, 0, \ + TEXEL0, 0, TEXEL1, 0 +#define _G_CC_BLENDPE \ + ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, \ + TEXEL0, 0, SHADE, 0 +#define _G_CC_BLENDPEDECALA \ + ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, \ + 0, 0, 0, TEXEL0 +#define _G_CC_SPARSEST \ + PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0, \ + PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0 +#define _G_CC_TWOCOLORTEX \ + PRIMITIVE, SHADE, TEXEL0, SHADE, \ + 0, 0, 0, SHADE +#define G_CC_MODULATEI2 \ + COMBINED, 0, SHADE, 0, \ + 0, 0, 0, SHADE +#define G_CC_MODULATEIA2 \ + COMBINED, 0, SHADE, 0, \ + COMBINED, 0, SHADE, 0 +#define G_CC_MODULATERGB2 \ + G_CC_MODULATEI2 +#define G_CC_MODULATERGBA2 \ + G_CC_MODULATEIA2 +#define G_CC_MODULATEI_PRIM2 \ + COMBINED, 0, PRIMITIVE, 0, \ + 0, 0, 0, PRIMITIVE +#define G_CC_MODULATEIA_PRIM2 \ + COMBINED, 0, PRIMITIVE, 0, \ + COMBINED, 0, PRIMITIVE, 0 +#define G_CC_MODULATERGB_PRIM2 \ + G_CC_MODULATEI_PRIM2 +#define G_CC_MODULATERGBA_PRIM2 \ + G_CC_MODULATEIA_PRIM2 +#define G_CC_DECALRGB2 \ + 0, 0, 0, COMBINED, \ + 0, 0, 0, SHADE +#define G_CC_BLENDI2 \ + ENVIRONMENT, SHADE, COMBINED, SHADE, \ + 0, 0, 0, SHADE +#define G_CC_BLENDIA2 \ + ENVIRONMENT, SHADE, COMBINED, SHADE, \ + COMBINED, 0, SHADE, 0 +#define G_CC_HILITERGB2 \ + ENVIRONMENT, COMBINED, TEXEL0, COMBINED, \ + 0, 0, 0, SHADE +#define G_CC_HILITERGBA2 \ + ENVIRONMENT, COMBINED, TEXEL0, COMBINED, \ + ENVIRONMENT, COMBINED, TEXEL0, COMBINED +#define G_CC_HILITERGBDECALA2 \ + ENVIRONMENT, COMBINED, TEXEL0, COMBINED, \ + 0, 0, 0, TEXEL0 +#define G_CC_HILITERGBPASSA2 \ + ENVIRONMENT, COMBINED, TEXEL0, COMBINED, \ + 0, 0, 0, COMBINED +#define G_CC_CHROMA_KEY2 \ + TEXEL0, CENTER, SCALE, 0, \ + 0, 0, 0, 0 +#define G_CC_YUV2RGB \ + TEXEL1, K4, K5, TEXEL1, \ + 0, 0, 0, 0 +#define G_CC_PASS2 \ + 0, 0, 0, COMBINED, \ + 0, 0, 0, COMBINED +#define G_CC_LERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \ + a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ + ( \ + gFL_(G_CCMUX_##a0, 4, 52) | \ + gFL_(G_CCMUX_##c0, 5, 47) | \ + gFL_(G_ACMUX_##Aa0, 3, 44) | \ + gFL_(G_ACMUX_##Ac0, 3, 41) | \ + gFL_(G_CCMUX_##a1, 4, 37) | \ + gFL_(G_CCMUX_##c1, 5, 32) | \ + gFL_(G_CCMUX_##b0, 4, 28) | \ + gFL_(G_CCMUX_##b1, 4, 24) | \ + gFL_(G_ACMUX_##Aa1, 3, 21) | \ + gFL_(G_ACMUX_##Ac1, 3, 18) | \ + gFL_(G_CCMUX_##d0, 3, 15) | \ + gFL_(G_ACMUX_##Ab0, 3, 12) | \ + gFL_(G_ACMUX_##Ad0, 3, 9) | \ + gFL_(G_CCMUX_##d1, 3, 6) | \ + gFL_(G_ACMUX_##Ab1, 3, 3) | \ + gFL_(G_ACMUX_##Ad1, 3, 0) \ + ) +#define G_CC_MODE(mode1, mode2) G_CC_LERP(mode1, mode2) + +/* scissor modes */ +#define G_SC_NON_INTERLACE gI_(0b00) +#define G_SC_EVEN_INTERLACE gI_(0b10) +#define G_SC_ODD_INTERLACE gI_(0b11) + +/* display list branch flags */ +#define G_DL_PUSH gI_(0b0) +#define G_DL_NOPUSH gI_(0b1) + +/* conditional branching flags (f3dex and f3dex2) */ +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +# define G_BZ_PERSP 0 +# define G_BZ_ORTHO 1 +#endif + +/* matrix params */ +#define G_MTX_MUL (gI_(0b0) << 1) +#define G_MTX_LOAD (gI_(0b1) << 1) + +/* matrix params for fast3d and f3dex */ +#if defined(F3D_GBI) || defined(F3DEX_GBI) +# define G_MTX_MODELVIEW (gI_(0b0) << 0) +# define G_MTX_PROJECTION (gI_(0b1) << 0) +# define G_MTX_NOPUSH (gI_(0b0) << 2) +# define G_MTX_PUSH (gI_(0b1) << 2) +#endif + +/* matrix params for f3dex2 */ +#if defined(F3DEX_GBI_2) +# define G_MTX_NOPUSH (gI_(0b0) << 0) +# define G_MTX_PUSH (gI_(0b1) << 0) +# define G_MTX_MODELVIEW (gI_(0b0) << 2) +# define G_MTX_PROJECTION (gI_(0b1) << 2) +#endif + +/* moveword indices */ +#define G_MW_MATRIX 0 +#define G_MW_NUMLIGHT 2 +#define G_MW_CLIP 4 +#define G_MW_SEGMENT 6 +#define G_MW_FOG 8 +#define G_MW_GENSTAT 8 +#define G_MW_LIGHTCOL 10 +#define G_MW_PERSPNORM 14 + +/* moveword indices for fast3d and f3dex */ +#if defined(F3D_GBI) || defined(F3DEX_GBI) +# define G_MW_POINTS 12 +#endif + +/* moveword indices for f3dex2 */ +#if defined(F3DEX_GBI_2) +# define G_MW_FORCEMTX 12 +#endif + +/* moveword offsets */ +#define G_MWO_NUMLIGHT gI_(0x00) +#define G_MWO_CLIP_RNX gI_(0x04) +#define G_MWO_CLIP_RNY gI_(0x0C) +#define G_MWO_CLIP_RPX gI_(0x14) +#define G_MWO_CLIP_RPY gI_(0x1C) +#define G_MWO_SEGMENT_0 gI_(0x00) +#define G_MWO_SEGMENT_1 gI_(0x04) +#define G_MWO_SEGMENT_2 gI_(0x08) +#define G_MWO_SEGMENT_3 gI_(0x0C) +#define G_MWO_SEGMENT_4 gI_(0x10) +#define G_MWO_SEGMENT_5 gI_(0x14) +#define G_MWO_SEGMENT_6 gI_(0x18) +#define G_MWO_SEGMENT_7 gI_(0x1C) +#define G_MWO_SEGMENT_8 gI_(0x20) +#define G_MWO_SEGMENT_9 gI_(0x24) +#define G_MWO_SEGMENT_A gI_(0x28) +#define G_MWO_SEGMENT_B gI_(0x2C) +#define G_MWO_SEGMENT_C gI_(0x30) +#define G_MWO_SEGMENT_D gI_(0x34) +#define G_MWO_SEGMENT_E gI_(0x38) +#define G_MWO_SEGMENT_F gI_(0x3C) +#define G_MWO_FOG gI_(0x00) +#define G_MWO_aLIGHT_1 gI_(0x00) +#define G_MWO_bLIGHT_1 gI_(0x04) +#define G_MWO_MATRIX_XX_XY_I gI_(0x00) +#define G_MWO_MATRIX_XZ_XW_I gI_(0x04) +#define G_MWO_MATRIX_YX_YY_I gI_(0x08) +#define G_MWO_MATRIX_YZ_YW_I gI_(0x0C) +#define G_MWO_MATRIX_ZX_ZY_I gI_(0x10) +#define G_MWO_MATRIX_ZZ_ZW_I gI_(0x14) +#define G_MWO_MATRIX_WX_WY_I gI_(0x18) +#define G_MWO_MATRIX_WZ_WW_I gI_(0x1C) +#define G_MWO_MATRIX_XX_XY_F gI_(0x20) +#define G_MWO_MATRIX_XZ_XW_F gI_(0x24) +#define G_MWO_MATRIX_YX_YY_F gI_(0x28) +#define G_MWO_MATRIX_YZ_YW_F gI_(0x2C) +#define G_MWO_MATRIX_ZX_ZY_F gI_(0x30) +#define G_MWO_MATRIX_ZZ_ZW_F gI_(0x34) +#define G_MWO_MATRIX_WX_WY_F gI_(0x38) +#define G_MWO_MATRIX_WZ_WW_F gI_(0x3C) +#define G_MWO_POINT_RGBA gI_(0x10) +#define G_MWO_POINT_ST gI_(0x14) +#define G_MWO_POINT_XYSCREEN gI_(0x18) +#define G_MWO_POINT_ZSCREEN gI_(0x1C) + +/* moveword offsets for fast3d and f3dex */ +#if defined(F3D_GBI) || defined(F3DEX_GBI) +# define G_MWO_aLIGHT_2 gI_(0x20) +# define G_MWO_bLIGHT_2 gI_(0x24) +# define G_MWO_aLIGHT_3 gI_(0x40) +# define G_MWO_bLIGHT_3 gI_(0x44) +# define G_MWO_aLIGHT_4 gI_(0x60) +# define G_MWO_bLIGHT_4 gI_(0x64) +# define G_MWO_aLIGHT_5 gI_(0x80) +# define G_MWO_bLIGHT_5 gI_(0x84) +# define G_MWO_aLIGHT_6 gI_(0xA0) +# define G_MWO_bLIGHT_6 gI_(0xA4) +# define G_MWO_aLIGHT_7 gI_(0xC0) +# define G_MWO_bLIGHT_7 gI_(0xC4) +# define G_MWO_aLIGHT_8 gI_(0xE0) +# define G_MWO_bLIGHT_8 gI_(0xE4) +#endif + +/* moveword offsets for f3dex2 */ +#if defined(F3DEX_GBI_2) +# define G_MWO_aLIGHT_2 gI_(0x18) +# define G_MWO_bLIGHT_2 gI_(0x1C) +# define G_MWO_aLIGHT_3 gI_(0x30) +# define G_MWO_bLIGHT_3 gI_(0x34) +# define G_MWO_aLIGHT_4 gI_(0x48) +# define G_MWO_bLIGHT_4 gI_(0x4C) +# define G_MWO_aLIGHT_5 gI_(0x60) +# define G_MWO_bLIGHT_5 gI_(0x64) +# define G_MWO_aLIGHT_6 gI_(0x78) +# define G_MWO_bLIGHT_6 gI_(0x7C) +# define G_MWO_aLIGHT_7 gI_(0x90) +# define G_MWO_bLIGHT_7 gI_(0x94) +# define G_MWO_aLIGHT_8 gI_(0xA8) +# define G_MWO_bLIGHT_8 gI_(0xAC) +#endif + +/* movemem params for fast3d and f3dex */ +#if defined(F3D_GBI) || defined(F3DEX_GBI) +# define G_MV_VIEWPORT 128 +# define G_MV_LOOKATY 130 +# define G_MV_LOOKATX 132 +# define G_MV_L0 134 +# define G_MV_L1 136 +# define G_MV_L2 138 +# define G_MV_L3 140 +# define G_MV_L4 142 +# define G_MV_L5 144 +# define G_MV_L6 146 +# define G_MV_L7 148 +# define G_MV_TXTATT 150 +# define G_MV_MATRIX_2 152 +# define G_MV_MATRIX_3 154 +# define G_MV_MATRIX_4 156 +# define G_MV_MATRIX_1 158 +#endif + +/* movemem params for f3dex2 */ +#if defined(F3DEX_GBI_2) +# define G_MV_MMTX 2 +# define G_MV_PMTX 6 +# define G_MV_VIEWPORT 8 +# define G_MV_LIGHT 10 +# define G_MV_POINT 12 +# define G_MV_MATRIX 14 +# define G_MVO_LOOKATX gI_(0 * 0x18) +# define G_MVO_LOOKATY gI_(1 * 0x18) +# define G_MVO_L0 gI_(2 * 0x18) +# define G_MVO_L1 gI_(3 * 0x18) +# define G_MVO_L2 gI_(4 * 0x18) +# define G_MVO_L3 gI_(5 * 0x18) +# define G_MVO_L4 gI_(6 * 0x18) +# define G_MVO_L5 gI_(7 * 0x18) +# define G_MVO_L6 gI_(8 * 0x18) +# define G_MVO_L7 gI_(9 * 0x18) +#endif + +/* frustum ratios */ +#define FRUSTRATIO_1 gI_(1) +#define FRUSTRATIO_2 gI_(2) +#define FRUSTRATIO_3 gI_(3) +#define FRUSTRATIO_4 gI_(4) +#define FRUSTRATIO_5 gI_(5) +#define FRUSTRATIO_6 gI_(6) + +/* light params */ +#define NUMLIGHTS_0 1 +#define NUMLIGHTS_1 1 +#define NUMLIGHTS_2 2 +#define NUMLIGHTS_3 3 +#define NUMLIGHTS_4 4 +#define NUMLIGHTS_5 5 +#define NUMLIGHTS_6 6 +#define NUMLIGHTS_7 7 +#define LIGHT_1 1 +#define LIGHT_2 2 +#define LIGHT_3 3 +#define LIGHT_4 4 +#define LIGHT_5 5 +#define LIGHT_6 6 +#define LIGHT_7 7 +#define LIGHT_8 8 + +/* light params for fast3d and f3dex */ +#if defined(F3D_GBI) || defined(F3DEX_GBI) +# define NUML(n) (((n) + 1) * 32 + 0x80000000) +#endif + +/* light params for f3dex2 */ +#if defined(F3DEX_GBI_2) +# define NUML(n) ((n) * 0x18) +#endif + +/* background load types */ +#define G_BGLT_LOADBLOCK gI_(0x0033) +#define G_BGLT_LOADTILE gI_(0xFFF4) + +/* background flags */ +#define G_BG_FLAG_FLIPS (gI_(0b1) << 0) +#define G_BG_FLAG_FLIPT (gI_(0b1) << 1) + +/* object load types */ +#define G_OBJLT_TXTRBLOCK gI_(0x00001033) +#define G_OBJLT_TXTRTILE gI_(0x00FC1034) +#define G_OBJLT_TLUT gI_(0x00000030) + +/* object flags */ +#define G_OBJ_FLAG_FLIPS (gI_(0b1) << 0) +#define G_OBJ_FLAG_FLIPT (gI_(0b1) << 4) + +/* color macros */ +#define G_MAXZ 0x03FF +#define G_MAXFBZ 0x3FFF +#define GPACK_RGBA5551(r, g, b, a) \ + ( \ + gF_(r, 5, 11) | \ + gF_(g, 5, 6) | \ + gF_(b, 5, 1) | \ + gF_(a, 1, 0) \ + ) +#define GPACK_RGBA8888(r, g, b, a) \ + ( \ + gF_(r, 8, 24) | \ + gF_(g, 8, 16) | \ + gF_(b, 8, 8) | \ + gF_(a, 8, 0) \ + ) +#define GPACK_RGB24A8(rgb, a) (gF_(rgb, 24, 8) | gF_(a, 8, 0)) +#define GPACK_ZDZ(z, dz) (gF_(z, 14, 2) | gF_(dz, 2, 0)) + +/* structure definition macros */ +#define gdSPDefMtx(xx, xy, xz, xw, \ + yx, yy, yz, yw, \ + zx, zy, zz, zw, \ + wx, wy, wz, ww) \ + ( \ + (Mtx) \ + { \ + .i = \ + { \ + (qs1616(xx) >> 16) & 0xFFFF, \ + (qs1616(xy) >> 16) & 0xFFFF, \ + (qs1616(xz) >> 16) & 0xFFFF, \ + (qs1616(xw) >> 16) & 0xFFFF, \ + (qs1616(yx) >> 16) & 0xFFFF, \ + (qs1616(yy) >> 16) & 0xFFFF, \ + (qs1616(yz) >> 16) & 0xFFFF, \ + (qs1616(yw) >> 16) & 0xFFFF, \ + (qs1616(zx) >> 16) & 0xFFFF, \ + (qs1616(zy) >> 16) & 0xFFFF, \ + (qs1616(zz) >> 16) & 0xFFFF, \ + (qs1616(zw) >> 16) & 0xFFFF, \ + (qs1616(wx) >> 16) & 0xFFFF, \ + (qs1616(wy) >> 16) & 0xFFFF, \ + (qs1616(wz) >> 16) & 0xFFFF, \ + (qs1616(ww) >> 16) & 0xFFFF, \ + }, \ + .f = \ + { \ + qs1616(xx) & 0xFFFF, \ + qs1616(xy) & 0xFFFF, \ + qs1616(xz) & 0xFFFF, \ + qs1616(xw) & 0xFFFF, \ + qs1616(yx) & 0xFFFF, \ + qs1616(yy) & 0xFFFF, \ + qs1616(yz) & 0xFFFF, \ + qs1616(yw) & 0xFFFF, \ + qs1616(zx) & 0xFFFF, \ + qs1616(zy) & 0xFFFF, \ + qs1616(zz) & 0xFFFF, \ + qs1616(zw) & 0xFFFF, \ + qs1616(wx) & 0xFFFF, \ + qs1616(wy) & 0xFFFF, \ + qs1616(wz) & 0xFFFF, \ + qs1616(ww) & 0xFFFF, \ + } \ + } \ + ) +#define gdSPDefLookAt(rx, ry, rz, ux, uy, uz) \ + ( \ + (LookAt) \ + { \ + .l[0].l = \ + { \ + .col = {0, 0, 0}, \ + .colc = {0, 0, 0}, \ + .dir = {rx, ry, rz}, \ + }, \ + .l[1].l = \ + { \ + .col = {0, 0x80, 0}, \ + .colc = {0, 0x80, 0}, \ + .dir = {ux, uy, uz}, \ + }, \ + } \ + ) +#define gdSPDefLights0(ar, ag, ab) \ + ( \ + (Lights0) \ + { \ + .a.l = \ + { \ + .col = {ar, ag, ab}, \ + .colc = {ar, ag, ab}, \ + }, \ + .l[0].l = \ + { \ + } \ + } \ + ) +#define gdSPDefLights1(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1) \ + ( \ + (Lights1) \ + { \ + .a.l = \ + { \ + .col = {ar, ag, ab}, \ + .colc = {ar, ag, ab}, \ + }, \ + .l[0].l = \ + { \ + .col = {r1, g1, b1}, \ + .colc = {r1, g1, b1}, \ + .dir = {x1, y1, z1}, \ + } \ + } \ + ) +#define gdSPDefLights2(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2) \ + ( \ + (Lights2) \ + { \ + .a.l = \ + { \ + .col = {ar, ag, ab}, \ + .colc = {ar, ag, ab}, \ + }, \ + .l[0].l = \ + { \ + .col = {r1, g1, b1}, \ + .colc = {r1, g1, b1}, \ + .dir = {x1, y1, z1}, \ + } \ + .l[1].l = \ + { \ + .col = {r2, g2, b2}, \ + .colc = {r2, g2, b2}, \ + .dir = {x2, y2, z2}, \ + } \ + } \ + ) +#define gdSPDefLights3(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2, \ + r3, g3, b3, x3, y3, z3) \ + ( \ + (Lights3) \ + { \ + .a.l = \ + { \ + .col = {ar, ag, ab}, \ + .colc = {ar, ag, ab}, \ + }, \ + .l[0].l = \ + { \ + .col = {r1, g1, b1}, \ + .colc = {r1, g1, b1}, \ + .dir = {x1, y1, z1}, \ + } \ + .l[1].l = \ + { \ + .col = {r2, g2, b2}, \ + .colc = {r2, g2, b2}, \ + .dir = {x2, y2, z2}, \ + } \ + .l[2].l = \ + { \ + .col = {r3, g3, b3}, \ + .colc = {r3, g3, b3}, \ + .dir = {x3, y3, z3}, \ + } \ + } \ + ) +#define gdSPDefLights4(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2, \ + r3, g3, b3, x3, y3, z3, \ + r4, g4, b4, x4, y4, z4) \ + ( \ + (Lights4) \ + { \ + .a.l = \ + { \ + .col = {ar, ag, ab}, \ + .colc = {ar, ag, ab}, \ + }, \ + .l[0].l = \ + { \ + .col = {r1, g1, b1}, \ + .colc = {r1, g1, b1}, \ + .dir = {x1, y1, z1}, \ + } \ + .l[1].l = \ + { \ + .col = {r2, g2, b2}, \ + .colc = {r2, g2, b2}, \ + .dir = {x2, y2, z2}, \ + } \ + .l[2].l = \ + { \ + .col = {r3, g3, b3}, \ + .colc = {r3, g3, b3}, \ + .dir = {x3, y3, z3}, \ + } \ + .l[3].l = \ + { \ + .col = {r4, g4, b4}, \ + .colc = {r4, g4, b4}, \ + .dir = {x4, y4, z4}, \ + } \ + } \ + ) +#define gdSPDefLights5(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2, \ + r3, g3, b3, x3, y3, z3, \ + r4, g4, b4, x4, y4, z4, \ + r5, g5, b5, x5, y5, z5) \ + ( \ + (Lights5) \ + { \ + .a.l = \ + { \ + .col = {ar, ag, ab}, \ + .colc = {ar, ag, ab}, \ + }, \ + .l[0].l = \ + { \ + .col = {r1, g1, b1}, \ + .colc = {r1, g1, b1}, \ + .dir = {x1, y1, z1}, \ + } \ + .l[1].l = \ + { \ + .col = {r2, g2, b2}, \ + .colc = {r2, g2, b2}, \ + .dir = {x2, y2, z2}, \ + } \ + .l[2].l = \ + { \ + .col = {r3, g3, b3}, \ + .colc = {r3, g3, b3}, \ + .dir = {x3, y3, z3}, \ + } \ + .l[3].l = \ + { \ + .col = {r4, g4, b4}, \ + .colc = {r4, g4, b4}, \ + .dir = {x4, y4, z4}, \ + } \ + .l[4].l = \ + { \ + .col = {r5, g5, b5}, \ + .colc = {r5, g5, b5}, \ + .dir = {x5, y5, z5}, \ + } \ + } \ + ) +#define gdSPDefLights6(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2, \ + r3, g3, b3, x3, y3, z3, \ + r4, g4, b4, x4, y4, z4, \ + r5, g5, b5, x5, y5, z5, \ + r6, g6, b6, x6, y6, z6)\ + ( \ + (Lights6) \ + { \ + .a.l = \ + { \ + .col = {ar, ag, ab}, \ + .colc = {ar, ag, ab}, \ + }, \ + .l[0].l = \ + { \ + .col = {r1, g1, b1}, \ + .colc = {r1, g1, b1}, \ + .dir = {x1, y1, z1}, \ + } \ + .l[1].l = \ + { \ + .col = {r2, g2, b2}, \ + .colc = {r2, g2, b2}, \ + .dir = {x2, y2, z2}, \ + } \ + .l[2].l = \ + { \ + .col = {r3, g3, b3}, \ + .colc = {r3, g3, b3}, \ + .dir = {x3, y3, z3}, \ + } \ + .l[3].l = \ + { \ + .col = {r4, g4, b4}, \ + .colc = {r4, g4, b4}, \ + .dir = {x4, y4, z4}, \ + } \ + .l[4].l = \ + { \ + .col = {r5, g5, b5}, \ + .colc = {r5, g5, b5}, \ + .dir = {x5, y5, z5}, \ + } \ + .l[5].l = \ + { \ + .col = {r6, g6, b6}, \ + .colc = {r6, g6, b6}, \ + .dir = {x6, y6, z6}, \ + } \ + } \ + ) +#define gdSPDefLights7(ar, ag, ab, \ + r1, g1, b1, x1, y1, z1, \ + r2, g2, b2, x2, y2, z2, \ + r3, g3, b3, x3, y3, z3, \ + r4, g4, b4, x4, y4, z4, \ + r5, g5, b5, x5, y5, z5, \ + r6, g6, b6, x6, y6, z6, \ + r7, g7, b7, x7, y7, z7) \ + ( \ + (Lights7) \ + { \ + .a.l = \ + { \ + .col = {ar, ag, ab}, \ + .colc = {ar, ag, ab}, \ + }, \ + .l[0].l = \ + { \ + .col = {r1, g1, b1}, \ + .colc = {r1, g1, b1}, \ + .dir = {x1, y1, z1}, \ + } \ + .l[1].l = \ + { \ + .col = {r2, g2, b2}, \ + .colc = {r2, g2, b2}, \ + .dir = {x2, y2, z2}, \ + } \ + .l[2].l = \ + { \ + .col = {r3, g3, b3}, \ + .colc = {r3, g3, b3}, \ + .dir = {x3, y3, z3}, \ + } \ + .l[3].l = \ + { \ + .col = {r4, g4, b4}, \ + .colc = {r4, g4, b4}, \ + .dir = {x4, y4, z4}, \ + } \ + .l[4].l = \ + { \ + .col = {r5, g5, b5}, \ + .colc = {r5, g5, b5}, \ + .dir = {x5, y5, z5}, \ + } \ + .l[5].l = \ + { \ + .col = {r6, g6, b6}, \ + .colc = {r6, g6, b6}, \ + .dir = {x6, y6, z6}, \ + } \ + .l[6].l = \ + { \ + .col = {r7, g7, b7}, \ + .colc = {r7, g7, b7}, \ + .dir = {x7, y7, z7}, \ + } \ + } \ + ) +#define gdSPDefVtx(x, y, z, s, t) \ + ( \ + (Vtx) \ + { \ + .v = \ + { \ + .ob = {x, y, z}, \ + .tc = {qs105(s), qs105(t)}, \ + } \ + } \ + ) +#define gdSPDefVtxC(x, y, z, s, t, cr, cg, cb, ca) \ + ( \ + (Vtx) \ + { \ + .v = \ + { \ + .ob = {x, y, z}, \ + .tc = {qs105(s), qs105(t)}, \ + .cn = {cr, cg, cb, ca}, \ + } \ + } \ + ) +#define gdSPDefVtxN(x, y, z, s, t, nx, ny, nz, ca) \ + ( \ + (Vtx) \ + { \ + .n = \ + { \ + .ob = {x, y, z}, \ + .tc = {qs105(s), qs105(t)}, \ + .n = {nx, ny, nz}, \ + .a = ca \ + } \ + } \ + ) + +/* instruction macros */ + +#define gsDPFillRectangle(ulx, uly, lrx, lry) \ + gO_( \ + G_FILLRECT, \ + gF_(lrx, 10, 14) | \ + gF_(lry, 10, 2), \ + gF_(ulx, 10, 14) | \ + gF_(uly, 10, 2)) + +#define gsDPScisFillRectangle(ulx, uly, lrx, lry) \ + gsDPFillRectangle(gScC_(ulx), gScC_(uly), gScC_(lrx), gScC_(lry)) + +#define gsDPFullSync() \ + gO_(G_RDPFULLSYNC, 0, 0) + +#define gsDPLoadSync() \ + gO_(G_RDPLOADSYNC, 0, 0) + +#define gsDPTileSync() \ + gO_(G_RDPTILESYNC, 0, 0) + +#define gsDPPipeSync() \ + gO_(G_RDPPIPESYNC, 0, 0) + +#define gsDPLoadTLUT_pal16(pal, dram) \ + gsDPLoadTLUT(16, 256 + (gI_(pal) & 0xF) * 16, dram) + +#define gsDPLoadTLUT_pal256(dram) \ + gsDPLoadTLUT(256, 256, dram) + +#define gLTB_(timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + dxt, tmem, rt, line) \ + gsDPSetTextureImage(fmt, G_SIZ_LDSIZ(siz), 1, timg), \ + gsDPSetTile( \ + fmt, G_SIZ_LDSIZ(siz), 0, tmem, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, \ + cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock( \ + G_TX_LOADTILE, 0, 0, \ + (((width) * (height) + 1) * G_SIZ_BITS(siz) - 1) / \ + G_SIZ_BITS(G_SIZ_LDSIZ(siz)) - 1, \ + dxt), \ + gsDPPipeSync(), \ + gsDPSetTile( \ + fmt, siz, line, tmem, rt, pal, \ + cmt, maskt, shiftt, \ + cms, masks, shifts), \ + gsDPSetTileSize(rt, 0, 0, qu102((width) - 1), qu102((height) - 1)) + +#define gsDPLoadTextureBlock(timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + G_DXT(siz, width), 0x0, G_TX_RENDERTILE, \ + ((width) * G_SIZ_LDBITS(siz) + 63) / 64) + +#define gsDPLoadTextureBlockS(timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0, 0x0, G_TX_RENDERTILE, \ + ((width) * G_SIZ_LDBITS(siz) + 63) / 64) + +#define gsDPLoadTextureBlock_4b(timg, fmt, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, G_IM_SIZ_4b, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + G_DXT(G_IM_SIZ_4b, width), 0x0, G_TX_RENDERTILE, \ + ((width) * 4 + 63) / 64) + +#define gsDPLoadTextureBlock_4bS(timg, fmt, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, G_IM_SIZ_4b, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0, 0x0, G_TX_RENDERTILE, \ + ((width) * 4 + 63) / 64) + +#define gsDPLoadTextureBlockYuv(timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + G_DXT(siz, width), 0x0, G_TX_RENDERTILE, \ + ((width) + 7) / 8) + +#define gsDPLoadTextureBlockYuvS(timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0, 0x0, G_TX_RENDERTILE, \ + ((width) + 7) / 8) + +#define _gsDPLoadTextureBlock(timg, tmem, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + G_DXT(siz, width), tmem, G_TX_RENDERTILE, \ + ((width) * G_SIZ_LDBITS(siz) + 63) / 64) + +#define _gsDPLoadTextureBlockS(timg, tmem, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0, tmem, G_TX_RENDERTILE, \ + ((width) * G_SIZ_LDBITS(siz) + 63) / 64) + +#define _gsDPLoadTextureBlock_4b(timg, tmem, fmt, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, G_IM_SIZ_4b, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + G_DXT(G_IM_SIZ_4b, width), tmem, G_TX_RENDERTILE, \ + ((width) * 4 + 63) / 64) + +#define _gsDPLoadTextureBlock_4bS(timg, tmem, fmt, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, G_IM_SIZ_4b, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0, tmem, G_TX_RENDERTILE, \ + ((width) * 4 + 63) / 64) + +#define _gsDPLoadTextureBlockYuv(timg, tmem, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + G_DXT(siz, width), tmem, G_TX_RENDERTILE, \ + ((width) + 7) / 8) + +#define _gsDPLoadTextureBlockYuvS(timg, tmem, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0, tmem, G_TX_RENDERTILE, \ + ((width) + 7) / 8) + +#define gsDPLoadMultiBlock(timg, tmem, rt, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + G_DXT(siz, width), tmem, rt, \ + ((width) * G_SIZ_LDBITS(siz) + 63) / 64) + +#define gsDPLoadMultiBlockS(timg, tmem, rt, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0, tmem, rt, \ + ((width) * G_SIZ_LDBITS(siz) + 63) / 64) + +#define gsDPLoadMultiBlock_4b(timg, tmem, rt, fmt, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, G_IM_SIZ_4b, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + G_DXT(G_IM_SIZ_4b, width), tmem, rt, \ + ((width) * 4 + 63) / 64) + +#define gsDPLoadMultiBlock_4bS(timg, tmem, rt, fmt, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, G_IM_SIZ_4b, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0, tmem, rt, \ + ((width) * 4 + 63) / 64) + +#define gsDPLoadMultiBlockYuv(timg, tmem, rt, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + G_DXT(siz, width), tmem, rt, \ + ((width) + 7) / 8) + +#define gsDPLoadMultiBlockYuvS(timg, tmem, rt, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTB_( \ + timg, fmt, siz, width, height, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0, tmem, rt, \ + ((width) + 7) / 8) + +#define gLTT_(timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + tmem, rt, line) \ + gsDPSetTextureImage(fmt, siz, width, timg), \ + gsDPSetTile( \ + fmt, siz, line, tmem, \ + G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, \ + cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( \ + G_TX_LOADTILE, \ + qu102(uls), qu102(ult), \ + qu102(lrs), qu102(lrt)), \ + gsDPPipeSync(), \ + gsDPSetTile( \ + fmt, siz, line, \ + tmem, rt, pal, \ + cmt, maskt, shiftt, \ + cms, masks, shifts), \ + gsDPSetTileSize( \ + rt, \ + qu102(uls), qu102(ult), \ + qu102(lrs), qu102(lrt)) + +#define gLTT4_(timg, fmt, width, height, uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + tmem, rt) \ + gsDPSetTextureImage(fmt, G_IM_SIZ_8b, (width) / 2, timg), \ + gsDPSetTile( \ + fmt, G_IM_SIZ_8b, \ + (((lrs) - (uls) + 1) / 2 + 7) / 8, \ + tmem, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, \ + cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( \ + G_TX_LOADTILE, \ + qu102(uls) / 2, qu102(ult), \ + qu102(lrs) / 2, qu102(lrt)), \ + gsDPPipeSync(), \ + gsDPSetTile( \ + fmt, G_IM_SIZ_4b, \ + (((lrs) - (uls) + 1) / 2 + 7) / 8, \ + tmem, rt, pal, \ + cmt, maskt, shiftt, \ + cms, masks, shifts), \ + gsDPSetTileSize( \ + rt, \ + qu102(uls), qu102(ult), \ + qu102(lrs), qu102(lrt)) + +#define gsDPLoadTextureTile(timg, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTT_( \ + timg, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0x0, G_TX_RENDERTILE, \ + (((lrs) - (uls) + 1) * G_SIZ_LDBITS(siz) + 63) / 64) + +#define gsDPLoadTextureTile_4b(timg, fmt, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTT4_( \ + timg, fmt, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0x0, G_TX_RENDERTILE) + +#define gsDPLoadTextureTileYuv(timg, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTT_( \ + timg, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + 0x0, G_TX_RENDERTILE, \ + (((lrs) - (uls) + 1) + 7) / 8) + +#define _gsDPLoadTextureTile(timg, tmem, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTT_( \ + timg, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + tmem, G_TX_RENDERTILE, \ + (((lrs) - (uls) + 1) * G_SIZ_LDBITS(siz) + 63) / 64) + +#define _gsDPLoadTextureTile_4b(timg, tmem, fmt, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTT4_( \ + timg, fmt, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + tmem, G_TX_RENDERTILE) + +#define _gsDPLoadTextureTileYuv(timg, tmem, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, cms, cmt, \ + masks, maskt, shifts, shiftt) \ + gLTT_( \ + timg, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + tmem, G_TX_RENDERTILE, \ + (((lrs) - (uls) + 1) + 7) / 8) + +#define gsDPLoadMultiTile(timg, tmem, rt, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTT_( \ + timg, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + tmem, rt, \ + (((lrs) - (uls) + 1) * G_SIZ_LDBITS(siz) + 63) / 64) + +#define gsDPLoadMultiTile_4b(timg, tmem, rt, fmt, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTT4_( \ + timg, fmt, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + tmem, rt) + +#define gsDPLoadMultiTileYuv(timg, tmem, rt, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ + gLTT_( \ + timg, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt, \ + tmem, rt, \ + (((lrs) - (uls) + 1) + 7) / 8) + +#define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \ + gO_( \ + G_LOADBLOCK, \ + gF_(uls, 12, 12) | \ + gF_(ult, 12, 0), \ + gF_(tile, 3, 24) | \ + gF_(lrs, 12, 12) | \ + gF_(dxt, 12, 0)) + +#define gsDPNoOp() \ + gsDPNoOpTag(0) + +#define gsDPNoOpTag(tag) \ + gO_(G_NOOP, 0, tag) + +#define gsDPPipelineMode(mode) \ + gsSPSetOtherModeHi(G_MDSFT_PIPELINE, G_MDSIZ_PIPELINE, mode) + +#define gsDPSetBlendColor(r, g, b, a) \ + gO_( \ + G_SETBLENDCOLOR, \ + 0, \ + gF_(r, 8, 24) | \ + gF_(g, 8, 16) | \ + gF_(b, 8, 8) | \ + gF_(a, 8, 0)) + +#define gsDPSetEnvColor(r, g, b, a) \ + gO_( \ + G_SETENVCOLOR, \ + 0, \ + gF_(r, 8, 24) | \ + gF_(g, 8, 16) | \ + gF_(b, 8, 8) | \ + gF_(a, 8, 0)) + +#define gsDPSetFillColor(c) \ + gO_(G_SETFILLCOLOR, 0, c) + +#define gsDPSetFogColor(r, g, b, a) \ + gO_( \ + G_SETFOGCOLOR, 0, \ + gF_(r, 8, 24) | \ + gF_(g, 8, 16) | \ + gF_(b, 8, 8) | \ + gF_(a, 8, 0)) + +#define gsDPSetPrimColor(m, l, r, g, b, a) \ + gO_( \ + G_SETPRIMCOLOR, \ + gF_(m, 8, 8) | \ + gF_(l, 8, 0), \ + gF_(r, 8, 24) | \ + gF_(g, 8, 16) | \ + gF_(b, 8, 8) | \ + gF_(a, 8, 0)) + +#define gsDPSetColorImage(fmt, siz, width, img) \ + gO_( \ + G_SETCIMG, \ + gF_(fmt, 3, 21) | \ + gF_(siz, 2, 19) | \ + gF_((width) - 1, 12, 0), \ + img) + +#define gsDPSetDepthImage(img) \ + gO_(G_SETZIMG, 0, img) + +#define gsDPSetTextureImage(fmt, siz, width, img) \ + gO_( \ + G_SETTIMG, \ + gF_(fmt, 3, 21) | \ + gF_(siz, 2, 19) | \ + gF_((width) - 1, 12, 0), \ + img) + +#define gsDPSetHilite1Tile(tile, hilite, width, height) \ + gsDPSetTileSize( \ + tile, \ + ((Hilite *)(hilite))->h.x1 & 0xFFF, \ + ((Hilite *)(hilite))->h.y1 & 0xFFF, \ + (((width) - 1) * 4 + ((Hilite *)(hilite))->h.x1) & 0xFFF, \ + (((height) - 1) * 4 + ((Hilite *)(hilite))->h.y1) & 0xFFF) + +#define gsDPSetHilite2Tile(tile, hilite, width, height) \ + gsDPSetTileSize( \ + tile, \ + ((Hilite *)(hilite))->h.x2 & 0xFFF, \ + ((Hilite *)(hilite))->h.y2 & 0xFFF, \ + (((width) - 1) * 4 + ((Hilite *)(hilite))->h.x2) & 0xFFF, \ + (((height) - 1) * 4 + ((Hilite *)(hilite))->h.y2) & 0xFFF) + +#define gsDPSetAlphaCompare(mode) \ + gsSPSetOtherModeLo(G_MDSFT_ALPHACOMPARE, G_MDSIZ_ALPHACOMPARE, mode) + +#define gsDPSetAlphaDither(type) \ + gsSPSetOtherModeHi(G_MDSFT_ALPHADITHER, G_MDSIZ_ALPHADITHER, type) + +#define gsDPSetColorDither(type) \ + gsSPSetOtherModeHi(G_MDSFT_RGBDITHER, G_MDSIZ_RGBDITHER, type) + +#define gsDPSetCombineMode(mode1, mode2) \ + gsDPSetCombineLERP(mode1, mode2) + +#define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \ + a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ + gO_( \ + G_SETCOMBINE, \ + gF_(G_CCMUX_##a0, 4, 20) | \ + gF_(G_CCMUX_##c0, 5, 15) | \ + gF_(G_ACMUX_##Aa0, 3, 12) | \ + gF_(G_ACMUX_##Ac0, 3, 9) | \ + gF_(G_CCMUX_##a1, 4, 5) | \ + gF_(G_CCMUX_##c1, 5, 0), \ + gF_(G_CCMUX_##b0, 4, 28) | \ + gF_(G_CCMUX_##b1, 4, 24) | \ + gF_(G_ACMUX_##Aa1, 3, 21) | \ + gF_(G_ACMUX_##Ac1, 3, 18) | \ + gF_(G_CCMUX_##d0, 3, 15) | \ + gF_(G_ACMUX_##Ab0, 3, 12) | \ + gF_(G_ACMUX_##Ad0, 3, 9) | \ + gF_(G_CCMUX_##d1, 3, 6) | \ + gF_(G_ACMUX_##Ab1, 3, 3) | \ + gF_(G_ACMUX_##Ad1, 3, 0)) + +#define gsDPSetConvert(k0, k1, k2, k3, k4, k5) \ + gO_( \ + G_SETCONVERT, \ + gF_(k0, 9, 13) | \ + gF_(k1, 9, 4) | \ + gF_(gI_(k2) >> 5, 4, 0), \ + gF_(k2, 5, 27) | \ + gF_(k3, 9, 18) | \ + gF_(k4, 9, 9) | \ + gF_(k5, 9, 0)) + +#define gsDPSetTextureConvert(type) \ + gsSPSetOtherModeHi(G_MDSFT_TEXTCONV, G_MDSIZ_TEXTCONV, type) + +#define gsDPSetCycleType(type) \ + gsSPSetOtherModeHi(G_MDSFT_CYCLETYPE, G_MDSIZ_CYCLETYPE, type) + +#define gsDPSetDepthSource(source) \ + gsSPSetOtherModeLo(G_MDSFT_ZSRCSEL, G_MDSIZ_ZSRCSEL, source) + +#define gsDPSetCombineKey(type) \ + gsSPSetOtherModeHi(G_MDSFT_COMBKEY, G_MDSIZ_COMBKEY, type) + +#define gsDPSetKeyGB(cG, sG, wG, cB, sB, wB) \ + gO_( \ + G_SETKEYGB, \ + gF_(wG, 12, 12) | \ + gF_(wB, 12, 0), \ + gF_(cG, 8, 24) | \ + gF_(sG, 8, 16) | \ + gF_(cB, 8, 8) | \ + gF_(sB, 8, 0)) + +#define gsDPSetKeyR(cR, sR, wR) \ + gO_( \ + G_SETKEYR, 0, \ + gF_(wR, 12, 16) | \ + gF_(cR, 8, 8) | \ + gF_(sR, 8, 0)) + +#define gsDPSetPrimDepth(z, dz) \ + gO_( \ + G_SETPRIMDEPTH, \ + 0, \ + gF_(z, 16, 16) | \ + gF_(dz, 16, 0)) + +#define gsDPSetRenderMode(mode1, mode2) \ + gsSPSetOtherModeLo( \ + G_MDSFT_RENDERMODE, \ + G_MDSIZ_RENDERMODE, \ + gI_(mode1) | \ + gI_(mode2)) + +#define gsDPSetScissor(mode, ulx, uly, lrx, lry) \ + gsDPSetScissorFrac( \ + mode, \ + qu102(gI_(ulx)), \ + qu102(gI_(uly)), \ + qu102(gI_(lrx)), \ + qu102(gI_(lry))) + +#define gsDPSetScissorFrac(mode, ulx, uly, lrx, lry) \ + gO_( \ + G_SETSCISSOR, \ + gF_(ulx, 12, 12) | \ + gF_(uly, 12, 0), \ + gF_(mode, 2, 24) | \ + gF_(lrx, 12, 12) | \ + gF_(lry, 12, 0)) + +#define gsDPSetTextureDetail(type) \ + gsSPSetOtherModeHi(G_MDSFT_TEXTDETAIL, G_MDSIZ_TEXTDETAIL, type) + +#define gsDPSetTextureFilter(mode) \ + gsSPSetOtherModeHi(G_MDSFT_TEXTFILT, G_MDSIZ_TEXTFILT, mode) + +#define gsDPSetTextureLOD(mode) \ + gsSPSetOtherModeHi(G_MDSFT_TEXTLOD, G_MDSIZ_TEXTLOD, mode) + +#define gsDPSetTextureLUT(mode) \ + gsSPSetOtherModeHi(G_MDSFT_TEXTLUT, G_MDSIZ_TEXTLUT, mode) + +#define gsDPSetTexturePersp(enable) \ + gsSPSetOtherModeHi(G_MDSFT_TEXTPERSP, G_MDSIZ_TEXTPERSP, enable) + +#define gsDPSetTile(fmt, siz, line, tmem, tile, palette, \ + cmt, maskt, shiftt, cms, masks, shifts) \ + gO_( \ + G_SETTILE, \ + gF_(fmt, 3, 21) | \ + gF_(siz, 2, 19) | \ + gF_(line, 9, 9) | \ + gF_(tmem, 9, 0), \ + gF_(tile, 3, 24) | \ + gF_(palette, 4, 20) | \ + gF_(cmt, 2, 18) | \ + gF_(maskt, 4, 14) | \ + gF_(shiftt, 4, 10) | \ + gF_(cms, 2, 8) | \ + gF_(masks, 4, 4) | \ + gF_(shifts, 4, 0)) + +#define gsDPSetTileSize(tile, uls, ult, lrs, lrt) \ + gO_( \ + G_SETTILESIZE, \ + gF_(uls, 12, 12) | \ + gF_(ult, 12, 0), \ + gF_(tile, 3, 24) | \ + gF_(lrs, 12, 12) | \ + gF_(lrt, 12, 0)) + +#define gsSPBranchList(dl) \ + gsDisplayList(dl, 1) + +#define gsSPClipRatio(r) \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNX, (uint16_t)(r)), \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNY, (uint16_t)(r)), \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPX, (uint16_t)-(r)), \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPY, (uint16_t)-(r)) + +#define gsSPDisplayList(dl) \ + gsDisplayList(dl, 0) + +#define gsSPEndDisplayList() \ + gO_(G_ENDDL, 0, 0) + +#define gsSPFogFactor(fm, fo) \ + gsMoveWd( \ + G_MW_FOG, \ + G_MWO_FOG, \ + gF_(fm, 16, 16) | \ + gF_(fo, 16, 0)) + +#define gsSPFogPosition(min, max) \ + gsSPFogFactor( \ + (500 * 0x100) / ((max) - (min)), \ + (500 - (min)) * 0x100 / ((max) - (min))) + +#define gsSPLine3D(v0, v1, flag) \ + gsSPLineW3D(v0, v1, 0, flag) + +#define gsSPLookAt(l) \ + gsSPLookAtX(l), \ + gsSPLookAtY(gI_(l) + 0x10) + +#define gsSPSegment(seg, base) \ + gsMoveWd(G_MW_SEGMENT, (seg) * 4, base) + +#define gsSPSetLights0(lites) \ + gsSPNumLights(NUMLIGHTS_0), \ + gsSPLight(&(lites).l[0], 1), \ + gsSPLight(&(lites).a, 2) + +#define gsSPSetLights1(lites) \ + gsSPNumLights(NUMLIGHTS_1), \ + gsSPLight(&(lites).l[0], 1), \ + gsSPLight(&(lites).a, 2) + +#define gsSPSetLights2(lites) \ + gsSPNumLights(NUMLIGHTS_2), \ + gsSPLight(&(lites).l[0], 1), \ + gsSPLight(&(lites).l[1], 2), \ + gsSPLight(&(lites).a, 3) + +#define gsSPSetLights3(lites) \ + gsSPNumLights(NUMLIGHTS_3), \ + gsSPLight(&(lites).l[0], 1), \ + gsSPLight(&(lites).l[1], 2), \ + gsSPLight(&(lites).l[2], 3), \ + gsSPLight(&(lites).a, 4) + +#define gsSPSetLights4(lites) \ + gsSPNumLights(NUMLIGHTS_4), \ + gsSPLight(&(lites).l[0], 1), \ + gsSPLight(&(lites).l[1], 2), \ + gsSPLight(&(lites).l[2], 3), \ + gsSPLight(&(lites).l[3], 4), \ + gsSPLight(&(lites).a, 5) + +#define gsSPSetLights5(lites) \ + gsSPNumLights(NUMLIGHTS_5), \ + gsSPLight(&(lites).l[0], 1), \ + gsSPLight(&(lites).l[1], 2), \ + gsSPLight(&(lites).l[2], 3), \ + gsSPLight(&(lites).l[3], 4), \ + gsSPLight(&(lites).l[4], 5), \ + gsSPLight(&(lites).a, 6) + +#define gsSPSetLights6(lites) \ + gsSPNumLights(NUMLIGHTS_6), \ + gsSPLight(&(lites).l[0], 1), \ + gsSPLight(&(lites).l[1], 2), \ + gsSPLight(&(lites).l[2], 3), \ + gsSPLight(&(lites).l[3], 4), \ + gsSPLight(&(lites).l[4], 5), \ + gsSPLight(&(lites).l[5], 6), \ + gsSPLight(&(lites).a, 7) + +#define gsSPSetLights7(lites) \ + gsSPNumLights(NUMLIGHTS_7), \ + gsSPLight(&(lites).l[0], 1), \ + gsSPLight(&(lites).l[1], 2), \ + gsSPLight(&(lites).l[2], 3), \ + gsSPLight(&(lites).l[3], 4), \ + gsSPLight(&(lites).l[4], 5), \ + gsSPLight(&(lites).l[5], 6), \ + gsSPLight(&(lites).l[6], 7), \ + gsSPLight(&(lites).a, 8) + +#define gsSPSetStatus(sid, val) \ + gsMoveWd(G_MW_GENSTAT, sid, val) + +#define gsSPNumLights(n) \ + gsMoveWd(G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n)) + +#define gsSPLightColor(Lightnum, packedcolor) \ + gsMoveWd(G_MW_LIGHTCOL, G_MWO_a##Lightnum, packedcolor), \ + gsMoveWd(G_MW_LIGHTCOL, G_MWO_b##Lightnum, packedcolor) + +#define gsSPTextureRectangle(ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \ + gsTexRect(ulx, uly, lrx, lry, tile), \ + gsDPHalf1(gF_(s, 16, 16) | gF_(t, 16, 0)), \ + gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0)) + +#define gsSPScisTextureRectangle(ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \ + gsTexRect(gScC_(ulx), gScC_(uly), gScC_(lrx), gScC_(lry), tile), \ + gsDPHalf1( \ + gF_(gScD_(s, ulx, dsdx), 16, 16) | \ + gF_(gScD_(t, uly, dtdy), 16, 0)), \ + gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0)) + +#define gsSPTextureRectangleFlip(ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \ + gsTexRectFlip(ulx, uly, lrx, lry, tile), \ + gsDPHalf1(gF_(s, 16, 16) | gF_(t, 16, 0)), \ + gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0)) + +#define gsSPScisTextureRectangleFlip( \ + ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \ + gsTexRectFlip(gScC_(ulx), gScC_(uly), gScC_(lrx), gScC_(lry), tile), \ + gsDPHalf1( \ + gF_(gScD_(s, ulx, dsdx), 16, 16) | \ + gF_(gScD_(t, uly, dtdy), 16, 0)), \ + gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0)) + +#define gsSPBgRectCopy(bg) \ + gO_(G_BG_COPY, 0, bg) + +#define gsSPBgRect1Cyc(bg) \ + gO_(G_BG_1CYC, 0, bg) + +#define gsSPObjRectangle(sp) \ + gO_(G_OBJ_RECTANGLE, 0, sp) + +#define gsSPObjRectangleR(sp) \ + gO_(G_OBJ_RECTANGLE_R, 0, sp) + +#define gsSPObjSprite(sp) \ + gO_(G_OBJ_SPRITE, 0, sp) + +#define gsSPObjMatrix(mtx) \ + gO_( \ + G_OBJ_MOVEMEM, \ + gF_(sizeof(uObjMtx) - 1, 8, 16), \ + mtx) + +#define gsSPObjSubMatrix(mtx) \ + gO_( \ + G_OBJ_MOVEMEM, \ + gF_(sizeof(uObjSubMtx) - 1, 8, 16) | \ + gF_(2, 16, 0), \ + mtx) + +#define gsSPObjRenderMode(mode) \ + gO_(G_OBJ_RENDERMODE, 0, mode) + +#define gsSPObjLoadTxtr(tx) \ + gO_(G_OBJ_LOADTXTR, 23, tx) + +#define gsSPObjLoadTxRect(txsp) \ + gO_(G_OBJ_LDTX_RECT, 47, txsp) + +#define gsSPObjLoadTxRectR(txsp) \ + gO_(G_OBJ_LDTX_RECT_R, 47, txsp) + +#define gsSPObjLoadTxSprite(txsp) \ + gO_(G_OBJ_LDTX_SPRITE, 47, txsp) + +#define gsSPSelectDL(ldl, sid, flag, mask) \ + gO_( \ + G_RDPHALF_0, \ + gF_(sid, 8, 16) | \ + gF_(ldl, 16, 0), \ + flag), \ + gO_( \ + G_SELECT_DL, \ + gF_(0x00, 8, 16) | \ + gF_(gI_(ldl) >> 16, 16, 0), \ + mask) + +#define gsSPSelectBranchDL(bdl, sid, flag, mask) \ + gO_( \ + G_RDPHALF_0, \ + gF_(sid, 8, 16) | \ + gF_(bdl, 16, 0), \ + flag), \ + gO_( \ + G_SELECT_DL, \ + gF_(0x01, 8, 16) | \ + gF_(gI_(bdl) >> 16, 16, 0), \ + mask) + +/* unlisted instructions */ + +#define gsDPLoadTLUTCmd(tile, count) \ + gO_( \ + G_LOADTLUT, \ + 0, \ + gF_(tile, 3, 24) | \ + gF_(count, 10, 14)) + +#define gsDPLoadTLUT(count, tmem, dram) \ + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), \ + gsDPTileSync(), \ + gsDPSetTile(0, 0, 0, tmem, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), \ + gsDPLoadSync(), \ + gsDPLoadTLUTCmd(G_TX_LOADTILE, (count) - 1), \ + gsDPPipeSync() + +#define gsDisplayList(dl, branch) \ + gO_(G_DL, gF_(branch, 8, 16), dl) + +#define gsDPLoadTile(tile, uls, ult, lrs, lrt) \ + gO_( \ + G_LOADTILE, \ + gF_(uls, 12, 12) | \ + gF_(ult, 12, 0), \ + gF_(tile, 3, 24) | \ + gF_(lrs, 12, 12) | \ + gF_(lrt, 12, 0)) + +#define gsDPSetCombine(c) \ + gO_( \ + G_SETCOMBINE, \ + (gL_(c) >> 32) & 0xFFFFFFFF, \ + (gL_(c) >> 0) & 0xFFFFFFFF) + +#define gsSPSetOtherModeLo(shift, length, data) \ + gsSPSetOtherMode(G_SETOTHERMODE_L, shift, length, data) + +#define gsSPSetOtherModeHi(shift, length, data) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, shift, length, data) + +#define gsDPSetOtherMode(mode0, mode1) \ + gO_(G_RDPSETOTHERMODE, gF_(mode0, 24, 0), mode1) + +#define gsTexRect(ulx, uly, lrx, lry, tile) \ + gO_( \ + G_TEXRECT, \ + gF_(lrx, 12, 12) | \ + gF_(lry, 12, 0), \ + gF_(tile, 3, 24) | \ + gF_(ulx, 12, 12) | \ + gF_(uly, 12, 0)) + +#define gsTexRectFlip(ulx, uly, lrx, lry, tile) \ + gO_( \ + G_TEXRECTFLIP, \ + gF_(lrx, 12, 12) | \ + gF_(lry, 12, 0), \ + gF_(tile, 3, 24) | \ + gF_(ulx, 12, 12) | \ + gF_(uly, 12, 0)) + +#define gsSPNoOp() \ + gO_(G_SPNOOP, 0, 0) + +#define gsDPHalf1(wordhi) \ + gO_(G_RDPHALF_1, 0, wordhi) + +#define gsDPHalf2(wordlo) \ + gO_(G_RDPHALF_2, 0, wordlo) + +#define gsDPWord(wordhi, wordlo) \ + gsDPHalf1(wordhi), \ + gsDPHalf2(wordlo) + +/* instruction macros for fast3d */ + +#if defined(F3D_GBI) + +# define gsSP1Triangle(v0, v1, v2, flag) \ + gO_( \ + G_TRI1, \ + 0, \ + gF_(flag, 8, 24) | \ + gF_(gI_(v0) * 10, 8, 16) | \ + gF_(gI_(v1) * 10, 8, 8) | \ + gF_(gI_(v2) * 10, 8, 0)) + +# define gsSPCullDisplayList(v0, vn) \ + gO_( \ + G_CULLDL, \ + (gI_(v0) & 0xF) * 40, \ + gI_((vn) + 1) & 0xF) * 40) + +# define gsSPLineW3D(v0, v1, wd, flag) \ + gO_( \ + G_LINE3D, \ + 0, \ + gF_(flag, 8, 24) | \ + gF_(gI_(v0) * 10, 8, 16) | \ + gF_(gI_(v1) * 10, 8, 8) | \ + gF_(wd, 8, 0)) + +# define gsSPVertex(v, n, v0) \ + gO_( \ + G_VTX, \ + gF_((n) - 1, 4, 20) | \ + gF_(v0, 4, 16) | \ + gF_(sizeof(Vtx) * (n), 16, 0), \ + v) + +#endif + +/* instruction macros for fast3d and beta f3dex */ +#if defined(F3D_GBI) || (defined(F3D_BETA) && defined(F3DEX_GBI)) + +# define gsSPModifyVertex(vtx, where, val) \ + gsMoveWd(G_MW_POINTS, (vtx) * 40 + (where), val) + +#endif + +/* instruction macros for fast3d and f3dex */ + +#if defined(F3D_GBI) || defined(F3DEX_GBI) + +# define gsSPForceMatrix(mptr) \ + gsMoveMem(16, G_MV_MATRIX_1, (char *)(mptr)), \ + gsMoveMem(16, G_MV_MATRIX_2, (char *)(mptr) + 16), \ + gsMoveMem(16, G_MV_MATRIX_3, (char *)(mptr) + 32), \ + gsMoveMem(16, G_MV_MATRIX_4, (char *)(mptr) + 48) + +# define gsSPSetGeometryMode(mode) \ + gO_(G_SETGEOMETRYMODE, 0, gI_(mode)) + +# define gsSPClearGeometryMode(mode) \ + gO_(G_CLEARGEOMETRYMODE, 0, gI_(mode)) + +# define gsSPLoadGeometryMode(mode) \ + gsSPClearGeometryMode(~gI_(0)), \ + gsSPSetGeometryMode(mode) + +# define gsSPInsertMatrix(where, num) \ + gsMoveWd(G_MW_MATRIX, where, num) + +# define gsSPLookAtX(l) \ + gsMoveMem(sizeof(Light), G_MV_LOOKATX, l) + +# define gsSPLookAtY(l) \ + gsMoveMem(sizeof(Light), G_MV_LOOKATY, l) + +# define gsSPMatrix(matrix, param) \ + gO_( \ + G_MTX, \ + gF_(param, 8, 16) | \ + gF_(sizeof(Mtx), 16, 0), \ + matrix) + +# define gsSPPopMatrix(param) \ + gO_(G_POPMTX, 0, param) + +# define gsSPLight(l, n) \ + gsMoveMem(sizeof(Light), G_MV_L0 + ((n) - 1) * 2, l) + +# define gsSPTexture(sc, tc, level, tile, on) \ + gO_( \ + G_TEXTURE, \ + gF_(level, 3, 11) | \ + gF_(tile, 3, 8) | \ + gF_(on, 8, 0), \ + gF_(sc, 16, 16) | \ + gF_(tc, 16, 0)) + +# define gsSPViewport(v) \ + gsMoveMem(sizeof(Vp), G_MV_VIEWPORT, v) + +# define gsSPSetOtherMode(opc, shift, length, data) \ + gO_( \ + opc, \ + gF_(shift, 8, 8) | \ + gF_(length, 8, 0), \ + data) + +# define gsMoveWd(index, offset, data) \ + gO_( \ + G_MOVEWORD, \ + gF_(offset, 16, 8) | \ + gF_(index, 8, 0), \ + data) + +# define gsMoveMem(size, index, address) \ + gO_( \ + G_MOVEMEM, \ + gF_(index, 8, 16) | \ + gF_(size, 16, 0), \ + address) + +#endif + +/* instruction macros for f3dex */ + +#if defined(F3DEX_GBI) + +# define gsSP1Quadrangle(v0, v1, v2, v3, flag) \ + gO_( \ + G_TRI2, \ + gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \ + gF_(gV4_(v1, v2, v3, v0, flag) * 2, 8, 8) | \ + gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 0), \ + gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \ + gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 8) | \ + gF_(gV4_(v3, v0, v1, v2, flag) * 2, 8, 0)) + +# define gsSPVertex(v, n, v0) \ + gO_( \ + G_VTX, \ + gF_((v0) * 2, 8, 16) | \ + gF_(n, 6, 10) | \ + gF_(sizeof(Vtx) * (n) - 1, 10, 0), \ + v) + +#endif + +/* instruction macros for f3dex and f3dex2 */ + +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) + +# define gsSP1Triangle(v0, v1, v2, flag) \ + gO_( \ + G_TRI1, \ + gF_(gV3_(v0, v1, v2, flag) * 2, 8, 16) | \ + gF_(gV3_(v1, v2, v0, flag) * 2, 8, 8) | \ + gF_(gV3_(v2, v0, v1, flag) * 2, 8, 0), \ + 0) + +# define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \ + gO_( \ + G_TRI2, \ + gF_(gV3_(v00, v01, v02, flag0) * 2, 8, 16) | \ + gF_(gV3_(v01, v02, v00, flag0) * 2, 8, 8) | \ + gF_(gV3_(v02, v00, v01, flag0) * 2, 8, 0), \ + gF_(gV3_(v10, v11, v12, flag1) * 2, 8, 16) | \ + gF_(gV3_(v11, v12, v10, flag1) * 2, 8, 8) | \ + gF_(gV3_(v12, v10, v11, flag1) * 2, 8, 0)) + +# define gsSPBranchLessZ(branchdl, vtx, zval, near, far, flag) \ + gsSPBranchLessZrg(branchdl, vtx, zval, near, far, flag, 0, G_MAXZ) + +# define gsSPBranchLessZrg(branchdl, vtx, zval, near, far, flag, zmin, zmax) \ + gsSPBranchLessZraw(branchdl, vtx, \ + G_DEPTOZSrg(zval, near, far, flag, zmin, zmax)) + +# define gsSPBranchLessZraw(branchdl, vtx, zval) \ + gsDPHalf1(branchdl), \ + gsBranchZ(vtx, zval) + +# define gsSPCullDisplayList(v0, vn) \ + gO_( \ + G_CULLDL, \ + gF_((v0) * 2, 16, 0), \ + gF_((vn) * 2, 16, 0)) + +# define gsSPLineW3D(v0, v1, wd, flag) \ + gO_( \ + G_LINE3D, \ + gF_(gV2_(v0, v1, flag) * 2, 8, 16) | \ + gF_(gV2_(v1, v0, flag) * 2, 8, 8) | \ + gF_(wd, 8, 0), \ + 0) + +# define gsSPLoadUcode(uc_start, uc_dstart) \ + gsSPLoadUcodeEx(uc_start, uc_dstart, 0x800) + +# define gsSPLoadUcodeL(ucode) \ + gsSPLoadUcode( \ + gI_(&ucode##TextStart) & 0x1FFFFFFF, \ + gI_(&ucode##DataStart) & 0x1FFFFFFF) + +# if !(defined(F3D_BETA) && defined(F3DEX_GBI)) +# define gsSPModifyVertex(vtx, where, val) \ + gO_( \ + G_MODIFYVTX, \ + gF_(where, 8, 16) | \ + gF_((vtx) * 2, 16, 0), \ + val) +# endif + +# define gsBranchZ(vtx, zval) \ + gO_( \ + G_BRANCH_Z, \ + gF_((vtx) * 5, 12, 12) | \ + gF_((vtx) * 2, 12, 0), \ + zval) + +# define gsLoadUcode(uc_start, uc_dsize) \ + gO_( \ + G_LOAD_UCODE, \ + gF_((uc_dsize) - 1, 16, 0), \ + uc_start) + +# define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \ + gsDPHalf1(uc_dstart), \ + gsLoadUcode(uc_start, uc_dsize) + +#endif + +/* instruction macros for f3dex2 */ + +#if defined(F3DEX_GBI_2) + +# define gsSP1Quadrangle(v0, v1, v2, v3, flag) \ + gO_( \ + G_QUAD, \ + gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \ + gF_(gV4_(v1, v2, v3, v0, flag) * 2, 8, 8) | \ + gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 0), \ + gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \ + gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 8) | \ + gF_(gV4_(v3, v0, v1, v2, flag) * 2, 8, 0)) + +# define gsSPForceMatrix(mptr) \ + gsMoveMem(sizeof(Mtx), G_MV_MATRIX, 0, mptr), \ + gsMoveWd(G_MW_FORCEMTX, 0, 0x10000) + +# define gsSPSetGeometryMode(mode) \ + gsSPGeometryMode(0, mode) + +# define gsSPClearGeometryMode(mode) \ + gsSPGeometryMode(mode, 0) + +# define gsSPLoadGeometryMode(mode) \ + gsSPGeometryMode(~gI_(0), mode) + +# define gsSPLookAtX(l) \ + gsMoveMem(sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATX, l) + +# define gsSPLookAtY(l) \ + gsMoveMem(sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATY, l) + +# define gsSPMatrix(matrix, param) \ + gO_( \ + G_MTX, \ + gF_((sizeof(Mtx) - 1) / 8, 5, 19) | \ + gF_(gI_(param) ^ G_MTX_PUSH, 8, 0), \ + matrix) + +# define gsSPPopMatrix(param) \ + gsSPPopMatrixN(param, 1) + +# define gsSPPopMatrixN(param, n) \ + gO_( \ + G_POPMTX, \ + gF_((sizeof(Mtx) - 1) / 8, 5, 19) | \ + gF_(2, 8, 0), \ + sizeof(Mtx) * (n)) + +# define gsSPLight(l, n) \ + gsMoveMem(sizeof(Light), G_MV_LIGHT, ((n) + 1) * 0x18, l) + +# define gsSPTexture(sc, tc, level, tile, on) \ + gO_( \ + G_TEXTURE, \ + gF_(level, 3, 11) | \ + gF_(tile, 3, 8) | \ + gF_(on, 7, 1), \ + gF_(sc, 16, 16) | \ + gF_(tc, 16, 0)) + +# define gsSPVertex(v, n, v0) \ + gO_( \ + G_VTX, \ + gF_(n, 8, 12) | \ + gF_((v0) + (n), 7, 1), \ + v) + +# define gsSPViewport(v) \ + gsMoveMem(sizeof(Vp), G_MV_VIEWPORT, 0, v) + +# define gsSPGeometryMode(clearbits, setbits) \ + gO_( \ + G_GEOMETRYMODE, \ + gF_(~gI_(clearbits), 24, 0), \ + setbits) + +# define gsSPSetOtherMode(opc, shift, length, data) \ + gO_( \ + opc, \ + gF_(32 - (shift) - (length), 8, 8) | \ + gF_((length) - 1, 8, 0), \ + data) + +# define gsMoveWd(index, offset, data) \ + gO_( \ + G_MOVEWORD, \ + gF_(index, 8, 16) | \ + gF_(offset, 16, 0), \ + data) + +# define gsMoveMem(size, index, offset, address) \ + gO_( \ + G_MOVEMEM, \ + gF_((size - 1) / 8, 5, 19) | \ + gF_((offset) / 8, 8, 8) | \ + gF_(index, 8, 0), \ + address) + +# define gsSPDma_io(flag, dmem, dram, size) \ + gO_( \ + G_DMA_IO, \ + gF_(flag, 1, 23) | \ + gF_((dmem) / 8, 10, 13) | \ + gF_((size) - 1, 12, 0), \ + dram) + +# define gsSPDmaRead(dmem, dram, size) \ + gsSPDma_io(0, dmem, dram, size) + +# define gsSPDmaWrite(dmem, dram, size) \ + gsSPDma_io(1, dmem, dram, size) + +# define gsSpecial3(hi, lo) \ + gO_(G_SPECIAL_3, hi, lo) + +# define gsSpecial2(hi, lo) \ + gO_(G_SPECIAL_2, hi, lo) + +# define gsSpecial1(hi, lo) \ + gO_(G_SPECIAL_1, hi, lo) + +#endif + +/* instruction macros for beta fast3d and f3dex */ + +#if defined(F3D_BETA) && (defined(F3D_GBI) || defined(F3DEX_GBI)) + +# define gsSPPerspNormalize(scale) \ + gO_(G_PERSPNORM, 0, scale) + +#else + +# define gsSPPerspNormalize(scale) \ + gsMoveWd(G_MW_PERSPNORM, 0, scale) + +#endif + +/* dynamic instruction macros */ + +#define gDisplayListPut(gdl, ...) \ + ({ \ + Gfx Gd_[] = {__VA_ARGS__}; \ + for(size_t Gi_ = 0; Gi_ < sizeof(Gd_) / sizeof(Gfx); Gi_++) \ + { \ + *(Gfx *)(gdl) = Gd_[Gi_]; \ + } \ + (void)0; \ + }) +#define gDisplayListAppend(pgdl, ...) \ + ({ \ + Gfx Gd_[] = {__VA_ARGS__}; \ + for(size_t Gi_ = 0; Gi_ < sizeof(Gd_) / sizeof(Gfx); Gi_++) \ + { \ + *(*(Gfx **)(pgdl))++ = Gd_[Gi_]; \ + } \ + (void)0; \ + }) +#define gDisplayListData(pgdl, d) \ + ({ \ + Gfx **Gp_ = (void *)(pgdl); \ + struct \ + { \ + __typeof__(d) v; \ + } *Gd_, *Gs_; \ + *Gp_ -= (sizeof(*Gd_) + sizeof(Gfx) - 1) / sizeof(Gfx); \ + Gd_ = (void *)*Gp_; \ + Gs_ = (void *)&(d); \ + *Gd_ = *Gs_; \ + &Gd_->v; \ + }) +#define gDisplayListAlloc(pgdl, s) \ + ({ \ + Gfx **Gp_ = (void *)(pgdl); \ + *Gp_ -= ((s) + sizeof(Gfx) - 1) / sizeof(Gfx); \ + (void *)*Gp_; \ + }) + +#define gDPFillRectangle(gdl, ...) \ + gD_(gdl, gsDPFillRectangle, __VA_ARGS__) +#define gDPScisFillRectangle(gdl, ...) \ + gD_(gdl, gsDPScisFillRectangle, __VA_ARGS__) +#define gDPFullSync(gdl) \ + gDisplayListPut(gdl, gsDPFullSync()) +#define gDPLoadSync(gdl) \ + gDisplayListPut(gdl, gsDPLoadSync()) +#define gDPTileSync(gdl) \ + gDisplayListPut(gdl, gsDPTileSync()) +#define gDPPipeSync(gdl) \ + gDisplayListPut(gdl, gsDPPipeSync()) +#define gDPLoadTLUT_pal16(gdl, ...) \ + gD_(gdl, gsDPLoadTLUT_pal16, __VA_ARGS__) +#define gDPLoadTLUT_pal256(gdl, ...) \ + gD_(gdl, gsDPLoadTLUT_pal256, __VA_ARGS__) +#define gDPLoadTextureBlock(gdl, ...) \ + gD_(gdl, gsDPLoadTextureBlock, __VA_ARGS__) +#define gDPLoadTextureBlockS(gdl, ...) \ + gD_(gdl, gsDPLoadTextureBlockS, __VA_ARGS__) +#define gDPLoadTextureBlock_4b(gdl, ...) \ + gD_(gdl, gsDPLoadTextureBlock_4b, __VA_ARGS__) +#define gDPLoadTextureBlock_4bS(gdl, ...) \ + gD_(gdl, gsDPLoadTextureBlock_4bS, __VA_ARGS__) +#define gDPLoadTextureBlockYuv(gdl, ...) \ + gD_(gdl, gsDPLoadTextureBlockYuv, __VA_ARGS__) +#define gDPLoadTextureBlockYuvS(gdl, ...) \ + gD_(gdl, gsDPLoadTextureBlockYuvS, __VA_ARGS__) +#define _gDPLoadTextureBlock(gdl, ...) \ + gD_(gdl, _gsDPLoadTextureBlock, __VA_ARGS__) +#define _gDPLoadTextureBlockS(gdl, ...) \ + gD_(gdl, _gsDPLoadTextureBlockS, __VA_ARGS__) +#define _gDPLoadTextureBlock_4b(gdl, ...) \ + gD_(gdl, _gsDPLoadTextureBlock_4b, __VA_ARGS__) +#define _gDPLoadTextureBlock_4bS(gdl, ...) \ + gD_(gdl, _gsDPLoadTextureBlock_4bS, __VA_ARGS__) +#define _gDPLoadTextureBlockYuv(gdl, ...) \ + gD_(gdl, _gsDPLoadTextureBlockYuv, __VA_ARGS__) +#define _gDPLoadTextureBlockYuvS(gdl, ...) \ + gD_(gdl, _gsDPLoadTextureBlockYuvS, __VA_ARGS__) +#define gDPLoadMultiBlock(gdl, ...) \ + gD_(gdl, gsDPLoadMultiBlock, __VA_ARGS__) +#define gDPLoadMultiBlockS(gdl, ...) \ + gD_(gdl, gsDPLoadMultiBlockS, __VA_ARGS__) +#define gDPLoadMultiBlock_4b(gdl, ...) \ + gD_(gdl, gsDPLoadMultiBlock_4b, __VA_ARGS__) +#define gDPLoadMultiBlock_4bS(gdl, ...) \ + gD_(gdl, gsDPLoadMultiBlock_4bS, __VA_ARGS__) +#define gDPLoadMultiBlockYuv(gdl, ...) \ + gD_(gdl, gsDPLoadMultiBlockYuv, __VA_ARGS__) +#define gDPLoadMultiBlockYuvS(gdl, ...) \ + gD_(gdl, gsDPLoadMultiBlockYuvS, __VA_ARGS__) +#define gDPLoadTextureTile(gdl, ...) \ + gD_(gdl, gsDPLoadTextureTile, __VA_ARGS__) +#define gDPLoadTextureTile_4b(gdl, ...) \ + gD_(gdl, gsDPLoadTextureTile_4b, __VA_ARGS__) +#define gDPLoadTextureTileYuv(gdl, ...) \ + gD_(gdl, gsDPLoadTextureTileYuv, __VA_ARGS__) +#define _gDPLoadTextureTile(gdl, ...) \ + gD_(gdl, _gsDPLoadTextureTile, __VA_ARGS__) +#define _gDPLoadTextureTile_4b(gdl, ...) \ + gD_(gdl, _gsDPLoadTextureTile_4b, __VA_ARGS__) +#define _gDPLoadTextureTileYuv(gdl, ...) \ + gD_(gdl, _gsDPLoadTextureTileYuv, __VA_ARGS__) +#define gDPLoadMultiTile(gdl, ...) \ + gD_(gdl, gsDPLoadMultiTile, __VA_ARGS__) +#define gDPLoadMultiTile_4b(gdl, ...) \ + gD_(gdl, gsDPLoadMultiTile_4b, __VA_ARGS__) +#define gDPLoadMultiTileYuv(gdl, ...) \ + gD_(gdl, gsDPLoadMultiTileYuv, __VA_ARGS__) +#define gDPLoadBlock(gdl, ...) \ + gD_(gdl, gsDPLoadBlock, __VA_ARGS__) +#define gDPNoOp(gdl) \ + gDisplayListPut(gdl, gsDPNoOp()) +#define gDPNoOpTag(gdl, ...) \ + gD_(gdl, gsDPNoOpTag, __VA_ARGS__) +#define gDPPipelineMode(gdl, ...) \ + gD_(gdl, gsDPPipelineMode, __VA_ARGS__) +#define gDPSetBlendColor(gdl, ...) \ + gD_(gdl, gsDPSetBlendColor, __VA_ARGS__) +#define gDPSetEnvColor(gdl, ...) \ + gD_(gdl, gsDPSetEnvColor, __VA_ARGS__) +#define gDPSetFillColor(gdl, ...) \ + gD_(gdl, gsDPSetFillColor, __VA_ARGS__) +#define gDPSetFogColor(gdl, ...) \ + gD_(gdl, gsDPSetFogColor, __VA_ARGS__) +#define gDPSetPrimColor(gdl, ...) \ + gD_(gdl, gsDPSetPrimColor, __VA_ARGS__) +#define gDPSetColorImage(gdl, ...) \ + gD_(gdl, gsDPSetColorImage, __VA_ARGS__) +#define gDPSetDepthImage(gdl, ...) \ + gD_(gdl, gsDPSetDepthImage, __VA_ARGS__) +#define gDPSetTextureImage(gdl, ...) \ + gD_(gdl, gsDPSetTextureImage, __VA_ARGS__) +#define gDPSetHilite1Tile(gdl, ...) \ + gD_(gdl, gsDPSetHilite1Tile, __VA_ARGS__) +#define gDPSetHilite2Tile(gdl, ...) \ + gD_(gdl, gsDPSetHilite2Tile, __VA_ARGS__) +#define gDPSetAlphaCompare(gdl, ...) \ + gD_(gdl, gsDPSetAlphaCompare, __VA_ARGS__) +#define gDPSetAlphaDither(gdl, ...) \ + gD_(gdl, gsDPSetAlphaDither, __VA_ARGS__) +#define gDPSetColorDither(gdl, ...) \ + gD_(gdl, gsDPSetColorDither, __VA_ARGS__) +#define gDPSetCombineMode(gdl, ...) \ + gD_(gdl, gsDPSetCombineLERP, __VA_ARGS__) +#define gDPSetCombineLERP(gdl, ...) \ + gD_(gdl, gsDPSetCombineLERP, __VA_ARGS__) +#define gDPSetConvert(gdl, ...) \ + gD_(gdl, gsDPSetConvert, __VA_ARGS__) +#define gDPSetTextureConvert(gdl, ...) \ + gD_(gdl, gsDPSetTextureConvert, __VA_ARGS__) +#define gDPSetCycleType(gdl, ...) \ + gD_(gdl, gsDPSetCycleType, __VA_ARGS__) +#define gDPSetDepthSource(gdl, ...) \ + gD_(gdl, gsDPSetDepthSource, __VA_ARGS__) +#define gDPSetCombineKey(gdl, ...) \ + gD_(gdl, gsDPSetCombineKey, __VA_ARGS__) +#define gDPSetKeyGB(gdl, ...) \ + gD_(gdl, gsDPSetKeyGB, __VA_ARGS__) +#define gDPSetKeyR(gdl, ...) \ + gD_(gdl, gsDPSetKeyR, __VA_ARGS__) +#define gDPSetPrimDepth(gdl, ...) \ + gD_(gdl, gsDPSetPrimDepth, __VA_ARGS__) +#define gDPSetRenderMode(gdl, ...) \ + gD_(gdl, gsDPSetRenderMode, __VA_ARGS__) +#define gDPSetScissor(gdl, ...) \ + gD_(gdl, gsDPSetScissor, __VA_ARGS__) +#define gDPSetScissorFrac(gdl, ...) \ + gD_(gdl, gsDPSetScissorFrac, __VA_ARGS__) +#define gDPSetTextureDetail(gdl, ...) \ + gD_(gdl, gsDPSetTextureDetail, __VA_ARGS__) +#define gDPSetTextureFilter(gdl, ...) \ + gD_(gdl, gsDPSetTextureFilter, __VA_ARGS__) +#define gDPSetTextureLOD(gdl, ...) \ + gD_(gdl, gsDPSetTextureLOD, __VA_ARGS__) +#define gDPSetTextureLUT(gdl, ...) \ + gD_(gdl, gsDPSetTextureLUT, __VA_ARGS__) +#define gDPSetTexturePersp(gdl, ...) \ + gD_(gdl, gsDPSetTexturePersp, __VA_ARGS__) +#define gDPSetTile(gdl, ...) \ + gD_(gdl, gsDPSetTile, __VA_ARGS__) +#define gDPSetTileSize(gdl, ...) \ + gD_(gdl, gsDPSetTileSize, __VA_ARGS__) +#define gSP1Triangle(gdl, ...) \ + gD_(gdl, gsSP1Triangle, __VA_ARGS__) +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +# define gSP2Triangles(gdl, ...) \ + gD_(gdl, gsSP2Triangles, __VA_ARGS__) +# define gSP1Quadrangle(gdl, ...) \ + gD_(gdl, gsSP1Quadrangle, __VA_ARGS__) +# define gSPBranchLessZ(gdl, ...) \ + gD_(gdl, gsSPBranchLessZ, __VA_ARGS__) +# define gSPBranchLessZrg(gdl, ...) \ + gD_(gdl, gsSPBranchLessZrg, __VA_ARGS__) +# define gSPBranchLessZraw(gdl, ...) \ + gD_(gdl, gsSPBranchLessZraw, __VA_ARGS__) +#endif +#define gSPBranchList(gdl, ...) \ + gD_(gdl, gsSPBranchList, __VA_ARGS__) +#define gSPClipRatio(gdl, ...) \ + gD_(gdl, gsSPClipRatio, __VA_ARGS__) +#define gSPCullDisplayList(gdl, ...) \ + gD_(gdl, gsSPCullDisplayList, __VA_ARGS__) +#define gSPDisplayList(gdl, ...) \ + gD_(gdl, gsSPDisplayList, __VA_ARGS__) +#define gSPEndDisplayList(gdl) \ + gDisplayListPut(gdl, gsSPEndDisplayList()) +#define gSPFogFactor(gdl, ...) \ + gD_(gdl, gsSPFogFactor, __VA_ARGS__) +#define gSPFogPosition(gdl, ...) \ + gD_(gdl, gsSPFogPosition, __VA_ARGS__) +#define gSPForceMatrix(gdl, ...) \ + gD_(gdl, gsSPForceMatrix, __VA_ARGS__) +#define gSPSetGeometryMode(gdl, ...) \ + gD_(gdl, gsSPSetGeometryMode, __VA_ARGS__) +#define gSPClearGeometryMode(gdl, ...) \ + gD_(gdl, gsSPClearGeometryMode, __VA_ARGS__) +#define gSPLoadGeometryMode(gdl, ...) \ + gD_(gdl, gsSPLoadGeometryMode, __VA_ARGS__) +#if defined(F3D_GBI) || defined(F3DEX_GBI) +# define gSPInsertMatrix(gdl, ...) \ + gD_(gdl, gsSPInsertMatrix, __VA_ARGS__) +#endif +#define gSPLine3D(gdl, ...) \ + gD_(gdl, gsSPLine3D, __VA_ARGS__) +#define gSPLineW3D(gdl, ...) \ + gD_(gdl, gsSPLineW3D, __VA_ARGS__) +#define gSPLoadUcode(gdl, ...) \ + gD_(gdl, gsSPLoadUcode, __VA_ARGS__) +#define gSPLoadUcodeL(gdl, ...) \ + gD_(gdl, gsSPLoadUcodeL, __VA_ARGS__) +#define gSPLookAtX(gdl, ...) \ + gD_(gdl, gsSPLookAtX, __VA_ARGS__) +#define gSPLookAtY(gdl, ...) \ + gD_(gdl, gsSPLookAtY, __VA_ARGS__) +#define gSPLookAt(gdl, ...) \ + gD_(gdl, gsSPLookAt, __VA_ARGS__) +#define gSPMatrix(gdl, ...) \ + gD_(gdl, gsSPMatrix, __VA_ARGS__) +#define gSPModifyVertex(gdl, ...) \ + gD_(gdl, gsSPModifyVertex, __VA_ARGS__) +#define gSPPerspNormalize(gdl, ...) \ + gD_(gdl, gsSPPerspNormalize, __VA_ARGS__) +#define gSPPopMatrix(gdl, ...) \ + gD_(gdl, gsSPPopMatrix, __VA_ARGS__) +#if defined(F3DEX_GBI_2) +# define gSPPopMatrixN(gdl, ...) \ + gD_(gdl, gsSPPopMatrixN, __VA_ARGS__) +#endif +#define gSPSegment(gdl, ...) \ + gD_(gdl, gsSPSegment, __VA_ARGS__) +#define gSPSetLights0(gdl, ...) \ + gD_(gdl, gsSPSetLights0, __VA_ARGS__) +#define gSPSetLights1(gdl, ...) \ + gD_(gdl, gsSPSetLights1, __VA_ARGS__) +#define gSPSetLights2(gdl, ...) \ + gD_(gdl, gsSPSetLights2, __VA_ARGS__) +#define gSPSetLights3(gdl, ...) \ + gD_(gdl, gsSPSetLights3, __VA_ARGS__) +#define gSPSetLights4(gdl, ...) \ + gD_(gdl, gsSPSetLights4, __VA_ARGS__) +#define gSPSetLights5(gdl, ...) \ + gD_(gdl, gsSPSetLights5, __VA_ARGS__) +#define gSPSetLights6(gdl, ...) \ + gD_(gdl, gsSPSetLights6, __VA_ARGS__) +#define gSPSetLights7(gdl, ...) \ + gD_(gdl, gsSPSetLights7, __VA_ARGS__) +#define gSPSetStatus(gdl, ...) \ + gD_(gdl, gsSPSetStatus, __VA_ARGS__) +#define gSPNumLights(gdl, ...) \ + gD_(gdl, gsSPNumLights, __VA_ARGS__) +#define gSPLight(gdl, ...) \ + gD_(gdl, gsSPLight, __VA_ARGS__) +#define gSPLightColor(gdl, ...) \ + gD_(gdl, gsSPLightColor, __VA_ARGS__) +#define gSPTexture(gdl, ...) \ + gD_(gdl, gsSPTexture, __VA_ARGS__) +#define gSPTextureRectangle(gdl, ...) \ + gD_(gdl, gsSPTextureRectangle, __VA_ARGS__) +#define gSPScisTextureRectangle(gdl, ...) \ + gD_(gdl, gsSPScisTextureRectangle, __VA_ARGS__) +#define gSPTextureRectangleFlip(gdl, ...) \ + gD_(gdl, gsSPTextureRectangleFlip, __VA_ARGS__) +#define gSPScisTextureRectangleFlip(gdl, ...) \ + gD_(gdl, gsSPScisTextureRectangleFlip, __VA_ARGS__) +#define gSPVertex(gdl, ...) \ + gD_(gdl, gsSPVertex, __VA_ARGS__) +#define gSPViewport(gdl, ...) \ + gD_(gdl, gsSPViewport, __VA_ARGS__) +#define gSPBgRectCopy(gdl, ...) \ + gD_(gdl, gsSPBgRectCopy, __VA_ARGS__) +#define gSPBgRect1Cyc(gdl, ...) \ + gD_(gdl, gsSPBgRect1Cyc, __VA_ARGS__) +#define gSPObjRectangle(gdl, ...) \ + gD_(gdl, gsSPObjRectangle, __VA_ARGS__) +#define gSPObjRectangleR(gdl, ...) \ + gD_(gdl, gsSPObjRectangleR, __VA_ARGS__) +#define gSPObjSprite(gdl, ...) \ + gD_(gdl, gsSPObjSprite, __VA_ARGS__) +#define gSPObjMatrix(gdl, ...) \ + gD_(gdl, gsSPObjMatrix, __VA_ARGS__) +#define gSPObjSubMatrix(gdl, ...) \ + gD_(gdl, gsSPObjSubMatrix, __VA_ARGS__) +#define gSPObjRenderMode(gdl, ...) \ + gD_(gdl, gsSPObjRenderMode, __VA_ARGS__) +#define gSPObjLoadTxtr(gdl, ...) \ + gD_(gdl, gsSPObjLoadTxtr, __VA_ARGS__) +#define gSPObjLoadTxRect(gdl, ...) \ + gD_(gdl, gsSPObjLoadTxRect, __VA_ARGS__) +#define gSPObjLoadTxRectR(gdl, ...) \ + gD_(gdl, gsSPObjLoadTxRectR, __VA_ARGS__) +#define gSPObjLoadTxSprite(gdl, ...) \ + gD_(gdl, gsSPObjLoadTxSprite, __VA_ARGS__) +#define gSPSelectDL(gdl, ...) \ + gD_(gdl, gsSPSelectDL, __VA_ARGS__) +#define gSPSelectBranchDL(gdl, ...) \ + gD_(gdl, gsSPSelectBranchDL, __VA_ARGS__) +#define gDPLoadTLUTCmd(gdl, ...) \ + gD_(gdl, gsDPLoadTLUTCmd, __VA_ARGS__) +#define gDPLoadTLUT(gdl, ...) \ + gD_(gdl, gsDPLoadTLUT, __VA_ARGS__) +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +# define gBranchZ(gdl, ...) \ + gD_(gdl, gsBranchZ, __VA_ARGS__) +#endif +#define gDisplayList(gdl, ...) \ + gD_(gdl, gsDisplayList, __VA_ARGS__) +#define gDPHalf1(gdl, ...) \ + gD_(gdl, gsDPHalf1, __VA_ARGS__) +#define gDPHalf2(gdl, ...) \ + gD_(gdl, gsDPHalf2, __VA_ARGS__) +#define gDPLoadTile(gdl, ...) \ + gD_(gdl, gsDPLoadTile, __VA_ARGS__) +#define gDPSetCombine(gdl, ...) \ + gD_(gdl, gsDPSetCombine, __VA_ARGS__) +#if defined(F3DEX_GBI_2) +# define gSPGeometryMode(gdl, ...) \ + gD_(gdl, gsSPGeometryMode, __VA_ARGS__) +#endif +#define gSPSetOtherMode(gdl, ...) \ + gD_(gdl, gsSPSetOtherMode, __VA_ARGS__) +#define gSPSetOtherModeLo(gdl, ...) \ + gD_(gdl, gsSPSetOtherModeLo, __VA_ARGS__) +#define gSPSetOtherModeHi(gdl, ...) \ + gD_(gdl, gsSPSetOtherModeHi, __VA_ARGS__) +#define gDPSetOtherMode(gdl, ...) \ + gD_(gdl, gsDPSetOtherMode, __VA_ARGS__) +#define gMoveWd(gdl, ...) \ + gD_(gdl, gsMoveWd, __VA_ARGS__) +#define gMoveMem(gdl, ...) \ + gD_(gdl, gsMoveMem, __VA_ARGS__) +#if defined(F3DEX_GBI_2) +# define gSPDma_io(gdl, ...) \ + gD_(gdl, gsSPDma_io, __VA_ARGS__) +# define gSPDmaRead(gdl, ...) \ + gD_(gdl, gsSPDmaRead, __VA_ARGS__) +# define gSPDmaWrite(gdl, ...) \ + gD_(gdl, gsSPDmaWrite, __VA_ARGS__) +#endif +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +# define gLoadUcode(gdl, ...) \ + gD_(gdl, gsLoadUcode, __VA_ARGS__) +# define gSPLoadUcodeEx(gdl, ...) \ + gD_(gdl, gsSPLoadUcodeEx, __VA_ARGS__) +#endif +#define gTexRect(gdl, ...) \ + gD_(gdl, gsTexRect, __VA_ARGS__) +#define gTexRectFlip(gdl, ...) \ + gD_(gdl, gsTexRectFlip, __VA_ARGS__) +#define gSPNoOp(gdl) \ + gDisplayListPut(gdl, gsSPNoOp()) +#define gDPWord(gdl, ...) \ + gD_(gdl, gsDPWord, __VA_ARGS__) +#if defined(F3DEX_GBI_2) +# define gSpecial3(gdl, ...) \ + gD_(gdl, gsSpecial3, __VA_ARGS__) +# define gSpecial2(gdl, ...) \ + gD_(gdl, gsSpecial2, __VA_ARGS__) +# define gSpecial1(gdl, ...) \ + gD_(gdl, gsSpecial1, __VA_ARGS__) +#endif + +/* data types and structures */ +typedef uint8_t qu08_t; +typedef uint16_t qu016_t; +typedef int16_t qs48_t; +typedef int16_t qs510_t; +typedef uint16_t qu510_t; +typedef int16_t qs102_t; +typedef uint16_t qu102_t; +typedef int16_t qs105_t; +typedef uint16_t qu105_t; +typedef int16_t qs132_t; +typedef int16_t qs142_t; +typedef int32_t qs1516_t; +typedef int32_t qs1616_t; +typedef int32_t qs205_t; + +typedef uint16_t g_bglt_t; +typedef uint8_t g_ifmt_t; +typedef uint8_t g_isiz_t; +typedef uint16_t g_bgf_t; +typedef uint8_t g_objf_t; +typedef uint32_t g_objlt_t; + +typedef struct +{ + _Alignas(8) + uint32_t hi; + uint32_t lo; +} Gfx; + +typedef struct +{ + int32_t x1; + int32_t y1; + int32_t x2; + int32_t y2; +} Hilite_t; + +typedef union +{ + _Alignas(8) + Hilite_t h; +} Hilite; + +typedef int32_t Mtx_t[4][4]; + +typedef union +{ + _Alignas(8) + Mtx_t m; + int32_t l[16]; + struct + { + int16_t i[16]; + uint16_t f[16]; + }; +} Mtx; + +typedef struct +{ + uint8_t col[3]; + char pad1; + uint8_t colc[3]; + char pad2; + int8_t dir[3]; + char pad3; +} Light_t; + +typedef union +{ + _Alignas(8) + Light_t l; +} Light; + +typedef struct +{ + Light l[2]; +} LookAt; + +typedef struct +{ + uint8_t col[3]; + char pad1; + uint8_t colc[3]; + char pad2; +} Ambient_t; + +typedef union +{ + _Alignas(8) + Ambient_t l; +} Ambient; + +typedef struct +{ + Ambient a; + Light l[1]; +} Lights0, Lights1; + +typedef struct +{ + Ambient a; + Light l[2]; +} Lights2; + +typedef struct +{ + Ambient a; + Light l[3]; +} Lights3; + +typedef struct +{ + Ambient a; + Light l[4]; +} Lights4; + +typedef struct +{ + Ambient a; + Light l[5]; +} Lights5; + +typedef struct +{ + Ambient a; + Light l[6]; +} Lights6; + +typedef struct +{ + Ambient a; + Light l[7]; +} Lightsn, Lights7; + +typedef struct +{ + int16_t ob[3]; + uint16_t flag; + qs105_t tc[2]; + uint8_t cn[4]; +} Vtx_t; + +typedef struct +{ + int16_t ob[3]; + uint16_t flag; + qs105_t tc[2]; + int8_t n[3]; + uint8_t a; +} Vtx_tn; + +typedef union +{ + _Alignas(8) + Vtx_t v; + Vtx_tn n; +} Vtx; + +typedef struct +{ + qs142_t vscale[4]; + qs142_t vtrans[4]; +} Vp_t; + +typedef union +{ + _Alignas(8) + Vp_t vp; +} Vp; + +typedef struct +{ + qs1516_t A; + qs1516_t B; + qs1516_t C; + qs1516_t D; + qs102_t X; + qs102_t Y; + qu510_t BaseScaleX; + qu510_t BaseScaleY; +} uObjMtx_t; + +typedef union +{ + _Alignas(8) + uObjMtx_t m; +} uObjMtx; + +typedef struct +{ + qs102_t X; + qs102_t Y; + qu510_t BaseScaleX; + qu510_t BaseScaleY; +} uObjSubMtx_t; + +typedef union +{ + _Alignas(8) + uObjSubMtx_t m; +} uObjSubMtx; + +typedef struct +{ + qu105_t imageX; + qu102_t imageW; + qs102_t frameX; + qu102_t frameW; + qu105_t imageY; + qu102_t imageH; + qs102_t frameY; + qu102_t frameH; + uint64_t * imagePtr; + g_bglt_t imageLoad; + g_ifmt_t imageFmt; + g_isiz_t imageSiz; + uint16_t imagePal; + g_bgf_t imageFlip; + uint16_t tmemW; + qs132_t tmemH; + uint16_t tmemLoadSH; + uint16_t tmemLoadTH; + uint16_t tmemSizeW; + uint16_t tmemSize; +} uObjBg_t; + +typedef struct +{ + qu105_t imageX; + qu102_t imageW; + qs102_t frameX; + qu102_t frameW; + qu105_t imageY; + qu102_t imageH; + qs102_t frameY; + qu102_t frameH; + uint64_t * imagePtr; + g_bglt_t imageLoad; + g_ifmt_t imageFmt; + g_isiz_t imageSiz; + uint16_t imagePal; + g_bgf_t imageFlip; + qu510_t scaleW; + qu510_t scaleH; + qs205_t imageYorig; + char padding[4]; +} uObjScaleBg_t; + +typedef union +{ + _Alignas(8) + uObjBg_t b; + uObjScaleBg_t s; +} uObjBg; + +typedef struct +{ + qs102_t objX; + qu510_t scaleW; + qu105_t imageW; + uint16_t paddingX; + qs102_t objY; + qu510_t scaleH; + qu105_t imageH; + uint16_t paddingY; + uint16_t imageStride; + uint16_t imageAdrs; + g_ifmt_t imageFmt; + g_isiz_t imageSiz; + uint16_t imagePal; + g_objf_t imageFlags; +} uObjSprite_t; + +typedef union +{ + _Alignas(8) + uObjSprite_t s; +} uObjSprite; + +typedef struct +{ + g_objlt_t type; + uint64_t * image; + uint16_t tmem; + uint16_t tsize; + uint16_t tline; + uint16_t sid; + uint32_t flag; + uint32_t mask; +} uObjTxtrBlock_t; + +typedef struct +{ + g_objlt_t type; + uint64_t * image; + uint16_t tmem; + uint16_t twidth; + uint16_t theight; + uint16_t sid; + uint32_t flag; + uint32_t mask; +} uObjTxtrTile_t; + +typedef struct +{ + g_objlt_t type; + uint64_t * image; + uint16_t phead; + uint16_t pnum; + uint16_t zero; + uint16_t sid; + uint32_t flag; + uint32_t mask; +} uObjTxtrTLUT_t; + +typedef union +{ + _Alignas(8) + uObjTxtrBlock_t block; + uObjTxtrTile_t tile; + uObjTxtrTLUT_t tlut; +} uObjTxtr; + +typedef struct +{ + uObjTxtr txtr; + uObjSprite sprite; +} uObjTxSprite; + +/* rectangle scissoring macros */ +#define gScC_(c) ((c) < 0 ? 0 : (c)) +#define gScD_(t, c, d) \ + ( \ + (c) < 0 ? \ + ( \ + (d) < 0 ? \ + (t) + (c) * (d) / 0x80 : \ + (t) - (c) * (d) / 0x80 \ + ) : \ + (t) \ + ) + +/* texture loading helper macros */ +#define G_SIZ_LDSIZ(siz) ((siz) < G_IM_SIZ_16b ? G_IM_SIZ_16b : (siz)) +#define G_SIZ_BITS(siz) (4 << gI_(siz)) +#define G_SIZ_LDBITS(siz) ((siz) < G_IM_SIZ_16b ? G_SIZ_BITS(siz) : 16) +#define G_DXT(siz, width) \ + ( \ + (width) * G_SIZ_BITS(siz) <= 64 ? \ + (1 << 11) : \ + ((1 << 11) + (width) * G_SIZ_BITS(siz) / 64 - 1) / \ + ((width) * G_SIZ_BITS(siz) / 64) \ + ) + +/* depth value macros */ +#define gZp_(zval, near, far) \ + ( \ + (1.f - (float)(near) / (float)(zval)) / \ + (1.f - (float)(near) / (float)(far)) \ + ) +#define gZo_(zval, near, far) \ + ( \ + ((float)(zval) - (float)(near)) / \ + ((float)(far) - (float)(near)) \ + ) +#define gZf_(zval, near, far, flag) \ + qs1616 \ + ( \ + (flag) == G_BZ_PERSP ? \ + gZp_(zval, near, far) : \ + gZo_(zval, near, far) \ + ) +#define G_DEPTOZSrg(zval, near, far, flag, zmin, zmax) \ + ( \ + gZf_(zval, near, far, flag) * \ + ((int32_t)((zmax) - (zmin)) & ~(int32_t)1) + \ + qs1616(zmin) \ + ) +#define G_DEPTOZS(zval, near, far, flag) \ + G_DEPTOZSrg(zval, near, far, flag, 0, G_MAXZ) + +/* vertex ordering macros */ +#define gV2_(v0, v1, flag) \ + ( \ + (flag) == 0 ? gI_(v0) : \ + gI_(v1) \ + ) +#define gV3_(v0, v1, v2, flag) \ + ( \ + (flag) == 0 ? gI_(v0) : \ + (flag) == 1 ? gI_(v1) : \ + gI_(v2) \ + ) +#define gV4_(v0, v1, v2, v3, flag) \ + ( \ + (flag) == 0 ? gI_(v0) : \ + (flag) == 1 ? gI_(v1) : \ + (flag) == 2 ? gI_(v2) : \ + gI_(v3) \ + ) + +/* sprite texture parameter macros */ +#define GS_PIX2TMEM(pix, siz) ((pix) * G_SIZ_BITS(siz) / 64) +#define GS_TB_TSIZE(pix, siz) (GS_PIX2TMEM(pix, siz) - 1) +#define GS_TB_TLINE(pix, siz) (((1 << 11) - 1) / GS_PIX2TMEM(pix, siz) + 1) +#define GS_TT_TWIDTH(pix, siz) (GS_PIX2TMEM(pix, siz) * 4 - 1) +#define GS_TT_THEIGHT(pix, siz) ((pix) * 4 - 1) +#define GS_PAL_HEAD(head) ((head) + 256) +#define GS_PAL_NUM(num) ((num) - 1) + +/* fixed-point conversion macros */ +#define qu08(n) ((qu08_t)((n) * 0x100)) +#define qu016(n) ((qu016_t)((n) * 0x10000)) +#define qs48(n) ((qs48_t)((n) * 0x0100)) +#define qs510(n) ((qs510_t)((n) * 0x0400)) +#define qu510(n) ((qu510_t)((n) * 0x0400)) +#define qs102(n) ((qs102_t)((n) * 0x0004)) +#define qu102(n) ((qu102_t)((n) * 0x0004)) +#define qs105(n) ((qs105_t)((n) * 0x0020)) +#define qu105(n) ((qu105_t)((n) * 0x0020)) +#define qs132(n) ((qs132_t)((n) * 0x0004)) +#define qs142(n) ((qs142_t)((n) * 0x0004)) +#define qs1516(n) ((qs1516_t)((n) * 0x00010000)) +#define qs1616(n) ((qs1616_t)((n) * 0x00010000)) +#define qs205(n) ((qs205_t)((n) * 0x00000020)) + +/* private helper macros */ +#define gI_(i) ((uint32_t)(i)) +#define gL_(l) ((uint64_t)(l)) +#define gF_(i, n, s) ((gI_(i) & ((gI_(1) << (n)) - 1)) << (s)) +#define gFL_(l, n, s) ((gL_(l) & ((gL_(1) << (n)) - 1)) << (s)) +#define gO_(opc, hi, lo) ((Gfx){gF_(opc, 8, 24) | gI_(hi), gI_(lo)}) +#define gD_(gdl, m, ...) gDisplayListPut(gdl, m(__VA_ARGS__)) + +#endif diff --git a/tools/ZAPD/lib/libgfxd/gfxd.c b/tools/ZAPD/lib/libgfxd/gfxd.c new file mode 100644 index 0000000000..76d7ded8a7 --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/gfxd.c @@ -0,0 +1,863 @@ +#include +#include +#include +#include +#include +#ifdef _WIN32 +# include +# define read _read +# define write _write +#else +# include +#endif +#include "gbi.h" +#include "gfxd.h" +#include "priv.h" + +static TLOCAL struct gfxd_state state; + +static int buffer_input_fn(void *buf, int count) +{ + if (count > config.input_buf_size) + count = config.input_buf_size; + memcpy(buf, config.input_buf, count); + config.input_buf += count; + config.input_buf_size -= count; + return count; +} + +static int buffer_output_fn(const char *buf, int count) +{ + if (count > config.output_buf_size) + count = config.output_buf_size; + memcpy(config.output_buf, buf, count); + config.output_buf += count; + config.output_buf_size -= count; + return count; +} + +static int fd_input_fn(void *buf, int count) +{ + return read(config.input_fd, buf, count); +} + +static int fd_output_fn(const char *buf, int count) +{ + return write(config.output_fd, buf, count); +} + +static void swap_words(Gfx *gfx) +{ + uint8_t b[8]; + uint8_t *pw = (void *) gfx; + uint8_t *pb = b; + + int endian = config.endian; + int wordsize = config.wordsize; + + for (int i = 0; i < 8 / wordsize; i++) + { + if (endian == gfxd_endian_host) + { + switch (wordsize) + { + case 1: + { + uint8_t w = *(uint8_t *) pw; + *pb++ = w >> 0; + break; + } + case 2: + { + uint16_t w = *(uint16_t *) pw; + *pb++ = w >> 8; + *pb++ = w >> 0; + break; + } + case 4: + { + uint32_t w = *(uint32_t *) pw; + *pb++ = w >> 24; + *pb++ = w >> 16; + *pb++ = w >> 8; + *pb++ = w >> 0; + break; + } + case 8: + { + uint64_t w = *(uint64_t *) pw; + *pb++ = w >> 56; + *pb++ = w >> 48; + *pb++ = w >> 40; + *pb++ = w >> 32; + *pb++ = w >> 24; + *pb++ = w >> 16; + *pb++ = w >> 8; + *pb++ = w >> 0; + break; + } + } + } + else + { + for (int j = 0; j < wordsize; j++) + { + if (endian == gfxd_endian_little) + *pb++ = pw[wordsize - 1 - j]; + else + *pb++ = pw[j]; + } + } + pw += wordsize; + } + + gfx->hi = ((uint32_t) b[0] << 24) + | ((uint32_t) b[1] << 16) + | ((uint32_t) b[2] << 8) + | ((uint32_t) b[3] << 0); + gfx->lo = ((uint32_t) b[4] << 24) + | ((uint32_t) b[5] << 16) + | ((uint32_t) b[6] << 8) + | ((uint32_t) b[7] << 0); +} + +static void get_more_input(void) +{ + if (state.end_input != 0) + return; + + char *recv_buf = (void *) &state.gfx[0]; + + while (state.n_gfx < sizeof(state.gfx) / sizeof(state.gfx[0])) + { + int n_read = sizeof(state.gfx) - state.n_byte; + n_read = config.input_fn(&recv_buf[state.n_byte], n_read); + if (n_read == 0) + return; + state.n_byte += n_read; + + while (state.n_gfx < state.n_byte / sizeof(Gfx)) + { + Gfx gfx = state.gfx[state.n_gfx]; + gfxd_macro_t *m = &state.macro[state.n_gfx]; + + swap_words(&gfx); + + int ret = config.ucode->disas_fn(m, gfx.hi, gfx.lo); + if (ret != 0 && config.stop_on_invalid != 0) + { + state.end_input = 1; + state.ret = ret; + return; + } + + state.n_gfx++; + } + } +} + +static int32_t typed_arg_i(int type, int idx) +{ + const gfxd_value_t *v = gfxd_value_by_type(type, idx); + if (v != NULL) + return v->i; + else + return -1; +} + +static uint32_t typed_arg_u(int type, int idx) +{ + const gfxd_value_t *v = gfxd_value_by_type(type, idx); + if (v != NULL) + return v->u; + else + return 0; +} + + +TLOCAL struct gfxd_config config = +{ + .ucode = NULL, + .endian = gfxd_endian_big, + .wordsize = 4, + .arg = NULL, + + .stop_on_invalid = 1, + .stop_on_end = 1, + .emit_dec_color = 0, + .emit_q_macro = 0, + .emit_ext_macro = 0, + + .input_buf = NULL, + .input_buf_size = 0, + .input_fn = &buffer_input_fn, + + .output_buf = NULL, + .output_buf_size = 0, + .output_fn = &buffer_output_fn, + + .macro_fn = &gfxd_macro_dflt, + .arg_fn = &gfxd_arg_dflt, + + .tlut_fn = NULL, + .timg_fn = NULL, + .cimg_fn = NULL, + .zimg_fn = NULL, + .dl_fn = NULL, + .mtx_fn = NULL, + .lookat_fn = NULL, + .light_fn = NULL, + .seg_fn = NULL, + .vtx_fn = NULL, + .vp_fn = NULL, + .uctext_fn = NULL, + .ucdata_fn = NULL, + .dram_fn = NULL, +}; + +void gfxd_input_buffer(const void *buf, int size) +{ + config.input_buf = buf; + config.input_buf_size = size; + config.input_fn = &buffer_input_fn; +} + +void gfxd_output_buffer(char *buf, int size) +{ + config.output_buf = buf; + config.output_buf_size = size; + config.output_fn = &buffer_output_fn; +} + +void gfxd_input_fd(int fd) +{ + config.input_fd = fd; + config.input_fn = &fd_input_fn; +} + +void gfxd_output_fd(int fd) +{ + config.output_fd = fd; + config.output_fn = &fd_output_fn; +} + +void gfxd_input_callback(gfxd_input_fn_t *fn) +{ + if (fn != NULL) + config.input_fn = fn; + else + gfxd_input_buffer(NULL, 0); +} + +void gfxd_output_callback(gfxd_output_fn_t *fn) +{ + if (fn != NULL) + config.output_fn = fn; + else + gfxd_output_buffer(NULL, 0); +} + +void gfxd_macro_fn(gfxd_macro_fn_t *fn) +{ + if (fn != NULL) + config.macro_fn = fn; + else + config.macro_fn = gfxd_macro_dflt; +} + +void gfxd_arg_fn(gfxd_arg_fn_t *fn) +{ + if (fn != NULL) + config.arg_fn = fn; + else + config.arg_fn = gfxd_arg_dflt; +} + +int gfxd_write(const void *buf, int count) +{ + return config.output_fn(buf, count); +} + +int gfxd_puts(const char *str) +{ + return gfxd_write(str, strlen(str)); +} + +int gfxd_printf(const char *fmt, ...) +{ + char s[256]; + + va_list arg; + va_start(arg, fmt); + int n = vsnprintf(s, sizeof(s), fmt, arg); + va_end(arg); + + if (n > sizeof(s) - 1) + n = sizeof(s) - 1; + + return gfxd_write(s, n); +} + +int gfxd_print_value(int type, const gfxd_value_t *value) +{ + return config.ucode->arg_tbl[type].fn(value); +} + +int gfxd_macro_dflt(void) +{ + gfxd_macro_t *m = &state.macro[0]; + const gfxd_macro_type_t *t = &config.ucode->macro_tbl[m->id]; + + const char *name = gfxd_macro_name(); + if (name == NULL) + { + if (config.arg != NULL) + { + gfxd_puts(config.arg); + gfxd_puts(" = "); + } + + gfxd_puts("(Gfx){"); + } + else + { + gfxd_puts(name); + gfxd_puts("("); + + if (config.arg != NULL) + { + gfxd_puts(config.arg); + if (t->n_arg != 0) + gfxd_puts(", "); + } + } + + for (int i = 0; i < t->n_arg; i++) + { + if (i != 0) + gfxd_puts(", "); + + config.arg_fn(i); + } + + if (name == NULL) + gfxd_puts("}"); + else + gfxd_puts(")"); + + return 0; +} + +int gfxd_arg_callbacks(int arg_num) +{ + int id = gfxd_macro_id(); + + switch (gfxd_arg_type(arg_num)) + { + case gfxd_Tlut: + { + if (config.tlut_fn != NULL) + { + int32_t num; + if (id == gfxd_DPLoadTLUT_pal16) + num = 16; + else if (id == gfxd_DPLoadTLUT_pal256) + num = 256; + else + num = typed_arg_i(gfxd_Num, 0); + return config.tlut_fn( + typed_arg_u(gfxd_Tlut, 0), + typed_arg_i(gfxd_Pal, 0), + num); + } + break; + } + case gfxd_Timg: + { + if (config.timg_fn != NULL) + { + int32_t siz = typed_arg_i(gfxd_Siz, 0); + if (siz == -1) + siz = G_IM_SIZ_4b; + return config.timg_fn( + typed_arg_u(gfxd_Timg, 0), + typed_arg_i(gfxd_Fmt, 0), + siz, + typed_arg_i(gfxd_Dim, 0), + typed_arg_i(gfxd_Dim, 1), + typed_arg_i(gfxd_Pal, 0)); + } + break; + } + case gfxd_Cimg: + { + if (config.cimg_fn != NULL) + { + return config.cimg_fn( + typed_arg_u(gfxd_Cimg, 0), + typed_arg_i(gfxd_Fmt, 0), + typed_arg_i(gfxd_Siz, 0), + typed_arg_i(gfxd_Dim, 0)); + } + break; + } + case gfxd_Zimg: + { + if (config.zimg_fn != NULL) + { + return config.zimg_fn( + typed_arg_u(gfxd_Zimg, 0)); + } + break; + } + case gfxd_Dl: + { + if (config.dl_fn != NULL) + { + return config.dl_fn( + typed_arg_u(gfxd_Dl, 0)); + } + break; + } + case gfxd_Mtxptr: + { + if (config.mtx_fn != NULL) + { + return config.mtx_fn( + typed_arg_u(gfxd_Mtxptr, 0)); + } + break; + } + case gfxd_Lookatptr: + { + if (config.lookat_fn != NULL) + { + int32_t num; + if (id == gfxd_SPLookAt) + num = 2; + else + num = 1; + return config.lookat_fn( + typed_arg_u(gfxd_Lookatptr, 0), + num); + } + break; + } + case gfxd_Lightptr: + { + if (config.light_fn != NULL) + { + int32_t num; + if (id == gfxd_SPSetLights1) + num = 1; + else if (id == gfxd_SPSetLights2) + num = 2; + else if (id == gfxd_SPSetLights3) + num = 3; + else if (id == gfxd_SPSetLights4) + num = 4; + else if (id == gfxd_SPSetLights5) + num = 5; + else if (id == gfxd_SPSetLights6) + num = 6; + else if (id == gfxd_SPSetLights7) + num = 7; + else + num = 1; + return config.light_fn( + typed_arg_u(gfxd_Lightptr, 0), + num); + } + break; + + } + case gfxd_Segptr: + { + if (config.seg_fn != NULL) + { + return config.seg_fn( + typed_arg_u(gfxd_Segptr, 0), + typed_arg_i(gfxd_Seg, 0)); + } + break; + } + case gfxd_Vtxptr: + { + if (config.vtx_fn != NULL) + { + return config.vtx_fn( + typed_arg_u(gfxd_Vtxptr, 0), + typed_arg_i(gfxd_Num, 0)); + } + break; + } + case gfxd_Vpptr: + { + if (config.vp_fn != NULL) + { + return config.vp_fn( + typed_arg_u(gfxd_Vpptr, 0)); + } + break; + } + case gfxd_Uctext: + { + if (config.uctext_fn != NULL) + { + return config.uctext_fn( + typed_arg_u(gfxd_Uctext, 0), + 0x1000); + } + break; + } + case gfxd_Ucdata: + { + if (config.ucdata_fn != NULL) + { + uint32_t size; + if (id == gfxd_SPLoadUcodeEx) + size = typed_arg_u(gfxd_Size, 0); + else + size = 0x800; + return config.ucdata_fn( + typed_arg_u(gfxd_Ucdata, 0), + size); + } + break; + } + case gfxd_Dram: + { + if (config.dram_fn != NULL) + { + return config.dram_fn( + typed_arg_u(gfxd_Dram, 0), + typed_arg_u(gfxd_Size, 0)); + } + break; + } + } + + return 0; +} + +void gfxd_arg_dflt(int arg_num) +{ + if (gfxd_arg_callbacks(arg_num) == 0) + { + gfxd_arg_t *a = &state.macro[0].arg[arg_num]; + + gfxd_print_value(a->type, &a->value); + } +} + +void gfxd_tlut_callback(gfxd_tlut_fn_t *fn) +{ + config.tlut_fn = fn; +} + +void gfxd_timg_callback(gfxd_timg_fn_t *fn) +{ + config.timg_fn = fn; +} + +void gfxd_cimg_callback(gfxd_cimg_fn_t *fn) +{ + config.cimg_fn = fn; +} + +void gfxd_zimg_callback(gfxd_zimg_fn_t *fn) +{ + config.zimg_fn = fn; +} + +void gfxd_dl_callback(gfxd_dl_fn_t *fn) +{ + config.dl_fn = fn; +} + +void gfxd_mtx_callback(gfxd_mtx_fn_t *fn) +{ + config.mtx_fn = fn; +} + +void gfxd_lookat_callback(gfxd_lookat_fn_t *fn) +{ + config.lookat_fn = fn; +} + +void gfxd_light_callback(gfxd_light_fn_t *fn) +{ + config.light_fn = fn; +} + +void gfxd_seg_callback(gfxd_seg_fn_t *fn) +{ + config.seg_fn = fn; +} + +void gfxd_vtx_callback(gfxd_vtx_fn_t *fn) +{ + config.vtx_fn = fn; +} + +void gfxd_vp_callback(gfxd_vp_fn_t *fn) +{ + config.vp_fn = fn; +} + +void gfxd_uctext_callback(gfxd_uctext_fn_t *fn) +{ + config.uctext_fn = fn; +} + +void gfxd_ucdata_callback(gfxd_ucdata_fn_t *fn) +{ + config.ucdata_fn = fn; +} + +void gfxd_dram_callback(gfxd_dram_fn_t *fn) +{ + config.dram_fn = fn; +} + +void gfxd_target(gfxd_ucode_t ucode) +{ + config.ucode = ucode; +} + +void gfxd_endian(int endian, int wordsize) +{ + config.endian = endian; + config.wordsize = wordsize; +} + +void gfxd_dynamic(const char *arg) +{ + config.arg = arg; +} + +void gfxd_enable(int cap) +{ + switch (cap) + { + case gfxd_stop_on_invalid: + config.stop_on_invalid = 1; + break; + + case gfxd_stop_on_end: + config.stop_on_end = 1; + break; + + case gfxd_emit_dec_color: + config.emit_dec_color = 1; + break; + + case gfxd_emit_q_macro: + config.emit_q_macro = 1; + break; + + case gfxd_emit_ext_macro: + config.emit_ext_macro = 1; + break; + } +} + +void gfxd_disable(int cap) +{ + switch (cap) + { + case gfxd_stop_on_invalid: + config.stop_on_invalid = 0; + return; + + case gfxd_stop_on_end: + config.stop_on_end = 0; + return; + + case gfxd_emit_dec_color: + config.emit_dec_color = 0; + break; + + case gfxd_emit_q_macro: + config.emit_q_macro = 0; + break; + + case gfxd_emit_ext_macro: + config.emit_ext_macro = 0; + break; + } +} + +void gfxd_udata_set(void *ptr) +{ + config.udata = ptr; +} + +void *gfxd_udata_get(void) +{ + return config.udata; +} + +int gfxd_execute(void) +{ + state.macro_offset = 0; + state.n_byte = 0; + state.n_gfx = 0; + state.end_input = 0; + state.ret = 0; + + for (;;) + { + get_more_input(); + if (state.n_gfx == 0) + break; + + gfxd_macro_t *m = &state.macro[0]; + config.ucode->combine_fn(m, state.n_gfx); + + const gfxd_macro_type_t *t = &config.ucode->macro_tbl[m->id]; + if (t->ext != 0 && config.emit_ext_macro == 0) + { + Gfx gfx = state.gfx[0]; + swap_words(&gfx); + + t = &config.ucode->macro_tbl[gfxd_Invalid]; + t->disas_fn(m, gfx.hi, gfx.lo); + } + + int ret = config.macro_fn(); + if (ret != 0) + { + state.ret = ret; + break; + } + + if (config.stop_on_end != 0 + && (m->id == gfxd_SPBranchList + || m->id == gfxd_SPEndDisplayList)) + { + break; + } + + int n_pop = config.ucode->macro_tbl[m->id].n_gfx; + int n_rem = state.n_gfx - n_pop; + { + int n_byte = n_rem * sizeof(gfxd_macro_t); + memmove(&state.macro[0], &state.macro[n_pop], n_byte); + state.n_gfx = n_rem; + } + { + int n_byte = n_rem * sizeof(Gfx); + memmove(&state.gfx[0], &state.gfx[n_pop], n_byte); + state.n_byte = n_byte; + } + state.macro_offset += n_pop * sizeof(Gfx); + } + + return state.ret; +} + +int gfxd_macro_offset(void) +{ + return state.macro_offset; +} + +int gfxd_macro_packets(void) +{ + return config.ucode->macro_tbl[state.macro[0].id].n_gfx; +} + +const void *gfxd_macro_data(void) +{ + return state.gfx; +} + +int gfxd_macro_id(void) +{ + return state.macro[0].id; +} + +const char *gfxd_macro_name(void) +{ + int id = state.macro[0].id; + const gfxd_macro_type_t *t = &config.ucode->macro_tbl[id]; + + if (t->prefix == NULL && t->suffix == NULL) + { + return NULL; + } + else + { + static TLOCAL char buf[32]; + + char *p = buf; + if (t->prefix != NULL) + { + const char *s = t->prefix; + while (*s != '\0') + *p++ = *s++; + } + *p++ = 'g'; + if (config.arg == NULL) + *p++ = 's'; + if (t->suffix != NULL) + { + const char *s = t->suffix; + while (*s != '\0') + *p++ = *s++; + } + *p++ = '\0'; + + return buf; + } +} + +int gfxd_arg_count(void) +{ + return config.ucode->macro_tbl[state.macro[0].id].n_arg; +} + +int gfxd_arg_type(int arg_num) +{ + return state.macro[0].arg[arg_num].type; +} + +const char *gfxd_arg_name(int arg_num) +{ + return state.macro[0].arg[arg_num].name; +} + +int gfxd_arg_fmt(int arg_num) +{ + return config.ucode->arg_tbl[state.macro[0].arg[arg_num].type].fmt; +} + +const gfxd_value_t *gfxd_arg_value(int arg_num) +{ + return &state.macro[0].arg[arg_num].value; +} + +const gfxd_value_t *gfxd_value_by_type(int type, int idx) +{ + gfxd_macro_t *m = &state.macro[0]; + const gfxd_macro_type_t *t = &config.ucode->macro_tbl[m->id]; + + for (int i = 0; i < t->n_arg; i++) + { + gfxd_arg_t *a = &m->arg[i]; + if (a->type == type) + { + if (idx == 0) + return &a->value; + else + idx--; + } + } + + return NULL; +} + +int gfxd_arg_valid(int arg_num) +{ + return state.macro[0].arg[arg_num].bad == 0; +} diff --git a/tools/ZAPD/lib/libgfxd/gfxd.h b/tools/ZAPD/lib/libgfxd/gfxd.h index ee0fc64c9e..268bbfa10f 100644 --- a/tools/ZAPD/lib/libgfxd/gfxd.h +++ b/tools/ZAPD/lib/libgfxd/gfxd.h @@ -10,6 +10,7 @@ extern "C" enum { gfxd_Word, /* generic word */ + gfxd_Opcode, /* command opcode (G_*) */ gfxd_Coordi, /* integer coordinate */ gfxd_Coordq, /* fractional (q10.2) coordinate */ gfxd_Pal, /* palette index */ @@ -65,7 +66,8 @@ enum gfxd_Dlflag, /* display list flag */ gfxd_Cr, /* clip ratio */ gfxd_Num, /* element count */ - gfxd_Fogz, /* fog depth (0 - 1000) */ + gfxd_Fogz, /* fog factor */ + gfxd_Fogp, /* fog position (0 - 1000) */ gfxd_Mtxptr, /* matrix pointer */ gfxd_Gm, /* geometry mode */ gfxd_Mwo_matrix, /* matrix moveword offset */ @@ -186,6 +188,7 @@ enum gfxd_SPCullDisplayList, gfxd_SPDisplayList, gfxd_SPEndDisplayList, + gfxd_SPFogFactor, gfxd_SPFogPosition, gfxd_SPForceMatrix, gfxd_SPSetGeometryMode, @@ -225,8 +228,10 @@ enum gfxd_DisplayList, gfxd_DPHalf1, gfxd_DPHalf2, + gfxd_DPWord, gfxd_DPLoadTile, gfxd_SPGeometryMode, + gfxd_SPSetOtherMode, gfxd_SPSetOtherModeLo, gfxd_SPSetOtherModeHi, gfxd_DPSetOtherMode, @@ -251,12 +256,14 @@ enum gfxd_stop_on_end, gfxd_emit_dec_color, gfxd_emit_q_macro, + gfxd_emit_ext_macro, }; enum { gfxd_endian_big, gfxd_endian_little, + gfxd_endian_host, }; enum @@ -347,6 +354,8 @@ void gfxd_endian(int endian, int wordsize); void gfxd_dynamic(const char *arg); void gfxd_enable(int cap); void gfxd_disable(int cap); +void gfxd_udata_set(void *ptr); +void *gfxd_udata_get(void); int gfxd_execute(void); diff --git a/tools/ZAPD/lib/libgfxd/libgfxd.a b/tools/ZAPD/lib/libgfxd/libgfxd.a deleted file mode 100644 index 1f8c0e27365d2e96de075afc74fff14b294f3411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3348354 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 N`8Zm>Zm74!7zJkg%K%+9+14 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

$UskB|L{^07 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

-T??fjqtOu62oh%QeyDj)Q1zZr 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

1osys3oK-~(4{L&IoI|yFf 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 z z8((DqBCCTcLoV1Gd4kckz^%m+1t=aW;=}9TiTI^A;Fms+Aq{sIw%`EmFM@dw(f*su z&&XiIgq$Lg)xp#=Fu;fMF7PCwYk^x!C^#DV(Srl76`PAe3;AI#h=DQ~=eP?nGT3}Y zjzH|aBe;vbcz6Uz?Hy?gkmOR(b_A#c84xc02y*F7l3cotWS3qg&848t7?>`dEy&1V z(@K&{69h>O(|SRY!W6Xq1Ljgh-#A4G)L$X&Qg}V%#ls~;s!KJ6&|M18)u43hfgz1I z86zi8ghxz;K|K; zVFr}JIHy{Kk-=s^aubm7wB}M_MiQqrk6<_z?h{ZTJjO50B!ccy6y1vWr5*4~$74vt zLlNXO^iTvH{t68|21FD#O9Rz{=0S&CS5T2BJVx>}m`kiUX>F6{3NYh0%_io7+<>h5y=74ZPX7dR%GV_7uxgpB=d68Ua!Og%R zAj+sN=_w2{N{|)o9wAW%kO%{VFh~j{Az}j21a_glq>Us4gQzgXTBxyNP;0@S1{o_Z z%*f4(@PPy)Bg76#MFvk{eQpK@DX5uX9S}36;f{rRMh0ps*j|vSvQXE<1>~TnfCZQ& z7#QTC0$^i70tzOO0D%iAnlQLS!xkj3q{j%0E|9N55$Yf@-ANMUZ)H|wz2e)Q#2FY= zP%MCmsd6)d^f54~p;!iyROe<46=z`3K$c=)(ClntWE5m%V9@GnVq{>FnCK+Iz@Uxl z76otw>mWOVfk7A9eg+0T(8fA_s6JLpZVW#dK()g|$Ph&U;zlEo8$muchMEph4UsfK zH67wAQ)E*Z7|f9MF))~OGlERBU`0wdOc2v7q2YjRgB7wE1B10JqoHsR;|?d*Q1J-v zNY-$0IM}c<7z#rTu{A-k?cl0Gaez>74;P1-!oc7F7elCJU~uGSG!zC2fZXf^<1jEd zgP5SWb3yTk1OtOBLVA?6=h_IfiYJ>g&+zcR$wDBtq*}&KND&MBSS2V39}GnY6#r=WQ6D8mlLm7z&}%olqL9GEg8NfSx>E0Ntd|$PfZ! zMnUyrk0C~euTZUiP<6}@dT=j1!@{2Lja5k)5*k8 zinLP$qK}Ee6siHH3aeLH7#uK_VMZ%6gEOWw%xHyJodETJ6_jRV2!t_f;X(m0<~FDh zC^WI9&O)d>OdVElFf&ZXREFsdkoyim&nCGKr5PDQV9ao+86c-%uZdxrFTphj!k944 z*dhaD?{BCUIjAL!3;{4El2!wdQe@1?z`)4JU=7ve0Hr}SxeJu-52Zn3FgDCYW(Lmx z7&R6P1I#T5Wmu|HRt5v8$wdNb6EIPy7c=T{X}IU_?5j0w}p%uu=lx}qLoJcuu0bLP}Ea(cg9cC6YLn&r*VPWXPREC*cm>DLaDZ^etaAH%3 zrGntcrmlezOWv4?Y3~e7bzBTs)NR02$HK4x)4UUy>X;Z{$pn@Tm>3)|T!*QOouPn% z>;Hc#45cg>2C^`4F*IPPW5uG*!A1o`9Rq_8G^xNG$cQ+y50p$G*chq^<{NCjU|>L3 zg(XWcVJO1xer7D{u(_WFLmgI2VL1twW*sKe$9 z28QKOD`D!eWLO40b=cg`f}swJrJ$6gpa>!v82q6$ zBSQ#``3_o(;HoNIpjzHQX{=R+2UPMel*U?B_&_Bkpf)lxV5ur#&fcnT?WrPwn$D~6FQ4A?R`149ioslXhFwW>&lDuP*#%@+&| z=&G=m+USa~yPp}uFzoJU!BB_QQdmxc+h>g&Bz57p!n25$dqV z!gZ*XFm+fmECa(js3Mr<*nEMh3X4%p7)D`tKQk6}*xb*8p$?0skn%7=0YZO*(u@ot zFy>ddPymc61@$qm`U7MZ%*0x__COf30WK5(VhQ0&4~hS`2*W;lYW z3|pai5ltEPLXnx_AEr7ig(4_W7#JqVLuhuW9!7=`7}EzT1PN6bFAOTm$bh9%WMH@q zHBS((EC9xohYB$8KywB$U@aIF_>eturXCJGjOD1QN{o_4rV=)OJFt->k>u= z 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

U4ChS8uFDU1!HK`l}k8%Bd#q%by&2DM0G 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%0AV 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

yNjyj! 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%0Abc%b^uA5x7lFwR+I5AmG` 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�pfp4wwy?z~CIHoK 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 diff --git a/tools/ZAPD/lib/libgfxd/priv.h b/tools/ZAPD/lib/libgfxd/priv.h new file mode 100644 index 0000000000..37cb66b683 --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/priv.h @@ -0,0 +1,123 @@ +#ifndef GFXD_PRIV_H +#define GFXD_PRIV_H +#include "gfxd.h" + +#ifdef CONFIG_MT +# ifdef _MSC_VER +# define TLOCAL __declspec(thread) +# else +# define TLOCAL _Thread_local +# endif +#else +# define TLOCAL +#endif + +#define UCFUNC static inline + +#define config gfxd_config__ + +typedef int gfxd_argfn_t(const gfxd_value_t *v); + +typedef struct +{ + int fmt; + gfxd_argfn_t * fn; +} gfxd_arg_type_t; + +typedef struct +{ + int type; + const char * name; + gfxd_value_t value; + int bad; +} gfxd_arg_t; + +typedef struct +{ + int id; + gfxd_arg_t arg[18]; +} gfxd_macro_t; + +typedef int gfxd_disas_fn_t(gfxd_macro_t *macro, uint32_t hi, uint32_t lo); +typedef int gfxd_combine_fn_t(gfxd_macro_t *macro, int n_macro); + +typedef struct +{ + const char * prefix; + const char * suffix; + int opcode; + int n_arg; + int n_gfx; + gfxd_disas_fn_t * disas_fn; + gfxd_combine_fn_t * combine_fn; + int alias; + int ext; +} gfxd_macro_type_t; + +struct gfxd_ucode +{ + gfxd_disas_fn_t * disas_fn; + gfxd_combine_fn_t * combine_fn; + const gfxd_arg_type_t * arg_tbl; + const gfxd_macro_type_t * macro_tbl; +}; + +struct gfxd_state +{ + int macro_offset; + + Gfx gfx[9]; + int n_byte; + int n_gfx; + gfxd_macro_t macro[9]; + + int end_input; + int ret; +}; + +struct gfxd_config +{ + gfxd_ucode_t ucode; + int endian; + int wordsize; + const char * arg; + void * udata; + + int stop_on_invalid; + int stop_on_end; + int emit_dec_color; + int emit_q_macro; + int emit_ext_macro; + + const char * input_buf; + int input_buf_size; + int input_fd; + gfxd_input_fn_t * input_fn; + + char * output_buf; + int output_buf_size; + int output_fd; + gfxd_output_fn_t * output_fn; + + gfxd_macro_fn_t * macro_fn; + gfxd_arg_fn_t * arg_fn; + + gfxd_tlut_fn_t * tlut_fn; + gfxd_timg_fn_t * timg_fn; + gfxd_cimg_fn_t * cimg_fn; + gfxd_zimg_fn_t * zimg_fn; + gfxd_dl_fn_t * dl_fn; + gfxd_mtx_fn_t * mtx_fn; + gfxd_lookat_fn_t * lookat_fn; + gfxd_light_fn_t * light_fn; + gfxd_seg_fn_t * seg_fn; + gfxd_vtx_fn_t * vtx_fn; + gfxd_vp_fn_t * vp_fn; + gfxd_uctext_fn_t * uctext_fn; + gfxd_ucdata_fn_t * ucdata_fn; + gfxd_dram_fn_t * dram_fn; +}; + +extern TLOCAL struct gfxd_config gfxd_config__; + +#endif diff --git a/tools/ZAPD/lib/libgfxd/uc.c b/tools/ZAPD/lib/libgfxd/uc.c new file mode 100644 index 0000000000..7efb091052 --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/uc.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include "gbi.h" +#include "gfxd.h" +#include "priv.h" + +#include "uc_argfn.c" +#include "uc_argtbl.c" +#include "uc_macrofn.c" +#include "uc_macrotbl.c" + +UCFUNC int disas(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int opcode = (hi >> 24) & 0xFF; + + for (int i = 0; i < sizeof(macro_tbl) / sizeof(macro_tbl[0]); i++) + { + const gfxd_macro_type_t *t = ¯o_tbl[i]; + if (t->disas_fn != NULL && t->opcode == opcode) + return t->disas_fn(m, hi, lo); + } + + return d_Invalid(m, hi, lo); +} + +UCFUNC int combine(gfxd_macro_t *m, int num) +{ + int opcode = macro_tbl[m->id].opcode; + + for (int i = 0; i < sizeof(macro_tbl) / sizeof(macro_tbl[0]); i++) + { + const gfxd_macro_type_t *t = ¯o_tbl[i]; + if (t->combine_fn != NULL + && t->opcode == opcode + && (t->ext == 0 || config.emit_ext_macro != 0)) + { + if (t->combine_fn(m, num) == 0) + return 0; + } + } + + return -1; +} + +static const struct gfxd_ucode uc = +{ + .disas_fn = disas, + .combine_fn = combine, + .arg_tbl = arg_tbl, + .macro_tbl = macro_tbl, +}; + +const gfxd_ucode_t uc_name = &uc; diff --git a/tools/ZAPD/lib/libgfxd/uc_argfn.c b/tools/ZAPD/lib/libgfxd/uc_argfn.c new file mode 100644 index 0000000000..f65feb60f7 --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/uc_argfn.c @@ -0,0 +1,1814 @@ +#define MDMASK(md) ((((uint32_t)1 << G_MDSIZ_##md) - 1) << G_MDSFT_##md) +#define MDMASK_RM_C1 ((uint32_t)0xCCCC0000) +#define MDMASK_RM_C2 ((uint32_t)0x33330000) +#define MDMASK_RM_LO ((uint32_t)0x0000FFF8) + +UCFUNC int argfn_i(const gfxd_value_t *v) +{ + return gfxd_printf("%" PRIi32, v->i); +} + +UCFUNC int argfn_u(const gfxd_value_t *v) +{ + return gfxd_printf("%" PRIu32, v->u); +} + +UCFUNC int argfn_x8(const gfxd_value_t *v) +{ + return gfxd_printf("0x%02" PRIX32, v->u); +} + +UCFUNC int argfn_x16(const gfxd_value_t *v) +{ + return gfxd_printf("0x%04" PRIX32, v->u); +} + +UCFUNC int argfn_x32(const gfxd_value_t *v) +{ + return gfxd_printf("0x%08" PRIX32, v->u); +} + +UCFUNC int argfn_color(const gfxd_value_t *v) +{ + if (config.emit_dec_color) + return gfxd_printf("%" PRIu32, v->u); + else + return gfxd_printf("0x%02" PRIX32, v->u); +} + +UCFUNC int argfn_qu08(const gfxd_value_t *v) +{ + if (v->u == 0) + return gfxd_puts("0"); + else if (config.emit_q_macro) + return gfxd_printf("qu08(%.16g)", v->u / 256.f); + else + return gfxd_printf("0x%02" PRIX32, v->u); +} + +UCFUNC int argfn_qu016(const gfxd_value_t *v) +{ + if (v->u == 0) + return gfxd_puts("0"); + else if (config.emit_q_macro) + return gfxd_printf("qu016(%.16g)", v->u / 65536.f); + else + return gfxd_printf("0x%04" PRIX32, v->u); +} + +UCFUNC int argfn_qs48(const gfxd_value_t *v) +{ + if (v->i == 0) + return gfxd_puts("0"); + else if (config.emit_q_macro) + return gfxd_printf("qs48(%.16g)", v->i / 256.f); + else + { + if (v->i < 0) + return gfxd_printf("-0x%04" PRIX32, (uint32_t)-v->i); + else + return gfxd_printf("0x%04" PRIX32, (uint32_t)v->i); + } +} + +UCFUNC int argfn_qs510(const gfxd_value_t *v) +{ + if (v->i == 0) + return gfxd_puts("0"); + else if (config.emit_q_macro) + return gfxd_printf("qs510(%.16g)", v->i / 1024.f); + else + { + if (v->i < 0) + return gfxd_printf("-0x%04" PRIX32, (uint32_t)-v->i); + else + return gfxd_printf("0x%04" PRIX32, (uint32_t)v->i); + } +} + +UCFUNC int argfn_qu102(const gfxd_value_t *v) +{ + if (v->u == 0) + return gfxd_puts("0"); + else if (config.emit_q_macro) + return gfxd_printf("qu102(%.16g)", v->u / 4.f); + else + return gfxd_printf("0x%04" PRIX32, v->u); +} + +UCFUNC int argfn_qs105(const gfxd_value_t *v) +{ + if (v->i == 0) + return gfxd_puts("0"); + else if (config.emit_q_macro) + return gfxd_printf("qs105(%.16g)", v->i / 32.f); + else + { + if (v->i < 0) + return gfxd_printf("-0x%04" PRIX32, (uint32_t)-v->i); + else + return gfxd_printf("0x%04" PRIX32, (uint32_t)v->i); + } +} + +UCFUNC int argfn_qs1616(const gfxd_value_t *v) +{ + if (v->i == 0) + return gfxd_puts("0"); + else if (config.emit_q_macro) + return gfxd_printf("qs1616(%.16g)", v->i / 65536.f); + else + { + if (v->i < 0) + return gfxd_printf("-0x%08" PRIX32, (uint32_t)-v->i); + else + return gfxd_printf("0x%08" PRIX32, (uint32_t)v->i); + } +} + +UCFUNC int argfn_opc(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_SPNOOP: + return gfxd_puts("G_SPNOOP"); + case G_MTX: + return gfxd_puts("G_MTX"); + case G_MOVEMEM: + return gfxd_puts("G_MOVEMEM"); + case G_VTX: + return gfxd_puts("G_VTX"); + case G_DL: + return gfxd_puts("G_DL"); + case G_RDPHALF_2: + return gfxd_puts("G_RDPHALF_2"); + case G_RDPHALF_1: + return gfxd_puts("G_RDPHALF_1"); +#if defined(F3D_BETA) && (defined(F3D_GBI) || defined(F3DEX_GBI)) + case G_PERSPNORM: + return gfxd_puts("G_PERSPNORM"); +#endif + case G_LINE3D: + return gfxd_puts("G_LINE3D"); +#if defined(F3D_GBI) || defined(F3DEX_GBI) + case G_CLEARGEOMETRYMODE: + return gfxd_puts("G_CLEARGEOMETRYMODE"); + case G_SETGEOMETRYMODE: + return gfxd_puts("G_SETGEOMETRYMODE"); +#endif + case G_ENDDL: + return gfxd_puts("G_ENDDL"); + case G_SETOTHERMODE_L: + return gfxd_puts("G_SETOTHERMODE_L"); + case G_SETOTHERMODE_H: + return gfxd_puts("G_SETOTHERMODE_H"); + case G_TEXTURE: + return gfxd_puts("G_TEXTURE"); + case G_MOVEWORD: + return gfxd_puts("G_MOVEWORD"); + case G_POPMTX: + return gfxd_puts("G_POPMTX"); + case G_CULLDL: + return gfxd_puts("G_CULLDL"); + case G_TRI1: + return gfxd_puts("G_TRI1"); + case G_NOOP: + return gfxd_puts("G_NOOP"); +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) + case G_LOAD_UCODE: + return gfxd_puts("G_LOAD_UCODE"); + case G_BRANCH_Z: + return gfxd_puts("G_BRANCH_Z"); + case G_TRI2: + return gfxd_puts("G_TRI2"); +# if !(defined(F3D_BETA) && defined(F3DEX_GBI)) + case G_MODIFYVTX: + return gfxd_puts("G_MODIFYVTX"); +# endif +#endif +#if defined(F3DEX_GBI_2) + case G_QUAD: + return gfxd_puts("G_QUAD"); + case G_SPECIAL_3: + return gfxd_puts("G_SPECIAL_3"); + case G_SPECIAL_2: + return gfxd_puts("G_SPECIAL_2"); + case G_SPECIAL_1: + return gfxd_puts("G_SPECIAL_1"); + case G_DMA_IO: + return gfxd_puts("G_DMA_IO"); + case G_GEOMETRYMODE: + return gfxd_puts("G_GEOMETRYMODE"); +#endif + case G_TEXRECT: + return gfxd_puts("G_TEXRECT"); + case G_TEXRECTFLIP: + return gfxd_puts("G_TEXRECTFLIP"); + case G_RDPLOADSYNC: + return gfxd_puts("G_RDPLOADSYNC"); + case G_RDPPIPESYNC: + return gfxd_puts("G_RDPPIPESYNC"); + case G_RDPTILESYNC: + return gfxd_puts("G_RDPTILESYNC"); + case G_RDPFULLSYNC: + return gfxd_puts("G_RDPFULLSYNC"); + case G_SETKEYGB: + return gfxd_puts("G_SETKEYGB"); + case G_SETKEYR: + return gfxd_puts("G_SETKEYR"); + case G_SETCONVERT: + return gfxd_puts("G_SETCONVERT"); + case G_SETSCISSOR: + return gfxd_puts("G_SETSCISSOR"); + case G_SETPRIMDEPTH: + return gfxd_puts("G_SETPRIMDEPTH"); + case G_RDPSETOTHERMODE: + return gfxd_puts("G_RDPSETOTHERMODE"); + case G_LOADTLUT: + return gfxd_puts("G_LOADTLUT"); + case G_SETTILESIZE: + return gfxd_puts("G_SETTILESIZE"); + case G_LOADBLOCK: + return gfxd_puts("G_LOADBLOCK"); + case G_LOADTILE: + return gfxd_puts("G_LOADTILE"); + case G_SETTILE: + return gfxd_puts("G_SETTILE"); + case G_FILLRECT: + return gfxd_puts("G_FILLRECT"); + case G_SETFILLCOLOR: + return gfxd_puts("G_SETFILLCOLOR"); + case G_SETFOGCOLOR: + return gfxd_puts("G_SETFOGCOLOR"); + case G_SETBLENDCOLOR: + return gfxd_puts("G_SETBLENDCOLOR"); + case G_SETPRIMCOLOR: + return gfxd_puts("G_SETPRIMCOLOR"); + case G_SETENVCOLOR: + return gfxd_puts("G_SETENVCOLOR"); + case G_SETCOMBINE: + return gfxd_puts("G_SETCOMBINE"); + case G_SETTIMG: + return gfxd_puts("G_SETTIMG"); + case G_SETZIMG: + return gfxd_puts("G_SETZIMG"); + case G_SETCIMG: + return gfxd_puts("G_SETCIMG"); + default: + return gfxd_printf("0x%02" PRIX32, (uint32_t)v->i); + } +} + +UCFUNC int argfn_fmt(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_IM_FMT_RGBA: + return gfxd_puts("G_IM_FMT_RGBA"); + case G_IM_FMT_YUV: + return gfxd_puts("G_IM_FMT_YUV"); + case G_IM_FMT_CI: + return gfxd_puts("G_IM_FMT_CI"); + case G_IM_FMT_IA: + return gfxd_puts("G_IM_FMT_IA"); + case G_IM_FMT_I: + return gfxd_puts("G_IM_FMT_I"); + default: + return gfxd_printf("%" PRIi32, v->i); + } +} + +UCFUNC int argfn_siz(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_IM_SIZ_4b: + return gfxd_puts("G_IM_SIZ_4b"); + case G_IM_SIZ_8b: + return gfxd_puts("G_IM_SIZ_8b"); + case G_IM_SIZ_16b: + return gfxd_puts("G_IM_SIZ_16b"); + case G_IM_SIZ_32b: + return gfxd_puts("G_IM_SIZ_32b"); + default: + return gfxd_printf("%" PRIi32, v->i); + } +} + +UCFUNC int argfn_cm(const gfxd_value_t *v) +{ + int n = 0; + if (v->u & G_TX_MIRROR) + n += gfxd_puts("G_TX_MIRROR"); + else + n += gfxd_puts("G_TX_NOMIRROR"); + if (v->u & G_TX_CLAMP) + n += gfxd_puts(" | G_TX_CLAMP"); + else + n += gfxd_puts(" | G_TX_WRAP"); + return n; +} + +UCFUNC int argfn_tm(const gfxd_value_t *v) +{ + if (v->i == 0) + return gfxd_puts("G_TX_NOMASK"); + else + return gfxd_printf("%" PRIi32, v->i); +} + +UCFUNC int argfn_ts(const gfxd_value_t *v) +{ + if (v->i == 0) + return gfxd_puts("G_TX_NOLOD"); + else + return gfxd_printf("%" PRIi32, v->i); +} + +UCFUNC int argfn_switch(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_ON: + return gfxd_puts("G_ON"); + case G_OFF: + return gfxd_puts("G_OFF"); + default: + return gfxd_printf("%" PRIi32, v->i); + } +} + +UCFUNC int argfn_tile(const gfxd_value_t *v) +{ + if (v->i == G_TX_LOADTILE) + return gfxd_puts("G_TX_LOADTILE"); + else if (v->i == G_TX_RENDERTILE) + return gfxd_puts("G_TX_RENDERTILE"); + else + return gfxd_printf("%" PRIi32, v->i); +} + +UCFUNC int argfn_gm(const gfxd_value_t *v) +{ + int n = 0; + uint32_t arg = v->u; + if (arg & G_ZBUFFER) + n += gfxd_puts("G_ZBUFFER"); + if (arg & G_TEXTURE_ENABLE) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_TEXTURE_ENABLE"); + } + if (arg & G_SHADE) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_SHADE"); + } + if ((arg & G_CULL_BOTH) == G_CULL_BOTH) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_CULL_BOTH"); + } + else + { + if (arg & G_CULL_FRONT) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_CULL_FRONT"); + } + if (arg & G_CULL_BACK) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_CULL_BACK"); + } + } + if (arg & G_FOG) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_FOG"); + } + if (arg & G_LIGHTING) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_LIGHTING"); + } + if (arg & G_TEXTURE_GEN) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_TEXTURE_GEN"); + } + if (arg & G_TEXTURE_GEN_LINEAR) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_TEXTURE_GEN_LINEAR"); + } + if (arg & G_LOD) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_LOD"); + } + if (arg & G_SHADING_SMOOTH) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_SHADING_SMOOTH"); + } + if (arg & G_CLIPPING) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("G_CLIPPING"); + } + arg = arg & ~(G_ZBUFFER | G_TEXTURE_ENABLE | G_SHADE | G_CULL_BOTH | + G_FOG | G_LIGHTING | G_TEXTURE_GEN | + G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH | + G_CLIPPING); + if (arg) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_printf("0x%08" PRIX32, arg); + } + return n; +} + +UCFUNC int argfn_sftlo(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_MDSFT_ALPHACOMPARE: + return gfxd_puts("G_MDSFT_ALPHACOMPARE"); + case G_MDSFT_ZSRCSEL: + return gfxd_puts("G_MDSFT_ZSRCSEL"); + case G_MDSFT_RENDERMODE: + return gfxd_puts("G_MDSFT_RENDERMODE"); + case G_MDSFT_BLENDER: + return gfxd_puts("G_MDSFT_BLENDER"); + default: + return gfxd_printf("%" PRIi32, v->i); + } +} + +UCFUNC int rm_mode_str(uint32_t arg) +{ + int n = 0; + if (arg & AA_EN) + n += gfxd_puts("AA_EN"); + if (arg & Z_CMP) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("Z_CMP"); + } + if (arg & Z_UPD) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("Z_UPD"); + } + if (arg & IM_RD) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("IM_RD"); + } + if (arg & CLR_ON_CVG) + { + if (n > 0) + n += gfxd_puts(" | "); + n += gfxd_puts("CLR_ON_CVG"); + } + if (n > 0) + n += gfxd_puts(" | "); + int cvg = arg & 0x00000300; + switch (cvg) + { + case CVG_DST_CLAMP: + n += gfxd_puts("CVG_DST_CLAMP"); + break; + case CVG_DST_WRAP: + n += gfxd_puts("CVG_DST_WRAP"); + break; + case CVG_DST_FULL: + n += gfxd_puts("CVG_DST_FULL"); + break; + case CVG_DST_SAVE: + n += gfxd_puts("CVG_DST_SAVE"); + break; + } + int zmode = arg & 0x00000C00; + switch (zmode) + { + case ZMODE_OPA: + n += gfxd_puts(" | ZMODE_OPA"); + break; + case ZMODE_INTER: + n += gfxd_puts(" | ZMODE_INTER"); + break; + case ZMODE_XLU: + n += gfxd_puts(" | ZMODE_XLU"); + break; + case ZMODE_DEC: + n += gfxd_puts(" | ZMODE_DEC"); + break; + } + if (arg & CVG_X_ALPHA) + n += gfxd_puts(" | CVG_X_ALPHA"); + if (arg & ALPHA_CVG_SEL) + n += gfxd_puts(" | ALPHA_CVG_SEL"); + if (arg & FORCE_BL) + n += gfxd_puts(" | FORCE_BL"); + return n; +} + +UCFUNC int rm_cbl_str(uint32_t arg, int c) +{ + int n = 0; + if (c == 2) + arg <<= 2; + int bp = (arg >> 30) & 0b11; + switch (bp) + { + case G_BL_CLR_IN: + n += gfxd_printf("GBL_c%i(G_BL_CLR_IN", c); + break; + case G_BL_CLR_MEM: + n += gfxd_printf("GBL_c%i(G_BL_CLR_MEM", c); + break; + case G_BL_CLR_BL: + n += gfxd_printf("GBL_c%i(G_BL_CLR_BL", c); + break; + case G_BL_CLR_FOG: + n += gfxd_printf("GBL_c%i(G_BL_CLR_FOG", c); + break; + } + int ba = (arg >> 26) & 0b11; + switch (ba) + { + case G_BL_A_IN: + n += gfxd_puts(", G_BL_A_IN"); + break; + case G_BL_A_FOG: + n += gfxd_puts(", G_BL_A_FOG"); + break; + case G_BL_A_SHADE: + n += gfxd_puts(", G_BL_A_SHADE"); + break; + case G_BL_0: + n += gfxd_puts(", G_BL_0"); + break; + } + int bm = (arg >> 22) & 0b11; + switch (bm) + { + case G_BL_CLR_IN: + n += gfxd_puts(", G_BL_CLR_IN"); + break; + case G_BL_CLR_MEM: + n += gfxd_puts(", G_BL_CLR_MEM"); + break; + case G_BL_CLR_BL: + n += gfxd_puts(", G_BL_CLR_BL"); + break; + case G_BL_CLR_FOG: + n += gfxd_puts(", G_BL_CLR_FOG"); + break; + } + int bb = (arg >> 18) & 0b11; + switch (bb) + { + case G_BL_1MA: + n += gfxd_puts(", G_BL_1MA)"); + break; + case G_BL_A_MEM: + n += gfxd_puts(", G_BL_A_MEM)"); + break; + case G_BL_1: + n += gfxd_puts(", G_BL_1)"); + break; + case G_BL_0: + n += gfxd_puts(", G_BL_0)"); + break; + } + return n; +} + +struct rm_preset +{ + uint32_t rm; + const char * name; +}; + +static const struct rm_preset rm_presets[] = +{ + {G_RM_OPA_SURF, "G_RM_OPA_SURF"}, + {G_RM_OPA_SURF2, "G_RM_OPA_SURF2"}, + {G_RM_AA_OPA_SURF, "G_RM_AA_OPA_SURF"}, + {G_RM_AA_OPA_SURF2, "G_RM_AA_OPA_SURF2"}, + {G_RM_RA_OPA_SURF, "G_RM_RA_OPA_SURF"}, + {G_RM_RA_OPA_SURF2, "G_RM_RA_OPA_SURF2"}, + {G_RM_ZB_OPA_SURF, "G_RM_ZB_OPA_SURF"}, + {G_RM_ZB_OPA_SURF2, "G_RM_ZB_OPA_SURF2"}, + {G_RM_AA_ZB_OPA_SURF, "G_RM_AA_ZB_OPA_SURF"}, + {G_RM_AA_ZB_OPA_SURF2, "G_RM_AA_ZB_OPA_SURF2"}, + {G_RM_RA_ZB_OPA_SURF, "G_RM_RA_ZB_OPA_SURF"}, + {G_RM_RA_ZB_OPA_SURF2, "G_RM_RA_ZB_OPA_SURF2"}, + {G_RM_XLU_SURF, "G_RM_XLU_SURF"}, + {G_RM_XLU_SURF2, "G_RM_XLU_SURF2"}, + {G_RM_AA_XLU_SURF, "G_RM_AA_XLU_SURF"}, + {G_RM_AA_XLU_SURF2, "G_RM_AA_XLU_SURF2"}, + {G_RM_ZB_XLU_SURF, "G_RM_ZB_XLU_SURF"}, + {G_RM_ZB_XLU_SURF2, "G_RM_ZB_XLU_SURF2"}, + {G_RM_AA_ZB_XLU_SURF, "G_RM_AA_ZB_XLU_SURF"}, + {G_RM_AA_ZB_XLU_SURF2, "G_RM_AA_ZB_XLU_SURF2"}, + {G_RM_ZB_OPA_DECAL, "G_RM_ZB_OPA_DECAL"}, + {G_RM_ZB_OPA_DECAL2, "G_RM_ZB_OPA_DECAL2"}, + {G_RM_AA_ZB_OPA_DECAL, "G_RM_AA_ZB_OPA_DECAL"}, + {G_RM_AA_ZB_OPA_DECAL2, "G_RM_AA_ZB_OPA_DECAL2"}, + {G_RM_RA_ZB_OPA_DECAL, "G_RM_RA_ZB_OPA_DECAL"}, + {G_RM_RA_ZB_OPA_DECAL2, "G_RM_RA_ZB_OPA_DECAL2"}, + {G_RM_ZB_XLU_DECAL, "G_RM_ZB_XLU_DECAL"}, + {G_RM_ZB_XLU_DECAL2, "G_RM_ZB_XLU_DECAL2"}, + {G_RM_AA_ZB_XLU_DECAL, "G_RM_AA_ZB_XLU_DECAL"}, + {G_RM_AA_ZB_XLU_DECAL2, "G_RM_AA_ZB_XLU_DECAL2"}, + {G_RM_AA_ZB_OPA_INTER, "G_RM_AA_ZB_OPA_INTER"}, + {G_RM_AA_ZB_OPA_INTER2, "G_RM_AA_ZB_OPA_INTER2"}, + {G_RM_RA_ZB_OPA_INTER, "G_RM_RA_ZB_OPA_INTER"}, + {G_RM_RA_ZB_OPA_INTER2, "G_RM_RA_ZB_OPA_INTER2"}, + {G_RM_AA_ZB_XLU_INTER, "G_RM_AA_ZB_XLU_INTER"}, + {G_RM_AA_ZB_XLU_INTER2, "G_RM_AA_ZB_XLU_INTER2"}, + {G_RM_AA_XLU_LINE, "G_RM_AA_XLU_LINE"}, + {G_RM_AA_XLU_LINE2, "G_RM_AA_XLU_LINE2"}, + {G_RM_AA_ZB_XLU_LINE, "G_RM_AA_ZB_XLU_LINE"}, + {G_RM_AA_ZB_XLU_LINE2, "G_RM_AA_ZB_XLU_LINE2"}, + {G_RM_AA_DEC_LINE, "G_RM_AA_DEC_LINE"}, + {G_RM_AA_DEC_LINE2, "G_RM_AA_DEC_LINE2"}, + {G_RM_AA_ZB_DEC_LINE, "G_RM_AA_ZB_DEC_LINE"}, + {G_RM_AA_ZB_DEC_LINE2, "G_RM_AA_ZB_DEC_LINE2"}, + {G_RM_TEX_EDGE, "G_RM_TEX_EDGE"}, + {G_RM_TEX_EDGE2, "G_RM_TEX_EDGE2"}, + {G_RM_AA_TEX_EDGE, "G_RM_AA_TEX_EDGE"}, + {G_RM_AA_TEX_EDGE2, "G_RM_AA_TEX_EDGE2"}, + {G_RM_AA_ZB_TEX_EDGE, "G_RM_AA_ZB_TEX_EDGE"}, + {G_RM_AA_ZB_TEX_EDGE2, "G_RM_AA_ZB_TEX_EDGE2"}, + {G_RM_AA_ZB_TEX_INTER, "G_RM_AA_ZB_TEX_INTER"}, + {G_RM_AA_ZB_TEX_INTER2, "G_RM_AA_ZB_TEX_INTER2"}, + {G_RM_AA_SUB_SURF, "G_RM_AA_SUB_SURF"}, + {G_RM_AA_SUB_SURF2, "G_RM_AA_SUB_SURF2"}, + {G_RM_AA_ZB_SUB_SURF, "G_RM_AA_ZB_SUB_SURF"}, + {G_RM_AA_ZB_SUB_SURF2, "G_RM_AA_ZB_SUB_SURF2"}, + {G_RM_PCL_SURF, "G_RM_PCL_SURF"}, + {G_RM_PCL_SURF2, "G_RM_PCL_SURF2"}, + {G_RM_AA_PCL_SURF, "G_RM_AA_PCL_SURF"}, + {G_RM_AA_PCL_SURF2, "G_RM_AA_PCL_SURF2"}, + {G_RM_ZB_PCL_SURF, "G_RM_ZB_PCL_SURF"}, + {G_RM_ZB_PCL_SURF2, "G_RM_ZB_PCL_SURF2"}, + {G_RM_AA_ZB_PCL_SURF, "G_RM_AA_ZB_PCL_SURF"}, + {G_RM_AA_ZB_PCL_SURF2, "G_RM_AA_ZB_PCL_SURF2"}, + {G_RM_AA_OPA_TERR, "G_RM_AA_OPA_TERR"}, + {G_RM_AA_OPA_TERR2, "G_RM_AA_OPA_TERR2"}, + {G_RM_AA_ZB_OPA_TERR, "G_RM_AA_ZB_OPA_TERR"}, + {G_RM_AA_ZB_OPA_TERR2, "G_RM_AA_ZB_OPA_TERR2"}, + {G_RM_AA_TEX_TERR, "G_RM_AA_TEX_TERR"}, + {G_RM_AA_TEX_TERR2, "G_RM_AA_TEX_TERR2"}, + {G_RM_AA_ZB_TEX_TERR, "G_RM_AA_ZB_TEX_TERR"}, + {G_RM_AA_ZB_TEX_TERR2, "G_RM_AA_ZB_TEX_TERR2"}, + {G_RM_AA_SUB_TERR, "G_RM_AA_SUB_TERR"}, + {G_RM_AA_SUB_TERR2, "G_RM_AA_SUB_TERR2"}, + {G_RM_AA_ZB_SUB_TERR, "G_RM_AA_ZB_SUB_TERR"}, + {G_RM_AA_ZB_SUB_TERR2, "G_RM_AA_ZB_SUB_TERR2"}, + {G_RM_CLD_SURF, "G_RM_CLD_SURF"}, + {G_RM_CLD_SURF2, "G_RM_CLD_SURF2"}, + {G_RM_ZB_CLD_SURF, "G_RM_ZB_CLD_SURF"}, + {G_RM_ZB_CLD_SURF2, "G_RM_ZB_CLD_SURF2"}, + {G_RM_ZB_OVL_SURF, "G_RM_ZB_OVL_SURF"}, + {G_RM_ZB_OVL_SURF2, "G_RM_ZB_OVL_SURF2"}, + {G_RM_ADD, "G_RM_ADD"}, + {G_RM_ADD2, "G_RM_ADD2"}, + {G_RM_VISCVG, "G_RM_VISCVG"}, + {G_RM_VISCVG2, "G_RM_VISCVG2"}, + {G_RM_OPA_CI, "G_RM_OPA_CI"}, + {G_RM_OPA_CI2, "G_RM_OPA_CI2"}, + {G_RM_RA_SPRITE, "G_RM_RA_SPRITE"}, + {G_RM_RA_SPRITE2, "G_RM_RA_SPRITE2"}, +}; + +static const struct rm_preset bl1_presets[] = +{ + {G_RM_FOG_SHADE_A, "G_RM_FOG_SHADE_A"}, + {G_RM_FOG_PRIM_A, "G_RM_FOG_PRIM_A"}, + {G_RM_PASS, "G_RM_PASS"}, + {G_RM_NOOP, "G_RM_NOOP"}, +}; + +static const struct rm_preset bl2_presets[] = +{ + {G_RM_NOOP2, "G_RM_NOOP2"}, +}; + +UCFUNC int othermodelo_str(uint32_t arg, uint32_t which) +{ + int n = 0; + uint32_t rm_c1_mask = MDMASK_RM_C1; + uint32_t rm_c2_mask = MDMASK_RM_C2; + uint32_t rm_mode_lo = MDMASK_RM_LO; + uint32_t rm_mask = rm_c1_mask | rm_c2_mask | rm_mode_lo; + const struct rm_preset *pre_c1 = NULL; + const struct rm_preset *pre_c2 = NULL; + int n_rm_presets = sizeof(rm_presets) / sizeof(*rm_presets); + for (int i = 0; i < n_rm_presets; i++) + { + const struct rm_preset *pre = &rm_presets[i]; + uint32_t pre_extra = pre->rm & ~rm_mask; + uint32_t rm_c1 = arg & (rm_c1_mask | rm_mode_lo | pre_extra); + if (!pre_c1 && rm_c1 == pre->rm) + pre_c1 = pre; + uint32_t rm_c2 = arg & (rm_c2_mask | rm_mode_lo | pre_extra); + if (!pre_c2 && rm_c2 == pre->rm) + pre_c2 = pre; + } + if (!pre_c1 || !pre_c2 || pre_c1 + 1 != pre_c2) + { + int n_bl1_presets = sizeof(bl1_presets) / sizeof(*bl1_presets); + for (int i = 0; i < n_bl1_presets; i++) + { + const struct rm_preset *pre = &bl1_presets[i]; + uint32_t pre_extra = pre->rm & ~rm_mask; + uint32_t rm_c1 = arg & (rm_c1_mask | pre_extra); + if (rm_c1 == pre->rm) + { + pre_c1 = pre; + break; + } + } + int n_bl2_presets = sizeof(bl2_presets) / sizeof(*bl2_presets); + for (int i = 0; i < n_bl2_presets; i++) + { + const struct rm_preset *pre = &bl2_presets[i]; + uint32_t pre_extra = pre->rm & ~rm_mask; + uint32_t rm_c2 = arg & (rm_c2_mask | pre_extra); + if (rm_c2 == pre->rm) + { + pre_c2 = pre; + break; + } + } + } + uint32_t pre_rm = 0; + if (pre_c1) + pre_rm |= pre_c1->rm; + if (pre_c2) + pre_rm |= pre_c2->rm; + uint32_t ac_mask = MDMASK(ALPHACOMPARE); + if (((arg & ~pre_rm) | which) & ac_mask) + { + uint32_t ac = arg & ac_mask; + switch (ac) + { + case G_AC_NONE: + n += gfxd_puts("G_AC_NONE"); + break; + case G_AC_THRESHOLD: + n += gfxd_puts("G_AC_THRESHOLD"); + break; + case G_AC_DITHER: + n += gfxd_puts("G_AC_DITHER"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, ac); + break; + } + } + uint32_t zs_mask = MDMASK(ZSRCSEL); + if (((arg & ~pre_rm) | which) & zs_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t zs = arg & zs_mask; + switch (zs) + { + case G_ZS_PIXEL: + n += gfxd_puts("G_ZS_PIXEL"); + break; + case G_ZS_PRIM: + n += gfxd_puts("G_ZS_PRIM"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, zs); + break; + } + } + uint32_t rm = arg & (rm_mask | pre_rm); + if (((arg & ~pre_rm) | which) & rm_mode_lo) + { + if (n > 0) + n += gfxd_puts(" | "); + n += rm_mode_str(rm); + } + int c = 0; + if (which & rm_c1_mask) + c |= 1; + if (which & rm_c2_mask) + c |= 2; + if (c & 1 || (c == 0 && arg & rm_c1_mask)) + { + if (n > 0) + n += gfxd_puts(" | "); + if (pre_c1) + n += gfxd_printf("%s", pre_c1->name); + else + n += rm_cbl_str(rm, 1); + } + if (c & 2 || (c == 0 && arg & rm_c2_mask)) + { + if (n > 0) + n += gfxd_puts(" | "); + if (pre_c2) + n += gfxd_printf("%s", pre_c2->name); + else + n += rm_cbl_str(rm, 2); + } + uint32_t unk_mask = ~(rm_mask | ac_mask | zs_mask); + if (arg & unk_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t unk = arg & unk_mask; + n += gfxd_printf("0x%08" PRIX32, unk); + } + return n; +} + +UCFUNC int argfn_ac(const gfxd_value_t *v) +{ + return othermodelo_str(v->u, MDMASK(ALPHACOMPARE)); +} + +UCFUNC int argfn_zs(const gfxd_value_t *v) +{ + return othermodelo_str(v->u, MDMASK(ZSRCSEL)); +} + +UCFUNC int argfn_rm1(const gfxd_value_t *v) +{ + return othermodelo_str(v->u, MDMASK_RM_C1); +} + +UCFUNC int argfn_rm2(const gfxd_value_t *v) +{ + return othermodelo_str(v->u, MDMASK_RM_C2); +} + +UCFUNC int argfn_othermodelo(const gfxd_value_t *v) +{ + uint32_t mask = MDMASK(ALPHACOMPARE) | MDMASK(ZSRCSEL) | MDMASK_RM_C1 | + MDMASK_RM_C2; + return othermodelo_str(v->u, mask); +} + +UCFUNC int argfn_sfthi(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_MDSFT_ALPHADITHER: + return gfxd_puts("G_MDSFT_ALPHADITHER"); + case G_MDSFT_RGBDITHER: + return gfxd_puts("G_MDSFT_RGBDITHER"); + case G_MDSFT_COMBKEY: + return gfxd_puts("G_MDSFT_COMBKEY"); + case G_MDSFT_TEXTCONV: + return gfxd_puts("G_MDSFT_TEXTCONV"); + case G_MDSFT_TEXTFILT: + return gfxd_puts("G_MDSFT_TEXTFILT"); + case G_MDSFT_TEXTLUT: + return gfxd_puts("G_MDSFT_TEXTLUT"); + case G_MDSFT_TEXTLOD: + return gfxd_puts("G_MDSFT_TEXTLOD"); + case G_MDSFT_TEXTDETAIL: + return gfxd_puts("G_MDSFT_TEXTDETAIL"); + case G_MDSFT_TEXTPERSP: + return gfxd_puts("G_MDSFT_TEXTPERSP"); + case G_MDSFT_CYCLETYPE: + return gfxd_puts("G_MDSFT_CYCLETYPE"); + case G_MDSFT_PIPELINE: + return gfxd_puts("G_MDSFT_PIPELINE"); + default: + return gfxd_printf("%" PRIi32, v->i); + } +} + +UCFUNC int othermodehi_str(uint32_t arg, uint32_t which) +{ + int n = 0; + uint32_t ad_mask = MDMASK(ALPHADITHER); + if ((arg | which) & ad_mask) + { + uint32_t ad = arg & ad_mask; + switch (ad) + { + case G_AD_PATTERN: + n += gfxd_puts("G_AD_PATTERN"); + break; + case G_AD_NOTPATTERN: + n += gfxd_puts("G_AD_NOTPATTERN"); + break; + case G_AD_NOISE: + n += gfxd_puts("G_AD_NOISE"); + break; + case G_AD_DISABLE: + n += gfxd_puts("G_AD_DISABLE"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, ad); + break; + } + } + uint32_t cd_mask = MDMASK(RGBDITHER); + if ((arg | which) & cd_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t cd = arg & cd_mask; + switch (cd) + { + case G_CD_MAGICSQ: + n += gfxd_puts("G_CD_MAGICSQ"); + break; + case G_CD_BAYER: + n += gfxd_puts("G_CD_BAYER"); + break; + case G_CD_NOISE: + n += gfxd_puts("G_CD_NOISE"); + break; + case G_CD_DISABLE: + n += gfxd_puts("G_CD_DISABLE"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, cd); + break; + } + } + uint32_t ck_mask = MDMASK(COMBKEY); + if ((arg | which) & ck_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t ck = arg & ck_mask; + switch (ck) + { + case G_CK_NONE: + n += gfxd_puts("G_CK_NONE"); + break; + case G_CK_KEY: + n += gfxd_puts("G_CK_KEY"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, ck); + break; + } + } + uint32_t tc_mask = MDMASK(TEXTCONV); + if ((arg | which) & tc_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t tc = arg & tc_mask; + switch (tc) + { + case G_TC_CONV: + n += gfxd_puts("G_TC_CONV"); + break; + case G_TC_FILTCONV: + n += gfxd_puts("G_TC_FILTCONV"); + break; + case G_TC_FILT: + n += gfxd_puts("G_TC_FILT"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, tc); + break; + } + } + uint32_t tf_mask = MDMASK(TEXTFILT); + if ((arg | which) & tf_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t tf = arg & tf_mask; + switch (tf) + { + case G_TF_POINT: + n += gfxd_puts("G_TF_POINT"); + break; + case G_TF_BILERP: + n += gfxd_puts("G_TF_BILERP"); + break; + case G_TF_AVERAGE: + n += gfxd_puts("G_TF_AVERAGE"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, tf); + break; + } + } + uint32_t tt_mask = MDMASK(TEXTLUT); + if ((arg | which) & tt_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t tt = arg & tt_mask; + switch (tt) + { + case G_TT_NONE: + n += gfxd_puts("G_TT_NONE"); + break; + case G_TT_RGBA16: + n += gfxd_puts("G_TT_RGBA16"); + break; + case G_TT_IA16: + n += gfxd_puts("G_TT_IA16"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, tt); + break; + } + } + uint32_t tl_mask = MDMASK(TEXTLOD); + if ((arg | which) & tl_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t tl = arg & tl_mask; + switch (tl) + { + case G_TL_TILE: + n += gfxd_puts("G_TL_TILE"); + break; + case G_TL_LOD: + n += gfxd_puts("G_TL_LOD"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, tl); + break; + } + } + uint32_t td_mask = MDMASK(TEXTDETAIL); + if ((arg | which) & td_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t td = arg & td_mask; + switch (td) + { + case G_TD_CLAMP: + n += gfxd_puts("G_TD_CLAMP"); + break; + case G_TD_SHARPEN: + n += gfxd_puts("G_TD_SHARPEN"); + break; + case G_TD_DETAIL: + n += gfxd_puts("G_TD_DETAIL"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, td); + break; + } + } + uint32_t tp_mask = MDMASK(TEXTPERSP); + if ((arg | which) & tp_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t tp = arg & tp_mask; + switch (tp) + { + case G_TP_NONE: + n += gfxd_puts("G_TP_NONE"); + break; + case G_TP_PERSP: + n += gfxd_puts("G_TP_PERSP"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, tp); + break; + } + } + uint32_t cyc_mask = MDMASK(CYCLETYPE); + if ((arg | which) & cyc_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t cyc = arg & cyc_mask; + switch (cyc) + { + case G_CYC_1CYCLE: + n += gfxd_puts("G_CYC_1CYCLE"); + break; + case G_CYC_2CYCLE: + n += gfxd_puts("G_CYC_2CYCLE"); + break; + case G_CYC_COPY: + n += gfxd_puts("G_CYC_COPY"); + break; + case G_CYC_FILL: + n += gfxd_puts("G_CYC_FILL"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, cyc); + break; + } + } + uint32_t pm_mask = MDMASK(PIPELINE); + if ((arg | which) & pm_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t pm = arg & pm_mask; + switch (pm) + { + case G_PM_NPRIMITIVE: + n += gfxd_puts("G_PM_NPRIMITIVE"); + break; + case G_PM_1PRIMITIVE: + n += gfxd_puts("G_PM_1PRIMITIVE"); + break; + default: + n += gfxd_printf("0x%08" PRIX32, pm); + break; + } + } + uint32_t unk_mask = ~(ad_mask | cd_mask | ck_mask | tc_mask | tf_mask | + tt_mask | tl_mask | td_mask | tp_mask | + cyc_mask | pm_mask); + if (arg & unk_mask) + { + if (n > 0) + n += gfxd_puts(" | "); + uint32_t unk = arg & unk_mask; + n += gfxd_printf("0x%08" PRIX32, unk); + } + return n; +} + +UCFUNC int argfn_ad(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(ALPHADITHER)); +} + +UCFUNC int argfn_cd(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(RGBDITHER)); +} + +UCFUNC int argfn_ck(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(COMBKEY)); +} + +UCFUNC int argfn_tc(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(TEXTCONV)); +} + +UCFUNC int argfn_tf(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(TEXTFILT)); +} + +UCFUNC int argfn_tt(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(TEXTLUT)); +} + +UCFUNC int argfn_tl(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(TEXTLOD)); +} + +UCFUNC int argfn_td(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(TEXTDETAIL)); +} + +UCFUNC int argfn_tp(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(TEXTPERSP)); +} + +UCFUNC int argfn_cyc(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(CYCLETYPE)); +} + +UCFUNC int argfn_pm(const gfxd_value_t *v) +{ + return othermodehi_str(v->u, MDMASK(PIPELINE)); +} + +UCFUNC int argfn_othermodehi(const gfxd_value_t *v) +{ + uint32_t mask = MDMASK(ALPHADITHER) | + MDMASK(RGBDITHER) | + MDMASK(COMBKEY) | + MDMASK(TEXTCONV) | + MDMASK(TEXTFILT) | + MDMASK(TEXTLUT) | + MDMASK(TEXTLOD) | + MDMASK(TEXTDETAIL) | + MDMASK(TEXTPERSP) | + MDMASK(CYCLETYPE) | + MDMASK(PIPELINE); + return othermodehi_str(v->u, mask); +} + +UCFUNC int argfn_cv(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_CV_K0: + return gfxd_puts("G_CV_K0"); + case G_CV_K1: + return gfxd_puts("G_CV_K1"); + case G_CV_K2: + return gfxd_puts("G_CV_K2"); + case G_CV_K3: + return gfxd_puts("G_CV_K3"); + case G_CV_K4: + return gfxd_puts("G_CV_K4"); + case G_CV_K5: + return gfxd_puts("G_CV_K5"); + default: + return gfxd_printf("%" PRIi32, v->i); + } +} + +UCFUNC int argfn_ccmuxa(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_CCMUX_COMBINED: + return gfxd_puts("COMBINED"); + case G_CCMUX_TEXEL0: + return gfxd_puts("TEXEL0"); + case G_CCMUX_TEXEL1: + return gfxd_puts("TEXEL1"); + case G_CCMUX_PRIMITIVE: + return gfxd_puts("PRIMITIVE"); + case G_CCMUX_SHADE: + return gfxd_puts("SHADE"); + case G_CCMUX_ENVIRONMENT: + return gfxd_puts("ENVIRONMENT"); + case G_CCMUX_1: + return gfxd_puts("1"); + case G_CCMUX_NOISE: + return gfxd_puts("NOISE"); + default: + return gfxd_puts("0"); + } +} + +UCFUNC int argfn_ccmuxb(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_CCMUX_COMBINED: + return gfxd_puts("COMBINED"); + case G_CCMUX_TEXEL0: + return gfxd_puts("TEXEL0"); + case G_CCMUX_TEXEL1: + return gfxd_puts("TEXEL1"); + case G_CCMUX_PRIMITIVE: + return gfxd_puts("PRIMITIVE"); + case G_CCMUX_SHADE: + return gfxd_puts("SHADE"); + case G_CCMUX_ENVIRONMENT: + return gfxd_puts("ENVIRONMENT"); + case G_CCMUX_CENTER: + return gfxd_puts("CENTER"); + case G_CCMUX_K4: + return gfxd_puts("K4"); + default: + return gfxd_puts("0"); + } +} + +UCFUNC int argfn_ccmuxc(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_CCMUX_COMBINED: + return gfxd_puts("COMBINED"); + case G_CCMUX_TEXEL0: + return gfxd_puts("TEXEL0"); + case G_CCMUX_TEXEL1: + return gfxd_puts("TEXEL1"); + case G_CCMUX_PRIMITIVE: + return gfxd_puts("PRIMITIVE"); + case G_CCMUX_SHADE: + return gfxd_puts("SHADE"); + case G_CCMUX_ENVIRONMENT: + return gfxd_puts("ENVIRONMENT"); + case G_CCMUX_SCALE: + return gfxd_puts("SCALE"); + case G_CCMUX_COMBINED_ALPHA: + return gfxd_puts("COMBINED_ALPHA"); + case G_CCMUX_TEXEL0_ALPHA: + return gfxd_puts("TEXEL0_ALPHA"); + case G_CCMUX_TEXEL1_ALPHA: + return gfxd_puts("TEXEL1_ALPHA"); + case G_CCMUX_PRIMITIVE_ALPHA: + return gfxd_puts("PRIMITIVE_ALPHA"); + case G_CCMUX_SHADE_ALPHA: + return gfxd_puts("SHADE_ALPHA"); + case G_CCMUX_ENV_ALPHA: + return gfxd_puts("ENV_ALPHA"); + case G_CCMUX_LOD_FRACTION: + return gfxd_puts("LOD_FRACTION"); + case G_CCMUX_PRIM_LOD_FRAC: + return gfxd_puts("PRIM_LOD_FRAC"); + case G_CCMUX_K5: + return gfxd_puts("K5"); + default: + return gfxd_puts("0"); + } +} + +UCFUNC int argfn_ccmuxd(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_CCMUX_COMBINED: + return gfxd_puts("COMBINED"); + case G_CCMUX_TEXEL0: + return gfxd_puts("TEXEL0"); + case G_CCMUX_TEXEL1: + return gfxd_puts("TEXEL1"); + case G_CCMUX_PRIMITIVE: + return gfxd_puts("PRIMITIVE"); + case G_CCMUX_SHADE: + return gfxd_puts("SHADE"); + case G_CCMUX_ENVIRONMENT: + return gfxd_puts("ENVIRONMENT"); + case G_CCMUX_1: + return gfxd_puts("1"); + default: + return gfxd_puts("0"); + } +} + +UCFUNC int argfn_acmuxabd(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_ACMUX_COMBINED: + return gfxd_puts("COMBINED"); + case G_ACMUX_TEXEL0: + return gfxd_puts("TEXEL0"); + case G_ACMUX_TEXEL1: + return gfxd_puts("TEXEL1"); + case G_ACMUX_PRIMITIVE: + return gfxd_puts("PRIMITIVE"); + case G_ACMUX_SHADE: + return gfxd_puts("SHADE"); + case G_ACMUX_ENVIRONMENT: + return gfxd_puts("ENVIRONMENT"); + case G_ACMUX_1: + return gfxd_puts("1"); + default: + return gfxd_puts("0"); + } +} + +UCFUNC int argfn_acmuxc(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_ACMUX_LOD_FRACTION: + return gfxd_puts("LOD_FRACTION"); + case G_ACMUX_TEXEL0: + return gfxd_puts("TEXEL0"); + case G_ACMUX_TEXEL1: + return gfxd_puts("TEXEL1"); + case G_ACMUX_PRIMITIVE: + return gfxd_puts("PRIMITIVE"); + case G_ACMUX_SHADE: + return gfxd_puts("SHADE"); + case G_ACMUX_ENVIRONMENT: + return gfxd_puts("ENVIRONMENT"); + case G_ACMUX_PRIM_LOD_FRAC: + return gfxd_puts("PRIM_LOD_FRAC"); + default: + return gfxd_puts("0"); + } +} + +struct cc_mode +{ + int a; + int b; + int c; + int d; + int Aa; + int Ab; + int Ac; + int Ad; +}; + +struct cc_preset +{ + struct cc_mode mode; + const char * name; +}; + +#define CC_(a,b,c,d,Aa,Ab,Ac,Ad) \ + { \ + G_CCMUX_##a, G_CCMUX_##b, \ + G_CCMUX_##c, G_CCMUX_##d, \ + G_ACMUX_##Aa, G_ACMUX_##Ab, \ + G_ACMUX_##Ac, G_ACMUX_##Ad \ + } +#define CC(m) CC_(m) +static const struct cc_preset cc_presets[] = +{ + {CC(G_CC_MODULATEI), "G_CC_MODULATEI"}, + {CC(G_CC_MODULATEIA), "G_CC_MODULATEIA"}, + {CC(G_CC_MODULATEIDECALA), "G_CC_MODULATEIDECALA"}, + {CC(G_CC_MODULATERGB), "G_CC_MODULATERGB"}, + {CC(G_CC_MODULATERGBA), "G_CC_MODULATERGBA"}, + {CC(G_CC_MODULATERGBDECALA), "G_CC_MODULATERGBDECALA"}, + {CC(G_CC_MODULATEI_PRIM), "G_CC_MODULATEI_PRIM"}, + {CC(G_CC_MODULATEIA_PRIM), "G_CC_MODULATEIA_PRIM"}, + {CC(G_CC_MODULATEIDECALA_PRIM), "G_CC_MODULATEIDECALA_PRIM"}, + {CC(G_CC_MODULATERGB_PRIM), "G_CC_MODULATERGB_PRIM"}, + {CC(G_CC_MODULATERGBA_PRIM), "G_CC_MODULATERGBA_PRIM"}, + {CC(G_CC_MODULATERGBDECALA_PRIM), "G_CC_MODULATERGBDECALA_PRIM"}, + {CC(G_CC_DECALRGB), "G_CC_DECALRGB"}, + {CC(G_CC_DECALRGBA), "G_CC_DECALRGBA"}, + {CC(G_CC_BLENDI), "G_CC_BLENDI"}, + {CC(G_CC_BLENDIA), "G_CC_BLENDIA"}, + {CC(G_CC_BLENDIDECALA), "G_CC_BLENDIDECALA"}, + {CC(G_CC_BLENDRGBA), "G_CC_BLENDRGBA"}, + {CC(G_CC_BLENDRGBDECALA), "G_CC_BLENDRGBDECALA"}, + {CC(G_CC_REFLECTRGB), "G_CC_REFLECTRGB"}, + {CC(G_CC_REFLECTRGBDECALA), "G_CC_REFLECTRGBDECALA"}, + {CC(G_CC_HILITERGB), "G_CC_HILITERGB"}, + {CC(G_CC_HILITERGBA), "G_CC_HILITERGBA"}, + {CC(G_CC_HILITERGBDECALA), "G_CC_HILITERGBDECALA"}, + {CC(G_CC_1CYUV2RGB), "G_CC_1CYUV2RGB"}, + {CC(G_CC_PRIMITIVE), "G_CC_PRIMITIVE"}, + {CC(G_CC_SHADE), "G_CC_SHADE"}, + {CC(G_CC_ADDRGB), "G_CC_ADDRGB"}, + {CC(G_CC_ADDRGBDECALA), "G_CC_ADDRGBDECALA"}, + {CC(G_CC_SHADEDECALA), "G_CC_SHADEDECALA"}, + {CC(G_CC_BLENDPE), "G_CC_BLENDPE"}, + {CC(G_CC_BLENDPEDECALA), "G_CC_BLENDPEDECALA"}, + {CC(G_CC_TRILERP), "G_CC_TRILERP"}, + {CC(G_CC_TEMPLERP), "G_CC_TEMPLERP"}, + {CC(G_CC_INTERFERENCE), "G_CC_INTERFERENCE"}, + {CC(_G_CC_BLENDPE), "_G_CC_BLENDPE"}, + {CC(_G_CC_BLENDPEDECALA), "_G_CC_BLENDPEDECALA"}, + {CC(_G_CC_SPARSEST), "_G_CC_SPARSEST"}, + {CC(_G_CC_TWOCOLORTEX), "_G_CC_TWOCOLORTEX"}, + {CC(G_CC_MODULATEI2), "G_CC_MODULATEI2"}, + {CC(G_CC_MODULATEIA2), "G_CC_MODULATEIA2"}, + {CC(G_CC_MODULATERGB2), "G_CC_MODULATERGB2"}, + {CC(G_CC_MODULATERGBA2), "G_CC_MODULATERGBA2"}, + {CC(G_CC_MODULATEI_PRIM2), "G_CC_MODULATEI_PRIM2"}, + {CC(G_CC_MODULATEIA_PRIM2), "G_CC_MODULATEIA_PRIM2"}, + {CC(G_CC_MODULATERGB_PRIM2), "G_CC_MODULATERGB_PRIM2"}, + {CC(G_CC_MODULATERGBA_PRIM2), "G_CC_MODULATERGBA_PRIM2"}, + {CC(G_CC_DECALRGB2), "G_CC_DECALRGB2"}, + {CC(G_CC_BLENDI2), "G_CC_BLENDI2"}, + {CC(G_CC_BLENDIA2), "G_CC_BLENDIA2"}, + {CC(G_CC_HILITERGB2), "G_CC_HILITERGB2"}, + {CC(G_CC_HILITERGBA2), "G_CC_HILITERGBA2"}, + {CC(G_CC_HILITERGBDECALA2), "G_CC_HILITERGBDECALA2"}, + {CC(G_CC_HILITERGBPASSA2), "G_CC_HILITERGBPASSA2"}, + {CC(G_CC_CHROMA_KEY2), "G_CC_CHROMA_KEY2"}, + {CC(G_CC_YUV2RGB), "G_CC_YUV2RGB"}, + {CC(G_CC_PASS2), "G_CC_PASS2"}, +}; +#undef CC_ +#undef CC + +UCFUNC int argfn_ccpre(const gfxd_value_t *v) +{ + return gfxd_printf("%s", cc_presets[v->i].name); +} + +UCFUNC int argfn_sc(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_SC_NON_INTERLACE: + return gfxd_puts("G_SC_NON_INTERLACE"); + case G_SC_EVEN_INTERLACE: + return gfxd_puts("G_SC_EVEN_INTERLACE"); + case G_SC_ODD_INTERLACE: + return gfxd_puts("G_SC_ODD_INTERLACE"); + default: + return gfxd_printf("%" PRIi32, v->i); + } +} + +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +UCFUNC int argfn_bz(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_BZ_PERSP: + return gfxd_puts("G_BZ_PERSP"); + default: + return gfxd_puts("G_BZ_ORTHO"); + } +} +#endif + +UCFUNC int argfn_dlf(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_DL_PUSH: + return gfxd_puts("G_DL_PUSH"); + case G_DL_NOPUSH: + return gfxd_puts("G_DL_NOPUSH"); + default: + return gfxd_printf("%" PRIi32, v->i);; + } +} + +UCFUNC int argfn_mp(const gfxd_value_t *v) +{ + int n = 0; + if (v->u & G_MTX_PUSH) + n += gfxd_puts("G_MTX_PUSH"); + else + n += gfxd_puts("G_MTX_NOPUSH"); + if (v->u & G_MTX_LOAD) + n += gfxd_puts(" | G_MTX_LOAD"); + else + n += gfxd_puts(" | G_MTX_MUL"); + if (v->u & G_MTX_PROJECTION) + n += gfxd_puts(" | G_MTX_PROJECTION"); + else + n += gfxd_puts(" | G_MTX_MODELVIEW"); + for (int i = 3; i < 8; i++) + if (v->u & (1 << i)) + n += gfxd_printf(" | 0x%02x", 1 << i); + return n; +} + +UCFUNC int argfn_ms(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_MTX_MODELVIEW: + return gfxd_puts("G_MTX_MODELVIEW"); + case G_MTX_PROJECTION: + return gfxd_puts("G_MTX_PROJECTION"); + default: + return gfxd_printf("%" PRIi32, v->i); + } +} + +UCFUNC int argfn_mw(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_MW_MATRIX: + return gfxd_puts("G_MW_MATRIX"); + case G_MW_NUMLIGHT: + return gfxd_puts("G_MW_NUMLIGHT"); + case G_MW_CLIP: + return gfxd_puts("G_MW_CLIP"); + case G_MW_SEGMENT: + return gfxd_puts("G_MW_SEGMENT"); + case G_MW_FOG: + return gfxd_puts("G_MW_FOG"); + case G_MW_LIGHTCOL: + return gfxd_puts("G_MW_LIGHTCOL"); + case G_MW_PERSPNORM: + return gfxd_puts("G_MW_PERSPNORM"); +#if defined(F3D_GBI) || defined(F3DEX_GBI) + case G_MW_POINTS: + return gfxd_puts("G_MW_POINTS"); +#endif +#if defined(F3DEX_GBI_2) + case G_MW_FORCEMTX: + return gfxd_puts("G_MW_FORCEMTX"); +#endif + default: + return gfxd_printf("%" PRIi32, v->i); + } +} + +UCFUNC int argfn_mwo_clip(const gfxd_value_t *v) +{ + switch (v->u) + { + case G_MWO_CLIP_RNX: + return gfxd_puts("G_MWO_CLIP_RNX"); + case G_MWO_CLIP_RNY: + return gfxd_puts("G_MWO_CLIP_RNY"); + case G_MWO_CLIP_RPX: + return gfxd_puts("G_MWO_CLIP_RPX"); + case G_MWO_CLIP_RPY: + return gfxd_puts("G_MWO_CLIP_RPY"); + default: + return gfxd_printf("0x%04" PRIX32, v->u); + } +} + +UCFUNC int argfn_mwo_lightcol(const gfxd_value_t *v) +{ + switch (v->u) + { + case G_MWO_aLIGHT_1: + return gfxd_puts("G_MWO_aLIGHT_1"); + case G_MWO_bLIGHT_1: + return gfxd_puts("G_MWO_bLIGHT_1"); + case G_MWO_aLIGHT_2: + return gfxd_puts("G_MWO_aLIGHT_2"); + case G_MWO_bLIGHT_2: + return gfxd_puts("G_MWO_bLIGHT_2"); + case G_MWO_aLIGHT_3: + return gfxd_puts("G_MWO_aLIGHT_3"); + case G_MWO_bLIGHT_3: + return gfxd_puts("G_MWO_bLIGHT_3"); + case G_MWO_aLIGHT_4: + return gfxd_puts("G_MWO_aLIGHT_4"); + case G_MWO_bLIGHT_4: + return gfxd_puts("G_MWO_bLIGHT_4"); + case G_MWO_aLIGHT_5: + return gfxd_puts("G_MWO_aLIGHT_5"); + case G_MWO_bLIGHT_5: + return gfxd_puts("G_MWO_bLIGHT_5"); + case G_MWO_aLIGHT_6: + return gfxd_puts("G_MWO_aLIGHT_6"); + case G_MWO_bLIGHT_6: + return gfxd_puts("G_MWO_bLIGHT_6"); + case G_MWO_aLIGHT_7: + return gfxd_puts("G_MWO_aLIGHT_7"); + case G_MWO_bLIGHT_7: + return gfxd_puts("G_MWO_bLIGHT_7"); + case G_MWO_aLIGHT_8: + return gfxd_puts("G_MWO_aLIGHT_8"); + case G_MWO_bLIGHT_8: + return gfxd_puts("G_MWO_bLIGHT_8"); + default: + return gfxd_printf("0x%04" PRIX32, v->u); + } +} + +UCFUNC int argfn_lightnum(const gfxd_value_t *v) +{ + return gfxd_printf("LIGHT_%" PRIi32, v->i); +} + +UCFUNC int argfn_lightsn(const gfxd_value_t *v) +{ + return gfxd_printf("*(Lightsn *)0x%08" PRIX32, v->u); +} + +UCFUNC int argfn_mwo_matrix(const gfxd_value_t *v) +{ + switch (v->u) + { + case G_MWO_MATRIX_XX_XY_I: + return gfxd_puts("G_MWO_MATRIX_XX_XY_I"); + case G_MWO_MATRIX_XZ_XW_I: + return gfxd_puts("G_MWO_MATRIX_XZ_XW_I"); + case G_MWO_MATRIX_YX_YY_I: + return gfxd_puts("G_MWO_MATRIX_YX_YY_I"); + case G_MWO_MATRIX_YZ_YW_I: + return gfxd_puts("G_MWO_MATRIX_YZ_YW_I"); + case G_MWO_MATRIX_ZX_ZY_I: + return gfxd_puts("G_MWO_MATRIX_ZX_ZY_I"); + case G_MWO_MATRIX_ZZ_ZW_I: + return gfxd_puts("G_MWO_MATRIX_ZZ_ZW_I"); + case G_MWO_MATRIX_WX_WY_I: + return gfxd_puts("G_MWO_MATRIX_WX_WY_I"); + case G_MWO_MATRIX_WZ_WW_I: + return gfxd_puts("G_MWO_MATRIX_WZ_WW_I"); + case G_MWO_MATRIX_XX_XY_F: + return gfxd_puts("G_MWO_MATRIX_XX_XY_F"); + case G_MWO_MATRIX_XZ_XW_F: + return gfxd_puts("G_MWO_MATRIX_XZ_XW_F"); + case G_MWO_MATRIX_YX_YY_F: + return gfxd_puts("G_MWO_MATRIX_YX_YY_F"); + case G_MWO_MATRIX_YZ_YW_F: + return gfxd_puts("G_MWO_MATRIX_YZ_YW_F"); + case G_MWO_MATRIX_ZX_ZY_F: + return gfxd_puts("G_MWO_MATRIX_ZX_ZY_F"); + case G_MWO_MATRIX_ZZ_ZW_F: + return gfxd_puts("G_MWO_MATRIX_ZZ_ZW_F"); + case G_MWO_MATRIX_WX_WY_F: + return gfxd_puts("G_MWO_MATRIX_WX_WY_F"); + case G_MWO_MATRIX_WZ_WW_F: + return gfxd_puts("G_MWO_MATRIX_WZ_WW_F"); + default: + return gfxd_printf("0x%04" PRIX32, v->u); + } +} + +UCFUNC int argfn_mwo_point(const gfxd_value_t *v) +{ + switch (v->u) + { + case G_MWO_POINT_RGBA: + return gfxd_puts("G_MWO_POINT_RGBA"); + case G_MWO_POINT_ST: + return gfxd_puts("G_MWO_POINT_ST"); + case G_MWO_POINT_XYSCREEN: + return gfxd_puts("G_MWO_POINT_XYSCREEN"); + case G_MWO_POINT_ZSCREEN: + return gfxd_puts("G_MWO_POINT_ZSCREEN"); + default: + return gfxd_printf("0x%04" PRIX32, v->u); + } +} + +UCFUNC int argfn_mv(const gfxd_value_t *v) +{ + switch (v->i) + { + case G_MV_VIEWPORT: + return gfxd_puts("G_MV_VIEWPORT"); +#if defined(F3D_GBI) || defined(F3DEX_GBI) + case G_MV_LOOKATY: + return gfxd_puts("G_MV_LOOKATY"); + case G_MV_LOOKATX: + return gfxd_puts("G_MV_LOOKATX"); + case G_MV_L0: + return gfxd_puts("G_MV_L0"); + case G_MV_L1: + return gfxd_puts("G_MV_L1"); + case G_MV_L2: + return gfxd_puts("G_MV_L2"); + case G_MV_L3: + return gfxd_puts("G_MV_L3"); + case G_MV_L4: + return gfxd_puts("G_MV_L4"); + case G_MV_L5: + return gfxd_puts("G_MV_L5"); + case G_MV_L6: + return gfxd_puts("G_MV_L6"); + case G_MV_L7: + return gfxd_puts("G_MV_L7"); + case G_MV_TXTATT: + return gfxd_puts("G_MV_TXTATT"); + case G_MV_MATRIX_2: + return gfxd_puts("G_MV_MATRIX_2"); + case G_MV_MATRIX_3: + return gfxd_puts("G_MV_MATRIX_3"); + case G_MV_MATRIX_4: + return gfxd_puts("G_MV_MATRIX_4"); + case G_MV_MATRIX_1: + return gfxd_puts("G_MV_MATRIX_1"); +#elif defined(F3DEX_GBI_2) + case G_MV_MMTX: + return gfxd_puts("G_MV_MMTX"); + case G_MV_PMTX: + return gfxd_puts("G_MV_PMTX"); + case G_MV_LIGHT: + return gfxd_puts("G_MV_LIGHT"); + case G_MV_POINT: + return gfxd_puts("G_MV_POINT"); + case G_MV_MATRIX: + return gfxd_puts("G_MV_MATRIX"); +#endif + default: + return gfxd_printf("%" PRIi32, v->i); + } +} + +UCFUNC int argfn_cr(const gfxd_value_t *v) +{ + switch (v->u) + { + case FRUSTRATIO_1: + return gfxd_puts("FRUSTRATIO_1"); + case FRUSTRATIO_2: + return gfxd_puts("FRUSTRATIO_2"); + case FRUSTRATIO_3: + return gfxd_puts("FRUSTRATIO_3"); + case FRUSTRATIO_4: + return gfxd_puts("FRUSTRATIO_4"); + case FRUSTRATIO_5: + return gfxd_puts("FRUSTRATIO_5"); + case FRUSTRATIO_6: + return gfxd_puts("FRUSTRATIO_6"); + default: + return gfxd_printf("%" PRIu32, v->u); + } +} diff --git a/tools/ZAPD/lib/libgfxd/uc_argtbl.c b/tools/ZAPD/lib/libgfxd/uc_argtbl.c new file mode 100644 index 0000000000..09baa0abbb --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/uc_argtbl.c @@ -0,0 +1,490 @@ +static const gfxd_arg_type_t arg_tbl[] = +{ + [gfxd_Word] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Opcode] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_opc, + }, + [gfxd_Coordi] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_u, + }, + [gfxd_Coordq] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_qu102, + }, + [gfxd_Pal] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Tlut] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Timg] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Tmem] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x16, + }, + [gfxd_Tile] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_tile, + }, + [gfxd_Fmt] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_fmt, + }, + [gfxd_Siz] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_siz, + }, + [gfxd_Dim] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Cm] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_cm, + }, + [gfxd_Tm] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_tm, + }, + [gfxd_Ts] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_ts, + }, + [gfxd_Dxt] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_u, + }, + [gfxd_Tag] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Pm] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_pm, + }, + [gfxd_Colorpart] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_color, + }, + [gfxd_Color] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Lodfrac] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_qu08, + }, + [gfxd_Cimg] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Zimg] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Ac] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_ac, + }, + [gfxd_Ad] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_ad, + }, + [gfxd_Cd] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_cd, + }, + [gfxd_Ccpre] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_ccpre, + }, + [gfxd_Ccmuxa] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_ccmuxa, + }, + [gfxd_Ccmuxb] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_ccmuxb, + }, + [gfxd_Ccmuxc] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_ccmuxc, + }, + [gfxd_Ccmuxd] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_ccmuxd, + }, + [gfxd_Acmuxabd] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_acmuxabd, + }, + [gfxd_Acmuxc] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_acmuxc, + }, + [gfxd_Cv] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_cv, + }, + [gfxd_Tc] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_tc, + }, + [gfxd_Cyc] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_cyc, + }, + [gfxd_Zs] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_zs, + }, + [gfxd_Ck] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_ck, + }, + [gfxd_Keyscale] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_color, + }, + [gfxd_Keywidth] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_qs48, + }, + [gfxd_Zi] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Rm1] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_rm1, + }, + [gfxd_Rm2] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_rm2, + }, + [gfxd_Sc] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_sc, + }, + [gfxd_Td] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_td, + }, + [gfxd_Tf] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_tf, + }, + [gfxd_Tl] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_tl, + }, + [gfxd_Tt] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_tt, + }, + [gfxd_Tp] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_tp, + }, + [gfxd_Line] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Vtx] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Vtxflag] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Dl] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) + [gfxd_Zraw] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_qs1616, + }, +#endif + [gfxd_Dlflag] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_dlf, + }, + [gfxd_Cr] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_cr, + }, + [gfxd_Num] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Fogz] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Fogp] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Mtxptr] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Gm] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_gm, + }, + [gfxd_Mwo_matrix] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_mwo_matrix, + }, + [gfxd_Linewd] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Uctext] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Ucdata] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Size] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x16, + }, + [gfxd_Lookatptr] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Mtxparam] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_mp, + }, + [gfxd_Mtxstack] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_ms, + }, + [gfxd_Mwo_point] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_mwo_point, + }, + [gfxd_Wscale] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_qu016, + }, + [gfxd_Seg] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x8, + }, + [gfxd_Segptr] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Lightsn] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_lightsn, + }, + [gfxd_Numlights] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Lightnum] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_lightnum, + }, + [gfxd_Lightptr] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Tcscale] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_qu016, + }, + [gfxd_Switch] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_switch, + }, + [gfxd_St] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_qs105, + }, + [gfxd_Stdelta] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_qs510, + }, + [gfxd_Vtxptr] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Vpptr] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Dram] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x32, + }, + [gfxd_Dlflag] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, + [gfxd_Sftlo] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_sftlo, + }, + [gfxd_Othermodelo] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_othermodelo, + }, + [gfxd_Sfthi] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_sfthi, + }, + [gfxd_Othermodehi] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_othermodehi, + }, + [gfxd_Mw] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_mw, + }, + [gfxd_Mwo] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x16, + }, + [gfxd_Mwo_clip] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_mwo_clip, + }, + [gfxd_Mwo_lightcol] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_mwo_lightcol, + }, + [gfxd_Mv] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_mv, + }, + [gfxd_Mvo] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x16, + }, + [gfxd_Dmem] = + { + .fmt = gfxd_argfmt_u, + .fn = argfn_x16, + }, + [gfxd_Dmaflag] = + { + .fmt = gfxd_argfmt_i, + .fn = argfn_i, + }, +}; diff --git a/tools/ZAPD/lib/libgfxd/uc_f3d.c b/tools/ZAPD/lib/libgfxd/uc_f3d.c new file mode 100644 index 0000000000..9465515108 --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/uc_f3d.c @@ -0,0 +1,4 @@ +#define uc_name gfxd_f3d +#define F3D_GBI + +#include "uc.c" diff --git a/tools/ZAPD/lib/libgfxd/uc_f3db.c b/tools/ZAPD/lib/libgfxd/uc_f3db.c new file mode 100644 index 0000000000..cd4990412d --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/uc_f3db.c @@ -0,0 +1,5 @@ +#define uc_name gfxd_f3db +#define F3D_GBI +#define F3D_BETA + +#include "uc.c" diff --git a/tools/ZAPD/lib/libgfxd/uc_f3dex.c b/tools/ZAPD/lib/libgfxd/uc_f3dex.c new file mode 100644 index 0000000000..2ec70d8aba --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/uc_f3dex.c @@ -0,0 +1,4 @@ +#define uc_name gfxd_f3dex +#define F3DEX_GBI + +#include "uc.c" diff --git a/tools/ZAPD/lib/libgfxd/uc_f3dex2.c b/tools/ZAPD/lib/libgfxd/uc_f3dex2.c new file mode 100644 index 0000000000..9a19c99038 --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/uc_f3dex2.c @@ -0,0 +1,4 @@ +#define uc_name gfxd_f3dex2 +#define F3DEX_GBI_2 + +#include "uc.c" diff --git a/tools/ZAPD/lib/libgfxd/uc_f3dexb.c b/tools/ZAPD/lib/libgfxd/uc_f3dexb.c new file mode 100644 index 0000000000..2b5c30a4a6 --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/uc_f3dexb.c @@ -0,0 +1,5 @@ +#define uc_name gfxd_f3dexb +#define F3DEX_GBI +#define F3D_BETA + +#include "uc.c" diff --git a/tools/ZAPD/lib/libgfxd/uc_macrofn.c b/tools/ZAPD/lib/libgfxd/uc_macrofn.c new file mode 100644 index 0000000000..707c0cbf5a --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/uc_macrofn.c @@ -0,0 +1,2453 @@ +static inline uint32_t getfield(uint32_t w, int n, int s) +{ + return (w >> s) & (((uint32_t)1 << n) - 1); +} + +static inline int32_t argvi(gfxd_macro_t *m, int idx) +{ + return m->arg[idx].value.i; +} + +static inline uint32_t argvu(gfxd_macro_t *m, int idx) +{ + return m->arg[idx].value.u; +} + +static inline float argvf(gfxd_macro_t *m, int idx) +{ + return m->arg[idx].value.f; +} + +static inline void argi(gfxd_macro_t *m, int idx, const char *name, + int32_t value, int type) +{ + m->arg[idx].type = type; + m->arg[idx].name = name; + m->arg[idx].value.i = value; + m->arg[idx].bad = 0; +} + +static inline void argu(gfxd_macro_t *m, int idx, const char *name, + uint32_t value, int type) +{ + m->arg[idx].type = type; + m->arg[idx].name = name; + m->arg[idx].value.u = value; + m->arg[idx].bad = 0; +} + +static inline void argf(gfxd_macro_t *m, int idx, const char *name, + float value, int type) +{ + m->arg[idx].type = type; + m->arg[idx].name = name; + m->arg[idx].value.f = value; + m->arg[idx].bad = 0; +} + +static inline void badarg(gfxd_macro_t *m, int idx) +{ + m->arg[idx].bad = 1; +} + +UCFUNC int32_t sx(uint32_t n, int bits) +{ + int32_t smin = (int32_t)1 << (bits - 1); + int32_t smax = (int32_t)1 << bits; + int32_t i = n; + if (i < smin) + return i; + else + return i - smax; +} + +UCFUNC int d_Invalid(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_Invalid; + argu(m, 0, "hi", hi, gfxd_Word); + argu(m, 1, "lo", lo, gfxd_Word); + return -1; +} + +UCFUNC int d_DPFillRectangle(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPFillRectangle; + argu(m, 0, "ulx", getfield(lo, 10, 14), gfxd_Coordi); + argu(m, 1, "uly", getfield(lo, 10, 2), gfxd_Coordi); + argu(m, 2, "lrx", getfield(hi, 10, 14), gfxd_Coordi); + argu(m, 3, "lry", getfield(hi, 10, 2), gfxd_Coordi); + return 0; +} + +UCFUNC int d_DPFullSync(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPFullSync; + return 0; +} + +UCFUNC int d_DPLoadSync(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPLoadSync; + return 0; +} + +UCFUNC int d_DPTileSync(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPTileSync; + return 0; +} + +UCFUNC int d_DPPipeSync(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPPipeSync; + return 0; +} + +UCFUNC int c_DPLoadTLUT_pal16(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 6) + return -1; + if (m[0].id != gfxd_DPSetTextureImage + || argvi(&m[0], 0) != G_IM_FMT_RGBA + || argvi(&m[0], 1) != G_IM_SIZ_16b + || argvi(&m[0], 2) != 1) + { + return -1; + } + uint32_t dram = argvu(&m[0], 3); + if (m[1].id != gfxd_DPTileSync) + return -1; + if (m[2].id != gfxd_DPSetTile + || argvi(&m[2], 0) != 0 + || argvi(&m[2], 1) != 0 + || argvi(&m[2], 2) != 0 + || argvu(&m[2], 3) < 0x100 + || argvu(&m[2], 3) % 0x10 != 0 + || argvi(&m[2], 4) != G_TX_LOADTILE + || argvi(&m[2], 5) != 0 + || argvu(&m[2], 6) != 0 + || argvi(&m[2], 7) != 0 + || argvi(&m[2], 8) != 0 + || argvu(&m[2], 9) != 0 + || argvi(&m[2], 10) != 0 + || argvi(&m[2], 11) != 0) + { + return -1; + } + int pal = (argvu(&m[2], 3) - 0x100) / 0x10; + if (m[3].id != gfxd_DPLoadSync) + return -1; + if (m[4].id != gfxd_DPLoadTLUTCmd + || argvi(&m[4], 0) != G_TX_LOADTILE + || argvi(&m[4], 1) != 15) + { + return -1; + } + if (m[5].id != gfxd_DPPipeSync) + return -1; + m->id = gfxd_DPLoadTLUT_pal16; + argi(m, 0, "pal", pal, gfxd_Pal); + argu(m, 1, "dram", dram, gfxd_Tlut); + return 0; +} + +UCFUNC int c_DPLoadTLUT_pal256(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 6) + return -1; + if (m[0].id != gfxd_DPSetTextureImage + || argvi(&m[0], 0) != G_IM_FMT_RGBA + || argvi(&m[0], 1) != G_IM_SIZ_16b + || argvi(&m[0], 2) != 1) + { + return -1; + } + uint32_t dram = argvu(&m[0], 3); + if (m[1].id != gfxd_DPTileSync) + return -1; + if (m[2].id != gfxd_DPSetTile + || argvi(&m[2], 0) != 0 + || argvi(&m[2], 1) != 0 + || argvi(&m[2], 2) != 0 + || argvu(&m[2], 3) != 0x100 + || argvi(&m[2], 4) != G_TX_LOADTILE + || argvi(&m[2], 5) != 0 + || argvu(&m[2], 6) != 0 + || argvi(&m[2], 7) != 0 + || argvi(&m[2], 8) != 0 + || argvu(&m[2], 9) != 0 + || argvi(&m[2], 10) != 0 + || argvi(&m[2], 11) != 0) + { + return -1; + } + if (m[3].id != gfxd_DPLoadSync) + return -1; + if (m[4].id != gfxd_DPLoadTLUTCmd + || argvi(&m[4], 0) != G_TX_LOADTILE + || argvi(&m[4], 1) != 255) + { + return -1; + } + if (m[5].id != gfxd_DPPipeSync) + return -1; + m->id = gfxd_DPLoadTLUT_pal256; + argu(m, 0, "dram", dram, gfxd_Tlut); + return 0; +} + +UCFUNC int c_ltb(gfxd_macro_t *m, int n_macro, int id, int mdxt, int mtmem, + int mrt, int myuv, int m4b) +{ + if (n_macro < 7) + return -1; + if (m[0].id != gfxd_DPSetTextureImage || argvi(&m[0], 2) != 1) + return -1; + g_ifmt_t fmt = argvi(&m[0], 0); + g_isiz_t ldsiz = argvi(&m[0], 1); + uint32_t timg = argvu(&m[0], 3); + if (myuv && fmt != G_IM_FMT_YUV) + return -1; + if (m[1].id != gfxd_DPSetTile + || argvi(&m[1], 0) != fmt + || argvi(&m[1], 1) != ldsiz + || argvi(&m[1], 2) != 0 + || argvi(&m[1], 4) != G_TX_LOADTILE + || argvi(&m[1], 5) != 0) + { + return -1; + } + uint32_t tmem = argvu(&m[1], 3); + unsigned cms = argvu(&m[1], 9); + unsigned cmt = argvu(&m[1], 6); + int masks = argvi(&m[1], 10); + int maskt = argvi(&m[1], 7); + int shifts = argvi(&m[1], 11); + int shiftt = argvi(&m[1], 8); + if (m[2].id != gfxd_DPLoadSync) + return -1; + if (m[3].id != gfxd_DPLoadBlock + || argvi(&m[3], 0) != G_TX_LOADTILE + || argvu(&m[3], 1) != 0 + || argvu(&m[3], 2) != 0) + { + return -1; + } + qu102_t ldlrs = argvu(&m[3], 3); + unsigned lddxt = argvu(&m[3], 4); + if (m[4].id != gfxd_DPPipeSync) + return -1; + if (m[5].id != gfxd_DPSetTile + || argvi(&m[5], 0) != fmt + || G_SIZ_LDSIZ(argvi(&m[5], 1)) != ldsiz + || argvu(&m[5], 3) != tmem + || argvu(&m[5], 6) != cmt + || argvi(&m[5], 7) != maskt + || argvi(&m[5], 8) != shiftt + || argvu(&m[5], 9) != cms + || argvi(&m[5], 10) != masks + || argvi(&m[5], 11) != shifts) + { + return -1; + } + int siz = argvi(&m[5], 1); + int rdline = argvi(&m[5], 2); + int rt = argvi(&m[5], 4); + int pal = argvi(&m[5], 5); + if (m4b && siz != G_IM_SIZ_4b) + return -1; + if (!(mrt && rt != G_TX_RENDERTILE && tmem == 0) + && (tmem != 0) != mtmem) + { + return -1; + } + if ((rt != G_TX_RENDERTILE) != mrt) + return -1; + if (m[6].id != gfxd_DPSetTileSize + || argvi(&m[6], 0) != rt + || argvu(&m[6], 1) != 0 + || argvu(&m[6], 2) != 0 + || (argvu(&m[6], 3) & 3) + || (argvu(&m[6], 4) & 3)) + { + return -1; + } + int width = (argvu(&m[6], 3) >> 2) + 1; + int height = (argvu(&m[6], 4) >> 2) + 1; + unsigned lrs = ((width * height + 1) * G_SIZ_BITS(siz) - 1) / + G_SIZ_BITS(G_SIZ_LDSIZ(siz)) - 1; + unsigned dxt = 0; + if (!mdxt) + { + dxt = (width * G_SIZ_BITS(siz) <= 64 ? (1 << 11) : + ((1 << 11) + width * G_SIZ_BITS(siz) / 64 - 1) / + (width * G_SIZ_BITS(siz) / 64)); + } + int line; + if (myuv) + line = (width + 7) / 8; + else + line = (width * G_SIZ_LDBITS(siz) + 63) / 64; + if (ldlrs != lrs || lddxt != dxt || rdline != line) + return -1; + m->id = id; + int i = 0; + argu(m, i++, "timg", timg, gfxd_Timg); + if (mtmem) + argu(m, i++, "tmem", tmem, gfxd_Tmem); + if (mrt) + argi(m, i++, "rtile", rt, gfxd_Tile); + argi(m, i++, "fmt", fmt, gfxd_Fmt); + if (!m4b) + argi(m, i++, "siz", siz, gfxd_Siz); + argi(m, i++, "width", width, gfxd_Dim); + argi(m, i++, "height", height, gfxd_Dim); + argi(m, i++, "pal", pal, gfxd_Pal); + argu(m, i++, "cms", cms, gfxd_Cm); + argu(m, i++, "cmt", cmt, gfxd_Cm); + argi(m, i++, "masks", masks, gfxd_Tm); + argi(m, i++, "maskt", maskt, gfxd_Tm); + argi(m, i++, "shifts", shifts, gfxd_Ts); + argi(m, i++, "shiftt", shiftt, gfxd_Ts); + return 0; +} + +UCFUNC int c_DPLoadMultiBlockYuvS(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadMultiBlockYuvS, 1, 1, 1, 1, 0); +} + +UCFUNC int c_DPLoadMultiBlockYuv(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadMultiBlockYuv, 0, 1, 1, 1, 0); +} + +UCFUNC int c_DPLoadMultiBlock_4bS(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadMultiBlock_4bS, 1, 1, 1, 0, 1); +} + +UCFUNC int c_DPLoadMultiBlock_4b(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadMultiBlock_4b, 0, 1, 1, 0, 1); +} + +UCFUNC int c_DPLoadMultiBlockS(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadMultiBlockS, 1, 1, 1, 0, 0); +} + +UCFUNC int c_DPLoadMultiBlock(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadMultiBlock, 0, 1, 1, 0, 0); +} + +UCFUNC int c__DPLoadTextureBlockYuvS(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd__DPLoadTextureBlockYuvS, 1, 1, 0, 1, 0); +} + +UCFUNC int c__DPLoadTextureBlockYuv(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd__DPLoadTextureBlockYuv, 0, 1, 0, 1, 0); +} + +UCFUNC int c__DPLoadTextureBlock_4bS(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd__DPLoadTextureBlock_4bS, 1, 1, 0, 0, 1); +} + +UCFUNC int c__DPLoadTextureBlock_4b(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd__DPLoadTextureBlock_4b, 0, 1, 0, 0, 1); +} + +UCFUNC int c__DPLoadTextureBlockS(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd__DPLoadTextureBlockS, 1, 1, 0, 0, 0); +} + +UCFUNC int c__DPLoadTextureBlock(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd__DPLoadTextureBlock, 0, 1, 0, 0, 0); +} + +UCFUNC int c_DPLoadTextureBlockYuvS(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadTextureBlockYuvS, 1, 0, 0, 1, 0); +} + +UCFUNC int c_DPLoadTextureBlockYuv(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadTextureBlockYuv, 0, 0, 0, 1, 0); +} + +UCFUNC int c_DPLoadTextureBlock_4bS(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadTextureBlock_4bS, 1, 0, 0, 0, 1); +} + +UCFUNC int c_DPLoadTextureBlock_4b(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadTextureBlock_4b, 0, 0, 0, 0, 1); +} + +UCFUNC int c_DPLoadTextureBlockS(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadTextureBlockS, 1, 0, 0, 0, 0); +} + +UCFUNC int c_DPLoadTextureBlock(gfxd_macro_t *m, int n_macro) +{ + return c_ltb(m, n_macro, gfxd_DPLoadTextureBlock, 0, 0, 0, 0, 0); +} + +UCFUNC int c_ltt(gfxd_macro_t *m, int n_macro, int id, int mtmem, int mrt, + int myuv, int m4b) +{ + if (n_macro < 7) + return -1; + if (m[0].id != gfxd_DPSetTextureImage) + return -1; + g_ifmt_t fmt = argvi(&m[0], 0); + g_isiz_t ldsiz = argvi(&m[0], 1); + int width = argvi(&m[0], 2); + if (m4b) + { + if (ldsiz != G_IM_SIZ_8b) + return -1; + width *= 2; + } + uint32_t timg = argvu(&m[0], 3); + if (myuv && fmt != G_IM_FMT_YUV) + return -1; + if (m[1].id != gfxd_DPSetTile + || argvi(&m[1], 0) != fmt + || argvi(&m[1], 1) != ldsiz + || argvi(&m[1], 4) != G_TX_LOADTILE + || argvi(&m[1], 5) != 0) + { + return -1; + } + int ldline = argvi(&m[1], 2); + uint32_t tmem = argvu(&m[1], 3); + unsigned cms = argvu(&m[1], 9); + unsigned cmt = argvu(&m[1], 6); + int masks = argvi(&m[1], 10); + int maskt = argvi(&m[1], 7); + int shifts = argvi(&m[1], 11); + int shiftt = argvi(&m[1], 8); + if (m[2].id != gfxd_DPLoadSync) + return -1; + if (m[3].id != gfxd_DPLoadTile + || argvi(&m[3], 0) != G_TX_LOADTILE + || (argvu(&m[3], 1) & 1) + || (argvu(&m[3], 2) & 3) + || (argvu(&m[3], 3) & 1) + || (argvu(&m[3], 4) & 3)) + { + return -1; + } + qu102_t lduls = argvu(&m[3], 1); + qu102_t ldult = argvu(&m[3], 2); + qu102_t ldlrs = argvu(&m[3], 3); + qu102_t ldlrt = argvu(&m[3], 4); + if (m[4].id != gfxd_DPPipeSync) + return -1; + if (m[5].id != gfxd_DPSetTile + || argvi(&m[5], 0) != fmt + || argvi(&m[5], 2) != ldline + || argvu(&m[5], 3) != tmem + || argvu(&m[5], 6) != cmt + || argvi(&m[5], 7) != maskt + || argvi(&m[5], 8) != shiftt + || argvu(&m[5], 9) != cms + || argvi(&m[5], 10) != masks + || argvi(&m[5], 11) != shifts) + { + return -1; + } + int siz = argvi(&m[5], 1); + int rt = argvi(&m[5], 4); + int pal = argvi(&m[5], 5); + if (m4b) + { + if (siz != G_IM_SIZ_4b) + return -1; + } + else if (siz != ldsiz) + return -1; + if (!(mrt && rt != G_TX_RENDERTILE && tmem == 0) + && (tmem != 0) != mtmem) + { + return -1; + } + if ((rt != G_TX_RENDERTILE) != mrt) + return -1; + if (m[6].id != gfxd_DPSetTileSize + || argvi(&m[6], 0) != rt + || (argvu(&m[6], 1) & 3) + || (argvu(&m[6], 2) & 3) + || (argvu(&m[6], 3) & 3) + || (argvu(&m[6], 4) & 3)) + { + return -1; + } + unsigned uls = argvu(&m[6], 1) >> 2; + unsigned ult = argvu(&m[6], 2) >> 2; + unsigned lrs = argvu(&m[6], 3) >> 2; + unsigned lrt = argvu(&m[6], 4) >> 2; + int line; + if (myuv) + line = ((lrs - uls + 1) + 7) / 8; + else if (m4b) + line = ((lrs - uls + 1) / 2 + 7) / 8; + else + line = ((lrs - uls + 1) * G_SIZ_LDBITS(siz) + 63) / 64; + if (m4b) + { + if (lduls != qu102(uls) / 2 || ldlrs != qu102(lrs) / 2) + return -1; + } + else if (lduls != qu102(uls) || ldlrs != qu102(lrs)) + return -1; + if (ldult != qu102(ult) || ldlrt != qu102(lrt) || ldline != line) + return -1; + m->id = id; + int i = 0; + argu(m, i++, "timg", timg, gfxd_Timg); + if (mtmem) + argu(m, i++, "tmem", tmem, gfxd_Tmem); + if (mrt) + argi(m, i++, "rtile", rt, gfxd_Tile); + argi(m, i++, "fmt", fmt, gfxd_Fmt); + if (!m4b) + argi(m, i++, "siz", siz, gfxd_Siz); + argi(m, i++, "width", width, gfxd_Dim); + argi(m, i++, "height", 0, gfxd_Dim); + argu(m, i++, "uls", uls, gfxd_Coordi); + argu(m, i++, "ult", ult, gfxd_Coordi); + argu(m, i++, "lrs", lrs, gfxd_Coordi); + argu(m, i++, "lrt", lrt, gfxd_Coordi); + argi(m, i++, "pal", pal, gfxd_Pal); + argu(m, i++, "cms", cms, gfxd_Cm); + argu(m, i++, "cmt", cmt, gfxd_Cm); + argi(m, i++, "masks", masks, gfxd_Tm); + argi(m, i++, "maskt", maskt, gfxd_Tm); + argi(m, i++, "shifts", shifts, gfxd_Ts); + argi(m, i++, "shiftt", shiftt, gfxd_Ts); + return 0; +} + +UCFUNC int c_DPLoadMultiTileYuv(gfxd_macro_t *m, int n_macro) +{ + return c_ltt(m, n_macro, gfxd_DPLoadMultiTileYuv, 1, 1, 1, 0); +} + +UCFUNC int c_DPLoadMultiTile_4b(gfxd_macro_t *m, int n_macro) +{ + return c_ltt(m, n_macro, gfxd_DPLoadMultiTile_4b, 1, 1, 0, 1); +} + +UCFUNC int c_DPLoadMultiTile(gfxd_macro_t *m, int n_macro) +{ + return c_ltt(m, n_macro, gfxd_DPLoadMultiTile, 1, 1, 0, 0); +} + +UCFUNC int c__DPLoadTextureTileYuv(gfxd_macro_t *m, int n_macro) +{ + return c_ltt(m, n_macro, gfxd__DPLoadTextureTileYuv, 1, 0, 1, 0); +} + +UCFUNC int c__DPLoadTextureTile_4b(gfxd_macro_t *m, int n_macro) +{ + return c_ltt(m, n_macro, gfxd__DPLoadTextureTile_4b, 1, 0, 0, 1); +} + +UCFUNC int c__DPLoadTextureTile(gfxd_macro_t *m, int n_macro) +{ + return c_ltt(m, n_macro, gfxd__DPLoadTextureTile, 1, 0, 0, 0); +} + +UCFUNC int c_DPLoadTextureTileYuv(gfxd_macro_t *m, int n_macro) +{ + return c_ltt(m, n_macro, gfxd_DPLoadTextureTileYuv, 0, 0, 1, 0); +} + +UCFUNC int c_DPLoadTextureTile_4b(gfxd_macro_t *m, int n_macro) +{ + return c_ltt(m, n_macro, gfxd_DPLoadTextureTile_4b, 0, 0, 0, 1); +} + +UCFUNC int c_DPLoadTextureTile(gfxd_macro_t *m, int n_macro) +{ + return c_ltt(m, n_macro, gfxd_DPLoadTextureTile, 0, 0, 0, 0); +} + +UCFUNC int d_DPLoadBlock(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPLoadBlock; + argi(m, 0, "tile", getfield(lo, 3, 24), gfxd_Tile); + argu(m, 1, "uls", getfield(hi, 12, 12), gfxd_Coordi); + argu(m, 2, "ult", getfield(hi, 12, 0), gfxd_Coordi); + argu(m, 3, "lrs", getfield(lo, 12, 12), gfxd_Coordi); + argu(m, 4, "dxt", getfield(lo, 12, 0), gfxd_Dxt); + return 0; +} + +UCFUNC int d_DPNoOp(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPNoOp; + return 0; +} + +UCFUNC int d_DPNoOpTag(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + if (lo == 0) + return d_DPNoOp(m, hi, lo); + else + { + m->id = gfxd_DPNoOpTag; + argu(m, 0, "tag", lo, gfxd_Tag); + return 0; + } +} + +UCFUNC int d_DPPipelineMode(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPPipelineMode; + argu(m, 0, "mode", lo, gfxd_Pm); + return 0; +} + +UCFUNC int d_DPSetBlendColor(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetBlendColor; + argu(m, 0, "r", getfield(lo, 8, 24), gfxd_Colorpart); + argu(m, 1, "g", getfield(lo, 8, 16), gfxd_Colorpart); + argu(m, 2, "b", getfield(lo, 8, 8), gfxd_Colorpart); + argu(m, 3, "a", getfield(lo, 8, 0), gfxd_Colorpart); + return 0; +} + +UCFUNC int d_DPSetEnvColor(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetEnvColor; + argu(m, 0, "r", getfield(lo, 8, 24), gfxd_Colorpart); + argu(m, 1, "g", getfield(lo, 8, 16), gfxd_Colorpart); + argu(m, 2, "b", getfield(lo, 8, 8), gfxd_Colorpart); + argu(m, 3, "a", getfield(lo, 8, 0), gfxd_Colorpart); + return 0; +} + +UCFUNC int d_DPSetFillColor(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetFillColor; + argu(m, 0, "c", lo, gfxd_Color); + return 0; +} + +UCFUNC int d_DPSetFogColor(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetFogColor; + argu(m, 0, "r", getfield(lo, 8, 24), gfxd_Colorpart); + argu(m, 1, "g", getfield(lo, 8, 16), gfxd_Colorpart); + argu(m, 2, "b", getfield(lo, 8, 8), gfxd_Colorpart); + argu(m, 3, "a", getfield(lo, 8, 0), gfxd_Colorpart); + return 0; +} + +UCFUNC int d_DPSetPrimColor(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetPrimColor; + argu(m, 0, "m", getfield(hi, 8, 8), gfxd_Lodfrac); + argu(m, 1, "l", getfield(hi, 8, 0), gfxd_Lodfrac); + argu(m, 2, "r", getfield(lo, 8, 24), gfxd_Colorpart); + argu(m, 3, "g", getfield(lo, 8, 16), gfxd_Colorpart); + argu(m, 4, "b", getfield(lo, 8, 8), gfxd_Colorpart); + argu(m, 5, "a", getfield(lo, 8, 0), gfxd_Colorpart); + return 0; +} + +UCFUNC int d_DPSetColorImage(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetColorImage; + argi(m, 0, "fmt", getfield(hi, 3, 21), gfxd_Fmt); + argi(m, 1, "siz", getfield(hi, 2, 19), gfxd_Siz); + argi(m, 2, "width", getfield(hi, 12, 0) + 1, gfxd_Dim); + argu(m, 3, "cimg", lo, gfxd_Cimg); + return 0; +} + +UCFUNC int d_DPSetDepthImage(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetDepthImage; + argu(m, 0, "zimg", lo, gfxd_Zimg); + return 0; +} + +UCFUNC int d_DPSetTextureImage(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetTextureImage; + argi(m, 0, "fmt", getfield(hi, 3, 21), gfxd_Fmt); + argi(m, 1, "siz", getfield(hi, 2, 19), gfxd_Siz); + argi(m, 2, "width", getfield(hi, 12, 0) + 1, gfxd_Dim); + argu(m, 3, "timg", lo, gfxd_Timg); + return 0; +} + +UCFUNC int d_DPSetAlphaCompare(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetAlphaCompare; + argu(m, 0, "mode", lo, gfxd_Ac); + return 0; +} + +UCFUNC int d_DPSetAlphaDither(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetAlphaDither; + argu(m, 0, "mode", lo, gfxd_Ad); + return 0; +} + +UCFUNC int d_DPSetColorDither(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetColorDither; + argu(m, 0, "mode", lo, gfxd_Cd); + return 0; +} + +UCFUNC void cc_unpack(struct cc_mode *m0, struct cc_mode *m1, uint32_t hi, + uint32_t lo) +{ + m0->a = getfield(hi, 4, 20); + m0->b = getfield(lo, 4, 28); + m0->c = getfield(hi, 5, 15); + m0->d = getfield(lo, 3, 15); + m0->Aa = getfield(hi, 3, 12); + m0->Ab = getfield(lo, 3, 12); + m0->Ac = getfield(hi, 3, 9); + m0->Ad = getfield(lo, 3, 9); + m1->a = getfield(hi, 4, 5); + m1->b = getfield(lo, 4, 24); + m1->c = getfield(hi, 5, 0); + m1->d = getfield(lo, 3, 6); + m1->Aa = getfield(lo, 3, 21); + m1->Ab = getfield(lo, 3, 3); + m1->Ac = getfield(lo, 3, 18); + m1->Ad = getfield(lo, 3, 0); +} + +UCFUNC int cc_lookup(const struct cc_mode *m) +{ + struct cc_mode m_norm = *m; + if (m_norm.a > 0x7) m_norm.a = G_CCMUX_0; + if (m_norm.b > 0x7) m_norm.b = G_CCMUX_0; + if (m_norm.c > 0xF) m_norm.c = G_CCMUX_0; + if (m_norm.d > 0x6) m_norm.d = G_CCMUX_0; + m = &m_norm; + int n_presets = sizeof(cc_presets) / sizeof(*cc_presets); + for (int i = 0; i < n_presets; i++) + { + const struct cc_mode *p = &cc_presets[i].mode; + if (m->a == p->a + && m->b == p->b + && m->c == p->c + && m->d == p->d + && m->Aa == p->Aa + && m->Ab == p->Ab + && m->Ac == p->Ac + && m->Ad == p->Ad) + { + return i; + } + } + return -1; +} + +UCFUNC int d_DPSetCombineMode(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetCombineMode; + struct cc_mode m0; + struct cc_mode m1; + cc_unpack(&m0, &m1, hi, lo); + int p0 = cc_lookup(&m0); + int p1 = cc_lookup(&m1); + argi(m, 0, "mode1", p0, gfxd_Ccpre); + argi(m, 1, "mode2", p1, gfxd_Ccpre); + int ret = 0; + if (p0 == -1) + { + badarg(m, 0); + ret = -1; + } + if (p1 == -1) + { + badarg(m, 1); + ret = -1; + } + return ret; +} + +UCFUNC int d_DPSetCombineLERP(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + struct cc_mode m0; + struct cc_mode m1; + cc_unpack(&m0, &m1, hi, lo); + int p0 = cc_lookup(&m0); + int p1 = cc_lookup(&m1); + if (p0 != -1 && p1 != -1) + return d_DPSetCombineMode(m, hi, lo); + else + { + m->id = gfxd_DPSetCombineLERP; + argi(m, 0, "a0", m0.a, gfxd_Ccmuxa); + argi(m, 1, "b0", m0.b, gfxd_Ccmuxb); + argi(m, 2, "c0", m0.c, gfxd_Ccmuxc); + argi(m, 3, "d0", m0.d, gfxd_Ccmuxd); + argi(m, 4, "Aa0", m0.Aa, gfxd_Acmuxabd); + argi(m, 5, "Ab0", m0.Ab, gfxd_Acmuxabd); + argi(m, 6, "Ac0", m0.Ac, gfxd_Acmuxc); + argi(m, 7, "Ad0", m0.Ad, gfxd_Acmuxabd); + argi(m, 8, "a1", m1.a, gfxd_Ccmuxa); + argi(m, 9, "b1", m1.b, gfxd_Ccmuxb); + argi(m, 10, "c1", m1.c, gfxd_Ccmuxc); + argi(m, 11, "d1", m1.d, gfxd_Ccmuxd); + argi(m, 12, "Aa1", m1.Aa, gfxd_Acmuxabd); + argi(m, 13, "Ab1", m1.Ab, gfxd_Acmuxabd); + argi(m, 14, "Ac1", m1.Ac, gfxd_Acmuxc); + argi(m, 15, "Ad1", m1.Ad, gfxd_Acmuxabd); + return 0; + } +} + +UCFUNC int d_DPSetConvert(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetConvert; + argi(m, 0, "k0", sx(getfield(hi, 9, 13), 9), gfxd_Cv); + argi(m, 1, "k1", sx(getfield(hi, 9, 4), 9), gfxd_Cv); + argi(m, 2, "k2", sx((getfield(hi, 4, 0) << 5) | getfield(lo, 5, 27), 9), + gfxd_Cv); + argi(m, 3, "k3", sx(getfield(lo, 9, 18), 9), gfxd_Cv); + argi(m, 4, "k4", sx(getfield(lo, 9, 9), 9), gfxd_Cv); + argi(m, 5, "k5", sx(getfield(lo, 9, 0), 9), gfxd_Cv); + return 0; +} + +UCFUNC int d_DPSetTextureConvert(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetTextureConvert; + argu(m, 0, "mode", lo, gfxd_Tc); + return 0; +} + +UCFUNC int d_DPSetCycleType(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetCycleType; + argu(m, 0, "mode", lo, gfxd_Cyc); + return 0; +} + +UCFUNC int d_DPSetDepthSource(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetDepthSource; + argu(m, 0, "mode", lo, gfxd_Zs); + return 0; +} + +UCFUNC int d_DPSetCombineKey(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetCombineKey; + argu(m, 0, "mode", lo, gfxd_Ck); + return 0; +} + +UCFUNC int d_DPSetKeyGB(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetKeyGB; + argu(m, 0, "cG", getfield(lo, 8, 24), gfxd_Color); + argu(m, 1, "sG", getfield(lo, 8, 16), gfxd_Keyscale); + argi(m, 2, "wG", sx(getfield(hi, 12, 12), 12), gfxd_Keywidth); + argu(m, 3, "cB", getfield(lo, 8, 8), gfxd_Color); + argu(m, 4, "sB", getfield(lo, 8, 0), gfxd_Keyscale); + argi(m, 5, "wB", sx(getfield(hi, 12, 0), 12), gfxd_Keywidth); + return 0; +} + +UCFUNC int d_DPSetKeyR(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetKeyR; + argu(m, 0, "cR", getfield(lo, 8, 8), gfxd_Color); + argu(m, 1, "sR", getfield(lo, 8, 0), gfxd_Keyscale); + argi(m, 2, "wR", sx(getfield(lo, 12, 16), 12), gfxd_Keywidth); + return 0; +} + +UCFUNC int d_DPSetPrimDepth(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetPrimDepth; + argi(m, 0, "z", sx(getfield(lo, 16, 16), 16), gfxd_Zi); + argi(m, 1, "dz", sx(getfield(lo, 16, 0), 16), gfxd_Zi); + return 0; +} + +UCFUNC int d_DPSetRenderMode(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetRenderMode; + argu(m, 0, "mode1", lo, gfxd_Rm1); + argu(m, 1, "mode2", lo, gfxd_Rm2); + return 0; +} + +UCFUNC int d_DPSetScissor(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetScissor; + argi(m, 0, "mode", getfield(lo, 2, 24), gfxd_Sc); + argu(m, 1, "ulx", getfield(hi, 10, 14), gfxd_Coordi); + argu(m, 2, "uly", getfield(hi, 10, 2), gfxd_Coordi); + argu(m, 3, "lrx", getfield(lo, 10, 14), gfxd_Coordi); + argu(m, 4, "lry", getfield(lo, 10, 2), gfxd_Coordi); + return 0; +} + +UCFUNC int d_DPSetScissorFrac(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + qu102_t ulx = getfield(hi, 12, 12); + qu102_t uly = getfield(hi, 12, 0); + qu102_t lrx = getfield(lo, 12, 12); + qu102_t lry = getfield(lo, 12, 0); + if ((ulx & 3) || (uly & 3) || (lrx & 3) || (lry & 3)) + { + m->id = gfxd_DPSetScissorFrac; + argi(m, 0, "mode", getfield(lo, 2, 24), gfxd_Sc); + argu(m, 1, "ulx", ulx, gfxd_Coordq); + argu(m, 2, "uly", uly, gfxd_Coordq); + argu(m, 3, "lrx", lrx, gfxd_Coordq); + argu(m, 4, "lry", lry, gfxd_Coordq); + return 0; + } + else + return d_DPSetScissor(m, hi, lo); +} + +UCFUNC int d_DPSetTextureDetail(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetTextureDetail; + argu(m, 0, "mode", lo, gfxd_Td); + return 0; +} + +UCFUNC int d_DPSetTextureFilter(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetTextureFilter; + argu(m, 0, "mode", lo, gfxd_Tf); + return 0; +} + +UCFUNC int d_DPSetTextureLOD(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetTextureLOD; + argu(m, 0, "mode", lo, gfxd_Tl); + return 0; +} + +UCFUNC int d_DPSetTextureLUT(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetTextureLUT; + argu(m, 0, "mode", lo, gfxd_Tt); + return 0; +} + +UCFUNC int d_DPSetTexturePersp(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetTexturePersp; + argu(m, 0, "mode", lo, gfxd_Tp); + return 0; +} + +UCFUNC int d_DPSetTile(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetTile; + argi(m, 0, "fmt", getfield(hi, 3, 21), gfxd_Fmt); + argi(m, 1, "siz", getfield(hi, 2, 19), gfxd_Siz); + argi(m, 2, "line", getfield(hi, 9, 9), gfxd_Line); + argu(m, 3, "tmem", getfield(hi, 9, 0), gfxd_Tmem); + argi(m, 4, "tile", getfield(lo, 3, 24), gfxd_Tile); + argi(m, 5, "pal", getfield(lo, 4, 20), gfxd_Pal); + argu(m, 6, "cmt", getfield(lo, 2, 18), gfxd_Cm); + argi(m, 7, "maskt", getfield(lo, 4, 14), gfxd_Tm); + argi(m, 8, "shiftt", getfield(lo, 4, 10), gfxd_Ts); + argu(m, 9, "cms", getfield(lo, 2, 8), gfxd_Cm); + argi(m, 10, "masks", getfield(lo, 4, 4), gfxd_Tm); + argi(m, 11, "shifts", getfield(lo, 4, 0), gfxd_Ts); + return 0; +} + +UCFUNC int d_DPSetTileSize(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetTileSize; + argi(m, 0, "tile", getfield(lo, 3, 24), gfxd_Tile); + argu(m, 1, "uls", getfield(hi, 12, 12), gfxd_Coordq); + argu(m, 2, "ult", getfield(hi, 12, 0), gfxd_Coordq); + argu(m, 3, "lrs", getfield(lo, 12, 12), gfxd_Coordq); + argu(m, 4, "lrt", getfield(lo, 12, 0), gfxd_Coordq); + return 0; +} + +#if defined(F3D_GBI) +UCFUNC int d_SP1Triangle(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SP1Triangle; + int n0 = getfield(lo, 8, 16); + int n1 = getfield(lo, 8, 8); + int n2 = getfield(lo, 8, 0); + argi(m, 0, "v0", n0 / 10, gfxd_Vtx); + argi(m, 1, "v1", n1 / 10, gfxd_Vtx); + argi(m, 2, "v2", n2 / 10, gfxd_Vtx); + argi(m, 3, "flag", getfield(lo, 8, 24), gfxd_Vtxflag); + int ret = 0; + if (n0 % 10 != 0) + { + badarg(m, 0); + ret = -1; + } + if (n1 % 10 != 0) + { + badarg(m, 1); + ret = -1; + } + if (n2 % 10 != 0) + { + badarg(m, 2); + ret = -1; + } + return ret; +} +#elif defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +UCFUNC int d_SP1Triangle(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SP1Triangle; + int n0 = getfield(hi, 8, 16); + int n1 = getfield(hi, 8, 8); + int n2 = getfield(hi, 8, 0); + argi(m, 0, "v0", n0 / 2, gfxd_Vtx); + argi(m, 1, "v1", n1 / 2, gfxd_Vtx); + argi(m, 2, "v2", n2 / 2, gfxd_Vtx); + argi(m, 3, "flag", 0, gfxd_Vtxflag); + int ret = 0; + if (n0 % 2 != 0) + { + badarg(m, 0); + ret = -1; + } + if (n1 % 2 != 0) + { + badarg(m, 1); + ret = -1; + } + if (n2 % 2 != 0) + { + badarg(m, 2); + ret = -1; + } + return ret; +} + +UCFUNC int d_SP1Quadrangle(gfxd_macro_t *m, uint32_t hi, uint32_t lo); +UCFUNC int d_SP2Triangles(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int n00 = getfield(hi, 8, 16); + int n01 = getfield(hi, 8, 8); + int n02 = getfield(hi, 8, 0); + int n10 = getfield(lo, 8, 16); + int n11 = getfield(lo, 8, 8); + int n12 = getfield(lo, 8, 0); +#if defined(F3DEX_GBI) + if (n00 == n10 && n02 == n11) + return d_SP1Quadrangle(m, hi, lo); +#endif + m->id = gfxd_SP2Triangles; + argi(m, 0, "v00", n00 / 2, gfxd_Vtx); + argi(m, 1, "v01", n01 / 2, gfxd_Vtx); + argi(m, 2, "v02", n02 / 2, gfxd_Vtx); + argi(m, 3, "flag0", 0, gfxd_Vtxflag); + argi(m, 4, "v10", n10 / 2, gfxd_Vtx); + argi(m, 5, "v11", n11 / 2, gfxd_Vtx); + argi(m, 6, "v12", n12 / 2, gfxd_Vtx); + argi(m, 7, "flag1", 0, gfxd_Vtxflag); + int ret = 0; + if (n00 % 2 != 0) + { + badarg(m, 0); + ret = -1; + } + if (n01 % 2 != 0) + { + badarg(m, 1); + ret = -1; + } + if (n02 % 2 != 0) + { + badarg(m, 2); + ret = -1; + } + if (n10 % 2 != 0) + { + badarg(m, 4); + ret = -1; + } + if (n11 % 2 != 0) + { + badarg(m, 5); + ret = -1; + } + if (n12 % 2 != 0) + { + badarg(m, 6); + ret = -1; + } + return ret; +} + +UCFUNC int d_SP1Quadrangle(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SP1Quadrangle; + int n00 = getfield(hi, 8, 16); + int n01 = getfield(hi, 8, 8); + int n02 = getfield(hi, 8, 0); + int n10 = getfield(lo, 8, 16); + int n11 = getfield(lo, 8, 8); + int n12 = getfield(lo, 8, 0); + int v00 = n00 / 2; + int v01 = n01 / 2; + int v02 = n02 / 2; + int v10 = n10 / 2; + int v11 = n11 / 2; + int v12 = n12 / 2; + argi(m, 0, "v0", v00, gfxd_Vtx); + argi(m, 1, "v1", v01, gfxd_Vtx); + argi(m, 2, "v2", v11, gfxd_Vtx); + argi(m, 3, "v3", v12, gfxd_Vtx); + argi(m, 4, "flag", 0, gfxd_Vtxflag); + int ret = 0; + if (v00 != v10 || n00 % 2 != 0 || n10 % 2 != 0) + { + badarg(m, 0); + ret = -1; + } + if (n01 % 2 != 0) + { + badarg(m, 1); + ret = -1; + } + if (v02 != v11 || n02 % 2 != 0 || n11 % 2 != 0) + { + badarg(m, 2); + ret = -1; + } + if (n12 % 2 != 0) + { + badarg(m, 3); + ret = -1; + } + return ret; +} + +UCFUNC int c_SPBranchLessZraw(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 2) + return -1; + if (m[0].id != gfxd_DPHalf1) + return -1; + uint32_t branchdl = argvu(&m[0], 0); + if (m[1].id != gfxd_BranchZ) + return -1; + int32_t vtx = argvi(&m[1], 0); + int32_t zval = argvi(&m[1], 1); + m->id = gfxd_SPBranchLessZraw; + argu(m, 0, "dl", branchdl, gfxd_Dl); + argi(m, 1, "vtx", vtx, gfxd_Vtx); + argi(m, 2, "zval", zval, gfxd_Zraw); + return 0; +} +#endif + +UCFUNC int d_SPBranchList(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPBranchList; + argu(m, 0, "dl", lo, gfxd_Dl); + return 0; +} + +UCFUNC int c_SPClipRatio(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 4) + return -1; + if (m[0].id != gfxd_MoveWd + || argvi(&m[0], 0) != G_MW_CLIP + || argvu(&m[0], 1) != G_MWO_CLIP_RNX) + { + return -1; + } + uint32_t r = argvu(&m[0], 2); + if (m[1].id != gfxd_MoveWd + || argvi(&m[1], 0) != G_MW_CLIP + || argvu(&m[1], 1) != G_MWO_CLIP_RNY + || argvu(&m[1], 2) != r) + { + return -1; + } + if (m[2].id != gfxd_MoveWd + || argvi(&m[2], 0) != G_MW_CLIP + || argvu(&m[2], 1) != G_MWO_CLIP_RPX + || ((uint32_t)1 << 16) - argvu(&m[2], 2) != r) + { + return -1; + } + if (m[3].id != gfxd_MoveWd + || argvi(&m[3], 0) != G_MW_CLIP + || argvu(&m[3], 1) != G_MWO_CLIP_RPY + || ((uint32_t)1 << 16) - argvu(&m[3], 2) != r) + { + return -1; + } + m->id = gfxd_SPClipRatio; + argi(m, 0, "r", r, gfxd_Cr); + return 0; +} + +#if defined(F3D_GBI) +UCFUNC int d_SPCullDisplayList(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPCullDisplayList; + int n0 = getfield(hi, 24, 0); + int nn = getfield(lo, 16, 0); + argi(m, 0, "v0", n0 / 40, gfxd_Vtx); + argi(m, 1, "vn", nn / 40 - 1, gfxd_Num); + int ret = 0; + if (n0 % 40 != 0) + { + badarg(m, 0); + ret = -1; + } + if (nn % 40 != 0) + { + badarg(m, 1); + ret = -1; + } + return ret; +} +#elif defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +UCFUNC int d_SPCullDisplayList(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPCullDisplayList; + int n0 = getfield(hi, 16, 0); + int nn = getfield(lo, 16, 0); + argi(m, 0, "v0", n0 / 2, gfxd_Vtx); + argi(m, 1, "vn", nn / 2, gfxd_Num); + int ret = 0; + if (n0 % 2 != 0) + { + badarg(m, 0); + ret = -1; + } + if (nn % 2 != 0) + { + badarg(m, 1); + ret = -1; + } + return ret; +} +#endif + +UCFUNC int d_SPDisplayList(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPDisplayList; + argu(m, 0, "dl", lo, gfxd_Dl); + return 0; +} + +UCFUNC int d_SPEndDisplayList(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPEndDisplayList; + return 0; +} + +UCFUNC int d_SPFogFactor(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPFogFactor; + argi(m, 0, "fm", sx(getfield(lo, 16, 16), 16), gfxd_Fogz); + argi(m, 1, "fo", sx(getfield(lo, 16, 0), 16), gfxd_Fogz); + return 0; +} + +UCFUNC int d_SPFogPosition(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int x = sx(getfield(lo, 16, 16), 16); + int y = sx(getfield(lo, 16, 0), 16); + if (x == 0) + return d_SPFogFactor(m, hi, lo); + else + { + int d = 128000 / x; + int yd = y * d; + if (yd > 0) + yd += 255; + else if (yd < 0) + yd -= 255; + int min = 500 - yd / 256; + int max = d + min; + + if (min >= 0 && min <= 1000 && max >= 0 && max <= 1000) + { + m->id = gfxd_SPFogPosition; + argi(m, 0, "min", min, gfxd_Fogp); + argi(m, 1, "max", max, gfxd_Fogp); + return 0; + } + else + return d_SPFogFactor(m, hi, lo); + } +} + +#if defined(F3D_GBI) || defined(F3DEX_GBI) +UCFUNC int c_SPForceMatrix(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 4) + return -1; + for (int i = 0; i < 4; i++) + if (m[i].id != gfxd_MoveMem + || argvu(&m[i], 0) != 16 + || argvu(&m[i], 2) != argvu(&m[0], 2) + i * 16) + { + return -1; + } + if (argvi(&m[0], 1) != G_MV_MATRIX_1 + || argvi(&m[1], 1) != G_MV_MATRIX_2 + || argvi(&m[2], 1) != G_MV_MATRIX_3 + || argvi(&m[3], 1) != G_MV_MATRIX_4) + { + return -1; + } + uint32_t mptr = argvu(&m[0], 2); + m->id = gfxd_SPForceMatrix; + argu(m, 0, "mptr", mptr, gfxd_Mtxptr); + return 0; +} +#elif defined(F3DEX_GBI_2) +UCFUNC int c_SPForceMatrix(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 2) + return -1; + if (m[0].id != gfxd_MoveMem + || argvu(&m[0], 0) != sizeof(Mtx) + || argvi(&m[0], 1) != G_MV_MATRIX + || argvu(&m[0], 2) != 0) + { + return -1; + } + uint32_t mptr = argvu(&m[0], 3); + if (m[1].id != gfxd_MoveWd + || argvi(&m[1], 0) != G_MW_FORCEMTX + || argvu(&m[1], 1) != 0 + || argvu(&m[1], 2) != 0x10000) + { + return -1; + } + m->id = gfxd_SPForceMatrix; + argu(m, 0, "mptr", mptr, gfxd_Mtxptr); + return 0; +} +#endif + +UCFUNC int d_SPSetGeometryMode(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPSetGeometryMode; + argu(m, 0, "mode", lo, gfxd_Gm); + return 0; +} + +UCFUNC int d_SPClearGeometryMode(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPClearGeometryMode; +#if defined(F3D_GBI) || defined(F3DEX_GBI) + argu(m, 0, "mode", lo, gfxd_Gm); +#elif defined(F3DEX_GBI_2) + argu(m, 0, "mode", getfield(~hi, 24, 0), gfxd_Gm); +#endif + return 0; +} + +#if defined(F3D_GBI) || defined(F3DEX_GBI) +UCFUNC int c_SPLoadGeometryMode(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 2) + return -1; + if (m[0].id != gfxd_SPClearGeometryMode + || argvu(&m[0], 0) != 0xFFFFFFFF + || m[1].id != gfxd_SPSetGeometryMode) + { + return -1; + } + uint32_t mode = argvu(&m[1], 0); + m->id = gfxd_SPLoadGeometryMode; + argu(m, 0, "mode", mode, gfxd_Gm); + return 0; +} +#elif defined(F3DEX_GBI_2) +UCFUNC int d_SPLoadGeometryMode(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPLoadGeometryMode; + argu(m, 0, "mode", lo, gfxd_Gm); + return 0; +} +#endif + +#if defined(F3D_GBI) || defined(F3DEX_GBI) +UCFUNC int d_SPInsertMatrix(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPInsertMatrix; + argu(m, 0, "where", getfield(hi, 16, 8), gfxd_Mwo_matrix); + argu(m, 1, "val", lo, gfxd_Word); + return 0; +} +#endif + +#if defined(F3D_GBI) +UCFUNC int d_SPLine3D(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPLine3D; + int n0 = getfield(lo, 8, 16); + int n1 = getfield(lo, 8, 8); + argi(m, 0, "v0", n0 / 10, gfxd_Vtx); + argi(m, 1, "v1", n1 / 10, gfxd_Vtx); + argi(m, 2, "flag", getfield(lo, 8, 24), gfxd_Vtxflag); + int ret = 0; + if (n0 % 10 != 0) + { + badarg(m, 0); + ret = -1; + } + if (n1 % 10 != 0) + { + badarg(m, 1); + ret = -1; + } + return ret; +} +#elif defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +UCFUNC int d_SPLine3D(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPLine3D; + int n0 = getfield(hi, 8, 16); + int n1 = getfield(hi, 8, 8); + argi(m, 0, "v0", n0 / 2, gfxd_Vtx); + argi(m, 1, "v1", n1 / 2, gfxd_Vtx); + argi(m, 2, "flag", 0, gfxd_Vtxflag); + int ret = 0; + if (n0 % 2 != 0) + { + badarg(m, 0); + ret = -1; + } + if (n1 % 2 != 0) + { + badarg(m, 1); + ret = -1; + } + return ret; +} +#endif + +#if defined(F3D_GBI) +UCFUNC int d_SPLineW3D(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int wd = getfield(lo, 8, 0); + if (wd == 0) + return d_SPLine3D(m, hi, lo); + else + { + m->id = gfxd_SPLineW3D; + int n0 = getfield(lo, 8, 16); + int n1 = getfield(lo, 8, 8); + argi(m, 0, "v0", n0 / 10, gfxd_Vtx); + argi(m, 1, "v1", n1 / 10, gfxd_Vtx); + argi(m, 2, "wd", wd, gfxd_Linewd); + argi(m, 3, "flag", getfield(lo, 8, 24), gfxd_Vtxflag); + int ret = 0; + if (n0 % 10 != 0) + { + badarg(m, 0); + ret = -1; + } + if (n1 % 10 != 0) + { + badarg(m, 1); + ret = -1; + } + return ret; + } +} +#elif defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +UCFUNC int d_SPLineW3D(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int wd = getfield(hi, 8, 0); + if (wd == 0) + return d_SPLine3D(m, hi, lo); + else + { + m->id = gfxd_SPLineW3D; + int n0 = getfield(hi, 8, 16); + int n1 = getfield(hi, 8, 8); + argi(m, 0, "v0", n0 / 2, gfxd_Vtx); + argi(m, 1, "v1", n1 / 2, gfxd_Vtx); + argi(m, 2, "wd", wd, gfxd_Linewd); + argi(m, 3, "flag", 0, gfxd_Vtxflag); + int ret = 0; + if (n0 % 2 != 0) + { + badarg(m, 0); + ret = -1; + } + if (n1 % 2 != 0) + { + badarg(m, 1); + ret = -1; + } + return ret; + } +} +#endif + +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +UCFUNC int c_SPLoadUcode(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 2) + return -1; + if (m[0].id != gfxd_DPHalf1) + return -1; + uint32_t uc_dstart = argvu(&m[0], 0); + if (m[1].id != gfxd_LoadUcode) + return -1; + uint32_t uc_start = argvu(&m[1], 0); + uint32_t uc_dsize = argvu(&m[1], 1); + if (uc_dsize != 0x800) + return -1; + m->id = gfxd_SPLoadUcode; + argu(m, 0, "uc_start", uc_start, gfxd_Uctext); + argu(m, 1, "uc_dstart", uc_dstart, gfxd_Ucdata); + return 0; +} +#endif + +UCFUNC int d_SPLookAtX(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPLookAtX; + argu(m, 0, "l", lo, gfxd_Lookatptr); + return 0; +} + +UCFUNC int d_SPLookAtY(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPLookAtY; + argu(m, 0, "l", lo, gfxd_Lookatptr); + return 0; +} + +UCFUNC int c_SPLookAt(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 2) + return -1; + if (m[0].id != gfxd_SPLookAtX) + return -1; + uint32_t l = argvu(&m[0], 0); + if (m[1].id != gfxd_SPLookAtY || argvu(&m[1], 0) != l + 0x10) + return -1; + m->id = gfxd_SPLookAt; + argu(m, 0, "l", l, gfxd_Lookatptr); + return 0; +} + +#if defined(F3D_GBI) || defined(F3DEX_GBI) +UCFUNC int d_SPMatrix(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPMatrix; + int x = getfield(hi, 16, 0); + argu(m, 0, "matrix", lo, gfxd_Mtxptr); + argi(m, 1, "param", getfield(hi, 8, 16), gfxd_Mtxparam); + if (x != sizeof(Mtx)) + return -1; + else + return 0; +} +#elif defined(F3DEX_GBI_2) +UCFUNC int d_SPMatrix(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPMatrix; + int x = getfield(hi, 5, 19); + argu(m, 0, "matrix", lo, gfxd_Mtxptr); + argi(m, 1, "param", getfield(hi, 8, 0) ^ G_MTX_PUSH, gfxd_Mtxparam); + if (x != (sizeof(Mtx) - 1) / 8) + return -1; + else + return 0; +} +#endif + +#if defined(F3D_GBI) || (defined(F3D_BETA) && defined(F3DEX_GBI)) +UCFUNC int d_SPModifyVertex(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPModifyVertex; + int offset = getfield(hi, 16, 8); + argi(m, 0, "vtx", offset / 40, gfxd_Vtx); + argu(m, 1, "where", offset % 40, gfxd_Mwo_point); + argu(m, 2, "val", lo, gfxd_Word); + return 0; +} +#elif defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +UCFUNC int d_SPModifyVertex(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPModifyVertex; + int vtx = getfield(hi, 16, 0); + argi(m, 0, "vtx", vtx / 2, gfxd_Vtx); + argu(m, 1, "where", getfield(hi, 8, 16), gfxd_Mwo_point); + argu(m, 2, "val", lo, gfxd_Word); + int ret = 0; + if (vtx % 2 != 0) + { + badarg(m, 0); + ret = -1; + } + return ret; +} +#endif + +UCFUNC int d_SPPerspNormalize(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPPerspNormalize; + argu(m, 0, "scale", getfield(lo, 16, 0), gfxd_Wscale); + return 0; +} + +UCFUNC int d_SPPopMatrix(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPPopMatrix; +#if defined(F3D_GBI) || defined(F3DEX_GBI) + argi(m, 0, "param", lo, gfxd_Mtxstack); +#elif defined(F3DEX_GBI_2) + argi(m, 0, "param", G_MTX_MODELVIEW, gfxd_Mtxstack); +#endif + return 0; +} + +#if defined(F3DEX_GBI_2) +UCFUNC int d_SPPopMatrixN(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int len = (getfield(hi, 5, 19) + 1) * 8; + int ofs = getfield(hi, 8, 8) * 8; + int idx = getfield(hi, 8, 0); + int n = lo / sizeof(Mtx); + if (lo % sizeof(Mtx) == 0 + && len == sizeof(Mtx) + && ofs == 0 + && idx == 2 + && n == 1) + { + return d_SPPopMatrix(m, hi, lo); + } + m->id = gfxd_SPPopMatrixN; + argi(m, 0, "param", G_MTX_MODELVIEW, gfxd_Mtxstack); + argi(m, 1, "num", n, gfxd_Num); + int ret = 0; + if (lo % sizeof(Mtx) != 0) + { + badarg(m, 1); + ret = -1; + } + if (len != sizeof(Mtx) || ofs != 0 || idx != 2) + ret = -1; + return ret; +} +#endif + +UCFUNC int d_SPSegment(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPSegment; +#if defined(F3D_GBI) || defined(F3DEX_GBI) + int offset = getfield(hi, 16, 8); +#elif defined(F3DEX_GBI_2) + int offset = getfield(hi, 16, 0); +#endif + argu(m, 0, "seg", offset / 4, gfxd_Seg); + argu(m, 1, "base", lo, gfxd_Segptr); + int ret = 0; + if (offset % 4 != 0) + { + badarg(m, 0); + ret = -1; + } + return ret; +} + +UCFUNC int c_SPSetLightsN(gfxd_macro_t *m, int n_macro, int id, int numlights) +{ + if (n_macro < 2 + numlights) + return -1; + if (m[0].id != gfxd_SPNumLights || argvi(&m[0], 0) != numlights) + return -1; + int a = 1 + numlights; + if (m[a].id != gfxd_SPLight || argvi(&m[a], 1) != a) + return -1; + uint32_t l = argvu(&m[a], 0); + for (int i = 1; i <= numlights; i++) + { + int offset = sizeof(Ambient) + sizeof(Light) * (i - 1); + if (m[i].id != gfxd_SPLight + || argvu(&m[i], 0) != l + offset + || argvi(&m[i], 1) != i) + { + return -1; + } + } + m->id = id; + argu(m, 0, "l", l, gfxd_Lightsn); + return 0; +} + +UCFUNC int c_SPSetLights1(gfxd_macro_t *m, int n_macro) +{ + return c_SPSetLightsN(m, n_macro, gfxd_SPSetLights1, NUMLIGHTS_1); +} + +UCFUNC int c_SPSetLights2(gfxd_macro_t *m, int n_macro) +{ + return c_SPSetLightsN(m, n_macro, gfxd_SPSetLights2, NUMLIGHTS_2); +} + +UCFUNC int c_SPSetLights3(gfxd_macro_t *m, int n_macro) +{ + return c_SPSetLightsN(m, n_macro, gfxd_SPSetLights3, NUMLIGHTS_3); +} + +UCFUNC int c_SPSetLights4(gfxd_macro_t *m, int n_macro) +{ + return c_SPSetLightsN(m, n_macro, gfxd_SPSetLights4, NUMLIGHTS_4); +} + +UCFUNC int c_SPSetLights5(gfxd_macro_t *m, int n_macro) +{ + return c_SPSetLightsN(m, n_macro, gfxd_SPSetLights5, NUMLIGHTS_5); +} + +UCFUNC int c_SPSetLights6(gfxd_macro_t *m, int n_macro) +{ + return c_SPSetLightsN(m, n_macro, gfxd_SPSetLights6, NUMLIGHTS_6); +} + +UCFUNC int c_SPSetLights7(gfxd_macro_t *m, int n_macro) +{ + return c_SPSetLightsN(m, n_macro, gfxd_SPSetLights7, NUMLIGHTS_7); +} + +#if defined(F3D_GBI) || defined(F3DEX_GBI) +UCFUNC int d_SPNumLights(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPNumLights; + argi(m, 0, "n", (lo - 0x80000000) / 32 - 1, gfxd_Numlights); + int ret = 0; + if (lo < 0x80000040 || lo % 32 != 0) + { + badarg(m, 0); + ret = -1; + } + return ret; +} +#elif defined(F3DEX_GBI_2) +UCFUNC int d_SPNumLights(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPNumLights; + argi(m, 0, "n", lo / 24, gfxd_Numlights); + int ret = 0; + if (lo < 24 || lo % 24 != 0) + { + badarg(m, 0); + ret = -1; + } + return ret; +} +#endif + +#if defined(F3D_GBI) || defined(F3DEX_GBI) +UCFUNC int d_SPLight(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int n = (getfield(hi, 8, 16) - G_MV_L0) / 2 + 1; + m->id = gfxd_SPLight; + argu(m, 0, "l", lo, gfxd_Lightptr); + argi(m, 1, "n", n, gfxd_Num); + return 0; +} +#elif defined(F3DEX_GBI_2) +UCFUNC int d_SPLight(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int n = (getfield(hi, 8, 8) * 8 / 24) - 1; + m->id = gfxd_SPLight; + argu(m, 0, "l", lo, gfxd_Lightptr); + argi(m, 1, "n", n, gfxd_Num); + return 0; +} +#endif + +UCFUNC int c_SPLightColor(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 2) + return -1; + if (m[0].id != gfxd_MoveWd + || argvi(&m[0], 0) != G_MW_LIGHTCOL + || argvu(&m[0], 1) % 0x18 != 0 + || argvu(&m[0], 1) > G_MWO_aLIGHT_8) + { + return -1; + } + uint32_t offset = argvu(&m[0], 1); + uint32_t packedcolor = argvu(&m[0], 2); + if (m[1].id != gfxd_MoveWd + || argvi(&m[1], 0) != G_MW_LIGHTCOL + || argvu(&m[1], 1) != offset + 4 + || argvu(&m[1], 2) != packedcolor) + { + return -1; + } + m->id = gfxd_SPLightColor; + argi(m, 0, "n", offset / 0x18 + 1, gfxd_Lightnum); + argu(m, 1, "c", packedcolor, gfxd_Color); + return 0; +} + +UCFUNC int d_SPTexture(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPTexture; + argu(m, 0, "sc", getfield(lo, 16, 16), gfxd_Tcscale); + argu(m, 1, "tc", getfield(lo, 16, 0), gfxd_Tcscale); + argi(m, 2, "level", getfield(hi, 3, 11), gfxd_Num); + argi(m, 3, "tile", getfield(hi, 3, 8), gfxd_Tile); +#if defined(F3D_GBI) || defined(F3DEX_GBI) + argi(m, 4, "on", getfield(hi, 8, 0), gfxd_Switch); +#elif defined(F3DEX_GBI_2) + argi(m, 4, "on", getfield(hi, 7, 1), gfxd_Switch); +#endif + return 0; +} + +UCFUNC int c_SPTextureRectangle(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 3) + return -1; + if (m[0].id != gfxd_TexRect) + return -1; + qu102_t ulx = argvu(&m[0], 0); + qu102_t uly = argvu(&m[0], 1); + qu102_t lrx = argvu(&m[0], 2); + qu102_t lry = argvu(&m[0], 3); + int tile = argvi(&m[0], 4); + if (m[1].id != gfxd_DPHalf1) + return -1; + qs105_t s = sx(getfield(argvu(&m[1], 0), 16, 16), 16); + qs105_t t = sx(getfield(argvu(&m[1], 0), 16, 0), 16); + if (m[2].id != gfxd_DPHalf2) + return -1; + qs510_t dsdx = sx(getfield(argvu(&m[2], 0), 16, 16), 16); + qs510_t dtdy = sx(getfield(argvu(&m[2], 0), 16, 0), 16); + m->id = gfxd_SPTextureRectangle; + argu(m, 0, "ulx", ulx, gfxd_Coordq); + argu(m, 1, "uly", uly, gfxd_Coordq); + argu(m, 2, "lrx", lrx, gfxd_Coordq); + argu(m, 3, "lry", lry, gfxd_Coordq); + argi(m, 4, "tile", tile, gfxd_Tile); + argi(m, 5, "s", s, gfxd_St); + argi(m, 6, "t", t, gfxd_St); + argi(m, 7, "dsdx", dsdx, gfxd_Stdelta); + argi(m, 8, "dtdy", dtdy, gfxd_Stdelta); + return 0; +} + +UCFUNC int c_SPTextureRectangleFlip(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 3) + return -1; + if (m[0].id != gfxd_TexRectFlip) + return -1; + qu102_t ulx = argvu(&m[0], 0); + qu102_t uly = argvu(&m[0], 1); + qu102_t lrx = argvu(&m[0], 2); + qu102_t lry = argvu(&m[0], 3); + int tile = argvi(&m[0], 4); + if (m[1].id != gfxd_DPHalf1) + return -1; + qs105_t s = sx(getfield(argvu(&m[1], 0), 16, 16), 16); + qs105_t t = sx(getfield(argvu(&m[1], 0), 16, 0), 16); + if (m[2].id != gfxd_DPHalf2) + return -1; + qs510_t dsdx = sx(getfield(argvu(&m[2], 0), 16, 16), 16); + qs510_t dtdy = sx(getfield(argvu(&m[2], 0), 16, 0), 16); + m->id = gfxd_SPTextureRectangleFlip; + argu(m, 0, "ulx", ulx, gfxd_Coordq); + argu(m, 1, "uly", uly, gfxd_Coordq); + argu(m, 2, "lrx", lrx, gfxd_Coordq); + argu(m, 3, "lry", lry, gfxd_Coordq); + argi(m, 4, "tile", tile, gfxd_Tile); + argi(m, 5, "s", s, gfxd_St); + argi(m, 6, "t", t, gfxd_St); + argi(m, 7, "dsdx", dsdx, gfxd_Stdelta); + argi(m, 8, "dtdy", dtdy, gfxd_Stdelta); + return 0; +} + +#if defined(F3D_GBI) +UCFUNC int d_SPVertex(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPVertex; + int n = getfield(hi, 4, 20) + 1; + int v0 = getfield(hi, 4, 16); + int size = getfield(hi, 16, 0); + argu(m, 0, "v", lo, gfxd_Vtxptr); + argi(m, 1, "n", n, gfxd_Num); + argi(m, 2, "v0", v0, gfxd_Vtx); + int ret = 0; + if (size != sizeof(Vtx) * n) + { + badarg(m, 1); + ret = -1; + } + return ret; +} +#elif defined(F3DEX_GBI) +UCFUNC int d_SPVertex(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPVertex; + int n = getfield(hi, 6, 10); + int v0 = getfield(hi, 8, 16); + int size = getfield(hi, 10, 0); + argu(m, 0, "v", lo, gfxd_Vtxptr); + argi(m, 1, "n", n, gfxd_Num); + argi(m, 2, "v0", v0 / 2, gfxd_Vtx); + int ret = 0; + if (size != sizeof(Vtx) * n - 1) + { + badarg(m, 1); + ret = -1; + } + if (v0 % 2 != 0) + { + badarg(m, 2); + ret = -1; + } + return ret; +} +#elif defined(F3DEX_GBI_2) +UCFUNC int d_SPVertex(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPVertex; + int n = getfield(hi, 8, 12); + int v0 = getfield(hi, 7, 1) - n; + argu(m, 0, "v", lo, gfxd_Vtxptr); + argi(m, 1, "n", n, gfxd_Num); + argi(m, 2, "v0", v0, gfxd_Vtx); + return 0; +} +#endif + +UCFUNC int d_SPViewport(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPViewport; + argu(m, 0, "v", lo, gfxd_Vpptr); + return 0; +} + +UCFUNC int d_DPLoadTLUTCmd(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPLoadTLUTCmd; + argi(m, 0, "tile", getfield(lo, 3, 24), gfxd_Tile); + argi(m, 1, "count", getfield(lo, 10, 14), gfxd_Num); + return 0; +} + +UCFUNC int c_DPLoadTLUT(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 6) + return -1; + if (m[0].id != gfxd_DPSetTextureImage + || argvi(&m[0], 0) != G_IM_FMT_RGBA + || argvi(&m[0], 1) != G_IM_SIZ_16b + || argvi(&m[0], 2) != 1) + { + return -1; + } + uint32_t dram = argvu(&m[0], 3); + if (m[1].id != gfxd_DPTileSync) + return -1; + if (m[2].id != gfxd_DPSetTile + || argvi(&m[2], 0) != 0 + || argvi(&m[2], 1) != 0 + || argvi(&m[2], 2) != 0 + || argvi(&m[2], 4) != G_TX_LOADTILE + || argvi(&m[2], 5) != 0 + || argvu(&m[2], 6) != 0 + || argvi(&m[2], 7) != 0 + || argvi(&m[2], 8) != 0 + || argvu(&m[2], 9) != 0 + || argvi(&m[2], 10) != 0 + || argvi(&m[2], 11) != 0) + { + return -1; + } + uint32_t tmem = argvu(&m[2], 3); + if (m[3].id != gfxd_DPLoadSync) + return -1; + if (m[4].id != gfxd_DPLoadTLUTCmd || argvi(&m[4], 0) != G_TX_LOADTILE) + return -1; + int count = argvi(&m[4], 1) + 1; + if (m[5].id != gfxd_DPPipeSync) + return -1; + m->id = gfxd_DPLoadTLUT; + argi(m, 0, "count", count, gfxd_Num); + argu(m, 1, "tmem", tmem, gfxd_Tmem); + argu(m, 2, "dram", dram, gfxd_Tlut); + return 0; +} + +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +UCFUNC int d_BranchZ(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_BranchZ; + int na = getfield(hi, 12, 12); + int nb = getfield(hi, 12, 0); + int32_t zval; + if (lo > 0x7FFFFFFF) + zval = -0x80000000 + (int32_t)(lo & 0x7FFFFFFF); + else + zval = lo; + argi(m, 0, "vtx", nb / 2, gfxd_Vtx); + argi(m, 1, "zval", zval, gfxd_Zraw); + int ret = 0; + if (nb % 2 != 0 || na / 5 != nb / 2 || na % 5 != 0) + { + badarg(m, 0); + ret = -1; + } + return ret; +} +#endif + +UCFUNC int d_DisplayList(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int flag = getfield(hi, 8, 16); + if (flag == 0) + return d_SPDisplayList(m, hi, lo); + else if (flag == 1) + return d_SPBranchList(m, hi, lo); + else + { + m->id = gfxd_DisplayList; + argu(m, 0, "dl", lo, gfxd_Dl); + argi(m, 1, "flag", flag, gfxd_Dlflag); + return 0; + } +} + +UCFUNC int d_DPHalf1(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPHalf1; + argu(m, 0, "hi", lo, gfxd_Word); + return 0; +} + +UCFUNC int d_DPHalf2(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPHalf2; + argu(m, 0, "lo", lo, gfxd_Word); + return 0; +} + +UCFUNC int c_DPWord(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 2) + return -1; + if (m[0].id != gfxd_DPHalf1 || m[1].id != gfxd_DPHalf2) + return -1; + uint32_t wordhi = argvu(&m[0], 0); + uint32_t wordlo = argvu(&m[1], 0); + m->id = gfxd_DPWord; + argu(m, 0, "wordhi", wordhi, gfxd_Word); + argu(m, 1, "wordlo", wordlo, gfxd_Word); + return 0; +} + +UCFUNC int d_DPLoadTile(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPLoadTile; + argi(m, 0, "tile", getfield(lo, 3, 24), gfxd_Tile); + argu(m, 1, "uls", getfield(hi, 12, 12), gfxd_Coordq); + argu(m, 2, "ult", getfield(hi, 12, 0), gfxd_Coordq); + argu(m, 3, "lrs", getfield(lo, 12, 12), gfxd_Coordq); + argu(m, 4, "lrt", getfield(lo, 12, 0), gfxd_Coordq); + return 0; +} + +#if defined(F3DEX_GBI_2) +UCFUNC int d_SPGeometryMode(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + uint32_t clearbits = getfield(~hi, 24, 0); + uint32_t setbits = lo; + if (clearbits == 0 && setbits != 0) + return d_SPSetGeometryMode(m, hi, lo); + else if (clearbits != 0 && setbits == 0) + return d_SPClearGeometryMode(m, hi, lo); + else if (clearbits == 0x00FFFFFF) + return d_SPLoadGeometryMode(m, hi, lo); + else + { + m->id = gfxd_SPGeometryMode; + argu(m, 0, "c", clearbits, gfxd_Gm); + argu(m, 1, "s", setbits, gfxd_Gm); + return 0; + } +} +#endif + +UCFUNC int d_SPSetOtherMode(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPSetOtherMode; + int opc = getfield(hi, 8, 24); +#if defined(F3D_GBI) || defined(F3DEX_GBI) + int length = getfield(hi, 8, 0); + int shift = getfield(hi, 8, 8); +#elif defined(F3DEX_GBI_2) + int length = getfield(hi, 8, 0) + 1; + int shift = 32 - (getfield(hi, 8, 8) + length); +#endif + argi(m, 0, "opc", opc, gfxd_Opcode); + argi(m, 1, "sft", shift, gfxd_Sftlo); + argi(m, 2, "len", length, gfxd_Num); + if (opc == G_SETOTHERMODE_H) + argu(m, 3, "mode", lo, gfxd_Othermodehi); + else if (opc == G_SETOTHERMODE_L) + argu(m, 3, "mode", lo, gfxd_Othermodelo); + else + argu(m, 3, "mode", lo, gfxd_Word); + return 0; +} + +UCFUNC int d_SPSetOtherModeLo(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ +#if defined(F3D_GBI) || defined(F3DEX_GBI) + int length = getfield(hi, 8, 0); + int shift = getfield(hi, 8, 8); +#elif defined(F3DEX_GBI_2) + int length = getfield(hi, 8, 0) + 1; + int shift = 32 - (getfield(hi, 8, 8) + length); +#endif + if (shift == G_MDSFT_ALPHACOMPARE && length == G_MDSIZ_ALPHACOMPARE) + return d_DPSetAlphaCompare(m, hi, lo); + else if (shift == G_MDSFT_ZSRCSEL && length == G_MDSIZ_ZSRCSEL) + return d_DPSetDepthSource(m, hi, lo); + else if (shift == G_MDSFT_RENDERMODE && length == G_MDSIZ_RENDERMODE) + return d_DPSetRenderMode(m, hi, lo); + else if (config.emit_ext_macro) + { + m->id = gfxd_SPSetOtherModeLo; + argi(m, 0, "sft", shift, gfxd_Sftlo); + argi(m, 1, "len", length, gfxd_Num); + argu(m, 2, "mode", lo, gfxd_Othermodelo); + return 0; + } + else + return d_SPSetOtherMode(m, hi, lo); +} + +UCFUNC int d_SPSetOtherModeHi(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ +#if defined(F3D_GBI) || defined(F3DEX_GBI) + int length = getfield(hi, 8, 0); + int shift = getfield(hi, 8, 8); +#elif defined(F3DEX_GBI_2) + int length = getfield(hi, 8, 0) + 1; + int shift = 32 - (getfield(hi, 8, 8) + length); +#endif + if (shift == G_MDSFT_ALPHADITHER && length == G_MDSIZ_ALPHADITHER) + return d_DPSetAlphaDither(m, hi, lo); + else if (shift == G_MDSFT_RGBDITHER && length == G_MDSIZ_RGBDITHER) + return d_DPSetColorDither(m, hi, lo); + else if (shift == G_MDSFT_COMBKEY && length == G_MDSIZ_COMBKEY) + return d_DPSetCombineKey(m, hi, lo); + else if (shift == G_MDSFT_TEXTCONV && length == G_MDSIZ_TEXTCONV) + return d_DPSetTextureConvert(m, hi, lo); + else if (shift == G_MDSFT_TEXTFILT && length == G_MDSIZ_TEXTFILT) + return d_DPSetTextureFilter(m, hi, lo); + else if (shift == G_MDSFT_TEXTLUT && length == G_MDSIZ_TEXTLUT) + return d_DPSetTextureLUT(m, hi, lo); + else if (shift == G_MDSFT_TEXTLOD && length == G_MDSIZ_TEXTLOD) + return d_DPSetTextureLOD(m, hi, lo); + else if (shift == G_MDSFT_TEXTDETAIL && length == G_MDSIZ_TEXTDETAIL) + return d_DPSetTextureDetail(m, hi, lo); + else if (shift == G_MDSFT_TEXTPERSP && length == G_MDSIZ_TEXTPERSP) + return d_DPSetTexturePersp(m, hi, lo); + else if (shift == G_MDSFT_CYCLETYPE && length == G_MDSIZ_CYCLETYPE) + return d_DPSetCycleType(m, hi, lo); + else if (shift == G_MDSFT_PIPELINE && length == G_MDSIZ_PIPELINE) + return d_DPPipelineMode(m, hi, lo); + else if (config.emit_ext_macro) + { + m->id = gfxd_SPSetOtherModeHi; + argi(m, 0, "sft", shift, gfxd_Sfthi); + argi(m, 1, "len", length, gfxd_Num); + argu(m, 2, "mode", lo, gfxd_Othermodehi); + return 0; + } + else + return d_SPSetOtherMode(m, hi, lo); +} + +UCFUNC int d_DPSetOtherMode(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_DPSetOtherMode; + argu(m, 0, "hi", getfield(hi, 24, 0), gfxd_Othermodehi); + argu(m, 1, "lo", lo, gfxd_Othermodelo); + return 0; +} + +UCFUNC int d_MoveWd(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ +#if defined(F3D_GBI) || defined(F3DEX_GBI) + int index = getfield(hi, 8, 0); + int offset = getfield(hi, 16, 8); +#elif defined(F3DEX_GBI_2) + int index = getfield(hi, 8, 16); + int offset = getfield(hi, 16, 0); +#endif + if (index == G_MW_FOG && offset == G_MWO_FOG) + return d_SPFogPosition(m, hi, lo); +#if !(defined(F3D_BETA) && (defined(F3D_GBI) || defined(F3DEX_GBI))) + else if (index == G_MW_PERSPNORM && offset == 0) + return d_SPPerspNormalize(m, hi, lo); +#endif + else if (index == G_MW_SEGMENT) + return d_SPSegment(m, hi, lo); + else if (index == G_MW_NUMLIGHT && offset == G_MWO_NUMLIGHT) + return d_SPNumLights(m, hi, lo); +#if defined(F3D_GBI) || (defined(F3D_BETA) && defined(F3DEX_GBI)) + else if (index == G_MW_POINTS) + return d_SPModifyVertex(m, hi, lo); +#endif +#if defined(F3D_GBI) || defined(F3DEX_GBI) + else if (index == G_MW_MATRIX) + return d_SPInsertMatrix(m, hi, lo); +#endif + else + { + m->id = gfxd_MoveWd; + argi(m, 0, "index", index, gfxd_Mw); + if (index == G_MW_MATRIX) + argu(m, 1, "offset", offset, gfxd_Mwo_matrix); + else if (index == G_MW_CLIP) + argu(m, 1, "offset", offset, gfxd_Mwo_clip); + else if (index == G_MW_LIGHTCOL) + argu(m, 1, "offset", offset, gfxd_Mwo_lightcol); + else + argu(m, 1, "offset", offset, gfxd_Mwo); + argu(m, 2, "value", lo, gfxd_Word); + } + return 0; +} + +#if defined(F3D_GBI) || defined(F3DEX_GBI) +UCFUNC int d_MoveMem(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int size = getfield(hi, 16, 0); + int index = getfield(hi, 8, 16); + if (size == sizeof(Light) + && index >= G_MV_L0 + && index <= G_MV_L7 + && index % 2 == 0) + { + return d_SPLight(m, hi, lo); + } + else if (size == sizeof(Light) && index == G_MV_LOOKATX) + return d_SPLookAtX(m, hi, lo); + else if (size == sizeof(Light) && index == G_MV_LOOKATY) + return d_SPLookAtY(m, hi, lo); + else if (size == sizeof(Vp) && index == G_MV_VIEWPORT) + return d_SPViewport(m, hi, lo); + else + { + m->id = gfxd_MoveMem; + argu(m, 0, "size", size, gfxd_Size); + argi(m, 1, "index", index, gfxd_Mv); + argu(m, 2, "dram", lo, gfxd_Dram); + return 0; + } +} +#elif defined(F3DEX_GBI_2) +UCFUNC int d_MoveMem(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int size = (getfield(hi, 5, 19) + 1) * 8; + int index = getfield(hi, 8, 0); + int offset = getfield(hi, 8, 8) * 8; + if (size == sizeof(Light) + && index == G_MV_LIGHT + && offset >= G_MVO_L0 + && offset <= G_MVO_L7 + && offset % 0x18 == 0) + { + return d_SPLight(m, hi, lo); + } + else if (size == sizeof(Light) + && index == G_MV_LIGHT + && offset == G_MVO_LOOKATX) + { + return d_SPLookAtX(m, hi, lo); + } + else if (size == sizeof(Light) + && index == G_MV_LIGHT + && offset == G_MVO_LOOKATY) + { + return d_SPLookAtY(m, hi, lo); + } + else if (size == sizeof(Vp) + && index == G_MV_VIEWPORT + && offset == 0) + { + return d_SPViewport(m, hi, lo); + } + else + { + m->id = gfxd_MoveMem; + argu(m, 0, "size", size, gfxd_Size); + argi(m, 1, "index", index, gfxd_Mv); + argu(m, 2, "offset", offset, gfxd_Size); + argu(m, 3, "dram", lo, gfxd_Dram); + return 0; + } +} +#endif + +#if defined(F3DEX_GBI_2) +UCFUNC int d_SPDmaRead(gfxd_macro_t *m, uint32_t hi, uint32_t lo); +UCFUNC int d_SPDmaWrite(gfxd_macro_t *m, uint32_t hi, uint32_t lo); +UCFUNC int d_SPDma_io(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + int flag = getfield(hi, 1, 23); + if (flag == 0) + return d_SPDmaRead(m, hi, lo); + else if (flag == 1) + return d_SPDmaWrite(m, hi, lo); + else + { + m->id = gfxd_SPDma_io; + argi(m, 0, "flag", flag, gfxd_Dmaflag); + argu(m, 1, "dmem", getfield(hi, 10, 13) * 8, gfxd_Dmem); + argu(m, 2, "dram", lo, gfxd_Dram); + argu(m, 3, "size", getfield(hi, 12, 10) + 1, gfxd_Size); + return 0; + } +} + +UCFUNC int d_SPDmaRead(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPDmaRead; + argu(m, 0, "dmem", getfield(hi, 10, 13) * 8, gfxd_Dmem); + argu(m, 1, "dram", lo, gfxd_Dram); + argu(m, 2, "size", getfield(hi, 12, 10) + 1, gfxd_Size); + return 0; +} + +UCFUNC int d_SPDmaWrite(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPDmaWrite; + argu(m, 0, "dmem", getfield(hi, 10, 13) * 8, gfxd_Dmem); + argu(m, 1, "dram", lo, gfxd_Dram); + argu(m, 2, "size", getfield(hi, 12, 10) + 1, gfxd_Size); + return 0; +} +#endif + +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) +UCFUNC int d_LoadUcode(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_LoadUcode; + argu(m, 0, "uc_start", lo, gfxd_Uctext); + argu(m, 1, "uc_dsize", getfield(hi, 16, 0) + 1, gfxd_Size); + return 0; +} + +UCFUNC int c_SPLoadUcodeEx(gfxd_macro_t *m, int n_macro) +{ + if (n_macro < 2) + return -1; + if (m[0].id != gfxd_DPHalf1) + return -1; + uint32_t uc_dstart = argvu(&m[0], 0); + if (m[1].id != gfxd_LoadUcode) + return -1; + uint32_t uc_start = argvu(&m[1], 0); + uint32_t uc_dsize = argvu(&m[1], 1); + m->id = gfxd_SPLoadUcodeEx; + argu(m, 0, "uc_start", uc_start, gfxd_Uctext); + argu(m, 1, "uc_dstart", uc_dstart, gfxd_Ucdata); + argu(m, 2, "uc_dsize", uc_dsize, gfxd_Size); + return 0; +} +#endif + +UCFUNC int d_TexRect(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_TexRect; + argu(m, 0, "ulx", getfield(lo, 12, 12), gfxd_Coordq); + argu(m, 1, "uly", getfield(lo, 12, 0), gfxd_Coordq); + argu(m, 2, "lrx", getfield(hi, 12, 12), gfxd_Coordq); + argu(m, 3, "lry", getfield(hi, 12, 0), gfxd_Coordq); + argi(m, 4, "tile", getfield(lo, 3, 24), gfxd_Tile); + return 0; +} + +UCFUNC int d_TexRectFlip(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_TexRectFlip; + argu(m, 0, "ulx", getfield(lo, 12, 12), gfxd_Coordq); + argu(m, 1, "uly", getfield(lo, 12, 0), gfxd_Coordq); + argu(m, 2, "lrx", getfield(hi, 12, 12), gfxd_Coordq); + argu(m, 3, "lry", getfield(hi, 12, 0), gfxd_Coordq); + argi(m, 4, "tile", getfield(lo, 3, 24), gfxd_Tile); + return 0; +} + +UCFUNC int d_SPNoOp(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_SPNoOp; + return 0; +} + +#if defined(F3DEX_GBI_2) +UCFUNC int d_Special3(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_Special3; + argu(m, 0, "hi", getfield(hi, 24, 0), gfxd_Word); + argu(m, 1, "lo", lo, gfxd_Word); + return 0; +} + +UCFUNC int d_Special2(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_Special2; + argu(m, 0, "hi", getfield(hi, 24, 0), gfxd_Word); + argu(m, 1, "lo", lo, gfxd_Word); + return 0; +} + +UCFUNC int d_Special1(gfxd_macro_t *m, uint32_t hi, uint32_t lo) +{ + m->id = gfxd_Special1; + argu(m, 0, "hi", getfield(hi, 24, 0), gfxd_Word); + argu(m, 1, "lo", lo, gfxd_Word); + return 0; +} +#endif diff --git a/tools/ZAPD/lib/libgfxd/uc_macrotbl.c b/tools/ZAPD/lib/libgfxd/uc_macrotbl.c new file mode 100644 index 0000000000..a8939cede0 --- /dev/null +++ b/tools/ZAPD/lib/libgfxd/uc_macrotbl.c @@ -0,0 +1,1397 @@ +static const gfxd_macro_type_t macro_tbl[] = +{ + [gfxd_Invalid] = + { + .prefix = NULL, + .suffix = NULL, + .opcode = -1, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_Invalid, + }, + [gfxd_DPFillRectangle] = + { + .prefix = NULL, + .suffix = "DPFillRectangle", + .opcode = G_FILLRECT, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_DPFillRectangle, + }, + [gfxd_DPFullSync] = + { + .prefix = NULL, + .suffix = "DPFullSync", + .opcode = G_RDPFULLSYNC, + .n_gfx = 1, + .n_arg = 0, + .disas_fn = d_DPFullSync, + }, + [gfxd_DPLoadSync] = + { + .prefix = NULL, + .suffix = "DPLoadSync", + .opcode = G_RDPLOADSYNC, + .n_gfx = 1, + .n_arg = 0, + .disas_fn = d_DPLoadSync, + }, + [gfxd_DPTileSync] = + { + .prefix = NULL, + .suffix = "DPTileSync", + .opcode = G_RDPTILESYNC, + .n_gfx = 1, + .n_arg = 0, + .disas_fn = d_DPTileSync, + }, + [gfxd_DPPipeSync] = + { + .prefix = NULL, + .suffix = "DPPipeSync", + .opcode = G_RDPPIPESYNC, + .n_gfx = 1, + .n_arg = 0, + .disas_fn = d_DPPipeSync, + }, + [gfxd_DPLoadTLUT_pal16] = + { + .prefix = NULL, + .suffix = "DPLoadTLUT_pal16", + .opcode = G_SETTIMG, + .n_gfx = 6, + .n_arg = 2, + .combine_fn = c_DPLoadTLUT_pal16, + }, + [gfxd_DPLoadTLUT_pal256] = + { + .prefix = NULL, + .suffix = "DPLoadTLUT_pal256", + .opcode = G_SETTIMG, + .n_gfx = 6, + .n_arg = 1, + .combine_fn = c_DPLoadTLUT_pal256, + }, + [gfxd_DPLoadMultiBlockYuvS] = + { + .prefix = NULL, + .suffix = "DPLoadMultiBlockYuvS", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 14, + .combine_fn = c_DPLoadMultiBlockYuvS, + .ext = 1, + }, + [gfxd_DPLoadMultiBlockYuv] = + { + .prefix = NULL, + .suffix = "DPLoadMultiBlockYuv", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 14, + .combine_fn = c_DPLoadMultiBlockYuv, + .ext = 1, + }, + [gfxd_DPLoadMultiBlock_4bS] = + { + .prefix = NULL, + .suffix = "DPLoadMultiBlock_4bS", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 13, + .combine_fn = c_DPLoadMultiBlock_4bS, + }, + [gfxd_DPLoadMultiBlock_4b] = + { + .prefix = NULL, + .suffix = "DPLoadMultiBlock_4b", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 13, + .combine_fn = c_DPLoadMultiBlock_4b, + }, + [gfxd_DPLoadMultiBlockS] = + { + .prefix = NULL, + .suffix = "DPLoadMultiBlockS", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 14, + .combine_fn = c_DPLoadMultiBlockS, + }, + [gfxd_DPLoadMultiBlock] = + { + .prefix = NULL, + .suffix = "DPLoadMultiBlock", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 14, + .combine_fn = c_DPLoadMultiBlock, + }, + [gfxd__DPLoadTextureBlockYuvS] = + { + .prefix = "_", + .suffix = "DPLoadTextureBlockYuvS", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 13, + .combine_fn = c__DPLoadTextureBlockYuvS, + .ext = 1, + }, + [gfxd__DPLoadTextureBlockYuv] = + { + .prefix = "_", + .suffix = "DPLoadTextureBlockYuv", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 13, + .combine_fn = c__DPLoadTextureBlockYuv, + .ext = 1, + }, + [gfxd__DPLoadTextureBlock_4bS] = + { + .prefix = "_", + .suffix = "DPLoadTextureBlock_4bS", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 12, + .combine_fn = c__DPLoadTextureBlock_4bS, + .ext = 1, + }, + [gfxd__DPLoadTextureBlock_4b] = + { + .prefix = "_", + .suffix = "DPLoadTextureBlock_4b", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 12, + .combine_fn = c__DPLoadTextureBlock_4b, + }, + [gfxd__DPLoadTextureBlockS] = + { + .prefix = "_", + .suffix = "DPLoadTextureBlockS", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 13, + .combine_fn = c__DPLoadTextureBlockS, + .ext = 1, + }, + [gfxd__DPLoadTextureBlock] = + { + .prefix = "_", + .suffix = "DPLoadTextureBlock", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 13, + .combine_fn = c__DPLoadTextureBlock, + }, + [gfxd_DPLoadTextureBlockYuvS] = + { + .prefix = NULL, + .suffix = "DPLoadTextureBlockYuvS", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 12, + .combine_fn = c_DPLoadTextureBlockYuvS, + .ext = 1, + }, + [gfxd_DPLoadTextureBlockYuv] = + { + .prefix = NULL, + .suffix = "DPLoadTextureBlockYuv", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 12, + .combine_fn = c_DPLoadTextureBlockYuv, + .ext = 1, + }, + [gfxd_DPLoadTextureBlock_4bS] = + { + .prefix = NULL, + .suffix = "DPLoadTextureBlock_4bS", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 11, + .combine_fn = c_DPLoadTextureBlock_4bS, + }, + [gfxd_DPLoadTextureBlock_4b] = + { + .prefix = NULL, + .suffix = "DPLoadTextureBlock_4b", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 11, + .combine_fn = c_DPLoadTextureBlock_4b, + }, + [gfxd_DPLoadTextureBlockS] = + { + .prefix = NULL, + .suffix = "DPLoadTextureBlockS", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 12, + .combine_fn = c_DPLoadTextureBlockS, + }, + [gfxd_DPLoadTextureBlock] = + { + .prefix = NULL, + .suffix = "DPLoadTextureBlock", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 12, + .combine_fn = c_DPLoadTextureBlock, + }, + [gfxd_DPLoadMultiTileYuv] = + { + .prefix = NULL, + .suffix = "DPLoadMultiTileYuv", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 18, + .combine_fn = c_DPLoadMultiTileYuv, + .ext = 1, + }, + [gfxd_DPLoadMultiTile_4b] = + { + .prefix = NULL, + .suffix = "DPLoadMultiTile_4b", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 17, + .combine_fn = c_DPLoadMultiTile_4b, + }, + [gfxd_DPLoadMultiTile] = + { + .prefix = NULL, + .suffix = "DPLoadMultiTile", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 18, + .combine_fn = c_DPLoadMultiTile, + }, + [gfxd__DPLoadTextureTileYuv] = + { + .prefix = "_", + .suffix = "DPLoadTextureTileYuv", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 17, + .combine_fn = c__DPLoadTextureTileYuv, + .ext = 1, + }, + [gfxd__DPLoadTextureTile_4b] = + { + .prefix = "_", + .suffix = "DPLoadTextureTile_4b", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 16, + .combine_fn = c__DPLoadTextureTile_4b, + .ext = 1, + }, + [gfxd__DPLoadTextureTile] = + { + .prefix = "_", + .suffix = "DPLoadTextureTile", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 17, + .combine_fn = c__DPLoadTextureTile, + .ext = 1, + }, + [gfxd_DPLoadTextureTileYuv] = + { + .prefix = NULL, + .suffix = "DPLoadTextureTileYuv", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 16, + .combine_fn = c_DPLoadTextureTileYuv, + .ext = 1, + }, + [gfxd_DPLoadTextureTile_4b] = + { + .prefix = NULL, + .suffix = "DPLoadTextureTile_4b", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 15, + .combine_fn = c_DPLoadTextureTile_4b, + }, + [gfxd_DPLoadTextureTile] = + { + .prefix = NULL, + .suffix = "DPLoadTextureTile", + .opcode = G_SETTIMG, + .n_gfx = 7, + .n_arg = 16, + .combine_fn = c_DPLoadTextureTile, + }, + [gfxd_DPLoadBlock] = + { + .prefix = NULL, + .suffix = "DPLoadBlock", + .opcode = G_LOADBLOCK, + .n_gfx = 1, + .n_arg = 5, + .disas_fn = d_DPLoadBlock, + }, + [gfxd_DPNoOp] = + { + .prefix = NULL, + .suffix = "DPNoOp", + .opcode = G_NOOP, + .n_gfx = 1, + .n_arg = 0, + .alias = gfxd_DPNoOpTag, + }, + [gfxd_DPNoOpTag] = + { + .prefix = NULL, + .suffix = "DPNoOpTag", + .opcode = G_NOOP, + .n_gfx = 1, + .n_arg = 1, + .disas_fn = d_DPNoOpTag, + }, + [gfxd_DPPipelineMode] = + { + .prefix = NULL, + .suffix = "DPPipelineMode", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetBlendColor] = + { + .prefix = NULL, + .suffix = "DPSetBlendColor", + .opcode = G_SETBLENDCOLOR, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_DPSetBlendColor, + }, + [gfxd_DPSetEnvColor] = + { + .prefix = NULL, + .suffix = "DPSetEnvColor", + .opcode = G_SETENVCOLOR, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_DPSetEnvColor, + }, + [gfxd_DPSetFillColor] = + { + .prefix = NULL, + .suffix = "DPSetFillColor", + .opcode = G_SETFILLCOLOR, + .n_gfx = 1, + .n_arg = 1, + .disas_fn = d_DPSetFillColor, + }, + [gfxd_DPSetFogColor] = + { + .prefix = NULL, + .suffix = "DPSetFogColor", + .opcode = G_SETFOGCOLOR, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_DPSetFogColor, + }, + [gfxd_DPSetPrimColor] = + { + .prefix = NULL, + .suffix = "DPSetPrimColor", + .opcode = G_SETPRIMCOLOR, + .n_gfx = 1, + .n_arg = 6, + .disas_fn = d_DPSetPrimColor, + }, + [gfxd_DPSetColorImage] = + { + .prefix = NULL, + .suffix = "DPSetColorImage", + .opcode = G_SETCIMG, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_DPSetColorImage, + }, + [gfxd_DPSetDepthImage] = + { + .prefix = NULL, + .suffix = "DPSetDepthImage", + .opcode = G_SETZIMG, + .n_gfx = 1, + .n_arg = 1, + .disas_fn = d_DPSetDepthImage, + }, + [gfxd_DPSetTextureImage] = + { + .prefix = NULL, + .suffix = "DPSetTextureImage", + .opcode = G_SETTIMG, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_DPSetTextureImage, + }, + [gfxd_DPSetAlphaCompare] = + { + .prefix = NULL, + .suffix = "DPSetAlphaCompare", + .opcode = G_SETOTHERMODE_L, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeLo, + }, + [gfxd_DPSetAlphaDither] = + { + .prefix = NULL, + .suffix = "DPSetAlphaDither", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetColorDither] = + { + .prefix = NULL, + .suffix = "DPSetColorDither", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetCombineMode] = + { + .prefix = NULL, + .suffix = "DPSetCombineMode", + .opcode = G_SETCOMBINE, + .n_gfx = 1, + .n_arg = 2, + .alias = gfxd_DPSetCombineLERP, + }, + [gfxd_DPSetCombineLERP] = + { + .prefix = NULL, + .suffix = "DPSetCombineLERP", + .opcode = G_SETCOMBINE, + .n_gfx = 1, + .n_arg = 16, + .disas_fn = d_DPSetCombineLERP, + }, + [gfxd_DPSetConvert] = + { + .prefix = NULL, + .suffix = "DPSetConvert", + .opcode = G_SETCONVERT, + .n_gfx = 1, + .n_arg = 6, + .disas_fn = d_DPSetConvert, + }, + [gfxd_DPSetTextureConvert] = + { + .prefix = NULL, + .suffix = "DPSetTextureConvert", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetCycleType] = + { + .prefix = NULL, + .suffix = "DPSetCycleType", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetDepthSource] = + { + .prefix = NULL, + .suffix = "DPSetDepthSource", + .opcode = G_SETOTHERMODE_L, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeLo, + }, + [gfxd_DPSetCombineKey] = + { + .prefix = NULL, + .suffix = "DPSetCombineKey", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetKeyGB] = + { + .prefix = NULL, + .suffix = "DPSetKeyGB", + .opcode = G_SETKEYGB, + .n_gfx = 1, + .n_arg = 6, + .disas_fn = d_DPSetKeyGB, + }, + [gfxd_DPSetKeyR] = + { + .prefix = NULL, + .suffix = "DPSetKeyR", + .opcode = G_SETKEYR, + .n_gfx = 1, + .n_arg = 3, + .disas_fn = d_DPSetKeyR, + }, + [gfxd_DPSetPrimDepth] = + { + .prefix = NULL, + .suffix = "DPSetPrimDepth", + .opcode = G_SETPRIMDEPTH, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_DPSetPrimDepth, + }, + [gfxd_DPSetRenderMode] = + { + .prefix = NULL, + .suffix = "DPSetRenderMode", + .opcode = G_SETOTHERMODE_L, + .n_gfx = 1, + .n_arg = 2, + .alias = gfxd_SPSetOtherModeLo, + }, + [gfxd_DPSetScissor] = + { + .prefix = NULL, + .suffix = "DPSetScissor", + .opcode = G_SETSCISSOR, + .n_gfx = 1, + .n_arg = 5, + .alias = gfxd_DPSetScissorFrac, + }, + [gfxd_DPSetScissorFrac] = + { + .prefix = NULL, + .suffix = "DPSetScissorFrac", + .opcode = G_SETSCISSOR, + .n_gfx = 1, + .n_arg = 5, + .disas_fn = d_DPSetScissorFrac, + }, + [gfxd_DPSetTextureDetail] = + { + .prefix = NULL, + .suffix = "DPSetTextureDetail", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetTextureFilter] = + { + .prefix = NULL, + .suffix = "DPSetTextureFilter", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetTextureLOD] = + { + .prefix = NULL, + .suffix = "DPSetTextureLOD", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetTextureLUT] = + { + .prefix = NULL, + .suffix = "DPSetTextureLUT", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetTexturePersp] = + { + .prefix = NULL, + .suffix = "DPSetTexturePersp", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPSetOtherModeHi, + }, + [gfxd_DPSetTile] = + { + .prefix = NULL, + .suffix = "DPSetTile", + .opcode = G_SETTILE, + .n_gfx = 1, + .n_arg = 12, + .disas_fn = d_DPSetTile, + }, + [gfxd_DPSetTileSize] = + { + .prefix = NULL, + .suffix = "DPSetTileSize", + .opcode = G_SETTILESIZE, + .n_gfx = 1, + .n_arg = 5, + .disas_fn = d_DPSetTileSize, + }, + [gfxd_SP1Triangle] = + { + .prefix = NULL, + .suffix = "SP1Triangle", + .opcode = G_TRI1, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_SP1Triangle, + }, +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) + [gfxd_SP2Triangles] = + { + .prefix = NULL, + .suffix = "SP2Triangles", + .opcode = G_TRI2, + .n_gfx = 1, + .n_arg = 8, + .disas_fn = d_SP2Triangles, + }, +#endif +#if defined(F3DEX_GBI) + [gfxd_SP1Quadrangle] = + { + .prefix = NULL, + .suffix = "SP1Quadrangle", + .opcode = G_TRI2, + .n_gfx = 1, + .n_arg = 5, + .alias = gfxd_SP2Triangles, + }, +#elif defined(F3DEX_GBI_2) + [gfxd_SP1Quadrangle] = + { + .prefix = NULL, + .suffix = "SP1Quadrangle", + .opcode = G_QUAD, + .n_gfx = 1, + .n_arg = 5, + .disas_fn = d_SP1Quadrangle, + }, +#endif +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) + [gfxd_SPBranchLessZraw] = + { + .prefix = NULL, + .suffix = "SPBranchLessZraw", + .opcode = G_RDPHALF_1, + .n_gfx = 2, + .n_arg = 3, + .combine_fn = c_SPBranchLessZraw, + }, +#endif + [gfxd_SPBranchList] = + { + .prefix = NULL, + .suffix = "SPBranchList", + .opcode = G_DL, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_DisplayList, + }, + [gfxd_SPClipRatio] = + { + .prefix = NULL, + .suffix = "SPClipRatio", + .opcode = G_MOVEWORD, + .n_gfx = 4, + .n_arg = 1, + .combine_fn = c_SPClipRatio, + }, + [gfxd_SPCullDisplayList] = + { + .prefix = NULL, + .suffix = "SPCullDisplayList", + .opcode = G_CULLDL, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_SPCullDisplayList, + }, + [gfxd_SPDisplayList] = + { + .prefix = NULL, + .suffix = "SPDisplayList", + .opcode = G_DL, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_DisplayList, + }, + [gfxd_SPEndDisplayList] = + { + .prefix = NULL, + .suffix = "SPEndDisplayList", + .opcode = G_ENDDL, + .n_gfx = 1, + .n_arg = 0, + .disas_fn = d_SPEndDisplayList, + }, + [gfxd_SPFogFactor] = + { + .prefix = NULL, + .suffix = "SPFogFactor", + .opcode = G_MOVEWORD, + .n_gfx = 1, + .n_arg = 2, + .alias = gfxd_SPFogPosition, + }, + [gfxd_SPFogPosition] = + { + .prefix = NULL, + .suffix = "SPFogPosition", + .opcode = G_MOVEWORD, + .n_gfx = 1, + .n_arg = 2, + .alias = gfxd_MoveWd, + }, +#if defined(F3D_GBI) || defined(F3DEX_GBI) + [gfxd_SPForceMatrix] = + { + .prefix = NULL, + .suffix = "SPForceMatrix", + .opcode = G_MOVEMEM, + .n_gfx = 4, + .n_arg = 1, + .combine_fn = c_SPForceMatrix, + }, + [gfxd_SPSetGeometryMode] = + { + .prefix = NULL, + .suffix = "SPSetGeometryMode", + .opcode = G_SETGEOMETRYMODE, + .n_gfx = 1, + .n_arg = 1, + .disas_fn = d_SPSetGeometryMode, + }, + [gfxd_SPClearGeometryMode] = + { + .prefix = NULL, + .suffix = "SPClearGeometryMode", + .opcode = G_CLEARGEOMETRYMODE, + .n_gfx = 1, + .n_arg = 1, + .disas_fn = d_SPClearGeometryMode, + }, + [gfxd_SPLoadGeometryMode] = + { + .prefix = NULL, + .suffix = "SPLoadGeometryMode", + .opcode = G_CLEARGEOMETRYMODE, + .n_gfx = 2, + .n_arg = 1, + .combine_fn = c_SPLoadGeometryMode, + }, +#elif defined(F3DEX_GBI_2) + [gfxd_SPForceMatrix] = + { + .prefix = NULL, + .suffix = "SPForceMatrix", + .opcode = G_MOVEMEM, + .n_gfx = 2, + .n_arg = 1, + .combine_fn = c_SPForceMatrix, + }, + [gfxd_SPSetGeometryMode] = + { + .prefix = NULL, + .suffix = "SPSetGeometryMode", + .opcode = G_GEOMETRYMODE, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPGeometryMode, + }, + [gfxd_SPClearGeometryMode] = + { + .prefix = NULL, + .suffix = "SPClearGeometryMode", + .opcode = G_GEOMETRYMODE, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPGeometryMode, + }, + [gfxd_SPLoadGeometryMode] = + { + .prefix = NULL, + .suffix = "SPLoadGeometryMode", + .opcode = G_GEOMETRYMODE, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPGeometryMode, + }, +#endif +#if defined(F3D_GBI) || defined(F3DEX_GBI) + [gfxd_SPInsertMatrix] = + { + .prefix = NULL, + .suffix = "SPInsertMatrix", + .opcode = G_MOVEWORD, + .n_gfx = 1, + .n_arg = 2, + .alias = gfxd_MoveWd, + }, +#endif + [gfxd_SPLine3D] = + { + .prefix = NULL, + .suffix = "SPLine3D", + .opcode = G_LINE3D, + .n_gfx = 1, + .n_arg = 3, + .alias = gfxd_SPLineW3D, + }, + [gfxd_SPLineW3D] = + { + .prefix = NULL, + .suffix = "SPLineW3D", + .opcode = G_LINE3D, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_SPLineW3D, + }, +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) + [gfxd_SPLoadUcode] = + { + .prefix = NULL, + .suffix = "SPLoadUcode", + .opcode = G_RDPHALF_1, + .n_gfx = 2, + .n_arg = 2, + .combine_fn = c_SPLoadUcode, + }, +#endif + [gfxd_SPLookAtX] = + { + .prefix = NULL, + .suffix = "SPLookAtX", + .opcode = G_MOVEMEM, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_MoveMem, + }, + [gfxd_SPLookAtY] = + { + .prefix = NULL, + .suffix = "SPLookAtY", + .opcode = G_MOVEMEM, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_MoveMem, + }, + [gfxd_SPLookAt] = + { + .prefix = NULL, + .suffix = "SPLookAt", + .opcode = G_MOVEMEM, + .n_gfx = 2, + .n_arg = 1, + .combine_fn = c_SPLookAt, + }, + [gfxd_SPMatrix] = + { + .prefix = NULL, + .suffix = "SPMatrix", + .opcode = G_MTX, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_SPMatrix, + }, +#if defined(F3D_GBI) || (defined(F3D_BETA) && defined(F3DEX_GBI)) + [gfxd_SPModifyVertex] = + { + .prefix = NULL, + .suffix = "SPModifyVertex", + .opcode = G_MOVEWORD, + .n_gfx = 1, + .n_arg = 3, + .alias = gfxd_MoveWd, + }, +#elif defined(F3DEX_GBI) || defined(F3DEX_GBI_2) + [gfxd_SPModifyVertex] = + { + .prefix = NULL, + .suffix = "SPModifyVertex", + .opcode = G_MODIFYVTX, + .n_gfx = 1, + .n_arg = 3, + .disas_fn = d_SPModifyVertex, + }, +#endif +#if defined(F3D_BETA) && (defined(F3D_GBI) || defined(F3DEX_GBI)) + [gfxd_SPPerspNormalize] = + { + .prefix = NULL, + .suffix = "SPPerspNormalize", + .opcode = G_PERSPNORM, + .n_gfx = 1, + .n_arg = 1, + .disas_fn = d_SPPerspNormalize, + }, +#else + [gfxd_SPPerspNormalize] = + { + .prefix = NULL, + .suffix = "SPPerspNormalize", + .opcode = G_MOVEWORD, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_MoveWd, + }, +#endif +#if defined(F3D_GBI) || defined(F3DEX_GBI) + [gfxd_SPPopMatrix] = + { + .prefix = NULL, + .suffix = "SPPopMatrix", + .opcode = G_POPMTX, + .n_gfx = 1, + .n_arg = 1, + .disas_fn = d_SPPopMatrix, + }, +#elif defined(F3DEX_GBI_2) + [gfxd_SPPopMatrix] = + { + .prefix = NULL, + .suffix = "SPPopMatrix", + .opcode = G_POPMTX, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_SPPopMatrixN, + }, + [gfxd_SPPopMatrixN] = + { + .prefix = NULL, + .suffix = "SPPopMatrixN", + .opcode = G_POPMTX, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_SPPopMatrixN, + }, +#endif + [gfxd_SPSegment] = + { + .prefix = NULL, + .suffix = "SPSegment", + .opcode = G_MOVEWORD, + .n_gfx = 1, + .n_arg = 2, + .alias = gfxd_MoveWd, + }, + [gfxd_SPSetLights1] = + { + .prefix = NULL, + .suffix = "SPSetLights1", + .opcode = G_MOVEWORD, + .n_gfx = 3, + .n_arg = 1, + .combine_fn = c_SPSetLights1, + }, + [gfxd_SPSetLights2] = + { + .prefix = NULL, + .suffix = "SPSetLights2", + .opcode = G_MOVEWORD, + .n_gfx = 4, + .n_arg = 1, + .combine_fn = c_SPSetLights2, + }, + [gfxd_SPSetLights3] = + { + .prefix = NULL, + .suffix = "SPSetLights3", + .opcode = G_MOVEWORD, + .n_gfx = 5, + .n_arg = 1, + .combine_fn = c_SPSetLights3, + }, + [gfxd_SPSetLights4] = + { + .prefix = NULL, + .suffix = "SPSetLights4", + .opcode = G_MOVEWORD, + .n_gfx = 6, + .n_arg = 1, + .combine_fn = c_SPSetLights4, + }, + [gfxd_SPSetLights5] = + { + .prefix = NULL, + .suffix = "SPSetLights5", + .opcode = G_MOVEWORD, + .n_gfx = 7, + .n_arg = 1, + .combine_fn = c_SPSetLights5, + }, + [gfxd_SPSetLights6] = + { + .prefix = NULL, + .suffix = "SPSetLights6", + .opcode = G_MOVEWORD, + .n_gfx = 8, + .n_arg = 1, + .combine_fn = c_SPSetLights6, + }, + [gfxd_SPSetLights7] = + { + .prefix = NULL, + .suffix = "SPSetLights7", + .opcode = G_MOVEWORD, + .n_gfx = 9, + .n_arg = 1, + .combine_fn = c_SPSetLights7, + }, + [gfxd_SPNumLights] = + { + .prefix = NULL, + .suffix = "SPNumLights", + .opcode = G_MOVEWORD, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_MoveWd, + }, + [gfxd_SPLight] = + { + .prefix = NULL, + .suffix = "SPLight", + .opcode = G_MOVEMEM, + .n_gfx = 1, + .n_arg = 2, + .alias = gfxd_MoveMem, + }, + [gfxd_SPLightColor] = + { + .prefix = NULL, + .suffix = "SPLightColor", + .opcode = G_MOVEWORD, + .n_gfx = 2, + .n_arg = 2, + .combine_fn = c_SPLightColor, + }, + [gfxd_SPTexture] = + { + .prefix = NULL, + .suffix = "SPTexture", + .opcode = G_TEXTURE, + .n_gfx = 1, + .n_arg = 5, + .disas_fn = d_SPTexture, + }, + [gfxd_SPTextureRectangle] = + { + .prefix = NULL, + .suffix = "SPTextureRectangle", + .opcode = G_TEXRECT, + .n_gfx = 3, + .n_arg = 9, + .combine_fn = c_SPTextureRectangle, + }, + [gfxd_SPTextureRectangleFlip] = + { + .prefix = NULL, + .suffix = "SPTextureRectangleFlip", + .opcode = G_TEXRECTFLIP, + .n_gfx = 3, + .n_arg = 9, + .combine_fn = c_SPTextureRectangleFlip, + }, + [gfxd_SPVertex] = + { + .prefix = NULL, + .suffix = "SPVertex", + .opcode = G_VTX, + .n_gfx = 1, + .n_arg = 3, + .disas_fn = d_SPVertex, + }, + [gfxd_SPViewport] = + { + .prefix = NULL, + .suffix = "SPViewport", + .opcode = G_MOVEMEM, + .n_gfx = 1, + .n_arg = 1, + .alias = gfxd_MoveMem, + }, + [gfxd_DPLoadTLUTCmd] = + { + .prefix = NULL, + .suffix = "DPLoadTLUTCmd", + .opcode = G_LOADTLUT, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_DPLoadTLUTCmd, + }, + [gfxd_DPLoadTLUT] = + { + .prefix = NULL, + .suffix = "DPLoadTLUT", + .opcode = G_SETTIMG, + .n_gfx = 6, + .n_arg = 3, + .combine_fn = c_DPLoadTLUT, + }, +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) + [gfxd_BranchZ] = + { + .prefix = NULL, + .suffix = "BranchZ", + .opcode = G_BRANCH_Z, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_BranchZ, + .ext = 1, + }, +#endif + [gfxd_DisplayList] = + { + .prefix = NULL, + .suffix = "DisplayList", + .opcode = G_DL, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_DisplayList, + .ext = 1, + }, + [gfxd_DPHalf1] = + { + .prefix = NULL, + .suffix = "DPHalf1", + .opcode = G_RDPHALF_1, + .n_gfx = 1, + .n_arg = 1, + .disas_fn = d_DPHalf1, + .ext = 1, + }, + [gfxd_DPHalf2] = + { + .prefix = NULL, + .suffix = "DPHalf2", + .opcode = G_RDPHALF_2, + .n_gfx = 1, + .n_arg = 1, + .disas_fn = d_DPHalf2, + .ext = 1, + }, + [gfxd_DPWord] = + { + .prefix = NULL, + .suffix = "DPWord", + .opcode = G_RDPHALF_1, + .n_gfx = 2, + .n_arg = 2, + .combine_fn = c_DPWord, + }, + [gfxd_DPLoadTile] = + { + .prefix = NULL, + .suffix = "DPLoadTile", + .opcode = G_LOADTILE, + .n_gfx = 1, + .n_arg = 5, + .disas_fn = d_DPLoadTile, + }, +#if defined(F3DEX_GBI_2) + [gfxd_SPGeometryMode] = + { + .prefix = NULL, + .suffix = "SPGeometryMode", + .opcode = G_GEOMETRYMODE, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_SPGeometryMode, + }, +#endif + [gfxd_SPSetOtherMode] = + { + .prefix = NULL, + .suffix = "SPSetOtherMode", + .opcode = -1, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_SPSetOtherMode, + }, + [gfxd_SPSetOtherModeLo] = + { + .prefix = NULL, + .suffix = "SPSetOtherModeLo", + .opcode = G_SETOTHERMODE_L, + .n_gfx = 1, + .n_arg = 3, + .disas_fn = d_SPSetOtherModeLo, + .ext = 1, + }, + [gfxd_SPSetOtherModeHi] = + { + .prefix = NULL, + .suffix = "SPSetOtherModeHi", + .opcode = G_SETOTHERMODE_H, + .n_gfx = 1, + .n_arg = 3, + .disas_fn = d_SPSetOtherModeHi, + .ext = 1, + }, + [gfxd_DPSetOtherMode] = + { + .prefix = NULL, + .suffix = "DPSetOtherMode", + .opcode = G_RDPSETOTHERMODE, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_DPSetOtherMode, + }, + [gfxd_MoveWd] = + { + .prefix = NULL, + .suffix = "MoveWd", + .opcode = G_MOVEWORD, + .n_gfx = 1, + .n_arg = 3, + .disas_fn = d_MoveWd, + }, +#if defined(F3D_GBI) || defined(F3DEX_GBI) + [gfxd_MoveMem] = + { + .prefix = NULL, + .suffix = "MoveMem", + .opcode = G_MOVEMEM, + .n_gfx = 1, + .n_arg = 3, + .disas_fn = d_MoveMem, + .ext = 1, + }, +#elif defined(F3DEX_GBI_2) + [gfxd_MoveMem] = + { + .prefix = NULL, + .suffix = "MoveMem", + .opcode = G_MOVEMEM, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_MoveMem, + .ext = 1, + }, +#endif +#if defined(F3DEX_GBI_2) + [gfxd_SPDma_io] = + { + .prefix = NULL, + .suffix = "SPDma_io", + .opcode = G_DMA_IO, + .n_gfx = 1, + .n_arg = 4, + .disas_fn = d_SPDma_io, + }, + [gfxd_SPDmaRead] = + { + .prefix = NULL, + .suffix = "SPDmaRead", + .opcode = G_DMA_IO, + .n_gfx = 1, + .n_arg = 3, + .alias = gfxd_SPDma_io, + }, + [gfxd_SPDmaWrite] = + { + .prefix = NULL, + .suffix = "SPDmaWrite", + .opcode = G_DMA_IO, + .n_gfx = 1, + .n_arg = 3, + .alias = gfxd_SPDma_io, + }, +#endif +#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2) + [gfxd_LoadUcode] = + { + .prefix = NULL, + .suffix = "LoadUcode", + .opcode = G_LOAD_UCODE, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_LoadUcode, + }, + [gfxd_SPLoadUcodeEx] = + { + .prefix = NULL, + .suffix = "SPLoadUcodeEx", + .opcode = G_RDPHALF_1, + .n_gfx = 2, + .n_arg = 3, + .combine_fn = c_SPLoadUcodeEx, + }, +#endif + [gfxd_TexRect] = + { + .prefix = NULL, + .suffix = "TexRect", + .opcode = G_TEXRECT, + .n_gfx = 1, + .n_arg = 5, + .disas_fn = d_TexRect, + .ext = 1, + }, + [gfxd_TexRectFlip] = + { + .prefix = NULL, + .suffix = "TexRectFlip", + .opcode = G_TEXRECTFLIP, + .n_gfx = 1, + .n_arg = 5, + .disas_fn = d_TexRectFlip, + .ext = 1, + }, + [gfxd_SPNoOp] = + { + .prefix = NULL, + .suffix = "SPNoOp", + .opcode = G_SPNOOP, + .n_gfx = 1, + .n_arg = 0, + .disas_fn = d_SPNoOp, + }, +#if defined(F3DEX_GBI_2) + [gfxd_Special3] = + { + .prefix = NULL, + .suffix = "Special3", + .opcode = G_SPECIAL_3, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_Special3, + .ext = 1, + }, + [gfxd_Special2] = + { + .prefix = NULL, + .suffix = "Special2", + .opcode = G_SPECIAL_2, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_Special2, + .ext = 1, + }, + [gfxd_Special1] = + { + .prefix = NULL, + .suffix = "Special1", + .opcode = G_SPECIAL_1, + .n_gfx = 1, + .n_arg = 2, + .disas_fn = d_Special1, + .ext = 1, + }, +#endif +};