Та же программа на ash + winit + egui: орбитальная камера, три плоскости сетки, загрузка .obj, три режима отображения, единый проход динамического рендеринга с глубинным вложением и submit через synchronization2. Шейдеры общие с C++-версией — build.rs компилирует их из shaders/ и вшивает SPIR-V в бинарь. Пять крейтов повторяют карту целей CMake, но инвариант «весь Vulkan в одном месте» теперь проверяет компилятор: у simv-mesh и simv-editor нет ash в зависимостях. Расхождения, вынужденные языком, а не вкусом: * App переехал в исполняемый крейт — в C++ граф целей цикличен (core владеет vk, vk принимает core::Window&), и держится это лишь на том, что simv_vk видит заголовки core, не линкуя цель; Cargo такой цикл отвергает; * состояние сцены возвращается из замыкания интерфейса, а не ставится сеттерами: замыкание вызывается из метода рендерера, трогать рендерер оттуда нельзя; * выгрузка меша на видеокарту уехала из середины записи кадра, где C++-версия зовёт vkDeviceWaitIdle уже после захвата образа цепочки показа. Vulkan-контекст и цепочка показа написаны руками: замены vk-bootstrap в экосистеме Rust нет. Обёртки Buffer и Image, лежащие в C++-версии без применения, здесь задействованы всеми потребителями. 13 тестов, из них три перенесены из Catch2 дословно. cargo clippy -D warnings чист, слой валидации молчит. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
43 lines
1.8 KiB
TOML
43 lines
1.8 KiB
TOML
# Порт редактора SimVulcan на Rust. Пять крейтов повторяют карту целей CMake из
|
|
# корня репозитория (simv_core / simv_vk / simv_mesh / simv_editor + исполняемый файл),
|
|
# и это не косметика: главный инвариант проекта — «весь Vulkan живёт в одном месте» —
|
|
# здесь проверяется компилятором. У simv-mesh и simv-editor просто нет ash в
|
|
# зависимостях, так что нарушить границу нельзя даже случайно.
|
|
[workspace]
|
|
resolver = "2"
|
|
members = ["crates/*"]
|
|
|
|
[workspace.package]
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
rust-version = "1.82"
|
|
license = "MIT"
|
|
|
|
# Версии закреплены здесь, крейты ссылаются через `workspace = true`.
|
|
[workspace.dependencies]
|
|
simv-core = { path = "crates/simv-core" }
|
|
simv-mesh = { path = "crates/simv-mesh" }
|
|
simv-vk = { path = "crates/simv-vk" }
|
|
simv-editor = { path = "crates/simv-editor" }
|
|
|
|
ash = "0.38"
|
|
ash-window = "0.13"
|
|
raw-window-handle = "0.6"
|
|
winit = "0.30"
|
|
gpu-allocator = { version = "0.28", default-features = false, features = ["vulkan"] }
|
|
egui = "0.36"
|
|
egui-winit = { version = "0.36", default-features = false, features = ["wayland", "x11"] }
|
|
egui-ash-renderer = { version = "0.13", features = ["gpu-allocator"] }
|
|
glam = { version = "0.33", features = ["bytemuck"] }
|
|
tobj = "4"
|
|
log = "0.4"
|
|
chrono = { version = "0.4", default-features = false, features = ["clock", "std"] }
|
|
thiserror = "2"
|
|
anyhow = "1"
|
|
bytemuck = { version = "1", features = ["derive"] }
|
|
|
|
[profile.release]
|
|
opt-level = 3
|
|
lto = "thin"
|
|
codegen-units = 1
|