У некоторых моделей в некоторых анимациях оказались вывернутые во внутрь нормали.
GPT в xhight режиме сначала гайзлайтил меня что все нормально. Потом газлайтил что все пофиксил (нет). Потом отдельный gpt ревьюфил фикс первого и тоже ничего не добился (так я проверил теорию про то что качество модели может фликерить и один и тот же промпт может то выстрелить то нет)
Итого GPT в hight-x не смог решить проблему даже в паре с двух попыток суммарно за 60+ минут.
Fable xhight разобрался за 22 минуты (скушав правда ~20% недельного лимита на фейбл)
1. Исходные данные (AT_Conyard_HC.XBF, из него собирается состояние Build): у clonetread01/clonetread02 трансформ и все 576 кадров анимации имеют det < 0 (диапазон [-0.032, -0.012]) — это зеркальные копии («clone» — клон MCV на стройплощадке). Конвертер корректно выносит отражение в узел MirroredContent — с этим всё в порядке.
2. Ключевой факт: у обоих тредов все 13 нормалей вершин направлены внутрь геометрии в локальном пространстве (проверено численно против направления «центроид → треугольник»), и winding треугольников согласован с этими внутренними нормалями. То есть меш авторски пред-скомпенсирован под вечное зеркало: в мире исходной игры отражение выворачивало геометрию обратно «наружу».
3. Почему оригинал это скрывал: оригинальный движок (и CorrinoEngine — в его Engine нет ни одного GL.Enable(CullFace), нормали идут из файла как есть) рендерит без backface culling. Вывернутый меш под зеркалом выглядел цельным, а неправильное освещение (нормали и в мире остаются внутренними — отражение не меняет «внутрь/наружу») в 2001-м никто не заметил.
4. Почему Godot ломает: Godot 4 автоматически переворачивает cull mode для инстансов с отрицательным детерминантом глобального трансформа (renderer_geometry_instance.cpp:69: mirror = determinant < 0; переворот в rasterizer_scene_gles3.cpp — проверено в исходниках 4.7-stable). Для правильно авторенных зеркальных мешей это чинит картинку, а для пред-скомпенсированных (треды) — выворачивает её. Подтверждено рендер-диагностикой: FRONT_FACING-шейдер показывает у треда наружные грани «front» (в отличие от эталонного cloneBox02), т.е. winding в мире у него противоположен всем остальным мешам.
5. Доказательство фиксом: реверс порядка вершин треугольников + инверсия нормалей у двух мешей тредов в рантайме полностью чинит рендер — треды становятся цельными, с правильными боковинами гусениц и корректным освещением (скриншоты «до/после» снимал через хостовый Godot 4.7).
* CullFace - это оптимизация которая автоматически скипает в рендере и обсчетах стороны полигонов которые игрок не может увидеть в игре. Это очень базовый прием оптимизации 3д графики кратно снижающий нагрузку (плюс минус в двое).
Т.е. не сдохни вествуд сразу после поспешного релиза они могли выпустить патч улучшаяющий перф игры в двое =)