первые наработки по рендеру
This commit is contained in:
@@ -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-совместимые структуры.
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
|
||||
Reference in New Issue
Block a user