Integrating Recast Navigation Static Libraries for WebAssembly (Emscripten & CMake) Интеграция статических библиотек Recast Navigation для WebAssembly (Emscripten и CMake)

A step-by-step guide to configuring and integrating the Recast Navigation static libraries in your CMake projects for WebAssembly using Emscripten. Пошаговое руководство по настройке и интеграции статических библиотек Recast Navigation в проекты CMake для WebAssembly с использованием Emscripten.

Before proceeding, make sure you have built and installed the Recast Navigation static libraries for WebAssembly using the guide: Перед продолжением убедитесь, что вы собрали и установили статические библиотеки Recast Navigation для WebAssembly, следуя инструкции:

Step 1: Create Project Directory Шаг 1: Создание директории проекта

Create a workspace folder and a new directory for your Recast Navigation WebAssembly test project: Создайте рабочую папку для проектов и новую директорию для вашего тестового WebAssembly-проекта Recast Navigation:

mkdir C:\projects\recast-wasm-test
cd C:\projects\recast-wasm-test

Step 2: Create Source Files (main.cpp & CMakeLists.txt) Шаг 2: Создание исходных файлов (main.cpp и CMakeLists.txt)

You can create these files using Notepad, Sublime Text, or any text editor: Вы можете создать эти файлы через Блокнот, Sublime Text или любой текстовый редактор:

notepad main.cpp
notepad CMakeLists.txt

1. File Contents for main.cpp 1. Содержимое файла main.cpp

#include <iostream>
#include <Recast.h>
#include <DetourNavMesh.h>
#include <DetourNavMeshQuery.h>

int main() {
    std::cout << "Initializing Recast & Detour (WebAssembly)..." << std::endl;

    // Allocate Recast Context
    rcContext ctx;
    
    // Allocate Detour NavMesh & NavMeshQuery objects
    dtNavMesh* navMesh = dtAllocNavMesh();
    dtNavMeshQuery* navQuery = dtAllocNavMeshQuery();

    if (!navMesh || !navQuery) {
        std::cerr << "Failed to allocate Detour structures!" << std::endl;
        return 1;
    }

    dtStatus status = navQuery->init(navMesh, 2048);
    if (dtStatusSucceed(status)) {
        std::cout << "NavMeshQuery initialized (empty mesh baseline test successful)." << std::endl;
    }

    // Clean up allocated memory
    dtFreeNavMeshQuery(navQuery);
    dtFreeNavMesh(navMesh);

    std::cout << "Recast Navigation WebAssembly test completed successfully!" << std::endl;
    return 0;
}

2. File Contents for CMakeLists.txt 2. Содержимое файла CMakeLists.txt

Imports all core Recast & Detour WebAssembly static libraries (libRecast.a, libDetour.a, libDetourCrowd.a, etc.) and sets the necessary Emscripten link options: Импортирует все основные статические WebAssembly-библиотеки Recast и Detour (libRecast.a, libDetour.a, libDetourCrowd.a и др.) и настраивает необходимые флаги линковки Emscripten:

cmake_minimum_required(VERSION 3.21)
project(recast_wasm_test CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(PROJECT_SOURCES
    main.cpp
)

add_executable(app)
target_sources(app PRIVATE ${PROJECT_SOURCES})

set(RECAST_DIR "C:/libs/recastnavigation-wasm")

target_include_directories(app PRIVATE
    ${RECAST_DIR}/include
    ${RECAST_DIR}/include/recastnavigation
)

add_library(Recast_Static STATIC IMPORTED)
set_target_properties(Recast_Static PROPERTIES
    IMPORTED_LOCATION "${RECAST_DIR}/lib/libRecast.a"
)

add_library(Detour_Static STATIC IMPORTED)
set_target_properties(Detour_Static PROPERTIES
    IMPORTED_LOCATION "${RECAST_DIR}/lib/libDetour.a"
)

add_library(DebugUtils_Static STATIC IMPORTED)
set_target_properties(DebugUtils_Static PROPERTIES
    IMPORTED_LOCATION "${RECAST_DIR}/lib/libDebugUtils.a"
)

add_library(DetourCrowd_Static STATIC IMPORTED)
set_target_properties(DetourCrowd_Static PROPERTIES
    IMPORTED_LOCATION "${RECAST_DIR}/lib/libDetourCrowd.a"
)

add_library(DetourTileCache_Static STATIC IMPORTED)
set_target_properties(DetourTileCache_Static PROPERTIES
    IMPORTED_LOCATION "${RECAST_DIR}/lib/libDetourTileCache.a"
)

target_link_libraries(app PRIVATE
    Recast_Static
    Detour_Static
    DebugUtils_Static
    DetourCrowd_Static
    DetourTileCache_Static
)

target_link_options(app PRIVATE
    "-sALLOW_MEMORY_GROWTH=1"
    "-sNODERAWFS=1"
)

Step 3: Create Build & Execution Scripts Шаг 3: Создание скриптов сборки и запуска

config-wasm.bat

call emcmake cmake -G "MinGW Makefiles" -S . -B dist/wasm

build-wasm.bat

cmake --build dist/wasm

run-wasm.bat

@echo off
node .\dist\wasm\app.js

Run the scripts sequentially in Command Prompt (CMD) with Emscripten activated: Последовательно запустите скрипты в командной строке (CMD) с активированным Emscripten:

config-wasm.bat
build-wasm.bat
run-wasm.bat

Step 4: Expected Output Шаг 4: Ожидаемый результат

After running the scripts with Node.js, you should see output similar to this: После запуска скриптов через Node.js вы должны увидеть результат, похожий на следующий:

Initializing Recast & Detour (WebAssembly)...
NavMeshQuery initialized (empty mesh baseline test successful).
Recast Navigation WebAssembly test completed successfully!

Support My Work Поддержать проект

If these tutorials helped you, consider buying me a coffee! Если эти туториалы вам помогли, вы можете поддержать автора.

Sberbank (Russia only) Сбербанк (только для РФ)

Sberbank SBP QR Code

Direct transfer via phone number (Russia only) Перевод по номеру телефона (только для РФ)

+7 (917) 212-29-59

USDT TRC20

USDT TRC20 QR Code

Support via Cryptocurrency Поддержка криптовалютой

TMtY1YifNf6FKvgeFmqKGQR4NStKr3csGp