- gr2_bridge: gr2 Mat4 (row-major) -> Godot Transform3D (4x4 transpose); build_skeleton (rest from local_transform, initial_placement folded into roots), build_skin (bind i -> bone i, pose = inverse_world), build_mesh (surface per gr2 mesh, ARRAY_BONES = skeleton idx via bone_bindings, rigid meshes bound to bone_bindings[0]). - dxt: DDS DXT1/3/5 decoder ported from xrender-poc. - Metin2Model: load_gr2 -> Skeleton3D + MeshInstance3D + StandardMaterial3D (runtime DDS albedo, face/body split by surface name). Z-up cm -> Y-up m conversion on the node transform (unit_scale, flip_z, flip_winding props). - Metin2AnimPlayer: _process samples a (separate) anim .gr2 with gr2::sample_pose(model.skeleton, anim, t) -> set_bone_global_pose per bone; Godot GPU-skins via skin_matrix = global_pose(i) * bind_pose(i) == gr2 deformer matrix. selfcheck() NaN-scans all anims. Verified: warrior_cheongrin renders (75 bones, 5 surfaces, 3324 verts, textured, upright). dance01 (dur 28.3s, 74 tracks) plays, 0 NaN over 25 samples, distinct poses at t=2/9/16/23. Screenshots in test/golden/. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WaHYEY9rwLWt21PULiYjeJ
41 lines
1.7 KiB
CMake
41 lines
1.7 KiB
CMake
# mtgodot GDExtension — M0' skeleton (registers Metin2Model, links libgr2).
|
|
|
|
# --- godot-cpp (submodule @ master) ---
|
|
# master has no per-minor branch; it ships bundled extension_api-4-*.json.
|
|
# Pin to 4.7 to match the installed editor (4.7.1; patch-level ABI is compatible).
|
|
set(GODOTCPP_API_VERSION "4.7" CACHE STRING "Target Godot API version" FORCE)
|
|
add_subdirectory(godot-cpp)
|
|
|
|
# --- libgr2 from the sibling xrender-poc repo ---
|
|
# M0': plain sibling-directory reference (both repos live under .../mt/).
|
|
# For a portable checkout, either git-submodule xrender-poc or vendor libgr2,
|
|
# then pass -DXRENDER_POC_DIR=/path/to/xrender-poc.
|
|
set(XRENDER_POC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../xrender-poc"
|
|
CACHE PATH "Path to the xrender-poc repo (provides libgr2)")
|
|
if(NOT EXISTS "${XRENDER_POC_DIR}/libgr2/CMakeLists.txt")
|
|
message(FATAL_ERROR
|
|
"libgr2 not found at '${XRENDER_POC_DIR}/libgr2'. "
|
|
"Pass -DXRENDER_POC_DIR=/path/to/xrender-poc")
|
|
endif()
|
|
add_subdirectory("${XRENDER_POC_DIR}/libgr2" "${CMAKE_CURRENT_BINARY_DIR}/libgr2")
|
|
|
|
# --- the extension shared library ---
|
|
add_library(mtgodot SHARED
|
|
src/register_types.cpp
|
|
src/metin2_model.cpp
|
|
src/metin2_anim.cpp
|
|
src/gr2_bridge.cpp
|
|
src/dxt.cpp
|
|
)
|
|
target_compile_features(mtgodot PRIVATE cxx_std_20)
|
|
target_link_libraries(mtgodot PRIVATE godot::cpp xrender::libgr2)
|
|
|
|
# Drop the dylib straight into the Godot project where the .gdextension expects it:
|
|
# project/bin/libmtgodot.macos.template_debug.dylib (Debug)
|
|
# project/bin/libmtgodot.macos.template_release.dylib (Release)
|
|
set_target_properties(mtgodot PROPERTIES
|
|
PREFIX "lib"
|
|
OUTPUT_NAME "mtgodot.macos.$<IF:$<CONFIG:Release>,template_release,template_debug>"
|
|
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/project/bin"
|
|
)
|