diff --git a/docs/texture_pipeline.md b/docs/texture_pipeline.md new file mode 100644 index 0000000..7528794 --- /dev/null +++ b/docs/texture_pipeline.md @@ -0,0 +1,105 @@ +# Текстурные программы (TexturePipelineProgram) + +Текстурная программа — это строка, описывающая источник текстуры и цепочку операций +над ней. Такие строки используются в `textures` моделей и компилируются +`TexturePipelineProgram`. + +## Общая форма +``` +[tex] [|> op(...)]* +``` +`tex` в начале необязателен. + +## Базовые выражения +- `name` или `"name.png"` — ссылка на текстуру из assets. Расширение .png/.jpg/.jpeg допустимо. +- `anim(...)` — анимация из спрайт-листа (см. ниже). +- `x <#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() ) +```