View Issue Details

IDProjectCategoryView StatusLast Update
0000890OpenIVopenFormatspublic2025-02-01 02:56
Reporterkirill_mapperAssigned To 
PriorityimmediateSeveritymajorReproducibilityalways
Status newResolutionopen 
Product Version4.1 
Target VersionFixed in Version 
Summary0000890: [Collisions][BUG] Некорректная генерация ссылок на соседние полигоны (Siblings) при конвертации коллизионных объектов в OpenIV
DescriptionОписание проблемы:
OpenIV генерирует некорректные ссылки на соседние полигоны (Siblings) для коллизионных объектов при конвертации из openformat (obn, odr) в игровой формат (ybn, ydr), даже с включенным параметром ComputePolyNeighbors True. Это приводит к необходимости вручную исправлять ссылки. В противном случае, неправильные ссылки могут периодически вызывать краши игры.

Воспроизведение:
    Экспортировать модель с коллизионными объектами в openformat, оставив ссылки Siblings пустыми (-1 -1 -1) с включенным параметром ComputePolyNeighbors True.
    Или экспортировать с выключенным параметром, но с правильно заданными ссылками.
    Импортировать файл в OpenIV и проверить, что ссылки на соседние полигоны остаются некорректными.

Результат:
Ссылки Siblings неправильно вычисляются или не сохраняются корректно в конвертированном файле, несмотря на активацию параметра ComputePolyNeighbors True.
Ожидаемый результат:
OpenIV должен правильно вычислять и генерировать ссылки на соседние полигоны для коллизионных объектов.

Решение:
    Метод public void UpdateEdgeIndices() из CodeWalker должен быть использован для корректировки ссылок на соседние полигоны. Этот метод пересчитывает соседей и восстанавливает правильные ссылки. https://github.com/dexyfex/CodeWalker/blob/c45ea837330864c03ca5f355fd38affab85e46c5/CodeWalker.Core/GameFiles/Resources/Bounds.cs#L2160-L2271
    Проблемы с соседями полигонов:
        Если грань (e1, e2, e3) полигона ссылается на несуществующий соседний полигон (индекс больше числа полигонов), это считается ошибкой. Код пересчитывает соседей для всех полигонов, чтобы восстановить правильные ссылки.
    Неверные ссылки на вершины:
        Если грань полигона (через соседний полигон) указывает на несуществующую вершину (индекс больше числа вершин), это тоже считается ошибкой и исправляется.
    Пересчёт соседей:
        Границы (edges) полигонов пересчитываются с использованием уникальных идентификаторов (на основе индексов вершин).
        Словарь (edgeMapping) связывает грани с их полигонами, чтобы правильно определить, какие полигоны являются соседями через эти грани.
        Соседние полигоны обновляются для каждого типа 0 (валидного полигона).
    Итог: Код гарантирует, что каждая грань полигона правильно ссылается на соседний полигон (или -1, если сосед отсутствует), а также исправляет проблемы с вершинами, чтобы коллизионная геометрия не сбоила. Это важно для корректной работы коллизии без крашей.

    Валидация ссылок может быть выполнена с использованием кода из ResourceChecks.cpp. https://github.com/citizenfx/fivem/blob/eb1e6d85586aea7796510e5f663745c38050de91/code/components/gta-streaming-five/src/ResourceChecks.cpp#L139-L309

    Специальная утилита Ymap-Ybn Mover может быть использована для исправления и корректировки ссылок в .ybn, .ydr, .yft файлах. Подробнее на GitHub репозитории. https://github.com/92-Smallo/Ymap-Ybn-Mover/tree/master

    Обсуждение проблемы можно найти на форуме How to fixing invalid poly edge references https://forum.cfx.re/t/how-to-fixing-invalid-poly-edge-references/2158569 и на GitHub Issue #2799. https://github.com/citizenfx/fivem/issues/2799?ysclid=m6lb7j0pbb486229925
Tagsbug, Collision, major, openFormats, PolyEdge
GameGrand Theft Auto V

Activities

There are no notes attached to this issue.

Issue History

Date Modified Username Field Change
2025-02-01 02:52 kirill_mapper New Issue
2025-02-01 02:56 kirill_mapper Tag Attached: Collision
2025-02-01 02:56 kirill_mapper Tag Attached: PolyEdge
2025-02-01 02:56 kirill_mapper Tag Attached: major
2025-02-01 02:56 kirill_mapper Tag Attached: bug
2025-02-01 02:56 kirill_mapper Tag Attached: openFormats