• Nikitos's avatar
    Текстурированный меш: UV и id текстуры в engine.submitMesh
    · f0fb28e7
    Nikitos создал
    Первый пункт §4.1 («текстурированные треугольники и меш»). Раньше `r2d_batch_mesh`
    всегда биндил БЕЛУЮ текстуру, и `u`/`v` были мертвы — текстурированный псевдо-3D
    был невозможен. Теперь:
    
    * `R2DTriBatch` помнит `texture` — id текстуры пакета;
    * `engine.submitMesh(vertices, count?, texture?)`: третий аргумент — id из
      `engine.loadTexture` / `engine.textureFromPixels` / `$.atlas`; без него белая
      текстура, как раньше;
    * `r2d_render_draw_mesh` биндит текстуру пакета, а не жёстко белую.
    
    ПРОВЕРЕНО ПО ПИКСЕЛЯМ (tests/agent/highlevel_mesh_test.py): текстура 2x1
    «красный | зелёный», u=0 слева → красная половина 100..199, u=1 справа → зелёная
    200..299. Плюс прежние проверки: меш ровно по вершинам, z-буфер отсекает дальний
    треугольник независимо от порядка, 100 треугольников без падения.
    
    ЗАОДНО ИСПРАВЛЕНА ЛОЖЬ В ДОКЕ: `r`/`g`/`b` у вершин — 0..255 (как у drawRect),
    а не 0..1. `r2d__color_f32` клампит в 255, поэтому игрок, следующий доке,
    получал почти чёрный меш — я сам на этом обжёгся при первом замере. Поправлено
    в комментарии script.c, в API.md (там же появился пример с текстурой) и в
    depth.md.
    
    ТЕСТ ПЕРЕПИСАН на ОДИН обработчик `$.update`: он накапливает функции, и каждый
    новый кадр рисовал бы все меши сразу — более поздний перекрывал предыдущий, и
    проверки UV «падали» из-за моего же теста. Второй аргумент `undefined` движок
    читает как count=0, поэтому count считается в JS явно.
    
    ОСТАЛОСЬ ИЗ §4.1: `$.mesh` (вершины с UV, веса на 1-2 кости, скелет-дерево,
    CPU-деформация без аллокаций) и извлечение тегов/пивотов/костей из Aseprite JSON
    (сам импорт атласов уже есть в `$.atlas`). §4.2 (stencil) тоже не сделан —
    depth-stencil формат сейчас только depth.
    
    Полный qjs, агентские тесты, doc_coverage, doc_claims, быстрый набор — зелёные.
    f0fb28e7