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!