# Готовые VFX-элементы и папка выдачи

## Стоки — это библиотеки съёмки, а не элементов

Проверено измерением. По запросам «arrow overlay», «glitch overlay black
background», «light leak overlay» Pexels и Pixabay отдают обычные видео: ночную
улицу, боке фонарей, человека на фоне города. Из восьми скачанных «оверлеев»
настоящими элементами оказались **два**.

```bash
python scripts/render_element_overlay.py in out --plan p --inspect папка/
```

```
pexels_29817387.mp4   unknown  фон не чёрный, не зелёный и без альфы — обычная съёмка
pexels_9667672.mp4    black    рамка кадра чёрная и ровная — режим screen
pexels_9667674.mp4    black    рамка кадра чёрная и ровная — режим screen
```

Настоящие элементы — указатели, глитч-рамки, вспышки, дым, частицы — лежат на
профильных VFX-сайтах, и API у них нет: файл скачивается руками.

| Где | Что там | Как отдают |
|---|---|---|
| MyCreativeFX | самая большая бесплатная библиотека: огонь, дым, вспышки, глитч-переходы | чёрный фон или ProRes 4444 / WebM с альфой |
| FX Elements | 100+ бесплатных, остальное платно | часто с альфой |
| ProductionCrate | техничные VFX, много указателей и HUD | альфа |
| FreeVisuals | грин-скрин пачками под CapCut/Premiere | зелёный фон |
| Mixkit, Pixabay | немного оверлеев среди обычной съёмки | чёрный фон |

## Скачал — просто клади в папку

`render_element_overlay.py` не ищет. Он делает так, чтобы **любой** скачанный
элемент работал без ручной возни: определяет, как он сделан, и накладывает
правильно.

| Как сделан | Как определяется | Как накладывается |
|---|---|---|
| **чёрный фон** | рамка кадра тёмная и ровная | `blend=screen` |
| **зелёный фон** | рамка кадра зелёная | `chromakey` по **измеренному** цвету |
| **альфа** | `pix_fmt` содержит `yuva`/`rgba` | обычный `overlay` |
| **обычная съёмка** | ничего из перечисленного | отказ с объяснением |

Три вещи, которые здесь важны:

- **Судить по рамке кадра, а не по среднему.** Эффект живёт в середине, фон — по
  краям. Среднее по кадру смешивает одно с другим и даёт серое ни о чём.
- **Хромакей по измеренному цвету, а не по константе `0x00FF00`.** Оттенок
  зелёного гуляет от сайта к сайту, и захардкоженный ключ оставляет кайму на
  половине паков. После ключа обязателен despill, иначе зелёный ободок виден
  именно на светлом фоне, куда элемент обычно и кладут.
- **Чёрный фон — это `screen`, а не хромакей.** Screen оставляет максимум из двух
  пикселей, поэтому чёрное исчезает само. Хромакей по чёрному вырезал бы ещё и
  тёмные части самого эффекта.

## Папка выдачи

```bash
python scripts/deliver.py --project PROJECT --name имя_ролика \
  --note "что изменилось в этой версии"
```

Рабочая папка к концу монтажа держит полтора десятка промежуточных MP4 по сто с
лишним мегабайт: `base`, `with_open`, `punched`, `graded`, `with_fx`,
`captioned`, `with_gfx`, `with_broll`, `with_music`. Они нужны — по ним
возобновляется прогон и ищется, где что испортилось. Но найти среди них готовый
файл невозможно, а через неделю не вспомнить, чем `with_gfx2` отличался от
`with_gfx`.

```
deliveries/<имя>/
    имя_v1_20260731.mp4              ← ролик
    имя_v1_20260731.preview.jpg      ← восемь кадров: понятно без плеера
    имя_v1_20260731.captions.ass/.srt
    имя_v1_20260731.timeline_full.json
    имя_v1_20260731.<все планы>.json
    имя_v1_20260731.reports/         ← ворота, контрольные кадры, провенанс
    README.md                        ← история всех версий папки
```

Номер версии не выдумывается: берётся следующий за уже лежащими. README
дописывается, а не перезаписывается — папка и есть история версий, с длительностью,
громкостью и строкой «что изменилось» по каждой.

**Ролик, не прошедший ворота, не выдаётся.** На это есть `--force`, и тогда
README честно пишет, что файл выдан с проваленной проверкой. Это защита ровно от
того «вроде готово», ради которого написана вторая аксиома скилла.
