summaryrefslogtreecommitdiff
path: root/tools/dumprwtree
diff options
context:
space:
mode:
authorclaude-bot <[email protected]>2026-07-13 12:40:03 +0000
committerclaude-bot <[email protected]>2026-07-13 12:40:03 +0000
commit847962910f0bff071f3bf07c9abb87764fb6cac3 (patch)
treeddcd429e134c7fd5f72ddc97ced175de8d66fcd0 /tools/dumprwtree
downloadlibrw-847962910f0bff071f3bf07c9abb87764fb6cac3.tar.gz
librw-847962910f0bff071f3bf07c9abb87764fb6cac3.zip
Import aap/librw @ masterHEADmaster
Snapshot for re3/reVC vendoring, per @lzcnt. Source: https://github.com/aap/librw (master).
Diffstat (limited to 'tools/dumprwtree')
-rw-r--r--tools/dumprwtree/CMakeLists.txt20
-rw-r--r--tools/dumprwtree/dumprwtree.cpp145
2 files changed, 165 insertions, 0 deletions
diff --git a/tools/dumprwtree/CMakeLists.txt b/tools/dumprwtree/CMakeLists.txt
new file mode 100644
index 0000000..092b3dd
--- /dev/null
+++ b/tools/dumprwtree/CMakeLists.txt
@@ -0,0 +1,20 @@
+add_executable(dumprwtree
+ dumprwtree.cpp
+)
+
+target_link_libraries(dumprwtree
+ PRIVATE
+ librw::librw
+)
+
+if(LIBRW_GL3_GFXLIB MATCHES "SDL[23]")
+ target_compile_definitions(dumprwtree PRIVATE SDL_MAIN_HANDLED)
+endif()
+
+if(LIBRW_INSTALL)
+ install(TARGETS dumprwtree
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ )
+endif()
+
+librw_platform_target(dumprwtree INSTALL)
diff --git a/tools/dumprwtree/dumprwtree.cpp b/tools/dumprwtree/dumprwtree.cpp
new file mode 100644
index 0000000..ca86d3c
--- /dev/null
+++ b/tools/dumprwtree/dumprwtree.cpp
@@ -0,0 +1,145 @@
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <cassert>
+
+#include <rw.h>
+
+using namespace std;
+using namespace rw;
+
+const char *chunks[] = { "None", "Struct", "String", "Extension", "Unknown",
+ "Camera", "Texture", "Material", "Material List", "Atomic Section",
+ "Plane Section", "World", "Spline", "Matrix", "Frame List",
+ "Geometry", "Clump", "Unknown", "Light", "Unicode String", "Atomic",
+ "Texture Native", "Texture Dictionary", "Animation Database",
+ "Image", "Skin Animation", "Geometry List", "Anim Animation",
+ "Team", "Crowd", "Delta Morph Animation", "Right To Render",
+ "MultiTexture Effect Native", "MultiTexture Effect Dictionary",
+ "Team Dictionary", "Platform Independet Texture Dictionary",
+ "Table of Contents", "Particle Standard Global Data", "AltPipe",
+ "Platform Independet Peds", "Patch Mesh", "Chunk Group Start",
+ "Chunk Group End", "UV Animation Dictionary", "Coll Tree"
+};
+
+/* From 0x0101 through 0x0135 */
+const char *toolkitchunks0[] = { "Metrics PLG", "Spline PLG", "Stereo PLG",
+ "VRML PLG", "Morph PLG", "PVS PLG", "Memory Leak PLG", "Animation PLG",
+ "Gloss PLG", "Logo PLG", "Memory Info PLG", "Random PLG",
+ "PNG Image PLG", "Bone PLG", "VRML Anim PLG", "Sky Mipmap Val",
+ "MRM PLG", "LOD Atomic PLG", "ME PLG", "Lightmap PLG",
+ "Refine PLG", "Skin PLG", "Label PLG", "Particles PLG", "GeomTX PLG",
+ "Synth Core PLG", "STQPP PLG",
+ "Part PP PLG", "Collision PLG", "HAnim PLG", "User Data PLG",
+ "Material Effects PLG", "Particle System PLG", "Delta Morph PLG",
+ "Patch PLG", "Team PLG", "Crowd PP PLG", "Mip Split PLG",
+ "Anisotrophy PLG", "Not used", "GCN Material PLG", "Geometric PVS PLG",
+ "XBOX Material PLG", "Multi Texture PLG", "Chain PLG", "Toon PLG",
+ "PTank PLG", "Particle Standard PLG", "PDS PLG", "PrtAdv PLG",
+ "Normal Map PLG", "ADC PLG", "UV Animation PLG"
+};
+
+/* From 0x0180 through 0x01c1 */
+const char *toolkitchunks1[] = {
+ "Character Set PLG", "NOHS World PLG", "Import Util PLG",
+ "Slerp PLG", "Optim PLG", "TL World PLG", "Database PLG",
+ "Raytrace PLG", "Ray PLG", "Library PLG",
+ "Not used", "Not used", "Not used", "Not used", "Not used", "Not used",
+ "2D PLG", "Tile Render PLG", "JPEG Image PLG", "TGA Image PLG",
+ "GIF Image PLG", "Quat PLG", "Spline PVS PLG", "Mipmap PLG",
+ "MipmapK PLG", "2D Font", "Intersection PLG", "TIFF Image PLG",
+ "Pick PLG", "BMP Image PLG", "RAS Image PLG", "Skin FX PLG",
+ "VCAT PLG", "2D Path", "2D Brush", "2D Object", "2D Shape", "2D Scene",
+ "2D Pick Region", "2D Object String", "2D Animation PLG",
+ "2D Animation",
+ "Not used", "Not used", "Not used", "Not used", "Not used", "Not used",
+ "2D Keyframe", "2D Maestro", "Barycentric",
+ "Platform Independent Texture Dictionary TK", "TOC TK", "TPL TK",
+ "AltPipe TK", "Animation TK", "Skin Split Tookit", "Compressed Key TK",
+ "Geometry Conditioning PLG", "Wing PLG", "Generic Pipeline TK",
+ "Lightmap Conversion TK", "Filesystem PLG", "Dictionary TK",
+ "UV Animation Linear", "UV Animation Parameter"
+};
+
+const char *RSchunks[] = { "Unused 1", "Unused 2", "Extra Normals",
+ "Pipeline Set", "Unused 5", "Unused 6", "Specular Material",
+ "Unused 8", "2dfx", "Extra Colors", "Collision Model",
+ "Unused 12", "Environment Material", "Breakable", "Node Name",
+ "Unused 16"
+};
+
+const char*
+getChunkName(uint32 id)
+{
+ switch(id){
+ case 0x50E:
+ return "Bin Mesh PLG";
+ case 0x510:
+ return "Native Data PLG";
+ case 0x511:
+ return "Vertex Format PLG";
+ case 0xF21E:
+ return "ZModeler Lock";
+ }
+
+ if(id <= 45)
+ return chunks[id];
+ else if(id <= 0x0253F2FF && id >= 0x0253F2F0)
+ return RSchunks[id-0x0253F2F0];
+ else if(id <= 0x0135 && id >= 0x0101)
+ return toolkitchunks0[id-0x0101];
+ else if(id <= 0x01C0 && id >= 0x0181)
+ return toolkitchunks1[id-0x0181];
+ else
+ return "Unknown";
+}
+
+void
+readchunk(StreamFile *s, ChunkHeaderInfo *h, int level)
+{
+ for(int i = 0; i < level; i++)
+ printf(" ");
+ const char *name = getChunkName(h->type);
+ printf("%s (%x bytes @ 0x%x/0x%x) - [0x%x]\n",
+ name, h->length, s->tell()-12, s->tell(), h->type);
+
+ uint32 end = s->tell() + h->length;
+ while(s->tell() < end){
+ ChunkHeaderInfo nh;
+ readChunkHeaderInfo(s, &nh);
+ if(nh.version == h->version && nh.build == h->build){
+ readchunk(s, &nh, level+1);
+ if(h->type == 0x510)
+ s->seek(end, 0);
+ }else{
+ s->seek(h->length-12);
+ break;
+ }
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ if(argc < 2){
+ fprintf(stderr, "usage: %s rwStreamFile\n", argv[0]);
+ return 0;
+ }
+ StreamFile s;
+ s.open(argv[1], "rb");
+
+ ChunkHeaderInfo header, last;
+ while(readChunkHeaderInfo(&s, &header)){
+ if(header.type == 0)
+ break;
+ last = header;
+ if(argc == 2)
+ readchunk(&s, &header, 0);
+ }
+
+ printf("%x %x %x\n", last.version, last.build,
+ libraryIDPack(last.version, last.build));
+
+ s.close();
+ return 0;
+}