feat: WOC collision mesh format — 7th novel open format

New format: WOC (Wowee Open Collision) — binary collision mesh for
custom zone walkability. Magic WOC1 (0x31434F57).

- WoweeCollisionBuilder::fromTerrain() generates collision triangles
  from terrain heightmap with slope classification (50 deg threshold)
- Per-triangle flags: walkable (0x01), water (0x02), steep (0x04)
- Respects terrain holes (skips triangles in hole regions)
- Binary save/load with bounds, tile coords, triangle data
- Auto-exported on zone save alongside WOT/WHM/WOM/WOB
- Added to content pack validation (score now 0-7)
- FORMAT_SPEC.md v1.1 updated with WOC binary layout
- 19 new test assertions: flat terrain generation (32k tris all
  walkable), save/load round-trip, hole skipping
- 328 total assertions across 84 test cases
This commit is contained in:
Kelsi 2026-05-05 15:23:58 -07:00
parent 961d863f82
commit 4d5eef480e
10 changed files with 342 additions and 7 deletions

View file

@ -366,7 +366,7 @@ void EditorUI::renderMenuBar(EditorApp& app) {
ImVec4 scoreColor = score >= 5 ? ImVec4(0.3f, 1, 0.3f, 1) :
score >= 3 ? ImVec4(1, 1, 0.3f, 1) :
ImVec4(1, 0.3f, 0.3f, 1);
ImGui::TextColored(scoreColor, "Open Format Score: %d/6", score);
ImGui::TextColored(scoreColor, "Open Format Score: %d/7", score);
ImGui::Separator();
auto fmt = [](bool has, bool valid, const char* name, const char* desc) {
ImVec4 c = has ? (valid ? ImVec4(0.3f,1,0.3f,1) : ImVec4(1,0.7f,0.3f,1))
@ -380,6 +380,7 @@ void EditorUI::renderMenuBar(EditorApp& app) {
fmt(val.hasPng, true, "PNG", "textures");
fmt(val.hasWom, val.womValid, "WOM", "models");
fmt(val.hasWob, val.wobValid, "WOB", "buildings");
fmt(val.hasWoc, val.wocValid, "WOC", "collision mesh");
ImGui::Separator();
fmt(val.hasCreatures, true, "creatures", "NPC spawns");
fmt(val.hasQuests, true, "quests", "quest data");