2026-02-02 12:24:50 -08:00
|
|
|
cmake_minimum_required(VERSION 3.15)
|
|
|
|
|
project(wowee VERSION 1.0.0 LANGUAGES CXX)
|
2026-02-11 15:24:05 -08:00
|
|
|
include(GNUInstallDirs)
|
2026-02-02 12:24:50 -08:00
|
|
|
|
2026-02-07 11:43:37 -08:00
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
2026-02-02 12:24:50 -08:00
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
|
|
|
|
|
|
# Output directories
|
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
|
|
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
|
|
|
|
|
|
|
|
|
# Options
|
|
|
|
|
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
|
|
|
|
option(WOWEE_BUILD_TESTS "Build tests" OFF)
|
2026-02-23 16:30:49 +01:00
|
|
|
option(WOWEE_ENABLE_ASAN "Enable AddressSanitizer (Debug builds)" OFF)
|
2026-02-02 12:24:50 -08:00
|
|
|
|
2026-02-20 03:02:31 -08:00
|
|
|
# Opcode registry generation/validation
|
|
|
|
|
find_package(Python3 COMPONENTS Interpreter QUIET)
|
|
|
|
|
if(Python3_Interpreter_FOUND)
|
|
|
|
|
add_custom_target(opcodes-generate
|
|
|
|
|
COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/gen_opcode_registry.py
|
|
|
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
|
|
|
COMMENT "Generating opcode registry include fragments"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
add_custom_target(opcodes-validate
|
|
|
|
|
COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/validate_opcode_maps.py --root ${CMAKE_SOURCE_DIR}
|
|
|
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
|
|
|
DEPENDS opcodes-generate
|
|
|
|
|
COMMENT "Validating canonical opcode registry and expansion maps"
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
# Find required packages
|
|
|
|
|
find_package(SDL2 REQUIRED)
|
2026-02-23 18:47:42 -08:00
|
|
|
find_package(Vulkan QUIET)
|
|
|
|
|
if(NOT Vulkan_FOUND)
|
|
|
|
|
# Fallback: some distros / CMake versions need pkg-config to locate Vulkan.
|
|
|
|
|
find_package(PkgConfig QUIET)
|
|
|
|
|
if(PkgConfig_FOUND)
|
|
|
|
|
pkg_check_modules(VULKAN_PKG vulkan)
|
|
|
|
|
if(VULKAN_PKG_FOUND)
|
|
|
|
|
add_library(Vulkan::Vulkan INTERFACE IMPORTED)
|
|
|
|
|
set_target_properties(Vulkan::Vulkan PROPERTIES
|
|
|
|
|
INTERFACE_INCLUDE_DIRECTORIES "${VULKAN_PKG_INCLUDE_DIRS}"
|
|
|
|
|
INTERFACE_LINK_LIBRARIES "${VULKAN_PKG_LIBRARIES}"
|
|
|
|
|
)
|
|
|
|
|
if(VULKAN_PKG_LIBRARY_DIRS)
|
|
|
|
|
set_property(TARGET Vulkan::Vulkan APPEND PROPERTY
|
|
|
|
|
INTERFACE_LINK_DIRECTORIES "${VULKAN_PKG_LIBRARY_DIRS}")
|
|
|
|
|
endif()
|
|
|
|
|
set(Vulkan_FOUND TRUE)
|
|
|
|
|
message(STATUS "Found Vulkan via pkg-config: ${VULKAN_PKG_LIBRARIES}")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
if(NOT Vulkan_FOUND)
|
|
|
|
|
message(FATAL_ERROR "Could not find Vulkan. Install libvulkan-dev (Linux), vulkan-loader (macOS), or the Vulkan SDK (Windows).")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
2026-02-21 19:41:21 -08:00
|
|
|
# GL/GLEW kept temporarily for unconverted sub-renderers during Vulkan migration.
|
|
|
|
|
# These files compile against GL types but their code is never called — the Vulkan
|
|
|
|
|
# path is the only active rendering backend. Remove in Phase 7 when all renderers
|
|
|
|
|
# are converted and grep confirms zero GL references.
|
|
|
|
|
find_package(OpenGL QUIET)
|
|
|
|
|
find_package(GLEW QUIET)
|
2026-02-02 12:24:50 -08:00
|
|
|
find_package(OpenSSL REQUIRED)
|
|
|
|
|
find_package(Threads REQUIRED)
|
2026-02-05 21:03:27 -08:00
|
|
|
find_package(ZLIB REQUIRED)
|
2026-02-18 17:38:08 -08:00
|
|
|
if(WIN32)
|
|
|
|
|
find_package(PkgConfig QUIET)
|
|
|
|
|
else()
|
|
|
|
|
find_package(PkgConfig REQUIRED)
|
|
|
|
|
endif()
|
|
|
|
|
if(PkgConfig_FOUND)
|
2026-02-23 16:30:49 +01:00
|
|
|
pkg_check_modules(FFMPEG libavformat libavcodec libswscale libavutil)
|
2026-02-18 17:38:08 -08:00
|
|
|
else()
|
|
|
|
|
# Fallback for MSVC/vcpkg — find FFmpeg libraries manually
|
|
|
|
|
find_path(FFMPEG_INCLUDE_DIRS libavformat/avformat.h)
|
|
|
|
|
find_library(AVFORMAT_LIB NAMES avformat)
|
|
|
|
|
find_library(AVCODEC_LIB NAMES avcodec)
|
|
|
|
|
find_library(AVUTIL_LIB NAMES avutil)
|
|
|
|
|
find_library(SWSCALE_LIB NAMES swscale)
|
|
|
|
|
set(FFMPEG_LIBRARIES ${AVFORMAT_LIB} ${AVCODEC_LIB} ${AVUTIL_LIB} ${SWSCALE_LIB})
|
2026-02-23 16:30:49 +01:00
|
|
|
endif()
|
|
|
|
|
if(FFMPEG_INCLUDE_DIRS AND AVFORMAT_LIB)
|
|
|
|
|
set(HAVE_FFMPEG TRUE)
|
|
|
|
|
message(STATUS "Found FFmpeg: ${AVFORMAT_LIB}")
|
|
|
|
|
elseif(FFMPEG_FOUND)
|
|
|
|
|
set(HAVE_FFMPEG TRUE)
|
|
|
|
|
else()
|
|
|
|
|
set(HAVE_FFMPEG FALSE)
|
|
|
|
|
message(WARNING "FFmpeg not found — video_player will be disabled. Install via vcpkg: ffmpeg:x64-windows")
|
2026-02-18 17:38:08 -08:00
|
|
|
endif()
|
2026-02-02 12:24:50 -08:00
|
|
|
|
2026-02-12 03:01:36 -08:00
|
|
|
# Unicorn Engine (x86 emulator for cross-platform Warden module execution)
|
|
|
|
|
find_library(UNICORN_LIBRARY NAMES unicorn)
|
|
|
|
|
find_path(UNICORN_INCLUDE_DIR unicorn/unicorn.h)
|
|
|
|
|
if(NOT UNICORN_LIBRARY OR NOT UNICORN_INCLUDE_DIR)
|
|
|
|
|
message(WARNING "Unicorn Engine not found. Install with: sudo apt-get install libunicorn-dev")
|
|
|
|
|
message(WARNING "Warden emulation will be disabled")
|
|
|
|
|
set(HAVE_UNICORN FALSE)
|
|
|
|
|
else()
|
|
|
|
|
message(STATUS "Found Unicorn Engine: ${UNICORN_LIBRARY}")
|
|
|
|
|
set(HAVE_UNICORN TRUE)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
# GLM (header-only math library)
|
|
|
|
|
find_package(glm QUIET)
|
|
|
|
|
if(NOT glm_FOUND)
|
|
|
|
|
message(STATUS "GLM not found, will use system includes or download")
|
|
|
|
|
endif()
|
2026-02-18 17:49:52 -08:00
|
|
|
# GLM GTX extensions (quaternion, norm, etc.) require this flag on newer GLM versions
|
2026-02-21 19:41:21 -08:00
|
|
|
add_compile_definitions(GLM_ENABLE_EXPERIMENTAL GLM_FORCE_DEPTH_ZERO_TO_ONE)
|
2026-02-23 16:30:49 +01:00
|
|
|
if(WIN32)
|
|
|
|
|
add_compile_definitions(NOMINMAX _CRT_SECURE_NO_WARNINGS)
|
|
|
|
|
endif()
|
2026-02-21 19:41:21 -08:00
|
|
|
|
|
|
|
|
# SPIR-V shader compilation via glslc
|
|
|
|
|
find_program(GLSLC glslc HINTS ${Vulkan_GLSLC_EXECUTABLE} "$ENV{VULKAN_SDK}/bin")
|
|
|
|
|
if(GLSLC)
|
|
|
|
|
message(STATUS "Found glslc: ${GLSLC}")
|
|
|
|
|
else()
|
|
|
|
|
message(WARNING "glslc not found. Install the Vulkan SDK or vulkan-tools package.")
|
|
|
|
|
message(WARNING "Shaders will not be compiled to SPIR-V.")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Function to compile GLSL shaders to SPIR-V
|
|
|
|
|
function(compile_shaders TARGET_NAME)
|
|
|
|
|
set(SHADER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/assets/shaders)
|
|
|
|
|
set(SPV_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/assets/shaders)
|
|
|
|
|
file(MAKE_DIRECTORY ${SPV_DIR})
|
|
|
|
|
|
|
|
|
|
file(GLOB GLSL_SOURCES "${SHADER_DIR}/*.glsl")
|
|
|
|
|
set(SPV_OUTPUTS)
|
|
|
|
|
|
|
|
|
|
foreach(GLSL_FILE ${GLSL_SOURCES})
|
|
|
|
|
get_filename_component(FILE_NAME ${GLSL_FILE} NAME)
|
|
|
|
|
# e.g. skybox.vert.glsl -> skybox.vert.spv
|
|
|
|
|
string(REGEX REPLACE "\\.glsl$" ".spv" SPV_NAME ${FILE_NAME})
|
|
|
|
|
set(SPV_FILE ${SPV_DIR}/${SPV_NAME})
|
|
|
|
|
|
|
|
|
|
# Determine shader stage from filename
|
|
|
|
|
if(FILE_NAME MATCHES "\\.vert\\.glsl$")
|
|
|
|
|
set(SHADER_STAGE vertex)
|
|
|
|
|
elseif(FILE_NAME MATCHES "\\.frag\\.glsl$")
|
|
|
|
|
set(SHADER_STAGE fragment)
|
|
|
|
|
elseif(FILE_NAME MATCHES "\\.comp\\.glsl$")
|
|
|
|
|
set(SHADER_STAGE compute)
|
|
|
|
|
elseif(FILE_NAME MATCHES "\\.geom\\.glsl$")
|
|
|
|
|
set(SHADER_STAGE geometry)
|
|
|
|
|
else()
|
|
|
|
|
message(WARNING "Cannot determine shader stage for: ${FILE_NAME}")
|
|
|
|
|
continue()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
add_custom_command(
|
|
|
|
|
OUTPUT ${SPV_FILE}
|
|
|
|
|
COMMAND ${GLSLC} -fshader-stage=${SHADER_STAGE} -O ${GLSL_FILE} -o ${SPV_FILE}
|
|
|
|
|
DEPENDS ${GLSL_FILE}
|
|
|
|
|
COMMENT "Compiling SPIR-V: ${FILE_NAME} -> ${SPV_NAME}"
|
|
|
|
|
VERBATIM
|
|
|
|
|
)
|
|
|
|
|
list(APPEND SPV_OUTPUTS ${SPV_FILE})
|
|
|
|
|
endforeach()
|
|
|
|
|
|
|
|
|
|
add_custom_target(${TARGET_NAME}_shaders ALL DEPENDS ${SPV_OUTPUTS})
|
|
|
|
|
add_dependencies(${TARGET_NAME} ${TARGET_NAME}_shaders)
|
|
|
|
|
endfunction()
|
2026-02-02 12:24:50 -08:00
|
|
|
|
2026-02-12 20:32:14 -08:00
|
|
|
# StormLib for MPQ extraction tool (not needed for main executable)
|
2026-02-02 12:24:50 -08:00
|
|
|
find_library(STORMLIB_LIBRARY NAMES StormLib stormlib storm)
|
|
|
|
|
find_path(STORMLIB_INCLUDE_DIR StormLib.h PATH_SUFFIXES StormLib)
|
|
|
|
|
|
2026-02-21 19:41:21 -08:00
|
|
|
# Include ImGui as a static library (Vulkan backend)
|
2026-02-02 12:24:50 -08:00
|
|
|
set(IMGUI_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extern/imgui)
|
|
|
|
|
if(EXISTS ${IMGUI_DIR})
|
|
|
|
|
add_library(imgui STATIC
|
|
|
|
|
${IMGUI_DIR}/imgui.cpp
|
|
|
|
|
${IMGUI_DIR}/imgui_draw.cpp
|
|
|
|
|
${IMGUI_DIR}/imgui_tables.cpp
|
|
|
|
|
${IMGUI_DIR}/imgui_widgets.cpp
|
|
|
|
|
${IMGUI_DIR}/imgui_demo.cpp
|
|
|
|
|
${IMGUI_DIR}/backends/imgui_impl_sdl2.cpp
|
2026-02-21 19:41:21 -08:00
|
|
|
${IMGUI_DIR}/backends/imgui_impl_vulkan.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
)
|
|
|
|
|
target_include_directories(imgui PUBLIC
|
|
|
|
|
${IMGUI_DIR}
|
|
|
|
|
${IMGUI_DIR}/backends
|
|
|
|
|
)
|
2026-02-21 19:41:21 -08:00
|
|
|
target_link_libraries(imgui PUBLIC SDL2::SDL2 Vulkan::Vulkan ${CMAKE_DL_LIBS})
|
2026-02-02 12:24:50 -08:00
|
|
|
else()
|
|
|
|
|
message(WARNING "ImGui not found in extern/imgui. Clone it with:")
|
|
|
|
|
message(WARNING " git clone https://github.com/ocornut/imgui.git extern/imgui")
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-21 19:41:21 -08:00
|
|
|
# vk-bootstrap (Vulkan device/instance setup)
|
|
|
|
|
set(VK_BOOTSTRAP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extern/vk-bootstrap)
|
|
|
|
|
if(EXISTS ${VK_BOOTSTRAP_DIR})
|
|
|
|
|
add_library(vk-bootstrap STATIC
|
|
|
|
|
${VK_BOOTSTRAP_DIR}/src/VkBootstrap.cpp
|
|
|
|
|
)
|
|
|
|
|
target_include_directories(vk-bootstrap PUBLIC ${VK_BOOTSTRAP_DIR}/src)
|
|
|
|
|
target_link_libraries(vk-bootstrap PUBLIC Vulkan::Vulkan)
|
|
|
|
|
else()
|
|
|
|
|
message(FATAL_ERROR "vk-bootstrap not found in extern/vk-bootstrap")
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
# Source files
|
|
|
|
|
set(WOWEE_SOURCES
|
|
|
|
|
# Core
|
|
|
|
|
src/core/application.cpp
|
|
|
|
|
src/core/window.cpp
|
|
|
|
|
src/core/input.cpp
|
|
|
|
|
src/core/logger.cpp
|
2026-02-08 23:15:26 -08:00
|
|
|
src/core/memory_monitor.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
# Network
|
|
|
|
|
src/network/socket.cpp
|
|
|
|
|
src/network/packet.cpp
|
|
|
|
|
src/network/tcp_socket.cpp
|
|
|
|
|
src/network/world_socket.cpp
|
|
|
|
|
|
|
|
|
|
# Auth
|
|
|
|
|
src/auth/auth_handler.cpp
|
|
|
|
|
src/auth/auth_opcodes.cpp
|
|
|
|
|
src/auth/auth_packets.cpp
|
2026-02-13 00:22:01 -08:00
|
|
|
src/auth/pin_auth.cpp
|
2026-02-13 01:32:15 -08:00
|
|
|
src/auth/integrity.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/auth/srp.cpp
|
|
|
|
|
src/auth/big_num.cpp
|
|
|
|
|
src/auth/crypto.cpp
|
|
|
|
|
src/auth/rc4.cpp
|
2026-02-13 16:53:28 -08:00
|
|
|
src/auth/vanilla_crypt.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
# Game
|
2026-02-12 22:56:36 -08:00
|
|
|
src/game/expansion_profile.cpp
|
|
|
|
|
src/game/opcode_table.cpp
|
|
|
|
|
src/game/update_field_table.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/game/game_handler.cpp
|
2026-02-12 02:09:15 -08:00
|
|
|
src/game/warden_crypto.cpp
|
2026-02-12 02:43:20 -08:00
|
|
|
src/game/warden_module.cpp
|
2026-02-12 03:01:36 -08:00
|
|
|
src/game/warden_emulator.cpp
|
2026-02-14 02:00:15 -08:00
|
|
|
src/game/warden_memory.cpp
|
2026-02-10 21:29:10 -08:00
|
|
|
src/game/transport_manager.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/game/world.cpp
|
|
|
|
|
src/game/player.cpp
|
|
|
|
|
src/game/entity.cpp
|
|
|
|
|
src/game/opcodes.cpp
|
|
|
|
|
src/game/world_packets.cpp
|
2026-02-12 22:56:36 -08:00
|
|
|
src/game/packet_parsers_tbc.cpp
|
|
|
|
|
src/game/packet_parsers_classic.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/game/character.cpp
|
|
|
|
|
src/game/zone_manager.cpp
|
|
|
|
|
src/game/inventory.cpp
|
|
|
|
|
|
|
|
|
|
# Audio
|
2026-02-09 00:40:50 -08:00
|
|
|
src/audio/audio_engine.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/audio/music_manager.cpp
|
2026-02-03 14:55:32 -08:00
|
|
|
src/audio/footstep_manager.cpp
|
2026-02-03 19:49:56 -08:00
|
|
|
src/audio/activity_sound_manager.cpp
|
2026-02-09 01:04:53 -08:00
|
|
|
src/audio/mount_sound_manager.cpp
|
2026-02-09 01:29:44 -08:00
|
|
|
src/audio/npc_voice_manager.cpp
|
2026-02-09 14:50:14 -08:00
|
|
|
src/audio/ambient_sound_manager.cpp
|
2026-02-09 16:30:47 -08:00
|
|
|
src/audio/ui_sound_manager.cpp
|
2026-02-09 16:38:50 -08:00
|
|
|
src/audio/combat_sound_manager.cpp
|
Add comprehensive spell sound manager with 35+ magic sounds
Implemented complete spell casting audio system with all magic schools:
Magic schools supported:
- Fire: Precast (Low/Medium/High), Cast, Fireball impacts
- Frost: Precast (Low/Medium/High), Cast, Blizzard impacts
- Holy: Precast (Low/Medium/High), Cast, Holy impacts (4 levels)
- Nature: Precast (Low/Medium/High), Cast
- Shadow: Precast (Low/Medium/High), Cast
- Arcane: Precast, Arcane Missile impacts
- Physical: Non-magical abilities
Spell phases:
- Precast: Channeling/preparation sounds (before cast)
- Cast: Spell release sounds (when spell fires)
- Impact: Spell hit sounds (when spell hits target)
Power levels:
- Low: Weak spells, low level abilities
- Medium: Standard power spells
- High: Powerful high-level spells
Sound coverage (35+ sounds):
- 16 precast sounds (Fire/Frost/Holy/Nature/Shadow × Low/Med/High + Arcane)
- 5 cast sounds (one per school)
- 16 impact sounds (Fireball ×3, Blizzard ×6, Holy ×4, Arcane Missile ×3)
Technical details:
- Loads 35+ sound files from Sound\Spells directory
- Simple API: playPrecast(school, power), playCast(school), playImpact(school, power)
- Convenience methods: playFireball(), playFrostbolt(), playHeal(), etc.
- Random variation selection for impacts
- Volume at 0.75 with global scale control
- Ready for integration with spell casting system
Usage examples:
```cpp
// Full spell sequence
spellSoundManager->playPrecast(MagicSchool::FIRE, SpellPower::HIGH);
// ... cast time ...
spellSoundManager->playCast(MagicSchool::FIRE);
// ... projectile travel ...
spellSoundManager->playImpact(MagicSchool::FIRE, SpellPower::HIGH);
// Convenience methods
spellSoundManager->playFireball();
spellSoundManager->playHeal();
```
This adds essential magic feedback for spell casting gameplay!
2026-02-09 16:45:30 -08:00
|
|
|
src/audio/spell_sound_manager.cpp
|
2026-02-09 16:50:37 -08:00
|
|
|
src/audio/movement_sound_manager.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
# Pipeline (asset loaders)
|
|
|
|
|
src/pipeline/blp_loader.cpp
|
|
|
|
|
src/pipeline/dbc_loader.cpp
|
|
|
|
|
src/pipeline/asset_manager.cpp
|
2026-02-12 20:32:14 -08:00
|
|
|
src/pipeline/asset_manifest.cpp
|
|
|
|
|
src/pipeline/loose_file_reader.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/pipeline/m2_loader.cpp
|
|
|
|
|
src/pipeline/wmo_loader.cpp
|
|
|
|
|
src/pipeline/adt_loader.cpp
|
2026-02-12 22:56:36 -08:00
|
|
|
src/pipeline/dbc_layout.cpp
|
2026-02-15 04:18:34 -08:00
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
src/pipeline/terrain_mesh.cpp
|
|
|
|
|
|
2026-02-21 19:41:21 -08:00
|
|
|
# Rendering (Vulkan infrastructure)
|
|
|
|
|
src/rendering/vk_context.cpp
|
|
|
|
|
src/rendering/vk_utils.cpp
|
|
|
|
|
src/rendering/vk_shader.cpp
|
|
|
|
|
src/rendering/vk_texture.cpp
|
|
|
|
|
src/rendering/vk_buffer.cpp
|
|
|
|
|
src/rendering/vk_pipeline.cpp
|
|
|
|
|
src/rendering/vk_render_target.cpp
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
# Rendering
|
|
|
|
|
src/rendering/renderer.cpp
|
|
|
|
|
src/rendering/shader.cpp
|
|
|
|
|
src/rendering/texture.cpp
|
|
|
|
|
src/rendering/mesh.cpp
|
|
|
|
|
src/rendering/camera.cpp
|
|
|
|
|
src/rendering/camera_controller.cpp
|
|
|
|
|
src/rendering/material.cpp
|
|
|
|
|
src/rendering/scene.cpp
|
|
|
|
|
src/rendering/terrain_renderer.cpp
|
|
|
|
|
src/rendering/terrain_manager.cpp
|
|
|
|
|
src/rendering/frustum.cpp
|
|
|
|
|
src/rendering/performance_hud.cpp
|
|
|
|
|
src/rendering/water_renderer.cpp
|
|
|
|
|
src/rendering/skybox.cpp
|
|
|
|
|
src/rendering/celestial.cpp
|
|
|
|
|
src/rendering/starfield.cpp
|
|
|
|
|
src/rendering/clouds.cpp
|
|
|
|
|
src/rendering/lens_flare.cpp
|
|
|
|
|
src/rendering/weather.cpp
|
|
|
|
|
src/rendering/lightning.cpp
|
2026-02-10 13:44:22 -08:00
|
|
|
src/rendering/lighting_manager.cpp
|
Implement WoW-accurate DBC-driven sky system with lore-faithful celestial bodies
Add SkySystem coordinator that follows WoW's actual architecture where skyboxes
are authoritative and procedural elements serve as fallbacks. Integrate lighting
system across all renderers (terrain, WMO, M2, character) with unified parameters.
Sky System:
- SkySystem coordinator manages skybox, celestial bodies, stars, clouds, lens flare
- Skybox is authoritative (baked stars from M2 models, procedural fallback only)
- skyboxHasStars flag gates procedural star rendering (prevents double-star bug)
Celestial Bodies (Lore-Accurate):
- Two moons: White Lady (30-day cycle, pale white) + Blue Child (27-day cycle, pale blue)
- Deterministic moon phases from server gameTime (not deltaTime toys)
- Sun positioning driven by LightingManager directionalDir (DBC-sourced)
- Camera-locked sky dome (translation ignored, rotation applied)
Lighting Integration:
- Apply LightingManager params to WMO, M2, character renderers
- Unified lighting: directional light, diffuse color, ambient color, fog
- Star occlusion by cloud density (70% weight) and fog density (30% weight)
Documentation:
- Add comprehensive SKY_SYSTEM.md technical guide
- Update MEMORY.md with sky system architecture and anti-patterns
- Update README.md with WoW-accurate descriptions
Critical design decisions:
- NO latitude-based star rotation (Azeroth not modeled as spherical planet)
- NO always-on procedural stars (skybox authority prevents zone identity loss)
- NO universal dual-moon setup (map-specific celestial configurations)
2026-02-10 14:36:17 -08:00
|
|
|
src/rendering/sky_system.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/rendering/character_renderer.cpp
|
2026-02-05 14:55:42 -08:00
|
|
|
src/rendering/character_preview.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/rendering/wmo_renderer.cpp
|
|
|
|
|
src/rendering/m2_renderer.cpp
|
2026-02-09 23:41:38 -08:00
|
|
|
src/rendering/quest_marker_renderer.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/rendering/minimap.cpp
|
2026-02-04 22:27:45 -08:00
|
|
|
src/rendering/world_map.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/rendering/swim_effects.cpp
|
2026-02-09 01:24:17 -08:00
|
|
|
src/rendering/mount_dust.cpp
|
2026-02-19 20:36:25 -08:00
|
|
|
src/rendering/levelup_effect.cpp
|
2026-02-19 21:13:13 -08:00
|
|
|
src/rendering/charge_effect.cpp
|
2026-02-03 13:33:31 -08:00
|
|
|
src/rendering/loading_screen.cpp
|
2026-02-23 16:30:49 +01:00
|
|
|
$<$<BOOL:${HAVE_FFMPEG}>:${CMAKE_CURRENT_SOURCE_DIR}/src/rendering/video_player.cpp>
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
# UI
|
|
|
|
|
src/ui/ui_manager.cpp
|
|
|
|
|
src/ui/auth_screen.cpp
|
|
|
|
|
src/ui/realm_screen.cpp
|
2026-02-05 14:13:48 -08:00
|
|
|
src/ui/character_create_screen.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
src/ui/character_screen.cpp
|
|
|
|
|
src/ui/game_screen.cpp
|
|
|
|
|
src/ui/inventory_screen.cpp
|
2026-02-06 13:47:03 -08:00
|
|
|
src/ui/quest_log_screen.cpp
|
2026-02-04 11:31:08 -08:00
|
|
|
src/ui/spellbook_screen.cpp
|
2026-02-06 16:04:25 -08:00
|
|
|
src/ui/talent_screen.cpp
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
# Main
|
|
|
|
|
src/main.cpp
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
set(WOWEE_HEADERS
|
|
|
|
|
include/core/application.hpp
|
|
|
|
|
include/core/window.hpp
|
|
|
|
|
include/core/input.hpp
|
|
|
|
|
include/core/logger.hpp
|
|
|
|
|
|
|
|
|
|
include/network/socket.hpp
|
|
|
|
|
include/network/packet.hpp
|
|
|
|
|
include/network/tcp_socket.hpp
|
2026-02-03 22:24:17 -08:00
|
|
|
include/network/world_socket.hpp
|
|
|
|
|
include/network/net_platform.hpp
|
|
|
|
|
|
|
|
|
|
include/platform/process.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
include/auth/auth_handler.hpp
|
|
|
|
|
include/auth/auth_opcodes.hpp
|
|
|
|
|
include/auth/auth_packets.hpp
|
|
|
|
|
include/auth/srp.hpp
|
|
|
|
|
include/auth/big_num.hpp
|
|
|
|
|
include/auth/crypto.hpp
|
|
|
|
|
|
|
|
|
|
include/game/game_handler.hpp
|
|
|
|
|
include/game/world.hpp
|
|
|
|
|
include/game/player.hpp
|
|
|
|
|
include/game/entity.hpp
|
|
|
|
|
include/game/opcodes.hpp
|
|
|
|
|
include/game/zone_manager.hpp
|
|
|
|
|
include/game/inventory.hpp
|
Add gameplay systems: combat, spells, groups, loot, vendors, and UI
Implement ~70 new protocol opcodes across 5 phases while maintaining
full 3.3.5a private server compatibility:
- Phase 1: Server-aware targeting (CMSG_SET_SELECTION), player/creature
name queries, CMSG_SET_ACTIVE_MOVER after login
- Phase 2: Auto-attack, melee/spell damage parsing, health/mana/power
tracking from UPDATE_OBJECT fields, floating combat text
- Phase 3: Spell casting, action bar (12 slots, keys 1-=), cast bar,
cooldown tracking, aura/buff system with cancellation
- Phase 4: Group invite/accept/decline/leave, party frames UI,
/invite chat command
- Phase 5: Loot window, NPC gossip dialog, vendor buy/sell interface
Also: disable debug HUD/panels by default, gate 3D rendering to
IN_GAME state only, fix window resize not updating UI positions.
2026-02-04 10:30:52 -08:00
|
|
|
include/game/spell_defines.hpp
|
|
|
|
|
include/game/group_defines.hpp
|
|
|
|
|
include/game/world_packets.hpp
|
|
|
|
|
include/game/character.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
|
2026-02-09 00:40:50 -08:00
|
|
|
include/audio/audio_engine.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
include/audio/music_manager.hpp
|
2026-02-03 14:55:32 -08:00
|
|
|
include/audio/footstep_manager.hpp
|
2026-02-03 19:49:56 -08:00
|
|
|
include/audio/activity_sound_manager.hpp
|
2026-02-09 01:04:53 -08:00
|
|
|
include/audio/mount_sound_manager.hpp
|
Implement comprehensive audio control panel with tabbed settings interface
Adds complete audio volume controls for all 11 audio systems with master volume. Reorganizes settings window into Video, Audio, and Gameplay tabs for better UX.
Audio Features:
- Master volume control affecting all audio systems
- Individual volume sliders for: Music, Ambient, UI, Combat, Spell, Movement, Footsteps, NPC Voices, Mounts, Activity sounds
- Real-time volume adjustment with master volume multiplier
- Restore defaults button per tab
Technical Changes:
- Added getVolumeScale() getters to all audio managers
- Integrated all 10 audio managers into renderer (UI, Combat, Spell, Movement added)
- Expanded game_screen.hpp with 11 pending volume variables
- Reorganized settings window using ImGui tab bars (Video/Audio/Gameplay)
- Audio settings uses scrollable child window for 11 volume controls
- Settings window expanded to 520x720px to accommodate comprehensive controls
2026-02-09 17:07:22 -08:00
|
|
|
include/audio/npc_voice_manager.hpp
|
|
|
|
|
include/audio/ambient_sound_manager.hpp
|
|
|
|
|
include/audio/ui_sound_manager.hpp
|
|
|
|
|
include/audio/combat_sound_manager.hpp
|
|
|
|
|
include/audio/spell_sound_manager.hpp
|
|
|
|
|
include/audio/movement_sound_manager.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
include/pipeline/blp_loader.hpp
|
2026-02-12 20:32:14 -08:00
|
|
|
include/pipeline/asset_manifest.hpp
|
|
|
|
|
include/pipeline/loose_file_reader.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
include/pipeline/m2_loader.hpp
|
|
|
|
|
include/pipeline/wmo_loader.hpp
|
|
|
|
|
include/pipeline/adt_loader.hpp
|
|
|
|
|
include/pipeline/dbc_loader.hpp
|
|
|
|
|
include/pipeline/terrain_mesh.hpp
|
|
|
|
|
|
2026-02-21 19:41:21 -08:00
|
|
|
include/rendering/vk_context.hpp
|
|
|
|
|
include/rendering/vk_utils.hpp
|
|
|
|
|
include/rendering/vk_shader.hpp
|
|
|
|
|
include/rendering/vk_texture.hpp
|
|
|
|
|
include/rendering/vk_buffer.hpp
|
|
|
|
|
include/rendering/vk_pipeline.hpp
|
|
|
|
|
include/rendering/vk_render_target.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
include/rendering/renderer.hpp
|
|
|
|
|
include/rendering/shader.hpp
|
|
|
|
|
include/rendering/texture.hpp
|
|
|
|
|
include/rendering/mesh.hpp
|
|
|
|
|
include/rendering/camera.hpp
|
|
|
|
|
include/rendering/camera_controller.hpp
|
|
|
|
|
include/rendering/material.hpp
|
|
|
|
|
include/rendering/scene.hpp
|
|
|
|
|
include/rendering/terrain_renderer.hpp
|
|
|
|
|
include/rendering/terrain_manager.hpp
|
|
|
|
|
include/rendering/frustum.hpp
|
|
|
|
|
include/rendering/performance_hud.hpp
|
|
|
|
|
include/rendering/water_renderer.hpp
|
|
|
|
|
include/rendering/skybox.hpp
|
|
|
|
|
include/rendering/celestial.hpp
|
|
|
|
|
include/rendering/starfield.hpp
|
|
|
|
|
include/rendering/clouds.hpp
|
|
|
|
|
include/rendering/lens_flare.hpp
|
|
|
|
|
include/rendering/weather.hpp
|
|
|
|
|
include/rendering/lightning.hpp
|
|
|
|
|
include/rendering/swim_effects.hpp
|
2026-02-04 22:27:45 -08:00
|
|
|
include/rendering/world_map.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
include/rendering/character_renderer.hpp
|
2026-02-05 14:55:42 -08:00
|
|
|
include/rendering/character_preview.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
include/rendering/wmo_renderer.hpp
|
2026-02-03 13:33:31 -08:00
|
|
|
include/rendering/loading_screen.hpp
|
2026-02-05 15:34:29 -08:00
|
|
|
include/rendering/video_player.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
include/ui/ui_manager.hpp
|
|
|
|
|
include/ui/auth_screen.hpp
|
|
|
|
|
include/ui/realm_screen.hpp
|
2026-02-05 14:13:48 -08:00
|
|
|
include/ui/character_create_screen.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
include/ui/character_screen.hpp
|
|
|
|
|
include/ui/game_screen.hpp
|
|
|
|
|
include/ui/inventory_screen.hpp
|
2026-02-04 11:31:08 -08:00
|
|
|
include/ui/spellbook_screen.hpp
|
2026-02-06 16:04:25 -08:00
|
|
|
include/ui/talent_screen.hpp
|
2026-02-02 12:24:50 -08:00
|
|
|
)
|
|
|
|
|
|
2026-02-11 15:24:05 -08:00
|
|
|
set(WOWEE_PLATFORM_SOURCES)
|
|
|
|
|
if(WIN32)
|
2026-02-18 19:05:47 -08:00
|
|
|
# Copy icon into build tree so llvm-rc can find it via the relative path in wowee.rc
|
|
|
|
|
configure_file(
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/assets/Wowee.ico
|
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/assets/wowee.ico
|
|
|
|
|
COPYONLY
|
|
|
|
|
)
|
2026-02-11 15:24:05 -08:00
|
|
|
list(APPEND WOWEE_PLATFORM_SOURCES resources/wowee.rc)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
# Create executable
|
2026-02-11 15:24:05 -08:00
|
|
|
add_executable(wowee ${WOWEE_SOURCES} ${WOWEE_HEADERS} ${WOWEE_PLATFORM_SOURCES})
|
2026-02-20 03:02:31 -08:00
|
|
|
if(TARGET opcodes-generate)
|
|
|
|
|
add_dependencies(wowee opcodes-generate)
|
|
|
|
|
endif()
|
2026-02-02 12:24:50 -08:00
|
|
|
|
2026-02-21 19:41:21 -08:00
|
|
|
# Compile GLSL shaders to SPIR-V
|
|
|
|
|
if(GLSLC)
|
|
|
|
|
compile_shaders(wowee)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
# Include directories
|
|
|
|
|
target_include_directories(wowee PRIVATE
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
2026-02-03 13:33:31 -08:00
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/extern
|
2026-02-21 19:41:21 -08:00
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/extern/vk-bootstrap/src
|
2026-02-02 12:24:50 -08:00
|
|
|
)
|
2026-02-23 16:30:49 +01:00
|
|
|
if(HAVE_FFMPEG)
|
|
|
|
|
target_include_directories(wowee PRIVATE ${FFMPEG_INCLUDE_DIRS})
|
|
|
|
|
endif()
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
# Link libraries
|
|
|
|
|
target_link_libraries(wowee PRIVATE
|
|
|
|
|
SDL2::SDL2
|
2026-02-21 19:41:21 -08:00
|
|
|
Vulkan::Vulkan
|
2026-02-02 12:24:50 -08:00
|
|
|
OpenSSL::SSL
|
|
|
|
|
OpenSSL::Crypto
|
|
|
|
|
Threads::Threads
|
2026-02-05 21:03:27 -08:00
|
|
|
ZLIB::ZLIB
|
2026-02-09 00:40:50 -08:00
|
|
|
${CMAKE_DL_LIBS}
|
2026-02-02 12:24:50 -08:00
|
|
|
)
|
|
|
|
|
|
2026-02-21 19:41:21 -08:00
|
|
|
# GL/GLEW linked temporarily for unconverted sub-renderers (removed in Phase 7)
|
|
|
|
|
if(TARGET OpenGL::GL)
|
|
|
|
|
target_link_libraries(wowee PRIVATE OpenGL::GL)
|
|
|
|
|
endif()
|
|
|
|
|
if(TARGET GLEW::GLEW)
|
|
|
|
|
target_link_libraries(wowee PRIVATE GLEW::GLEW)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-23 16:30:49 +01:00
|
|
|
if(HAVE_FFMPEG)
|
|
|
|
|
target_compile_definitions(wowee PRIVATE HAVE_FFMPEG)
|
|
|
|
|
target_link_libraries(wowee PRIVATE ${FFMPEG_LIBRARIES})
|
|
|
|
|
if(FFMPEG_LIBRARY_DIRS)
|
|
|
|
|
target_link_directories(wowee PRIVATE ${FFMPEG_LIBRARY_DIRS})
|
|
|
|
|
endif()
|
2026-02-05 15:34:29 -08:00
|
|
|
endif()
|
|
|
|
|
|
2026-02-03 22:24:17 -08:00
|
|
|
# Platform-specific libraries
|
2026-02-07 17:59:40 -08:00
|
|
|
if(UNIX AND NOT APPLE)
|
|
|
|
|
target_link_libraries(wowee PRIVATE X11)
|
|
|
|
|
endif()
|
2026-02-03 22:24:17 -08:00
|
|
|
if(WIN32)
|
|
|
|
|
target_link_libraries(wowee PRIVATE ws2_32)
|
|
|
|
|
# SDL2main provides WinMain entry point on Windows
|
|
|
|
|
if(TARGET SDL2::SDL2main)
|
|
|
|
|
target_link_libraries(wowee PRIVATE SDL2::SDL2main)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
# Link ImGui if available
|
|
|
|
|
if(TARGET imgui)
|
|
|
|
|
target_link_libraries(wowee PRIVATE imgui)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-21 19:41:21 -08:00
|
|
|
# Link vk-bootstrap
|
|
|
|
|
if(TARGET vk-bootstrap)
|
|
|
|
|
target_link_libraries(wowee PRIVATE vk-bootstrap)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-12 03:01:36 -08:00
|
|
|
# Link Unicorn if available
|
|
|
|
|
if(HAVE_UNICORN)
|
|
|
|
|
target_link_libraries(wowee PRIVATE ${UNICORN_LIBRARY})
|
|
|
|
|
target_include_directories(wowee PRIVATE ${UNICORN_INCLUDE_DIR})
|
|
|
|
|
target_compile_definitions(wowee PRIVATE HAVE_UNICORN)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
# Link GLM if found
|
|
|
|
|
if(TARGET glm::glm)
|
|
|
|
|
target_link_libraries(wowee PRIVATE glm::glm)
|
|
|
|
|
elseif(glm_FOUND)
|
|
|
|
|
target_include_directories(wowee PRIVATE ${GLM_INCLUDE_DIRS})
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Compiler warnings
|
|
|
|
|
if(MSVC)
|
|
|
|
|
target_compile_options(wowee PRIVATE /W4)
|
|
|
|
|
else()
|
|
|
|
|
target_compile_options(wowee PRIVATE -Wall -Wextra -Wpedantic)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-23 16:30:49 +01:00
|
|
|
# Debug build flags
|
|
|
|
|
if(MSVC)
|
|
|
|
|
# /ZI — Edit-and-Continue debug info (works with hot-reload in VS 2022)
|
|
|
|
|
# /RTC1 — stack-frame and uninitialised-variable runtime checks (Debug only)
|
|
|
|
|
# /sdl — additional SDL security checks
|
|
|
|
|
# /Od — disable optimisation so stepping matches source lines exactly
|
|
|
|
|
target_compile_options(wowee PRIVATE
|
|
|
|
|
$<$<CONFIG:Debug>:/ZI /RTC1 /sdl /Od>
|
|
|
|
|
)
|
|
|
|
|
# Ensure the linker emits a .pdb alongside the .exe for every config
|
|
|
|
|
target_link_options(wowee PRIVATE
|
|
|
|
|
$<$<CONFIG:Debug>:/DEBUG:FULL>
|
|
|
|
|
$<$<CONFIG:RelWithDebInfo>:/DEBUG:FASTLINK>
|
|
|
|
|
)
|
|
|
|
|
else()
|
|
|
|
|
# -g3 — maximum DWARF debug info (includes macro definitions)
|
|
|
|
|
# -Og — optimise for debugging (better than -O0, keeps most frames)
|
|
|
|
|
# -fno-omit-frame-pointer — preserve frame pointers so stack traces are clean
|
|
|
|
|
target_compile_options(wowee PRIVATE
|
|
|
|
|
$<$<CONFIG:Debug>:-g3 -Og -fno-omit-frame-pointer>
|
|
|
|
|
$<$<CONFIG:RelWithDebInfo>:-g -fno-omit-frame-pointer>
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# AddressSanitizer — catch buffer overflows, use-after-free, etc.
|
|
|
|
|
# Enable with: cmake ... -DWOWEE_ENABLE_ASAN=ON -DCMAKE_BUILD_TYPE=Debug
|
|
|
|
|
if(WOWEE_ENABLE_ASAN)
|
|
|
|
|
if(MSVC)
|
|
|
|
|
target_compile_options(wowee PRIVATE /fsanitize=address)
|
|
|
|
|
# ASAN on MSVC requires the dynamic CRT (/MD or /MDd)
|
|
|
|
|
target_compile_options(wowee PRIVATE
|
|
|
|
|
$<$<CONFIG:Debug>:/MDd>
|
|
|
|
|
$<$<CONFIG:Release>:/MD>
|
|
|
|
|
)
|
|
|
|
|
else()
|
|
|
|
|
target_compile_options(wowee PRIVATE -fsanitize=address -fno-omit-frame-pointer)
|
|
|
|
|
target_link_options(wowee PRIVATE -fsanitize=address)
|
|
|
|
|
endif()
|
|
|
|
|
message(STATUS "AddressSanitizer: ENABLED")
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-18 20:10:47 -08:00
|
|
|
# Release build optimizations
|
|
|
|
|
include(CheckIPOSupported)
|
|
|
|
|
check_ipo_supported(RESULT _ipo_supported OUTPUT _ipo_error)
|
|
|
|
|
if(_ipo_supported)
|
|
|
|
|
set_property(TARGET wowee PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE)
|
|
|
|
|
endif()
|
|
|
|
|
if(NOT MSVC)
|
|
|
|
|
# -O3: more aggressive inlining and auto-vectorization vs CMake's default -O2
|
|
|
|
|
target_compile_options(wowee PRIVATE $<$<CONFIG:Release>:-O3>)
|
|
|
|
|
# -fvisibility=hidden: keeps all symbols internal by default, shrinks binary
|
|
|
|
|
# and gives the linker and optimizer more freedom to dead-strip and inline
|
|
|
|
|
target_compile_options(wowee PRIVATE $<$<CONFIG:Release>:-fvisibility=hidden -fvisibility-inlines-hidden>)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-23 16:30:49 +01:00
|
|
|
# Copy assets next to the executable (runs every build, not just configure).
|
|
|
|
|
# Uses $<TARGET_FILE_DIR:wowee> so MSVC multi-config generators place assets
|
|
|
|
|
# in bin/Debug/ or bin/Release/ alongside the exe, not the common bin/ parent.
|
|
|
|
|
add_custom_command(TARGET wowee POST_BUILD
|
2026-02-22 02:59:24 -08:00
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/assets
|
2026-02-23 16:30:49 +01:00
|
|
|
$<TARGET_FILE_DIR:wowee>/assets
|
|
|
|
|
COMMENT "Syncing assets to $<TARGET_FILE_DIR:wowee>/assets"
|
2026-02-22 02:59:24 -08:00
|
|
|
)
|
2026-02-23 16:30:49 +01:00
|
|
|
|
|
|
|
|
# On Windows, SDL 2.28+ uses LoadLibraryExW with LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
|
|
|
|
|
# which does NOT include System32. Copy vulkan-1.dll into the output directory so
|
|
|
|
|
# SDL_Vulkan_LoadLibrary can locate it without needing a full system PATH search.
|
|
|
|
|
if(WIN32)
|
2026-02-23 18:32:47 -08:00
|
|
|
find_file(VULKAN_DLL vulkan-1.dll
|
|
|
|
|
PATHS "$ENV{SystemRoot}/System32" "$ENV{VULKAN_SDK}/Bin"
|
|
|
|
|
NO_DEFAULT_PATH)
|
|
|
|
|
if(VULKAN_DLL)
|
|
|
|
|
add_custom_command(TARGET wowee POST_BUILD
|
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
|
|
|
"${VULKAN_DLL}" "$<TARGET_FILE_DIR:wowee>/vulkan-1.dll"
|
|
|
|
|
COMMENT "Copying vulkan-1.dll to output directory"
|
|
|
|
|
)
|
|
|
|
|
else()
|
|
|
|
|
message(STATUS " vulkan-1.dll not found — skipping copy (MSYS2 provides it via PATH)")
|
|
|
|
|
endif()
|
2026-02-23 16:30:49 +01:00
|
|
|
endif()
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
# Install targets
|
|
|
|
|
install(TARGETS wowee
|
|
|
|
|
RUNTIME DESTINATION bin
|
|
|
|
|
LIBRARY DESTINATION lib
|
|
|
|
|
ARCHIVE DESTINATION lib
|
|
|
|
|
)
|
|
|
|
|
|
2026-02-18 18:29:34 -08:00
|
|
|
# Note: tool install rules are placed next to each target definition below.
|
2026-02-18 18:18:30 -08:00
|
|
|
|
|
|
|
|
# Install built-in assets (exclude proprietary music)
|
|
|
|
|
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/assets
|
|
|
|
|
DESTINATION bin
|
|
|
|
|
PATTERN "Original Music" EXCLUDE)
|
|
|
|
|
|
|
|
|
|
# On Windows, install any DLLs that were bundled into the build output dir
|
|
|
|
|
# (populated by the CI workflow's DLL-bundling step before cpack runs)
|
|
|
|
|
if(WIN32)
|
|
|
|
|
install(DIRECTORY "${CMAKE_BINARY_DIR}/bin/"
|
|
|
|
|
DESTINATION bin
|
|
|
|
|
FILES_MATCHING PATTERN "*.dll")
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-11 15:24:05 -08:00
|
|
|
# Linux desktop integration (launcher + icon)
|
|
|
|
|
if(UNIX AND NOT APPLE)
|
|
|
|
|
set(WOWEE_LINUX_ICON_PATH "${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons/hicolor/256x256/apps/wowee.png")
|
|
|
|
|
configure_file(
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/resources/wowee.desktop.in
|
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/wowee.desktop
|
|
|
|
|
@ONLY
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/wowee.desktop
|
|
|
|
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
|
|
|
|
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/assets/Wowee.png
|
|
|
|
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps
|
|
|
|
|
RENAME wowee.png)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-12 20:32:14 -08:00
|
|
|
# ---- Tool: asset_extract (MPQ → loose files) ----
|
|
|
|
|
if(STORMLIB_LIBRARY AND STORMLIB_INCLUDE_DIR)
|
|
|
|
|
add_executable(asset_extract
|
|
|
|
|
tools/asset_extract/main.cpp
|
|
|
|
|
tools/asset_extract/extractor.cpp
|
|
|
|
|
tools/asset_extract/path_mapper.cpp
|
|
|
|
|
tools/asset_extract/manifest_writer.cpp
|
2026-02-13 00:10:01 -08:00
|
|
|
src/pipeline/dbc_loader.cpp
|
|
|
|
|
src/core/logger.cpp
|
2026-02-12 20:32:14 -08:00
|
|
|
)
|
|
|
|
|
target_include_directories(asset_extract PRIVATE
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/tools/asset_extract
|
|
|
|
|
${STORMLIB_INCLUDE_DIR}
|
|
|
|
|
)
|
|
|
|
|
target_link_libraries(asset_extract PRIVATE
|
|
|
|
|
${STORMLIB_LIBRARY}
|
|
|
|
|
ZLIB::ZLIB
|
|
|
|
|
Threads::Threads
|
|
|
|
|
)
|
2026-02-23 14:09:51 +01:00
|
|
|
if(WIN32)
|
2026-02-23 18:32:47 -08:00
|
|
|
find_library(WININET_LIB wininet)
|
|
|
|
|
find_library(BZ2_LIB bz2)
|
|
|
|
|
if(WININET_LIB)
|
|
|
|
|
target_link_libraries(asset_extract PRIVATE ${WININET_LIB})
|
|
|
|
|
endif()
|
|
|
|
|
if(BZ2_LIB)
|
|
|
|
|
target_link_libraries(asset_extract PRIVATE ${BZ2_LIB})
|
|
|
|
|
endif()
|
2026-02-23 14:09:51 +01:00
|
|
|
endif()
|
2026-02-12 20:32:14 -08:00
|
|
|
set_target_properties(asset_extract PROPERTIES
|
|
|
|
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
|
|
|
)
|
2026-02-18 18:29:34 -08:00
|
|
|
install(TARGETS asset_extract RUNTIME DESTINATION bin)
|
2026-02-12 20:32:14 -08:00
|
|
|
message(STATUS " asset_extract tool: ENABLED")
|
|
|
|
|
else()
|
|
|
|
|
message(STATUS " asset_extract tool: DISABLED (requires StormLib)")
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-02-13 00:10:01 -08:00
|
|
|
# ---- Tool: dbc_to_csv (DBC → CSV text) ----
|
|
|
|
|
add_executable(dbc_to_csv
|
|
|
|
|
tools/dbc_to_csv/main.cpp
|
|
|
|
|
src/pipeline/dbc_loader.cpp
|
|
|
|
|
src/core/logger.cpp
|
|
|
|
|
)
|
|
|
|
|
target_include_directories(dbc_to_csv PRIVATE
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
|
|
|
)
|
|
|
|
|
target_link_libraries(dbc_to_csv PRIVATE Threads::Threads)
|
|
|
|
|
set_target_properties(dbc_to_csv PROPERTIES
|
|
|
|
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
|
|
|
)
|
2026-02-18 18:29:34 -08:00
|
|
|
install(TARGETS dbc_to_csv RUNTIME DESTINATION bin)
|
2026-02-13 00:10:01 -08:00
|
|
|
|
2026-02-13 00:55:36 -08:00
|
|
|
# ---- Tool: auth_probe (LOGON_CHALLENGE probe) ----
|
|
|
|
|
add_executable(auth_probe
|
|
|
|
|
tools/auth_probe/main.cpp
|
|
|
|
|
src/auth/auth_packets.cpp
|
|
|
|
|
src/auth/auth_opcodes.cpp
|
|
|
|
|
src/auth/crypto.cpp
|
|
|
|
|
src/network/packet.cpp
|
|
|
|
|
src/network/socket.cpp
|
|
|
|
|
src/network/tcp_socket.cpp
|
|
|
|
|
src/core/logger.cpp
|
|
|
|
|
)
|
|
|
|
|
target_include_directories(auth_probe PRIVATE
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
|
|
|
)
|
2026-02-18 19:12:16 -08:00
|
|
|
target_link_libraries(auth_probe PRIVATE Threads::Threads OpenSSL::Crypto
|
|
|
|
|
$<$<BOOL:${WIN32}>:ws2_32>)
|
2026-02-13 00:55:36 -08:00
|
|
|
set_target_properties(auth_probe PROPERTIES
|
|
|
|
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
|
|
|
)
|
2026-02-18 18:29:34 -08:00
|
|
|
install(TARGETS auth_probe RUNTIME DESTINATION bin)
|
2026-02-13 00:55:36 -08:00
|
|
|
|
2026-02-13 01:32:15 -08:00
|
|
|
# ---- Tool: auth_login_probe (challenge + proof probe) ----
|
|
|
|
|
add_executable(auth_login_probe
|
|
|
|
|
tools/auth_login_probe/main.cpp
|
|
|
|
|
src/auth/auth_packets.cpp
|
|
|
|
|
src/auth/auth_opcodes.cpp
|
|
|
|
|
src/auth/crypto.cpp
|
|
|
|
|
src/auth/integrity.cpp
|
|
|
|
|
src/auth/big_num.cpp
|
|
|
|
|
src/auth/srp.cpp
|
|
|
|
|
src/network/packet.cpp
|
|
|
|
|
src/network/socket.cpp
|
|
|
|
|
src/network/tcp_socket.cpp
|
|
|
|
|
src/core/logger.cpp
|
|
|
|
|
)
|
|
|
|
|
target_include_directories(auth_login_probe PRIVATE
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
|
|
|
)
|
2026-02-18 19:12:16 -08:00
|
|
|
target_link_libraries(auth_login_probe PRIVATE Threads::Threads OpenSSL::Crypto
|
|
|
|
|
$<$<BOOL:${WIN32}>:ws2_32>)
|
2026-02-13 01:32:15 -08:00
|
|
|
set_target_properties(auth_login_probe PROPERTIES
|
|
|
|
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
|
|
|
)
|
2026-02-18 18:29:34 -08:00
|
|
|
install(TARGETS auth_login_probe RUNTIME DESTINATION bin)
|
2026-02-13 01:32:15 -08:00
|
|
|
|
2026-02-12 20:32:14 -08:00
|
|
|
# ---- Tool: blp_convert (BLP ↔ PNG) ----
|
|
|
|
|
add_executable(blp_convert
|
|
|
|
|
tools/blp_convert/main.cpp
|
|
|
|
|
src/pipeline/blp_loader.cpp
|
|
|
|
|
src/core/logger.cpp
|
|
|
|
|
)
|
|
|
|
|
target_include_directories(blp_convert PRIVATE
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/extern
|
|
|
|
|
)
|
|
|
|
|
target_link_libraries(blp_convert PRIVATE Threads::Threads)
|
|
|
|
|
set_target_properties(blp_convert PROPERTIES
|
|
|
|
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
|
|
|
)
|
2026-02-18 18:29:34 -08:00
|
|
|
install(TARGETS blp_convert RUNTIME DESTINATION bin)
|
2026-02-12 20:32:14 -08:00
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
# Print configuration summary
|
|
|
|
|
message(STATUS "")
|
|
|
|
|
message(STATUS "Wowee Configuration:")
|
|
|
|
|
message(STATUS " C++ Standard: ${CMAKE_CXX_STANDARD}")
|
|
|
|
|
message(STATUS " Build Type: ${CMAKE_BUILD_TYPE}")
|
|
|
|
|
message(STATUS " SDL2: ${SDL2_VERSION}")
|
|
|
|
|
message(STATUS " OpenSSL: ${OPENSSL_VERSION}")
|
|
|
|
|
message(STATUS " ImGui: ${IMGUI_DIR}")
|
2026-02-23 16:30:49 +01:00
|
|
|
message(STATUS " ASAN: ${WOWEE_ENABLE_ASAN}")
|
2026-02-02 12:24:50 -08:00
|
|
|
message(STATUS "")
|
2026-02-18 18:18:30 -08:00
|
|
|
|
|
|
|
|
# ---- CPack packaging ----
|
|
|
|
|
set(CPACK_PACKAGE_NAME "wowee")
|
|
|
|
|
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
|
|
|
|
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "World of Warcraft client emulator")
|
|
|
|
|
set(CPACK_PACKAGE_VENDOR "Wowee")
|
|
|
|
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Wowee")
|
|
|
|
|
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
|
|
|
|
|
|
|
|
|
if(WIN32)
|
|
|
|
|
set(CPACK_GENERATOR "NSIS")
|
|
|
|
|
set(CPACK_NSIS_DISPLAY_NAME "Wowee")
|
|
|
|
|
set(CPACK_NSIS_PACKAGE_NAME "Wowee")
|
|
|
|
|
set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
|
|
|
|
|
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
|
|
|
|
|
# Run wowee from bin/ so that ./assets/ resolves correctly.
|
|
|
|
|
# SetOutPath sets the shortcut's working directory in NSIS.
|
|
|
|
|
set(CPACK_NSIS_CREATE_ICONS_EXTRA
|
2026-02-18 19:21:14 -08:00
|
|
|
"SetOutPath '$INSTDIR\\\\bin'\nCreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Wowee.lnk' '$INSTDIR\\\\bin\\\\wowee.exe'")
|
2026-02-18 18:18:30 -08:00
|
|
|
set(CPACK_NSIS_DELETE_ICONS_EXTRA
|
2026-02-18 19:21:14 -08:00
|
|
|
"Delete '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Wowee.lnk'")
|
2026-02-18 18:18:30 -08:00
|
|
|
elseif(APPLE)
|
|
|
|
|
set(CPACK_GENERATOR "DragNDrop")
|
|
|
|
|
else()
|
|
|
|
|
# Linux — generate postinst/prerm wrapper scripts
|
|
|
|
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/packaging)
|
|
|
|
|
# postinst: write a wrapper script at /usr/local/bin/wowee that cd's to
|
|
|
|
|
# the install dir so ./assets/ resolves correctly.
|
|
|
|
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/packaging/postinst
|
|
|
|
|
[[#!/bin/sh
|
|
|
|
|
cat > /usr/local/bin/wowee << 'WOWEE_WRAPPER'
|
|
|
|
|
#!/bin/sh
|
|
|
|
|
cd /opt/wowee/bin
|
|
|
|
|
exec ./wowee "$@"
|
|
|
|
|
WOWEE_WRAPPER
|
|
|
|
|
chmod +x /usr/local/bin/wowee
|
|
|
|
|
]])
|
|
|
|
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/packaging/prerm
|
|
|
|
|
"#!/bin/sh\nrm -f /usr/local/bin/wowee\n")
|
|
|
|
|
file(CHMOD
|
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/packaging/postinst
|
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/packaging/prerm
|
|
|
|
|
PERMISSIONS
|
|
|
|
|
OWNER_EXECUTE OWNER_WRITE OWNER_READ
|
|
|
|
|
GROUP_EXECUTE GROUP_READ
|
|
|
|
|
WORLD_EXECUTE WORLD_READ)
|
|
|
|
|
|
|
|
|
|
set(CPACK_GENERATOR "DEB")
|
|
|
|
|
set(CPACK_PACKAGING_INSTALL_PREFIX "/opt/wowee")
|
|
|
|
|
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Wowee")
|
|
|
|
|
set(CPACK_DEBIAN_PACKAGE_SECTION "games")
|
|
|
|
|
set(CPACK_DEBIAN_PACKAGE_DEPENDS
|
2026-02-21 19:41:21 -08:00
|
|
|
"libsdl2-2.0-0, libvulkan1, libssl3, zlib1g")
|
2026-02-18 18:18:30 -08:00
|
|
|
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/packaging/postinst;${CMAKE_CURRENT_BINARY_DIR}/packaging/prerm")
|
|
|
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64")
|
|
|
|
|
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
|
|
|
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|ARM64")
|
|
|
|
|
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "arm64")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
include(CPack)
|