World of Warcraft Engine Experiment - a custom opensource client.
Find a file
Kelsi 9eeb9ce64d Add normal mapping and parallax occlusion mapping for character models
Extends the WMO normal mapping/POM system to character M2 models with
bone-skinned tangents. Auto-generates normal/height maps from diffuse
textures using luminance→height, Sobel→normals (same algorithm as WMO).

- Expand vertex buffer from M2Vertex (48B) to CharVertexGPU (56B) with
  tangent vec4 computed via Lengyel's method in setupModelBuffers()
- Tangents are bone-transformed and Gram-Schmidt orthogonalized in the
  vertex shader, output as TBN for fragment shader consumption
- Fragment shader gains POM ray marching, normal map blending, and LOD
  crossfade via dFdx/dFdy (identical to WMO shader)
- Descriptor set 1 extended with binding 2 for normal/height sampler
- Settings (enable, strength, POM quality) wired from game_screen.cpp
  to both WMO and character renderers via shared UI controls
2026-02-23 01:40:23 -08:00
.github Suppress cpp/weak-cryptographic-algorithm via query-filter (protocol-mandated RC4) 2026-02-19 17:49:49 -08:00
assets Add normal mapping and parallax occlusion mapping for character models 2026-02-23 01:40:23 -08:00
container [build] Added configuration to allow building in container 2026-02-21 17:04:56 +02:00
Data Opcode registry: move to generated canonical+alias pipeline 2026-02-20 03:02:31 -08:00
docs Fix combat vocalizations with correct MPQ paths, add combat idle stance 2026-02-19 21:50:32 -08:00
extern Convert imgui to git submodule (shallow) 2026-02-18 19:23:03 -08:00
include Add normal mapping and parallax occlusion mapping for character models 2026-02-23 01:40:23 -08:00
resources Fix transport update handling, add desktop/icon resources, and clean repo artifacts 2026-02-11 15:24:05 -08:00
src Add normal mapping and parallax occlusion mapping for character models 2026-02-23 01:40:23 -08:00
tools Opcode registry: move to generated canonical+alias pipeline 2026-02-20 03:02:31 -08:00
.gitignore Add Vulkan Y-flip to projection matrix and ignore node_modules 2026-02-21 22:05:11 -08:00
.gitmodules Convert imgui to git submodule (shallow) 2026-02-18 19:23:03 -08:00
ATTRIBUTION.md Update docs to reflect current project state 2026-02-17 15:05:18 -08:00
build.sh Add build scripts for incremental and clean builds 2026-02-10 01:24:49 -08:00
BUILD_INSTRUCTIONS.md Update readme and build instructions docs 2026-02-22 05:09:16 -08:00
CMakeLists.txt Add configurable MSAA anti-aliasing, update auth screen and terrain shader 2026-02-22 02:59:24 -08:00
CODE_OF_CONDUCT.md Include code of conduct 2026-02-21 21:58:07 -08:00
debug_texture.sh Add level-up ding animation with golden rings, sound, and cheer emote 2026-02-17 17:35:57 -08:00
extract_assets.sh Fix MPQ detection failing when files are lowercase .mpq 2026-02-21 15:02:07 +02:00
extract_warden_rsa.py WARDEN work 2026-02-12 03:50:28 -08:00
LICENSE Revert "License update: if Turtle WoW bans my account, they don’t get to use my client" 2026-02-19 16:19:01 -08:00
list_mpq Add debug logging for GameObject spawns to diagnose duplicate cathedral 2026-02-09 18:04:20 -08:00
list_mpq.cpp Add debug logging for GameObject spawns to diagnose duplicate cathedral 2026-02-09 18:04:20 -08:00
README.md Update readme and build instructions docs 2026-02-22 05:09:16 -08:00
rebuild.sh Add build scripts for incremental and clean builds 2026-02-10 01:24:49 -08:00
restart-worldserver.sh Stabilize taxi/state sync and creature spawn handling 2026-02-11 21:14:35 -08:00

WoWee - World Of Warcraft Engine Experiment

Wowee Logo

A native C++ World of Warcraft client with a custom Vulkan renderer.

Sponsor Discord

Watch the video

Watch the video

Protocol Compatible with Vanilla (Classic) 1.12 + TBC 2.4.3 + WotLK 3.3.5a.

Legal Disclaimer: This is an educational/research project. It does not include any Blizzard Entertainment assets, data files, or proprietary code. World of Warcraft and all related assets are the property of Blizzard Entertainment, Inc. This project is not affiliated with or endorsed by Blizzard Entertainment. Users are responsible for supplying their own legally obtained game data files and for ensuring compliance with all applicable laws in their jurisdiction.

Status & Direction (2026-02-18)

  • Compatibility: Vanilla (Classic) 1.12 + TBC 2.4.3 + WotLK 3.3.5a are all supported via expansion profiles and per-expansion packet parsers (src/game/packet_parsers_classic.cpp, src/game/packet_parsers_tbc.cpp). All three expansions are roughly on par — no single one is significantly more complete than the others.
  • Tested against: AzerothCore, TrinityCore, and Mangos.
  • Current focus: protocol correctness across server variants, visual accuracy (M2/WMO edge cases, equipment textures), and multi-expansion coverage.
  • Warden: Full module execution via Unicorn Engine CPU emulation. Decrypts (RC4→RSA→zlib), parses and relocates the PE module, executes via x86 emulation with Windows API interception. Module cache at ~/.local/share/wowee/warden_cache/.

Features

Rendering Engine

  • Terrain -- Multi-tile streaming with async loading, texture splatting (4 layers), frustum culling
  • Atmosphere -- Procedural clouds (FBM noise), lens flare with chromatic aberration, cloud/fog star occlusion
  • Characters -- Skeletal animation with GPU vertex skinning (256 bones), race-aware textures
  • Buildings -- WMO renderer with multi-material batches, frustum culling, 160-unit distance culling
  • Particles -- M2 particle emitters with WotLK struct parsing, billboarded glow effects

Asset Pipeline

  • Extracted loose-file Data/ tree indexed by manifest.json (fast lookup + caching)
  • Optional overlay layers for multi-expansion asset deduplication
  • asset_extract + extract_assets.sh for MPQ extraction (StormLib tooling)
  • File formats: BLP (DXT1/3/5), ADT, M2, WMO, DBC (Spell/Item/Faction/etc.)

Gameplay Systems

  • Authentication -- Full SRP6a implementation with RC4 header encryption
  • Character System -- Creation (with nonbinary gender option), selection, 3D preview, stats panel, race/class support
  • Movement -- WASD movement, camera orbit, spline path following
  • Combat -- Auto-attack, spell casting with cooldowns, damage calculation, death handling
  • Targeting -- Tab-cycling, click-to-target, faction-based hostility (using Faction.dbc)
  • Inventory -- 23 equipment slots, 16 backpack slots, drag-drop, auto-equip
  • Spells -- Spellbook with class specialty tabs, drag-drop to action bar, spell icons
  • Action Bar -- 12 slots, drag-drop from spellbook/inventory, click-to-cast, keybindings
  • Trainers -- Spell trainer UI, buy spells, known/available/unavailable states
  • Quests -- Quest markers (! and ?) on NPCs and minimap, quest log, quest details, turn-in flow
  • Vendors -- Buy, sell, and buyback (most recent sold item), gold tracking, inventory sync
  • Loot -- Loot window, gold looting, item pickup
  • Gossip -- NPC interaction, dialogue options
  • Chat -- Tabs/channels, emotes, chat bubbles, clickable URLs, clickable item links with tooltips
  • Party -- Group invites, party list
  • Warden -- Warden anti-cheat module execution via Unicorn Engine x86 emulation (cross-platform, no Wine)
  • UI -- Loading screens with progress bar, settings window, minimap with zoom/rotation/square mode, top-right minimap mute speaker, separate bag windows with compact-empty mode (aggregate view)

Building

Prerequisites

# Ubuntu/Debian
sudo apt install libsdl2-dev libglm-dev libssl-dev \
                 libvulkan-dev vulkan-tools glslc \
                 libavformat-dev libavcodec-dev libswscale-dev libavutil-dev \
                 zlib1g-dev cmake build-essential libx11-dev \
                 libunicorn-dev \          # optional: Warden module execution
                 libstorm-dev              # optional: asset_extract tool

# Fedora
sudo dnf install SDL2-devel glm-devel openssl-devel \
                 vulkan-devel vulkan-tools glslc \
                 ffmpeg-devel zlib-devel cmake gcc-c++ libX11-devel \
                 unicorn-devel \           # optional: Warden module execution
                 StormLib-devel            # optional: asset_extract tool

# Arch
sudo pacman -S sdl2 glm openssl \
               vulkan-devel vulkan-tools shaderc \
               ffmpeg zlib cmake base-devel libx11 \
               unicorn                    # optional: Warden module execution
               # StormLib: install from AUR for asset_extract tool

Container build

You can use podman to build application in separate container.

  • Install podman
  • Then run container/build-in-container.sh
  • Artifacts can be found in /tmp/wowee.[random value].[commit hash]

Game Data

This project requires WoW client data that you extract from your own legally obtained install.

Wowee loads assets via an extracted loose-file tree indexed by manifest.json (it does not read MPQs at runtime).

1) Extract MPQs into ./Data/

# WotLK 3.3.5a example
./extract_assets.sh /path/to/WoW/Data wotlk
Data/
  manifest.json
  interface/
  sound/
  world/
  expansions/

Notes:

  • StormLib is required to build/run the extractor (asset_extract), but the main client does not require StormLib at runtime.
  • extract_assets.sh supports classic, tbc, wotlk targets.

2) Point wowee at the extracted data

By default, wowee looks for ./Data/. You can override with:

export WOW_DATA_PATH=/path/to/extracted/Data

Compile & Run

git clone --recurse-submodules https://github.com/Kelsidavis/WoWee.git
cd WoWee

mkdir build && cd build
cmake ..
make -j$(nproc)

./bin/wowee

Controls

Camera & Movement

Key Action
WASD Move camera / character
Mouse Look around / orbit camera
Shift Move faster
Mouse Left Click Target entity / interact
Tab Cycle targets

UI & Windows

Key Action
B Toggle bags
C Toggle character
P Toggle spellbook
N Toggle talents
L Toggle quest log
M Toggle world map
O Toggle guild roster
Enter Open chat
/ Open chat with slash
Escape Close windows / deselect

Action Bar

Key Action
1-9, 0, -, = Use action bar slots 1-12
Drag & Drop Spells from spellbook, items from inventory
Click Cast spell / use item

Debug & Development

Key Action
F1 Performance HUD
F4 Toggle shadows

Documentation

Getting Started

Technical Documentation

Security

  • GitHub Actions runs a dedicated security workflow at .github/workflows/security.yml.
  • Current checks include:
    • CodeQL for C/C++
    • Semgrep static analysis
    • Sanitizer build (ASan + UBSan)

Technical Details

  • Platform: Linux (primary), C++20, CMake 3.15+
  • Dependencies: SDL2, Vulkan, GLM, OpenSSL, ImGui, FFmpeg, Unicorn Engine (StormLib for asset extraction tooling)
  • Architecture: Modular design with clear separation (core, rendering, networking, game logic, asset pipeline, UI, audio)
  • Networking: Non-blocking TCP, SRP6a authentication, RC4 encryption, WoW 3.3.5a protocol
  • Asset Loading: Extracted loose-file tree + manifest.json indexing, async terrain streaming, overlay layers
  • Sky System: WoW-accurate DBC-driven architecture
    • Lore-Accurate Moons: White Lady (30-day cycle) + Blue Child (27-day cycle)
    • Deterministic Phases: Computed from server game time when available (fallback: local time/dev cycling)
    • Camera-Locked: Sky dome uses rotation-only transform (translation ignored)
    • No Latitude Math: Per-zone artistic constants, not Earth-like planetary simulation
    • Zone Identity: Different skyboxes per continent (Azeroth, Outland, Northrend)

License

This project's source code is licensed under the MIT License.

This project does not include any Blizzard Entertainment proprietary data, assets, or code. World of Warcraft is (c) 2004-2024 Blizzard Entertainment, Inc. All rights reserved.

References

Known Issues

MANY issues this is actively under development