gmod-rs/Cargo.toml
Niko Marmeladkov 1cb836d4c9 engine: физика на Rapier3D — пропы падают, сталкиваются и засыпают
Батч 2. Мир не переезжает в Rapier целиком: геометрия карты остаётся
брашевой, Rapier обслуживает только динамические тела.

Четыре дефекта найдены измерением на gm_construct, а не догадкой — каждый
следующий был невидим, пока не закрыт предыдущий:

1. Рельеф раздувался в 15 277 коллайдеров (сетка LAND_CELL дублировала
   каждый треугольник в каждую ячейку). Заменено одним объединённым
   trimesh с дедупликацией вершин: 11 776 треугольников -> 6 148 вершин,
   1 коллайдер. Точнее и на порядки дешевле.
2. Уровень gm_construct построен брашами, а не displacement'ами: без них
   все пропы падали насквозь. add_brushes восстанавливает вершины
   перебором троек плоскостей (Крамер). Замер: 2121 построен, 5 пропущено.
3. Broad-phase Rapier наполняется только на step(): после вставки статики
   луч её не видел. Лечится явным broad_phase.set_aabb().
4. setup_physics начинался с PhysicsWorld::new() и стирал построенные браши.

Тест поймал баг, который замер бы не увидел: add_brushes создавал
коллайдеры, но не увеличивал счётчик, и лог врал (static = 1 при 2121 браше).

Проверка двумя независимыми системами коллизий: и Rapier, и брашевая
Collision находят пол под пропами на z = -96. После 400 кадров все 4
prop_physics осели: speed = 0.0, sleeping = true.

Ограничения зафиксированы в docs/PARITY.md: коллайдер пропа — AABB модели,
а не vcollide; физика только у prop_physics*; FPS просел до 10-21 и требует
отдельного замера.

Тестов 55 в engine (было 42), 23 набора по воркспейсу, clippy чист.
2026-10-13 12:36:51 +03:00

54 lines
1.2 KiB
TOML

[workspace]
resolver = "2"
members = [
"crates/tier",
"crates/math",
"crates/fs",
"crates/formats",
"crates/engine",
"crates/render",
"crates/net",
"crates/client", "crates/lua",
]
[workspace.package]
version = "0.1.0"
edition = "2024"
rust-version = "1.85"
[workspace.dependencies]
# внутренние крейты
tier = { path = "crates/tier" }
math = { path = "crates/math" }
fs = { path = "crates/fs" }
formats = { path = "crates/formats" }
engine = { path = "crates/engine" }
render = { path = "crates/render" }
net = { path = "crates/net" }
# Физика
rapier3d = "0.36"
# внешние
anyhow = "1"
bytemuck = { version = "1", features = ["derive"] }
clap = { version = "4.5", features = ["derive"] }
crc32fast = "1"
flate2 = "1"
lzma-rs = "0.3"
parking_lot = "0.12"
pollster = "0.4"
rustc-hash = "2"
serde = { version = "1", features = ["derive"] }
sdl3 = { version = "0.20", features = ["raw-window-handle", "build-from-source"] }
thiserror = "2"
toml = "0.9"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
wgpu = "30"
[profile.dev]
opt-level = 1
[profile.dev.package."*"]
opt-level = 2