aboutsummaryrefslogtreecommitdiff
path: root/docs/specs/textures.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/specs/textures.md')
-rw-r--r--docs/specs/textures.md90
1 files changed, 90 insertions, 0 deletions
diff --git a/docs/specs/textures.md b/docs/specs/textures.md
new file mode 100644
index 0000000..72e1462
--- /dev/null
+++ b/docs/specs/textures.md
@@ -0,0 +1,90 @@
+# Текстуры и материалы
+
+На текущем этапе в дизассемблированных библиотеках **не найден полный декодер формата текстурного файла** (нет явных парсеров DDS/TGA/BMP и т.п.). Поэтому документ пока фиксирует:
+
+- что можно достоверно вывести по рендер‑конфигу,
+- что видно по структурам модели (materialIndex),
+- какие места требуют дальнейшего анализа.
+
+---
+
+## 1) Материал в модели
+
+В batch table модели (см. документацию по MSH/AniMesh) есть поле, очень похожее на:
+
+- `materialIndex: u16` (batch + 2)
+
+Это индекс, по которому рендерер выбирает:
+
+- текстуру(ы),
+- параметры (blend, alpha test, двухтекстурность и т.п.),
+- “шейдер/пайплайн” (в терминах оригинального рендера — набор state’ов).
+
+**Где лежит таблица материалов** (внутри модели или глобально) — требует подтверждения:
+
+- вероятный кандидат — отдельный ресурс/таблица, на которую `materialIndex` ссылается.
+- строковая таблица `Res10` может хранить имена материалов/текстур, но маппинг не доказан.
+
+---
+
+## 2) Переключатели рендера, влияющие на текстуры (из Ngi32.dll)
+
+В `Ngi32.dll` есть набор runtime‑настроек (похоже, читаются из системных настроек/INI/registry), которые сильно влияют на текстурный пайплайн:
+
+- `DisableMipmap`
+- `DisableBilinear`
+- `DisableTrilinear`
+- `DisableMultiTexturing`
+- `Disable32bitTextures` / `Force16bitTextures`
+- `ForceSoftware`
+- `ForceNoFiltering`
+- `ForceHWTnL`
+- `ForceNoHWTnL`
+
+Практический вывод для порта:
+
+- движок может работать **без мипмапов**, **без фильтрации**, и даже **без multitexturing**.
+
+---
+
+## 3) “Две текстуры” и дополнительные UV‑потоки
+
+В загрузчике модели присутствуют дополнительные per‑vertex ресурсы:
+
+- Res15 (stride 8) — кандидат на UV1 (lightmap/second layer)
+- Res16 (stride 8, split в 2×4) — кандидат на tangent/bitangent (normal mapping)
+- Res18 (stride 4) — кандидат на vertex color / AO
+
+Если материал реально поддерживает:
+
+- вторую текстуру (detail map, lightmap),
+- нормалмапы,
+
+то где‑то должен быть код:
+
+- который выбирает эти потоки как входные атрибуты вершинного шейдера/пайплайна,
+- который активирует multi‑texturing.
+
+Сейчас в найденных фрагментах это ещё **не подтверждено**, но структура данных “просится” именно туда.
+
+---
+
+## 4) Что нужно найти дальше (чтобы написать полноценную спецификацию материалов/текстур)
+
+1. Место, где `materialIndex` разворачивается в набор render states:
+ - alpha blending / alpha test
+ - z‑write/z‑test
+ - culling
+ - 1‑pass vs 2‑pass (multi‑texturing)
+2. Формат записи “material record”:
+ - какие поля
+ - ссылки на текстуры (ID, имя, индекс в таблице)
+3. Формат “texture asset”:
+ - где хранится (внутри NRes или отдельным файлом)
+ - компрессия/палитра/мip’ы
+4. Привязка строковой таблицы `Res10` к материалам:
+ - это имена материалов?
+ - это имена текстур?
+ - или это имена узлов/анимаций?
+
+До подтверждения этих пунктов разумнее держать документацию как “архитектурную карту”, а не как точный байтовый формат.