From 4ea09b0b8b029480a9ea313db0dc4af23fc4a2a8 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Tue, 5 May 2026 11:08:40 -0700 Subject: [PATCH] feat(editor): alpha map export as individual 64x64 grayscale PNGs --- tools/editor/wowee_terrain.cpp | 23 +++++++++++++++++++++++ tools/editor/wowee_terrain.hpp | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/tools/editor/wowee_terrain.cpp b/tools/editor/wowee_terrain.cpp index eafe82fb..9784630f 100644 --- a/tools/editor/wowee_terrain.cpp +++ b/tools/editor/wowee_terrain.cpp @@ -121,6 +121,29 @@ bool WoweeTerrain::exportNormalMap(const pipeline::ADTTerrain& terrain, return true; } +int WoweeTerrain::exportAlphaMaps(const pipeline::ADTTerrain& terrain, + const std::string& outputDir) { + namespace fs = std::filesystem; + fs::create_directories(outputDir); + int exported = 0; + + for (int ci = 0; ci < 256; ci++) { + const auto& chunk = terrain.chunks[ci]; + for (size_t li = 1; li < chunk.layers.size(); li++) { + if (!chunk.layers[li].useAlpha()) continue; + size_t off = chunk.layers[li].offsetMCAL; + if (off + 4096 > chunk.alphaMap.size()) continue; + + std::string path = outputDir + "/chunk_" + std::to_string(ci) + + "_layer_" + std::to_string(li) + ".png"; + stbi_write_png(path.c_str(), 64, 64, 1, + chunk.alphaMap.data() + off, 64); + exported++; + } + } + return exported; +} + bool WoweeTerrain::importOpen(const std::string& basePath, pipeline::ADTTerrain& terrain) { std::string hmPath = basePath + ".whm"; std::ifstream f(hmPath, std::ios::binary); diff --git a/tools/editor/wowee_terrain.hpp b/tools/editor/wowee_terrain.hpp index fa459af4..825a4982 100644 --- a/tools/editor/wowee_terrain.hpp +++ b/tools/editor/wowee_terrain.hpp @@ -18,6 +18,10 @@ public: static bool exportNormalMap(const pipeline::ADTTerrain& terrain, const std::string& path); + // Export alpha maps as individual 64x64 grayscale PNGs per chunk layer + static int exportAlphaMaps(const pipeline::ADTTerrain& terrain, + const std::string& outputDir); + // Import terrain from open format back to ADTTerrain static bool importOpen(const std::string& basePath, pipeline::ADTTerrain& terrain); };