Документация
Docs/ru/reference/model-format/validation.md
Валидация формата моделей
Сгенерированный справочник. Не редактируйте напрямую. Обновите
BuildTools/ModelFormatInterface.json, затем запуститеpython BuildTools/docs_model_format.py --write.
| Индекс | Синтаксис | Токены | Композиция | Ресурсы | Анимация | Валидация | Каноническая JSON-модель | Руководство |
Правила контракта
| Стабильный ID | Правило | Требование | Причина | Source |
|---|---|---|---|---|
model-format.rule.lexical-syntax |
Разделение по whitespace | Directives и arguments разделяются whitespace; # и ; начинают comments; quoting/escaping для paths с spaces отсутствуют. | Parser удаляет comments и извлекает tokens строки через istringstream. | Source/Tools/ModelInfoBaker.cpp |
model-format.rule.multiple-directives |
Последовательный разбор | Строка может содержать несколько directives; каждая забирает точное число arguments, затем разбор продолжается. | Компактные entries допустимы, но order меняет current link или mesh selector последующих modifiers. | Source/Tools/ModelInfoBaker.cpp |
model-format.rule.selector-order |
Порядок selectors | После Layer или Value задайте Root, Attach либо AttachParticles до transforms, materials, disables или cuts. | Layer и Value выбирают dummy link и очищают Mesh; ранние modifiers отбрасываются. | Source/Tools/ModelInfoBaker.cpp |
model-format.rule.template-files |
Имена templates | Basename include-only files начинается с TEMPLATE_; concrete files не используют этот prefix. | Templates участвуют в timestamps/parsing, но не выдаются как отдельные resources или metadata sections. | Source/Tools/ModelInfoBaker.cpp |
model-format.rule.include-replacements |
Scope replacements | Arguments Include являются pairs name/value и заменяют каждое буквальное %name% до tokenization. | Простая текстовая замена не понимает token boundaries; placeholders не должны случайно совпадать. | Source/Tools/ModelInfoBaker.cpp |
model-format.rule.relative-paths |
Владение paths | Model, Include, Attach, Cut разрешаются относительно declaring .fo3d; animation files — относительно concrete description, кроме ModelFile; particles/effects глобальны. | Перемещение template или description может изменить contributed asset paths. | Source/Tools/ModelInfoBaker.cpp |
model-format.rule.zero-identity |
Ноль — transform identity | Нулевые transform и Speed не дают вклада. Варианты +/* инициализируют нулевое поле operand до дальнейших операций. | Runtime SetAnimData пропускает нули, а parser accumulation поддерживает самостоятельные template Scale/Speed. | Source/Tools/ModelInfoBaker.cpp, Source/Client/ModelInstance.cpp |
model-format.rule.layer-zero |
Нулевой layer value неактивен | Runtime value 0 не выбирает link; authored Root и Attach требуют ненулевого Value. | Composition loop пропускает ноль, baker запрещает links с нулём. | Source/Tools/ModelInfoBaker.cpp, Source/Client/ModelInstance.cpp |
model-format.rule.parent-materials |
Наследование parent material | Используйте Parent или Parent_<mesh> только в attached child; parent mesh должен уже предоставлять нужный texture slot/effect. | Child копирует current material state родителя, не imported default; у root description нет parent context. | Source/Tools/ModelInfoBaker.cpp, Source/Client/ModelInstance.cpp |
model-format.rule.mesh-before-info |
Порядок baker | Запускайте ModelMeshBaker до ModelInfoBaker, чтобы проверить meshes, hierarchy, materials, animations и cuts из baked data. | Built-in orders: 4 для ModelMesh и 6 для ModelInfo. | Source/Tools/ModelMeshBaker.h, Source/Tools/ModelInfoBaker.h |
model-format.rule.first-animation-wins |
Побеждает первая animation mapping | Не объявляйте одну state/action Anim pair повторно; только первая mapping проверяется и регистрируется. | Дубликаты пропускаются model-info validation и client registration. | Source/Tools/ModelInfoBaker.cpp, Source/Client/ModelInformation.cpp |
model-format.rule.runtime-composition |
Смена layers перестраивает composition | Считайте model-layer arrays состоянием композиции: значение может создать/удалить children и particles, изменить materials/effects, geometry, cuts и combined meshes. | Layer change не является косметическим integer update: он меняет render graph и batching state. | Source/Client/ModelInstance.cpp |
model-format.rule.baked-link-bounds |
Запечённые bounds geometry link | Каждый non-particle child link содержит проверенный aggregate root-space AABB и per-animation AABB mapped clips parent; default и particle links не содержат geometry payload. | Runtime framing выбирает bounds direct child для active parent clips и при их отсутствии использует aggregate link envelope вместо обхода и skinning combined-mesh vertices. | Source/Tools/ModelInfoBaker.cpp, Source/Client/ModelInformation.cpp, Source/Client/ModelInstance.cpp |
model-format.rule.source-units-and-mirroring |
Положительный scale и world units Engine | До export заморозьте mirrored mesh nodes к положительному transform и держите direct FBX/OBJ attachments в диапазоне Baking.ModelAttachmentMinExtent .. Baking.ModelAttachmentMaxExtent. Если нужен явный description-level scale, используйте child .fo3d. | Отрицательные transforms инвертируют winding и normals, а чужой масштаб units создаёт невозможные model-sprite frames. Отказ bake оставляет оба дефекта у authored source. | Source/Tools/ModelMeshBaker.cpp, Source/Tools/ModelInfoBaker.cpp |
model-format.rule.validation-boundary |
Bake и видимая проверка | Требуйте clean resource bake для syntax/asset closure, затем проверяйте scale, pose, composition, attachments, materials, cuts и interaction bounds в visible client scene. | Baking доказывает references и serialized structure; composed visual result доказывает только client renderer. | Source/Tests/Test_ModelBaker.cpp |
Удалённые legacy-написания
| Удалённый token | Замена | Текущий контракт |
|---|---|---|
AnimEqual |
StateAnimEqual or ActionAnimEqual |
Текущий parser требует явно указать enum domain. |
CalculateTangentSpace |
none |
Mesh import настраивает ufbx для generation/normalization отсутствующих normals и tangents; directive .fo3d нет. |
RenderFrame |
none |
Текущие model descriptions не создают 2D render frames. |
RenderFrames |
none |
Текущие model descriptions не создают sequences 2D render frames. |
DrawSize |
automatic model-sprite layout from baked animation bounds |
ModelInfo записывает aggregate/per-animation bounds; client вычисляет offscreen frame активной composition и pose. |
ViewSize |
automatic view/name layout from baked idle-priority bounds |
Client проецирует baked model bounds и active child layers вместо authored interaction rectangle. |
Compatibility spelling Subset отдельно помечен как deprecated в токенах: он забирает argument, но не выбирает mesh.
Команды проверки
python BuildTools\docs_model_format.py --check
python -m unittest BuildTools.tests.test_docs_model_format
.\Binaries\Tests-Windows-win64\LF_UnitTests.exe "ModelBaker*"
cmake --build Build\Auto --config RelWithDebInfo --target BakeResources
Завершите видимой client scene, которая покрывает все используемые проектом сочетания слоёв, attachments, material overrides, cuts, animations, draw size и interaction bounds.