• Nikitos's avatar
    Импорт атласов из JSON: $.atlas (Aseprite, TexturePacker, свой формат)
    · 28b951c7
    Nikitos создал
    Пробел из docs/TASKS.md §1.6: лист резался только равномерной сеткой
    cols×rows×cw×ch, а художники отдают атласы с разными прямоугольниками и
    названиями анимаций.
    
    * parseAtlas()/normalizeFrame(): формат определяется по содержимому, а не по
      расширению. Aseprite (объект frames + meta.frameTags), TexturePacker/LibGDX
      (массив с filename), свой простой (карта имя → {x,y,w,h}); поддержаны
      w/h и width/height, плоский кадр и обёртка frame{};
    * теги Aseprite ссылаются на НОМЕРА кадров — собираются по порядку листа;
      direction: 'reverse' разворачивает список;
    * $.atlas.load читает JSON через $.fs или принимает data в памяти (ответ сети,
      тест), путь к картинке берётся из meta.image и считается от каталога JSON;
    * объект атласа: frame/frames/info/tag/tagSprites/tagInterval/tags/size —
      tagSprites() даёт готовый вход для $.anim.clip;
    * повёрнутые кадры пропускаются с записью в журнал, а не рисуются криво.
    
    Проверка: tests/js/atlas_test.mjs (7 проверок), полный набор qjs и агентских
    тестов зелёный.
    28b951c7