Skip to content

Repository files navigation

RFMapToolSharp

(В ближайшее время будет ознакомительная версия для открытия карт, без исходников)

Консольный инструмент на C# (.NET 8) для карт RF Online: чтение геометрии, материалов, текстур и анимаций объектов из игровых форматов и экспорт в .glb (glTF 2.0), а также задел на обратное направление (GLB → BSP, репак карт).

Быстрый старт (для пользователя, без установки чего-либо)

  1. Скачай и распакуй RFMapToolSharp-portable.zip — self-contained пакет, .NET устанавливать не нужно (рантайм внутри, Windows 10/11 x64).
  2. Закинь папки карт клиента в Map/ внутри пакета (рядом лежит подсказка _сюда_папки_карт.txt). Альтернатива: ничего не копировать, а вписать полный путь к клиенту в rf_path.txt (например D:\Games\RF_Online).
  3. Запусти RFMapToolSharp.cmd — откроется меню выбора карты. Из командной строки: RFMapToolSharp.cmd --all (все карты) / RFMapToolSharp.cmd --map Sette (одна).

Готовые .glb появятся в ReadyMaps/<карта>/ внутри пакета. Файл .glb открывается без установки программ: перетащи его в браузер на gltf-viewer.donmccurdy.com, либо открой в Blender / Windows 3D Viewer.

Структура пакета:

RFMapToolSharp/
  RFMapToolSharp.cmd   — запуск (двойной клик)
  Map/                 — сюда кладёшь папки карт
  ReadyMaps/           — здесь появятся готовые карты
  rf_path.txt          — или впиши путь к клиенту сюда
  app/                 — программа и рантайм (не трогай)
  ПРОЧТИ_МЕНЯ.txt      — короткая инструкция

Структура репозитория

Папка Назначение
Maps/Map/ Входные карты клиента RF Online (.bsp, .r3m, .r3t, .spt и пр.). Не коммитится.
ReadyMaps/ Готовые результаты экспорта.
Parsing/ Парсеры форматов: BSP/EBP, R3M (материалы), R3T (текстуры), SPT, RPK и др.
Export/ Экспорт в GLB (SharpGLTF), диагностика, мост SPT-моделей.
Editor/ Задел редактора карт (шаблоны, dry-run).
tools/ Вспомогательные утилиты (инвентарь ресурсов, guard-скрипты).
_runs/ Логи пакетных прогонов. Не коммитится.

Структура результата (ReadyMaps/)

ReadyMaps/
  <map>/<map>.glb            — готовая карта (только GLB, без мусора)
  _diagnostics/<map>/*.json  — отладочные дампы (ноды, матрицы объектов, UV-аномалии…)
  _reports/texture_report_<map>.json — сводка по текстурам
  _logs/<map>_export_<ts>.log        — tee-лог консоли прогона

--cleanup-diagnostics удаляет legacy-диагностику из <map>/ (интерактивно спрашивает подтверждение; в батче — no-op).

Что умеет экспорт

  • Геометрия BSP (.bsp): вершины, грани, матгруппы; фильтры вытянутых/аномальных треугольников (по умолчанию только логируются, не вырезаются).
  • Материалы (.r3m): привязка текстур, эвристики прозрачности (по имени и alpha type).
  • Текстуры (.r3t): DDS → PNG в памяти (DXT1/3/5, ATI, BC7), встраивание в GLB.
  • Анимации BSP-объектов (все карты, все анимированные объекты):
    • mesh-ноды вложены в иерархию объектных нод BSP_obj{id} по parent-chain;
    • каналы — world-дельты от запечённой позы, статичная поза не меняется (на baked-кадре цепочка = identity);
    • объекты с анизотропным scale, где дельта содержит shear и не раскладывается в TRS, факторизуются в точную цепочку из трёх TRS-нод _inv/_rot/_scl (пример: Sette obj1/2, scale ~0.007 по одной оси);
    • статичные объекты каналов не получают, пустых animations в GLB нет.
  • SPT-объекты: это helper-объёмы движка (музыкальные зоны, точки телепортов dpgoto/dpfrom, старты dsstart, модули данжей dmm*) — видимых моделей у них в данных нет. Экспортируются как полупрозрачные маркер-боксы реального размера (bbox из SPT) с полным node_tm (позиция + поворот + масштаб), цвет по классу: жёлтый helper / зелёный music / оранжевый portal / голубой spawn. Режим real-if-supported подхватывает .msh/.mod/.obj рядом с картой, если такие файлы появятся (см. SptModelBridge).
  • FX/SND-эмиттеры (.ebp): фонтаны, лава, листопад, ambient-звуки карты. Экспортируются как полупрозрачные маркер-ноды FX_<i>_<имя> (magenta) и SND_<i>_<имя> (blue-violet) с метаданными в extras (путь эффекта, fade, shader, wave-файл и т.д.). Диагностика: _diagnostics/<map>/ebp_fx.json.
  • RVP-летающие объекты (.rvp + реверснутый .cam): корабли, бабочки и прочие ambient/cutscene-объекты. Ноды RVP_<объект> с реальным мешем (.msh через SptModelBridge, резолв .\Chef\... от корня данных клиента) и анимацией полёта (pos/rot-каналы из треков .cam, кадр/30 = секунды). Привязка объект→якорь — по биндингам [PrepareTrack] (*b_01 *Dummy01). Формат .cam описан в POINT_ELEMENTS_ANALYSIS.md. Если меш не читается — ставится fallback-маркер RVP_<объект>_box. Диагностика: _diagnostics/<map>/rvp_objects.json.

Требования и сборка

  • Windows, .NET SDK 8 (запинен в global.json: 8.0.424)
  • Зависимости: SharpGLTF, Pfim, SixLabors.ImageSharp

Запуск

Без аргументов — интерактивное меню. Папка карт ищется автоматически: rf_path.txt (построчно, # = комментарий; ищется в рабочей папке, рядом с exe и на уровень выше exe) → Map|map в рабочей папке → обход вверх от cwd и exe → C:\Games\RF_Online\Map.

Основные флаги (batch mode)

Флаг Описание
--all Экспорт всех карт без меню
--map Sette Экспорт по части имени карты
--filter=Vol* Экспорт по маске (*, ?, без учёта регистра)
--resume Пропускать карты, у которых GLB новее всех исходников
--validate Round-trip проверка каждого GLB через SharpGLTF; exit code 0/1/2 = OK/warnings/errors
--cleanup-diagnostics Чистка legacy-диагностики (с подтверждением)

--glb-to-bsp-, --glb-insert-, --glb-to-rf-, --repack-map, --repack-bsp, --bsp-dump, --bsp-patch, --bsp-apply, --entity-report, --rf-inventory-. См. Program.cs` — эти режимы в активной разработке.

Диагностика

Актуальный статус (2026-09)

  • Батч-экспорт всех 41 BSP-карты проходит; --validate даёт code=1 (warnings) на всех, кроме Dungeon00 (code=2 — известное ограничение: сжатые вершины формата 2004 года парсером пока не поддерживаются).
  • Анимации BSP-объектов работают на всех картах (раньше — только Sette): 24 карты с объектами получили иерархию BSP_obj* и TRS-каналы (напр. Elan — 35 объектов/601 кадр, lobby — 13/2001, Transport01 — 34/301). Для этого снят глобальный skip трансформа для групп attr=8192 (все object-группы на всех картах имеют этот attr; skip оставлял объекты в raw local space — «в центре карты / за картой» — и глушил анимации).
  • Sette: все 8 анимированных BSP-объектов экспортируются с точными каналами (включая shear-факторизацию obj1/2).
  • SPT helper'ы экспортируются с полным node_tm (поворот теперь применяется) и маркер-боксами реального размера из bbox записи, полупрозрачными, с цветовой маркировкой по классу.
  • FX/SND-эмиттеры из .ebp экспортируются (маркер-ноды с extras): напр. Elan — 2321 FX + 60 SND, Platform01 — 5703 FX + 38 SND.
  • RVP-объекты экспортируются: 10 карт с летающими объектами, всего 219 нод RVP_*, все с анимациями полёта из .cam (Platform01 — 26 объектов, neutralA/B/C и S1/S2-варианты). Карты accretia/bellato/cora/Dungeon04 имеют .rvp без объектов (чистые камера-катсцены) — экспортировать нечего.
  • Исправлен парсинг граничного кадра BSP-треков (GetFrameAlphaCore: кадр 0 при первом ключе в кадре 0 ошибочно отдавал последний ключ — «снап» муверов на старте; также из .cam отбрасываются хвостовые ключи-терминаторы с frame=0, дававшие телепорт объекта в конечную позу на t=0).

Поисковые ключи

RF Online, RFOnline, Rising Force Online, RF map tool, RF Online map export, RF Online BSP, RF Online R3M, RF Online R3T, RF Online SPT, RF Online GLB, RF Online GLTF, RF Online modding, RF Online tools.