mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-04-03 20:03:50 +00:00
Complete rewrite — the previous version extensively referenced OpenGL (glClearColor, VAO/VBO/EBO, GLSL shaders) throughout all sections. The project has used Vulkan exclusively for months. Key changes: - Replace all OpenGL references with Vulkan equivalents (VkContext, VMA, descriptor sets, pipeline cache, SPIR-V shaders) - Update system diagram to show actual sub-renderer hierarchy (TerrainRenderer, WMORenderer, M2Renderer, CharacterRenderer, etc.) - Document GameHandler SOLID decomposition (8 domain handlers + EntityController + GameServices dependency injection) - Add Warden 4-layer architecture section - Add audio system section (miniaudio, 5 sound managers) - Update opcode count from "100+" to 664+ - Update UI section: talent screen and settings are implemented (not TODO) - Document threading model (async terrain, GPU upload queue, normal maps) - Fix dependencies list (Vulkan SDK, VMA, vk-bootstrap, Unicorn, FFmpeg) - Add container builds and CI platforms - Remove stale "TODO" items for features that are complete
319 lines
13 KiB
Markdown
319 lines
13 KiB
Markdown
# Architecture Overview
|
||
|
||
## System Design
|
||
|
||
Wowee follows a modular architecture with clear separation of concerns:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────┐
|
||
│ Application (main loop) │
|
||
│ - State management (auth/realms/game) │
|
||
│ - Update cycle │
|
||
│ - Event dispatch │
|
||
└──────────────┬──────────────────────────────┘
|
||
│
|
||
┌───────┴────────┐
|
||
│ │
|
||
┌──────▼──────┐ ┌─────▼──────┐
|
||
│ Window │ │ Input │
|
||
│ (SDL2 + │ │ (Keyboard/ │
|
||
│ Vulkan) │ │ Mouse) │
|
||
└──────┬──────┘ └─────┬──────┘
|
||
│ │
|
||
└───────┬────────┘
|
||
│
|
||
┌──────────┴──────────┐
|
||
│ │
|
||
┌───▼────────┐ ┌───────▼──────┐
|
||
│ Renderer │ │ UI Manager │
|
||
│ (Vulkan) │ │ (ImGui) │
|
||
└───┬────────┘ └──────────────┘
|
||
│
|
||
├─ Camera + CameraController
|
||
├─ TerrainRenderer (ADT streaming)
|
||
├─ WMORenderer (buildings, collision)
|
||
├─ M2Renderer (models, particles, ribbons)
|
||
├─ CharacterRenderer (skeletal animation)
|
||
├─ WaterRenderer (refraction, lava, slime)
|
||
├─ SkyBox + StarField + Weather
|
||
├─ LightingManager (Light.dbc volumes)
|
||
└─ SwimEffects, ChargeEffect, Lightning
|
||
```
|
||
|
||
## Core Systems
|
||
|
||
### 1. Application Layer (`src/core/`)
|
||
|
||
**Application** (`application.hpp/cpp`) - Main controller
|
||
- Owns all subsystems (renderer, game handler, asset manager, UI)
|
||
- Manages application state (AUTH → REALM_SELECT → CHAR_SELECT → IN_WORLD)
|
||
- Runs update/render loop
|
||
- Populates `GameServices` struct and passes to `GameHandler` at construction
|
||
|
||
**Window** (`window.hpp/cpp`) - SDL2 + Vulkan wrapper
|
||
- Creates SDL2 window with Vulkan surface
|
||
- Owns `VkContext` (Vulkan device, swapchain, render passes)
|
||
- Handles resize events
|
||
|
||
**Input** (`input.hpp/cpp`) - Input management
|
||
- Keyboard state tracking (SDL scancodes)
|
||
- Mouse position, buttons (1-based SDL indices), wheel delta
|
||
- Per-frame delta calculation
|
||
|
||
**Logger** (`logger.hpp/cpp`) - Thread-safe logging
|
||
- Multiple log levels (DEBUG, INFO, WARNING, ERROR, FATAL)
|
||
- File output to `logs/wowee.log`
|
||
- Configurable via `WOWEE_LOG_LEVEL` env var
|
||
|
||
### 2. Rendering System (`src/rendering/`)
|
||
|
||
**Renderer** (`renderer.hpp/cpp`) - Main rendering coordinator
|
||
- Manages Vulkan pipeline state
|
||
- Coordinates frame rendering across all sub-renderers
|
||
- Owns camera, sky, weather, lighting, and all sub-renderers
|
||
- Shadow mapping with PCF filtering
|
||
|
||
**VkContext** (`vk_context.hpp/cpp`) - Vulkan infrastructure
|
||
- Device selection, queue families, swapchain
|
||
- Render passes, framebuffers, command pools
|
||
- Sampler cache (FNV-1a hashed dedup)
|
||
- Pipeline cache persistence for fast startup
|
||
|
||
**Camera** (`camera.hpp/cpp`) - View/projection matrices
|
||
- Position and orientation
|
||
- FOV, aspect ratio, near/far planes
|
||
- Sub-pixel jitter for TAA/FSR2 (column 2 NDC offset)
|
||
- Frustum extraction for culling
|
||
|
||
**TerrainRenderer** - ADT terrain streaming
|
||
- Async chunk loading within configurable radius
|
||
- 4-layer texture splatting with alpha blending
|
||
- Frustum + distance culling
|
||
- Vegetation/foliage placement via deterministic RNG
|
||
|
||
**WMORenderer** - World Map Objects (buildings)
|
||
- Multi-material batch rendering
|
||
- Portal-based visibility culling
|
||
- Floor/wall collision (normal-based classification)
|
||
- Interior glass transparency, doodad placement
|
||
|
||
**M2Renderer** - Models (creatures, doodads, spell effects)
|
||
- Skeletal animation with GPU bone transforms
|
||
- Particle emitters (WotLK FBlock format)
|
||
- Ribbon emitters (charge trails, enchant glows)
|
||
- Portal spin effects, foliage wind displacement
|
||
- Per-instance animation state
|
||
|
||
**CharacterRenderer** - Player/NPC character models
|
||
- GPU vertex skinning (256 bones)
|
||
- Race/gender-aware textures via CharSections.dbc
|
||
- Equipment rendering (geoset visibility per slot)
|
||
- Fallback textures (white/transparent/flat-normal) for missing assets
|
||
|
||
**WaterRenderer** - Terrain and WMO water
|
||
- Refraction/reflection rendering
|
||
- Magma/slime with multi-octave FBM noise flow
|
||
- Beer-Lambert absorption
|
||
|
||
**Skybox + StarField + Weather**
|
||
- Procedural sky dome with time-of-day lighting
|
||
- Star field with day/night fade (dusk 18:00–20:00, dawn 04:00–06:00)
|
||
- Rain/snow particle systems per zone (via zone weather table)
|
||
|
||
**LightingManager** - Light.dbc volume sampling
|
||
- Time-of-day color bands (half-minutes, 0–2879)
|
||
- Distance-weighted light volume blending
|
||
- Fog color/distance parameters
|
||
|
||
### 3. Networking (`src/network/`)
|
||
|
||
**TCPSocket** (`tcp_socket.hpp/cpp`) - Platform TCP
|
||
- Non-blocking I/O with per-frame recv budgets
|
||
- 4 KB recv buffer per call
|
||
- Portable across Linux/macOS/Windows
|
||
|
||
**WorldSocket** (`world_socket.hpp/cpp`) - WoW world connection
|
||
- RC4 header encryption (derived from SRP session key)
|
||
- Packet parsing with configurable per-frame budgets
|
||
- Compressed move packet handling
|
||
|
||
**Packet** (`packet.hpp/cpp`) - Binary data container
|
||
- Read/write primitives (uint8–uint64, float, string, packed GUID)
|
||
- Bounds-checked reads (return 0 past end)
|
||
|
||
### 4. Authentication (`src/auth/`)
|
||
|
||
**AuthHandler** - Auth server protocol (port 3724)
|
||
- SRP6a challenge/proof flow
|
||
- Security flags: PIN (0x01), Matrix (0x02), Authenticator (0x04)
|
||
- Realm list retrieval
|
||
|
||
**SRP** (`srp.hpp/cpp`) - Secure Remote Password
|
||
- SRP6a with 19-byte (152-bit) ephemeral
|
||
- OpenSSL BIGNUM math
|
||
- Session key generation (40 bytes)
|
||
|
||
**Integrity** - Client integrity verification
|
||
- Checksum computation for Warden compatibility
|
||
|
||
### 5. Game Logic (`src/game/`)
|
||
|
||
**GameHandler** (`game_handler.hpp/cpp`) - Central game state
|
||
- Dispatch table routing 664+ opcodes to domain handlers
|
||
- Owns all domain handlers via composition
|
||
- Receives dependencies via `GameServices` struct (no singleton access)
|
||
|
||
**Domain Handlers** (SOLID decomposition from GameHandler):
|
||
- `EntityController` - UPDATE_OBJECT parsing, entity spawn/despawn
|
||
- `MovementHandler` - Movement packets, speed, taxi, swimming, flying
|
||
- `CombatHandler` - Damage, healing, death, auto-attack, threat
|
||
- `SpellHandler` - Spell casting, cooldowns, auras, talents, pet spells
|
||
- `InventoryHandler` - Equipment, bags, bank, mail, auction, vendors
|
||
- `QuestHandler` - Quest accept/complete, objectives, progress tracking
|
||
- `SocialHandler` - Party, guild, LFG, friends, who, duel, trade
|
||
- `ChatHandler` - Chat messages, channels, emotes, system messages
|
||
- `WardenHandler` - Anti-cheat module management
|
||
|
||
**OpcodeTable** - Expansion-agnostic opcode mapping
|
||
- `LogicalOpcode` enum → wire opcode via JSON config per expansion
|
||
- Runtime remapping for Classic/TBC/WotLK/Turtle protocol differences
|
||
|
||
**Entity / EntityManager** - Entity lifecycle
|
||
- Shared entity base class with update fields (uint32 array)
|
||
- Player, Unit, GameObject subtypes
|
||
- GUID-based lookup, field extraction (health, level, display ID, etc.)
|
||
|
||
**TransportManager** - Transport path evaluation
|
||
- Catmull-Rom spline interpolation from TransportAnimation.dbc
|
||
- Clock-based motion with server time synchronization
|
||
- Time-closed looping paths (wrap point duplicated, no index wrapping)
|
||
|
||
**Expansion Helpers** (`game_utils.hpp`):
|
||
- `isActiveExpansion("classic")` / `isActiveExpansion("tbc")` / `isActiveExpansion("wotlk")`
|
||
- `isClassicLikeExpansion()` (Classic or Turtle WoW)
|
||
- `isPreWotlk()` (Classic, Turtle, or TBC)
|
||
|
||
### 6. Asset Pipeline (`src/pipeline/`)
|
||
|
||
**AssetManager** - Runtime asset access
|
||
- Extracted loose-file tree indexed by `Data/manifest.json`
|
||
- Layered resolution via optional overlay manifests (multi-expansion dedup)
|
||
- File cache with configurable budget (256 MB min, 12 GB max)
|
||
- PNG override support (checks for .png before .blp)
|
||
|
||
**asset_extract (tool)** - MPQ extraction
|
||
- Uses StormLib to extract MPQs into `Data/` and generate `manifest.json`
|
||
- Driven by `extract_assets.sh` / `extract_assets.ps1`
|
||
|
||
**BLPLoader** - Texture decompression
|
||
- DXT1/3/5 block compression (RGB565 color endpoints)
|
||
- Palette mode with 1/4/8-bit alpha
|
||
- Mipmap extraction
|
||
|
||
**M2Loader** - Model binary parsing
|
||
- Version-aware header (Classic v256 vs WotLK v264)
|
||
- Skeletal animation tracks (embedded vs external .anim files, flag 0x20)
|
||
- Compressed quaternions (int16 offset mapping)
|
||
- Particle emitters, ribbon emitters, attachment points
|
||
- Geoset support (group × 100 + variant encoding)
|
||
|
||
**WMOLoader** - World object parsing
|
||
- Multi-group rendering with portal visibility
|
||
- Doodad placement (24-bit name index + 8-bit flags packing)
|
||
- Liquid data, collision geometry
|
||
|
||
**ADTLoader** - Terrain parsing
|
||
- 64×64 tiles per map, 16×16 chunks per tile (MCNK)
|
||
- MCVT height grid (145 vertices: 9 outer + 8 inner per row × 9 rows)
|
||
- Texture layers (up to 4 with alpha blending, RLE-compressed alpha maps)
|
||
- Async loading to prevent frame stalls
|
||
|
||
**DBCLoader** - Database table parsing
|
||
- Binary DBC format (fixed 4-byte uint32 fields + string block)
|
||
- CSV fallback for pre-extracted data
|
||
- Expansion-aware field layout via `dbc_layouts.json`
|
||
- 20+ DBC files: Spell, Item, Creature, Faction, Map, AreaTable, etc.
|
||
|
||
### 7. UI System (`src/ui/`)
|
||
|
||
**UIManager** - ImGui coordinator
|
||
- ImGui initialization with SDL2/Vulkan backend
|
||
- Screen state management and transitions
|
||
- Event handling and input routing
|
||
|
||
**Screens:**
|
||
- `AuthScreen` - Login with username/password, server address, security code
|
||
- `RealmScreen` - Realm list with population and type indicators
|
||
- `CharacterScreen` - Character selection with 3D animated preview
|
||
- `CharacterCreateScreen` - Race/class/gender/appearance customization
|
||
- `GameScreen` - Main HUD: chat, action bar, target frame, minimap, nameplates, combat text, tooltips
|
||
- `InventoryScreen` - Equipment paper doll, backpack, bag windows, item tooltips with stats
|
||
- `SpellbookScreen` - Tabbed spell list with icons, drag-drop to action bar
|
||
- `QuestLogScreen` - Quest list with objectives, details, and rewards
|
||
- `TalentScreen` - Talent tree UI with point allocation
|
||
- `SettingsScreen` - Graphics presets (LOW/MEDIUM/HIGH/ULTRA), audio, keybindings
|
||
|
||
### 8. Audio System (`src/audio/`)
|
||
|
||
**AudioEngine** - miniaudio-based playback
|
||
- WAV decode cache (256 entries, LRU eviction)
|
||
- 2D and 3D positional audio
|
||
- Sample rate preservation (explicit to avoid miniaudio pitch distortion)
|
||
|
||
**Sound Managers:**
|
||
- `AmbientSoundManager` - Wind, water, fire, birds, crickets, city ambience, bell tolls
|
||
- `ActivitySoundManager` - Swimming strokes, jumping, landing
|
||
- `MovementSoundManager` - Footsteps (terrain-aware), mount movement
|
||
- `MountSoundManager` - Mount-specific movement audio
|
||
- `MusicManager` - Zone music with day/night variants
|
||
|
||
### 9. Warden Anti-Cheat (`src/game/`)
|
||
|
||
4-layer architecture:
|
||
- `WardenHandler` - Packet handling (SMSG/CMSG_WARDEN_DATA)
|
||
- `WardenModuleManager` - Module lifecycle and caching
|
||
- `WardenModule` - 8-step pipeline: decrypt (RC4), strip RSA-2048 signature, decompress (zlib), parse PE headers, relocate, resolve imports, execute
|
||
- `WardenEmulator` - Unicorn Engine x86 CPU emulation with Windows API interception
|
||
- `WardenMemory` - PE image loading with bounds-checked reads, runtime global patching
|
||
|
||
## Threading Model
|
||
|
||
- **Main thread**: Window events, game logic update, rendering
|
||
- **Async terrain**: Non-blocking chunk loading (std::async)
|
||
- **Network I/O**: Non-blocking recv in main thread with per-frame budgets
|
||
- **Normal maps**: Background CPU generation with mutex-protected result queue
|
||
- **GPU uploads**: Second Vulkan queue for parallel texture/buffer transfers
|
||
|
||
## Memory Management
|
||
|
||
- **Smart pointers**: `std::unique_ptr` / `std::shared_ptr` throughout
|
||
- **RAII**: All Vulkan resources wrapped with proper destructors
|
||
- **VMA**: Vulkan Memory Allocator for GPU memory
|
||
- **Object pooling**: Weather particles, combat text entries
|
||
- **DBC caching**: Lazy-loaded mutable caches in const getters
|
||
|
||
## Build System
|
||
|
||
**CMake** with modular targets:
|
||
- `wowee` - Main executable
|
||
- `asset_extract` - MPQ extraction tool (requires StormLib)
|
||
- `dbc_to_csv` / `auth_probe` / `blp_convert` - Utility tools
|
||
|
||
**Dependencies:**
|
||
- SDL2, Vulkan SDK, OpenSSL, GLM, zlib (system)
|
||
- ImGui (submodule in extern/)
|
||
- VMA, vk-bootstrap, stb_image (vendored in extern/)
|
||
- StormLib (system, optional — only for asset_extract)
|
||
- Unicorn Engine (system, optional — only for Warden emulation)
|
||
- FFmpeg (system, optional — for video playback)
|
||
|
||
**CI**: GitHub Actions for Linux (x86-64, ARM64), Windows (MSYS2), macOS (ARM64)
|
||
**Container builds**: Docker cross-compilation for Linux, macOS (osxcross), Windows (LLVM-MinGW)
|
||
|
||
## Code Style
|
||
|
||
- **C++20 standard**
|
||
- **Namespaces**: `wowee::core`, `wowee::rendering`, `wowee::game`, `wowee::ui`, `wowee::network`, `wowee::auth`, `wowee::audio`, `wowee::pipeline`
|
||
- **Naming**: PascalCase for classes, camelCase for functions/variables, kPascalCase for constants
|
||
- **Headers**: `.hpp` extension, `#pragma once`
|
||
- **Commits**: Conventional style (`feat:`, `fix:`, `refactor:`, `docs:`, `perf:`)
|