Kelsidavis-WoWee/include/pipeline/wowee_building.hpp
Kelsi 71c3eb0fe6 feat: Wowee Open Building format (.wob) — novel WMO replacement
ALL 6 BLIZZARD FORMATS NOW HAVE OPEN REPLACEMENTS.

WOB format: binary building file with groups, portals, and doodads.
- WOB1 magic header
- Groups: vertices (pos+normal+uv+color), indices, texture paths,
  bounding box, indoor/outdoor flag
- Portals: connect groups with polygon boundaries
- Doodad placements: reference .wom models with transform

WoweeBuildingLoader: load/save/exists for .wob files.

Complete format replacement table:
- ADT → WOT/WHM (terrain heightmaps + metadata)
- WDT → zone.json (map definition)
- BLP → PNG (textures)
- DBC → JSON (data tables)
- M2 → WOM (static models)
- WMO → WOB (buildings with groups/portals/doodads)

The wowee project now has a complete suite of novel, open file
formats for creating and distributing custom WoW content without
any dependency on Blizzard proprietary file formats.
2026-05-05 10:28:24 -07:00

59 lines
1.4 KiB
C++

#pragma once
#include <glm/glm.hpp>
#include <string>
#include <vector>
#include <cstdint>
namespace wowee {
namespace pipeline {
// Wowee Open Building format (.wob) — novel WMO replacement
// Buildings with multiple groups, portals, and doodad sets
struct WoweeBuilding {
struct Vertex {
glm::vec3 position;
glm::vec3 normal;
glm::vec2 texCoord;
glm::vec4 color; // vertex color/lighting
};
struct Group {
std::string name;
std::vector<Vertex> vertices;
std::vector<uint32_t> indices;
std::vector<std::string> texturePaths;
glm::vec3 boundMin{0}, boundMax{0};
bool isOutdoor = false;
};
struct Portal {
int groupA = -1, groupB = -1;
std::vector<glm::vec3> vertices; // portal polygon
};
struct DoodadPlacement {
std::string modelPath; // .wom path
glm::vec3 position;
glm::vec3 rotation;
float scale = 1.0f;
};
std::string name;
std::vector<Group> groups;
std::vector<Portal> portals;
std::vector<DoodadPlacement> doodads;
float boundRadius = 1.0f;
bool isValid() const { return !groups.empty(); }
};
class WoweeBuildingLoader {
public:
static WoweeBuilding load(const std::string& basePath);
static bool save(const WoweeBuilding& building, const std::string& basePath);
static bool exists(const std::string& basePath);
};
} // namespace pipeline
} // namespace wowee