• Nikitos's avatar
    Мипмапы текстур: engine.loadTexture(path, { mipmaps: true })
    · 8813d966
    Nikitos создал
    §12.4 «фильтрация/мипмапы»: фильтрация была (nearest/linear), мипмапов не было
    вовсе. Без них УМЕНЬШЕННЫЙ спрайт мерцает — сэмплер берёт одну точку из большой
    картинки.
    
    ЧТО СДЕЛАНО:
    * render.c: r2d__mip_levels (полная пирамида, предел SDL 16), создание текстуры
      с нужным числом уровней, r2d_texture_load_mipped;
    * в r2d__upload_pixels после копирования — SDL_GenerateMipmapsForGPUTexture;
    * engine.loadTexture(path, { mipmaps: true });
    * $.resource: поле `mipmaps: true` в описании текстуры.
    
    ДВЕ ОШИБКИ SDL, которые поймал тест (обе — ассерты; в сборке с отключёнными
    ассертами это были бы молча чёрные текстуры, а не отказ):
    1. «Cannot generate mipmaps for texture with num_levels <= 1» — я добавил
       параметр уровней, но замена `num_levels = 1` попала не в ту функцию
       (в файле две почти одинаковые функции создания текстуры), и уровень остался
       один;
    2. «must be created with SAMPLER and COLOR_TARGET usage flags» — SDL строит
       уровни, РИСУЯ их, поэтому мипмап-текстуре нужен COLOR_TARGET
       (`levels > 1` добавляет флаг; одноуровневым он не нужен).
    
    УРОК ПРО МОИ ЖЕ ЗАМЕНЫ: `python replace` без проверки результата дважды сработал
    не туда — сначала в create_texture_usage, потом молча ничего. Теперь после
    каждой замены проверяю, что она нашлась.
    
    ПРОВЕРКА (tests/agent/highlevel_mipmap_test.py, 9 проверок): текстура с
    мипмапами получает валидный id; кэш по пути возвращает тот же слот; спрайт
    рисуется в натуральную величину и УМЕНЬШЕННЫМ (1929 точек против 40153 — то
    есть уменьшение реально); $.resource грузит текстуру с mipmaps: true;
    textureFromPixels не затронут.
    
    ЧЕСТНОЕ ОГРАНИЧЕНИЕ (записано в API.md): кэш идёт по ПУТИ, поэтому если текстура
    уже загружена без мипмапов, запрос с mipmaps: true вернёт ту же — опции не
    переприменяются. Загружайте с мипмапами сразу.
    
    ДОКИ: API.md (опция, зачем, ограничение кэша), resource.md (поле mipmaps),
    TASKS §12.4. Осталось из §12.4: Curve/Gradient как ресурсы ($.curve умеет
    кривые и градиенты, но видов в $.resource нет).
    
    Полный qjs, агентские тесты, doc_coverage, doc_claims, duplicate_keys, быстрый
    набор — зелёные.
    8813d966