# Текстурные программы (TexturePipelineProgram)

Текстурная программа — это строка, описывающая источник текстуры и цепочку операций
над ней. Такие строки используются в `textures` моделей и компилируются
`TexturePipelineProgram`.

## Общая форма
```
[tex] <base> [|> op(...)]*
```
`tex` в начале необязателен.

## Базовые выражения
- `name` или `"name.png"` — ссылка на текстуру из assets. Расширение .png/.jpg/.jpeg допустимо.
- `anim(...)` — анимация из спрайт-листа (см. ниже).
- `<w>x<h> <#RRGGBB|#RRGGBBAA>` — заливка цветом.

Примеры:
```
stone
tex "core:stone.png"
32x32 "#FF00FF"
```

## Аргументы операций
- Позиционные: `op(1, 2, "str")`
- Именованные: `op(w=16, h=16)`
- Значения: числа (uint32), строки в кавычках, либо идентификаторы.

Цвета задаются `#RRGGBB` или `#RRGGBBAA`.

## Операции пайплайна

Операции без аргументов можно писать без `()`: `brighten` и т.п.
В подвыражениях текстур (см. ниже) операции без аргументов нужно писать со скобками:
`brighten()`.

### Операции, принимающие текстуру
- `overlay(tex)` — наложение с альфой.
- `mask(tex)` — применение альфа-маски.
- `lowpart(percent, tex)` — смешивание нижней части (percent 1..100).

`tex` может быть:
- именем текстуры: `overlay("core:stone")`
- именованным аргументом: `overlay(tex="core:stone")`
- вложенной программой: `overlay( tex stone |> invert("rgb") )`

### Геометрия и альфа
- `resize(w, h)` — ресайз до размеров.
- `transform(t)` — трансформация (значение 0..7).
- `opacity(a)` — прозрачность 0..255.
- `remove_alpha` или `noalpha` — убрать альфа-канал.
- `make_alpha(color)` — сделать альфу по цвету (цвет в `#RRGGBB`).

### Цвет и яркость
- `invert(channels="rgb")` — инверсия каналов (`r`, `g`, `b`, `a`).
- `brighten()` — лёгкое осветление.
- `contrast(value, brightness)` — контраст и яркость (-127..127).
- `multiply(color)` — умножение на цвет.
- `screen(color)` — экранный режим.
- `colorize(color, ratio=255)` — тонирование цветом.

### Анимация
`anim` можно использовать в базе (с указанием текстуры) или в пайплайне
над текущим изображением.

База:
```
anim(tex, frame_w, frame_h, frames, fps, smooth, axis)
```

Пайплайн:
```
... |> anim(frame_w, frame_h, frames, fps, smooth, axis)
```

Именованные аргументы:
- `tex` — имя текстуры (только для базового `anim`).
- `frame_w` или `w`
- `frame_h` или `h`
- `frames` или `count`
- `fps`
- `smooth` (0/1)
- `axis` — режим нарезки:
  - `g` или пусто: по сетке (слева направо, сверху вниз)
  - `x`/`h`: по горизонтали
  - `y`/`v`: по вертикали

Если `frames` не задан, количество кадров вычисляется автоматически:
- сетка: `(sheet.W / frame_w) * (sheet.H / frame_h)`
- ось X/Y: `sheet.W / frame_w` или `sheet.H / frame_h`

Примеры:
```
anim("core:sheet", 16, 16, fps=8)         # сетка по умолчанию
anim("core:sheet", 16, 16, axis="x")      # по горизонтали
stone |> anim(16, 16, fps=10, smooth=1)   # анимировать текущую текстуру
```

## Вложенные текстурные выражения
Некоторые операции принимают текстуру в аргументах. Чтобы передать не только имя,
но и полноценную программу, используйте префикс `tex`:
```
overlay( tex "core:stone" |> resize(16,16) |> brighten() )
```
