первые наработки по рендеру

This commit is contained in:
2026-05-23 00:08:32 +04:00
parent 1a56b22e38
commit bba203aa53
25 changed files with 1841 additions and 110 deletions
+62 -21
View File
@@ -15,13 +15,15 @@
- читать и рендерить воду из `MH2O`;
- стримить мир чанками с LOD в runtime;
- стримить мир в **editor preview** по мере движения камеры в 3D viewport;
- читать `WMO` в отдельный `Dictionary` и собирать его в `Node3D` вручную.
- читать `WDT` и собирать состав мира по данным карты, а не по сканированию папки;
- читать `WMO` и автоматически расставлять его в мире через world-level registry с дедупом по `unique_id` (WMO на границе тайлов не дублируется);
- подхватывать глобальный WMO из `WDT.MWMO/MODF` для WMO-only карт (инстансы);
- читать `M2` (MD20 + SKIN00) и ставить его через `MultiMesh` из ADT doodad placements.
Что пока не доведено до полноценного world renderer:
- автоматическая подстановка `WMO` и `M2` в мир из `ADT/WDT`;
- вода без простого базового материала: нет нормального water shader, depth fade, shoreline blending, анимации;
- world-level `WDT` loader;
- M2 renderer статический: material flags (cull/unshaded), blend modes 2+, billboards для листвы и UV-transform'ы не применяются; анимация/скиннинг не парсятся;
- импорт обратно в форматы WoW;
- полноценные инструменты редактирования мира в editor.
@@ -38,10 +40,14 @@
- поддержка основных сжатых форматов, достаточная для terrain textures.
- `ADTLoader`
- `MTEX`, `MMDX/MMID`, `MWMO/MWID`;
- `MDDF`, `MODF`;
- `MDDF`, `MODF` (с `unique_id`, `flags`, `doodad_set`, `name_set`);
- `MCVT`, `MCNR`, `MCLY`, `MCAL`;
- `holes`;
- `MH2O`.
- `WDTLoader`
- `MVER`, `MPHD` (flags карты: global_wmo / big_alpha / sort_by_size_class);
- `MAIN` — таблица присутствия 64×64 ADT-тайлов;
- `MWMO` + `MODF` — глобальный WMO для инстансных/WMO-only карт.
- `ADTBuilder`
- сборка terrain в `Node3D`;
- terrain material с 4 слоями;
@@ -51,19 +57,32 @@
- `StreamingWorld`
- runtime streaming тайлов и чанков;
- editor streaming вокруг камеры viewport;
- отдельные `ADT`-узлы под `Terrain` в дереве сцены.
- состав мира берётся из `WDT` (fallback на папочный скан, если `.wdt` отсутствует);
- отдельные `ADT`-узлы под `Terrain` в дереве сцены;
- world-level WMO registry с refcount-дедупом по `unique_id`: WMO живёт пока на него ссылается хотя бы один загруженный тайл.
- `WMOLoader` / `WMOBuilder`
- root/group parsing;
- `WMOBuilder` собирает mesh по группам;
- интегрирован в `StreamingWorld` через world-level registry;
- глобальный WMO из `WDT` ставится один раз при загрузке карты.
- `M2Loader` / `M2Builder`
- парсинг `MD20` + `SKIN00`: vertices/normals/UVs, materials (flags + blend_mode), texture combos, batches;
- `M2Builder` собирает `ArrayMesh` + `StandardMaterial3D`;
- в `StreamingWorld` расставляется через `MultiMesh` из `ADT.MDDF`.
### Частично реализовано
- `WMOLoader`
- root/group parsing есть;
- `WMOBuilder` собирает mesh по группам;
- в общий world streaming пока не интегрировано.
- `M2` renderer
- статическая геометрия рендерится корректно;
- material flags пока не применяются (cull_mode, unshaded, depth_write);
- blend modes 2+ (additive / modulate) схлопнуты в обычный alpha;
- билборды (leaf bones) не распознаются — листва деревьев плоская;
- UV-трансформы (waterfalls, флаги, порталы) не применяются.
### Не реализовано
- `M2` renderer;
- `WDT` streaming metadata;
- скиннинг и анимации `M2` (bones, key frames);
- particles / ribbons;
- сохранение terrain/liquid/object placement обратно в WoW-форматы;
- редакторские инструменты изменения ADT/WMO данных.
@@ -197,7 +216,28 @@ res://data/extracted
Читает root/group файлы `WMO` и возвращает `Dictionary` с `materials` и `groups`.
Это уже можно использовать вручную, но в world streaming оно пока не подключено.
Подключён в `StreamingWorld` через world-level registry. Дедуп по `unique_id` из `ADT.MODF`, refcount по тайлам.
### `WDTLoader`
Читает `WDT` карты и возвращает `Dictionary`:
- `version``MVER` (ожидается 18);
- `flags`, `has_global_wmo`, `big_alpha`, `sort_by_size_class` — из `MPHD`;
- `tiles: Array[Dictionary]` — присутствующие тайлы `{x, y, flags}` из `MAIN`;
- `global_wmo_name: String` + `global_wmo_placement: Dictionary` — если карта WMO-only.
`StreamingWorld` по умолчанию строит мир из этого списка. Папочный скан остаётся fallback'ом.
### `M2Loader`
Читает `.m2` (`MD20`) + `<basename>00.skin` и возвращает `Dictionary` с геометрией:
- `textures`, `materials` (`flags`, `blend_mode`), `texture_combos`;
- `vertices`, `normals`, `uvs`, `indices`;
- `batches: Array[Dictionary]``{index_start, index_count, material_id, texture_combo_index}`.
Кости, анимации и частицы пока не читаются.
## Export/bake scripts
@@ -481,19 +521,20 @@ Preview одного `ADT` прямо в editor.
- terrain текстурирование уже рабочее, но ещё не 1:1 как в клиенте/Noggit во всех edge cases;
- water renderer сейчас базовый, без настоящих WoW water materials;
- `WMO` читается отдельно, но world placement пока не подключён;
- `M2` placements из `ADT` парсятся, но renderer нет;
- `WDT` ещё не управляет составом мира;
- `M2` рендерится статикой без билбордов, UV-анимаций и скелетной анимации;
- старые `baked_terrain_v2` tile-кэши (до добавления `unique_id` в `MODF`) не дедупят WMO на границах тайлов до перезапечки через `bake_all.gd`;
- проект сейчас ориентирован на просмотр и исследование данных, а не на полный round-trip import/export.
## Ближайшие логичные шаги
1. Подключить `WDT`, чтобы мир собирался не по сканированию папки, а по данным карты.
2. Интегрировать `WMO` placement в `StreamingWorld`.
3. Добавить `M2` loader/renderer.
4. Довести water shader.
5. Начать editor-side инструменты для редактирования terrain/liquid/object placement.
6. Подготовить формат сохранения обратно в WoW-совместимые структуры.
1. Довести M2 renderer:
- **A.** Применять material flags: корректный `cull_mode`, `unshaded`, `depth_write`; blend modes 2+ (`additive`, `modulate`) вместо плоского alpha.
- **B.** Билборды: парсить bones из `M2`, помечать billboard-флаги, для батчей ссылающихся на billboard-bone выдавать отдельные ноды с `BillboardMode = BILLBOARD_ENABLED`. Листва деревьев перестанет быть плоской.
- **C.** UV-трансформы и vertex colors — custom shader, per-instance UV offset в `MultiMesh`. Waterfalls, порталы, флаги.
2. Скелетная анимация и скиннинг `M2` (bones, key frames, attachments) — отдельный крупный кусок.
3. Довести water shader (depth fade, shoreline blending, анимация).
4. Editor-side инструменты редактирования terrain/liquid/object placement.
5. Подготовить формат сохранения обратно в WoW-совместимые структуры.
## Быстрый старт