Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
22 - Telegram Web
Telegram Web
Channel created
Всем привет!
В этом канале я буду постить разное о разработке на языке Rust.

Сам я не настоящий сварщик. У меня всего лишь один коммит в std.
Но я пишу на Rust c дорелизных времен и иногда немного преподаю его студентам.
А когда-то и писал на Rust за деньги в настоящий продакшн.

Сейчас у меня есть несколько пет проектов, о которых в основном и буду тут писать.
🤔2
Первый проект, о котором хотел бы рассказать это egui-snarl.
Я большой фанат egui как UI фреймворка для разработчика.
Может он и не самый красивый и местами делает слишком много работы, но на нем чертовски удобно писать UI, чего не скажешь о всех остальных UI фреймворках, что я пробовал, не только растовых.

egui-snarl это библиотека для создания визуальных нод-графов.
Тех самых нод графах что вы могли видеть в блендерах
Гудинях
Анрилах
egui-snarl позволяет создать нод-граф для любых целей.
У него вообще нет предположений о том что ноды и связи значат.
Ноды тоже, это просто данные.

Для начала я собрал вот такой простенький пример.
В отличии от существующих нод-граф крейтов у egui-snarl используется концепт вьюера.
Это он решает какие у ноды пины, сколько их, как выглядят, что рисуется рядом с ними.
egui-snarl предоставляет контейнер для графа Snarl и трейт для вьюера SnarlViewer.
При отрисовке Snarl::show регулярно обращается к SnarlViewer что бы отрисовать шапку ноды, узнать сколько сейчас пинов у ноды, отрисовать контент у пина, узнать как выглядит сам пин, а так же с событиями, что бы вьюер сам решил что делать, соединять ли ноды, а может между ними вставить еще одну для преобразования типа, удалять ли связь или ноду.
Граф на картинке выше имеет очень простое определение типа ноды.
Это такой вот энум

enum DemoNode {
/// Node with single input.
/// Displays the value of the input.
Sink,

/// Value node with a single output.
/// The value is editable in UI.
Integer(i32),

/// Value node with a single output.
String(String),

/// Value node with a single output.
///
/// It has two inputs, ediable if not connected.
Add(Vec<i32>),

/// Converts URI to Image
Show(String),
}


И уже вьюер сам знает что у Sink есть 1 вход и 0 выходов, а у Add входов сколько значений + 1, а выход 1
Так же вьюер решает, что Sink показывает у своего входа.
Когда Sink подключен к выходу от Integer или Add, то вьюер сделает ui.label() с числовым значением, от String со строковым значением, а от Show загрузит картинку, хотя в типе там тоже строка лежит.

Конечно при большем количестве вариантов надо заводить нормальные типы передаваемых данных, а не хэндлить каждый тип ноды отдельно, но в примере так нагляднее пока что.
Связи вообще и необязательно передают какие-то данные.
Я собираюсь использовать нод-графы в двух местах сейчас.

1. Для организации зависимостей между системами для ЕЦС. Snarl с системами будет передан в скедулер.
Планирую дать возможность менять порядок систем прямо в рантайме, когда симуляция игры запущена в эдиторе.
2. Для визуализации рендерграфа. Как-то модифицировать граф будет нельзя, только двигать ноды по плоскости.
Сейчас вот подумал, что для рендерграфа можно при выборе пина показывать содержимое. Даже для буферов, если будет описание структуры данных там
Сообщение для комментов
То ли копилот знает алгоритм де Кастельжо, то ли просто угадал
Вообще у людей разное отношение к копилоту и подобным ИИ для порграммистов.

Для меня это просто code completer 80го уровня.
Я никогда не прошу его реализовать функцию, я начинаю писать, а он предлагает. И часто угадывает.

Хотя функции на пару строк может и целиком угадать просто исходя из аргументов и возвращаемого типа.
This media is not supported in your browser
VIEW IN TELEGRAM
Оказывается находить кривую рядом с курсором очень даже просто.
Почти как рисовать. Сэмплишь многоточек и находишь расстояние до них.
Но для перфа сделал еще иерархичные баундин боксы до достаточно короткой секции
3
2025/07/09 15:46:53
Back to Top
HTML Embed Code: