Files
WoWee/docs/architecture.md

9.8 KiB

Architecture Overview

System Design

Wowee follows a modular architecture with clear separation of concerns:

┌─────────────────────────────────────────────┐
│           Application (main loop)            │
│  - State management (auth/realms/game)      │
│  - Update cycle (60 FPS)                    │
│  - Event dispatch                           │
└──────────────┬──────────────────────────────┘
               │
       ┌───────┴────────┐
       │                │
┌──────▼──────┐  ┌─────▼──────┐
│   Window    │  │   Input    │
│  (SDL2)     │  │ (Keyboard/ │
│             │  │   Mouse)   │
└──────┬──────┘  └─────┬──────┘
       │                │
       └───────┬────────┘
               │
    ┌──────────┴──────────┐
    │                     │
┌───▼────────┐   ┌───────▼──────┐
│  Renderer  │   │  UI Manager  │
│ (OpenGL)   │   │   (ImGui)    │
└───┬────────┘   └──────────────┘
    │
    ├─ Camera
    ├─ Scene Graph
    ├─ Shaders
    ├─ Meshes
    └─ Textures

Core Systems

1. Application Layer (src/core/)

Application - Main controller

  • Owns all subsystems
  • Manages application state
  • Runs update/render loop
  • Handles lifecycle (init/shutdown)

Window - SDL2 wrapper

  • Creates window and OpenGL context
  • Handles resize events
  • Manages VSync and fullscreen

Input - Input management

  • Keyboard state tracking
  • Mouse position and buttons
  • Mouse locking for camera control

Logger - Logging system

  • Thread-safe logging
  • Multiple log levels (DEBUG, INFO, WARNING, ERROR, FATAL)
  • Timestamp formatting

2. Rendering System (src/rendering/)

Renderer - Main rendering coordinator

  • Manages OpenGL state
  • Coordinates frame rendering
  • Owns camera and scene

Camera - View/projection matrices

  • Position and orientation
  • FOV and aspect ratio
  • View frustum (for culling)

Scene - Scene graph

  • Mesh collection
  • Spatial organization
  • Visibility determination

Shader - GLSL program wrapper

  • Loads vertex/fragment shaders
  • Uniform management
  • Compilation and linking

Mesh - Geometry container

  • Vertex buffer (position, normal, texcoord)
  • Index buffer
  • VAO/VBO/EBO management

Texture - Texture management

  • Loading (will support BLP format)
  • OpenGL texture object
  • Mipmap generation

Material - Surface properties

  • Shader assignment
  • Texture binding
  • Color/properties

3. Networking (src/network/)

Socket (Abstract base class)

  • Connection interface
  • Packet send/receive
  • Callback system

TCPSocket - Linux TCP sockets

  • Non-blocking I/O
  • Raw TCP (replaces WebSocket)
  • Packet framing

Packet - Binary data container

  • Read/write primitives
  • Byte order handling
  • Opcode management

4. Authentication (src/auth/)

AuthHandler - Auth server protocol

  • Connects to port 3724
  • SRP authentication flow
  • Session key generation

SRP - Secure Remote Password

  • SRP6a algorithm
  • Big integer math
  • Salt and verifier generation

Crypto - Cryptographic functions

  • SHA1 hashing (OpenSSL)
  • Random number generation
  • Encryption helpers

5. Game Logic (src/game/)

GameHandler - World server protocol

  • Connects to port 8129
  • Packet handlers for all opcodes
  • Session management

World - Game world state

  • Map loading
  • Entity management
  • Terrain streaming

Player - Player character

  • Position and movement
  • Stats and inventory
  • Action queue

Entity - Game entities

  • NPCs and creatures
  • Base entity functionality
  • GUID management

Opcodes - Protocol definitions

  • Client→Server opcodes (CMSG_*)
  • Server→Client opcodes (SMSG_*)
  • WoW 3.3.5a specific

6. Asset Pipeline (src/pipeline/)

MPQManager - Archive management

  • Loads .mpq files (via StormLib)
  • File lookup
  • Data extraction

BLPLoader - Texture parser

  • BLP format (Blizzard texture format)
  • DXT compression support
  • Mipmap extraction

M2Loader - Model parser

  • Character/creature models
  • Skeletal animation data
  • Bone hierarchies
  • Animation sequences

WMOLoader - World object parser

  • Buildings and structures
  • Static geometry
  • Portal system
  • Doodad placement

ADTLoader - Terrain parser

  • 16x16 chunks per map
  • Height map data
  • Texture layers (up to 4)
  • Liquid data (water/lava)
  • Object placement

DBCLoader - Database parser

  • Game data tables
  • Creature/spell/item definitions
  • Map and area information

7. UI System (src/ui/)

UIManager - ImGui coordinator

  • ImGui initialization
  • Event handling
  • Render dispatch

AuthScreen - Login interface

  • Username/password input
  • Server address configuration
  • Connection status

RealmScreen - Server selection

  • Realm list display
  • Population info
  • Realm type (PvP/PvE/RP)

CharacterScreen - Character selection

  • Character list with 3D preview
  • Create/delete characters
  • Enter world button

GameScreen - In-game UI

  • Chat window
  • Action bars
  • Character stats
  • Minimap

Data Flow Examples

Authentication Flow

User Input (username/password)
    ↓
AuthHandler::authenticate()
    ↓
SRP::calculateVerifier()
    ↓
TCPSocket::send(LOGON_CHALLENGE)
    ↓
Server Response (LOGON_CHALLENGE)
    ↓
AuthHandler receives packet
    ↓
SRP::calculateProof()
    ↓
TCPSocket::send(LOGON_PROOF)
    ↓
Server Response (LOGON_PROOF) → Success
    ↓
Application::setState(REALM_SELECTION)

Rendering Flow

Application::render()
    ↓
Renderer::beginFrame()
    ├─ glClearColor() - Clear screen
    └─ glClear() - Clear buffers
    ↓
Renderer::renderWorld(world)
    ├─ Update camera matrices
    ├─ Frustum culling
    ├─ For each visible chunk:
    │   ├─ Bind shader
    │   ├─ Set uniforms (matrices, lighting)
    │   ├─ Bind textures
    │   └─ Mesh::draw() → glDrawElements()
    └─ For each entity:
        ├─ Calculate bone transforms
        └─ Render skinned mesh
    ↓
UIManager::render()
    ├─ ImGui::NewFrame()
    ├─ Render current UI screen
    └─ ImGui::Render()
    ↓
Renderer::endFrame()
    ↓
Window::swapBuffers()

Asset Loading Flow

World::loadMap(mapId)
    ↓
MPQManager::readFile("World/Maps/{map}/map.adt")
    ↓
ADTLoader::load(adtData)
    ├─ Parse MCNK chunks (terrain)
    ├─ Parse MCLY chunks (textures)
    ├─ Parse MCVT chunks (vertices)
    └─ Parse MCNR chunks (normals)
    ↓
For each texture reference:
    MPQManager::readFile(texturePath)
    ↓
    BLPLoader::load(blpData)
    ↓
    Texture::loadFromMemory(imageData)
    ↓
Create Mesh from vertices/normals/texcoords
    ↓
Add to Scene
    ↓
Renderer draws in next frame

Threading Model

Currently single-threaded:

  • Main thread: Window events, update, render
  • Network I/O: Non-blocking in main thread
  • Asset loading: Synchronous in main thread

Future multi-threading opportunities:

  • Asset loading thread pool (background texture/model loading)
  • Network thread (dedicated for socket I/O)
  • Physics thread (if collision detection is added)

Memory Management

  • Smart pointers: Used throughout (std::unique_ptr, std::shared_ptr)
  • RAII: All resources (OpenGL, SDL) cleaned up automatically
  • No manual memory management: No raw new/delete
  • OpenGL resources: Wrapped in classes with proper destructors

Performance Considerations

Rendering

  • Frustum culling: Only render visible chunks
  • Batching: Group draw calls by material
  • LOD: Distance-based level of detail (TODO)
  • Occlusion: Portal-based visibility (WMO system)

Asset Streaming

  • Lazy loading: Load chunks as player moves
  • Unloading: Free distant chunks
  • Caching: Keep frequently used assets in memory

Network

  • Non-blocking I/O: Never stall main thread
  • Packet buffering: Handle multiple packets per frame
  • Compression: Some packets are compressed (TODO)

Error Handling

  • Logging: All errors logged with context
  • Graceful degradation: Missing assets show placeholder
  • State recovery: Network disconnect → back to auth screen
  • No crashes: Exceptions caught at application level

Configuration

Currently hardcoded, future config system:

  • Window size and fullscreen
  • Graphics quality settings
  • Server addresses
  • Keybindings
  • Audio volume

Testing Strategy

Unit Testing (TODO):

  • Packet serialization/deserialization
  • SRP math functions
  • Asset parsers with sample files

Integration Testing (TODO):

  • Full auth flow against test server
  • Realm list retrieval
  • Character selection

Manual Testing:

  • Visual verification of rendering
  • Performance profiling
  • Memory leak checking (valgrind)

Build System

CMake:

  • Modular target structure
  • Automatic dependency discovery
  • Cross-platform (Linux focus, but portable)
  • Out-of-source builds

Dependencies:

  • SDL2 (system)
  • OpenGL/GLEW (system)
  • OpenSSL (system)
  • GLM (system or header-only)
  • ImGui (submodule in extern/)
  • StormLib (system, optional)

Code Style

  • C++17 standard
  • Namespaces: wowee::core, wowee::rendering, etc.
  • Naming: PascalCase for classes, camelCase for functions/variables
  • Headers: .hpp extension
  • Includes: Relative to project root

This architecture provides a solid foundation for a full-featured native WoW client!