- Rust 56%
- WGSL 37.5%
- Python 4.3%
- Just 2.2%
| .cargo | ||
| .claude | ||
| .forgejo/workflows | ||
| assets | ||
| docs | ||
| LICENSES | ||
| src | ||
| .editorconfig | ||
| .gitignore | ||
| .sync.yml | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CLAUDE.md | ||
| clippy.toml | ||
| CODEOWNERS | ||
| CONVENTIONS.md | ||
| deny.toml | ||
| justfile | ||
| LICENSE | ||
| NOTICE | ||
| README.md | ||
| REUSE.toml | ||
| rust-toolchain.toml | ||
🔮 shikos-glass-scratch
Стенд, на котором «жидкое стекло» ShikOS доказывало, что оно вообще возможно.
Один WGSL-шейдер, девять живых ручек, полный гейт качества.
Зачем этот репозиторий
Стенд отвечает на один вопрос: тянет ли iced кастомный wgpu-пайплайн, на котором держится материал стекла ShikOS. Пока ответа нет, вкладываться в боевой крейт бессмысленно — поэтому техника сначала доказывается здесь, на минимальном приложении, и только потом переезжает в shikos-iced-liquid-glass.
Это не библиотека. publish = false, API никому не обещан, ломать его можно свободно. Ценность репозитория — в том, что он показывает работающий шейдер и дисциплину, с которой он писался.
Что он рисует
Скруглённый прямоугольник стекла над тестовым фоном. Форма задана SDF, фон под ней преломляется, по краю идёт кант с бликом. Девять ручек в интерфейсе меняют материал вживую — каждая двигает картинку, а не значение в структуре.
| Ручка | Диапазон | Что делает |
|---|---|---|
radius |
0 … 64 px | скругление углов |
blur |
0 … 40 px | размягчение преломлённого фона |
refraction |
0 … 1 | сила изгиба фона у края |
edge_width |
0 … 8 px | ширина канта |
thickness |
0 … 40 px | глубина: как быстро затухает преломление |
edge_highlight |
0 … 1 | яркость канта |
specular |
0 … 1 | сила блика |
light_angle |
−π … π | направление света |
dispersion |
0 … 10 | расщепление RGB на преломлении |
Как устроен кадр
flowchart LR
UI["Слайдеры iced<br/>девять f32"] --> UNI["Uniform-структура<br/>bytemuck, выровненная упаковка"]
UNI --> WGSL
subgraph WGSL ["src/glass.wgsl"]
SDF["SDF скруглённого<br/>прямоугольника"]
REF["Смещение выборки<br/>по градиенту SDF"]
BLUR["Многотаповое<br/>размытие фона"]
RIM["Кант, блик,<br/>дисперсия RGB"]
end
BG[("assets/backdrop.png<br/>фон под стеклом")] --> REF
SDF --> REF --> BLUR --> RIM --> OUT["Кадр в окне iced"]
Ключевое отличие от привычного «блюра под панелью»: фон не размывается на месте, а пересемплируется со смещением по градиенту SDF — то есть действительно преломляется у края, а не просто теряет резкость.
Стек
| Язык | Rust, edition 2024, #![forbid(unsafe_code)] |
| UI | iced 0.14 с бэкендом wgpu, виджет shader |
| Шейдер | WGSL, src/glass.wgsl |
| Мост CPU → GPU | bytemuck |
| Фон | image (только PNG) |
| Логи | tracing + tracing-subscriber, уровень через RUST_LOG |
Запуск
just run # cargo run
just # список всех рецептов
Нужны Rust по rust-toolchain.toml, just и GPU с поддержкой wgpu.
Гейт качества
just ci — то же, что гоняет CI в .forgejo/workflows/ci.yml:
| Шаг | Что проверяет |
|---|---|
reuse lint |
у каждого файла есть SPDX-заголовок и лицензия |
cargo fmt --check |
форматирование |
cargo clippy |
-D warnings, плюс запрет unwrap, print_stdout, print_stderr, dbg! |
cargo nextest |
тесты, включая doc-тесты |
cargo doc |
RUSTDOCFLAGS=-D warnings — документация без предупреждений |
cargo deny |
лицензии и уязвимости зависимостей |
Формальный бюджет кадра (≤ 1 мс) меряется criterion-бенчами уже на миграции в боевой крейт — здесь проверка перформанса ручная: окно остаётся отзывчивым, пока тянешь слайдеры (docs/glass-pr1.md).
Правила репозитория
justfile, конфигурация CI и линтеров приезжают из shikos-template и локально не редактируются — синхронизация описана в .sync.yml. Соглашения по коду — в CONVENTIONS.md: без unwrap, логи только через tracing, ошибки через thiserror. Постановка задачи на текущий этап — docs/glass-pr1.md.
Лицензия
PolyForm Strict 1.0.0 — см. LICENSE. Репозиторий REUSE-совместим.
Открытый исходный код не даёт прав на использование: читать можно, использовать — нет.