Тест: движение пропа обязано отдавать диапазоны вершин на GPU
Some checks are pending
CI / checks (push) Waiting to run

Диагностика превращена в обычный картовый тест: собираем коробку-проп вручную
(VFS в тестах пуст), поднимаем телом физики на 200 юнитов, шагаем секунду и
проверяем обе половины — вершины переписались и мир перечислил их диапазон для
заливки. Это охраняет причину жалобы «физика видит, а картинка стоит»: раньше
`move_prop` писал вершины своей копией кода мимо общего помощника и диапазоны
не запоминались.

29 картовых тестов и весь workspace зелёные.
This commit is contained in:
Niko Marmeladkov 2026-10-17 10:31:48 +03:00
parent d700d15416
commit 0a6504e04c
2 changed files with 26 additions and 18 deletions

View file

@ -265,12 +265,21 @@ pub fn map(assets: Option<PathBuf>, args: MapArgs) -> anyhow::Result<()> {
math::Vec3::ZERO,
&mut budget,
) {
let half = w
.model_instances
.get(index)
.and_then(|i| w.prop_meshes.get(i.mesh))
.map(|m| m.bounds_half_extents);
info!(index, model = %candidate, ?half, "вьюмодель в мире");
let diag = w.model_instances.get(index).map(|i| {
let mesh = w.prop_meshes.get(i.mesh);
(
i.mesh,
i.first_vertex,
i.vertex_count,
mesh.map(|m| m.positions.first().copied()),
mesh.map(|m| m.bounds_half_extents),
mesh.map(|m| m.positions.len()),
w.batches
.last()
.map(|b| (b.material, b.first_index, b.index_count)),
)
});
info!(index, model = %candidate, ?diag, "вьюмодель в мире");
return Some(index);
}
}

View file

@ -5220,10 +5220,15 @@ mod tests {
assert!(duck_eye > DUCK_HALF.z, "в приседе глаза выше середины тела");
}
/// Диагностика: движущийся проп переписывает вершины и попадает в
/// `moved_ranges` (пока не сходится: коробка теста задана в мировых
/// координатах, а меш обязан быть в локальных — правку видно по двойному
/// смещению вершины).
/// Движущийся проп переписывает вершины и попадает в `moved_ranges`.
///
/// Жалоба пользователя: «физика вроде работает, но позиция рендера
/// обновляется только при спавне нового». Причина была в том, что
/// `move_prop` писал вершины своей копией кода мимо общего помощника и не
/// запоминал диапазоны — буфер рендера их не получал. Тест собирает
/// коробку-проп вручную (VFS в тестах пуст, модели из него не грузятся),
/// поднимает её телом физики и проверяет обе половины: вершины
/// переписались и мир перечислил их для заливки на GPU.
///
/// Жалоба пользователя: «физика вроде работает, но позиция рендера
/// обновляется только при спавне нового». Причина — буфер рендера
@ -5233,8 +5238,8 @@ mod tests {
/// проверяет обе половины: вершины переписались и мир перечислил их для
/// заливки.
#[test]
#[ignore = "диагностика: SOURCE_RS_TEST_BSP; меш задаётся в локальных координатах"]
fn probe_moving_prop_reports_vertex_ranges() {
#[ignore = "требует ассеты Garry's Mod: SOURCE_RS_TEST_BSP"]
fn real_map_moving_prop_reports_vertex_ranges() {
let Some(path) = std::env::var_os("SOURCE_RS_TEST_BSP") else {
eprintln!("SOURCE_RS_TEST_BSP не задан — проверка пропущена");
return;
@ -5310,12 +5315,6 @@ mod tests {
.teleport(body, before + Vec3::new(0.0, 0.0, 200.0), Vec3::ZERO)
);
let _ = world.take_moved_ranges();
println!(
"ЗАМЕР проп: спит после телепорта {}, поза {:?}, запись {:?}",
world.physics.is_sleeping(body),
world.physics.transform(body),
(world.props[index].origin, world.props[index].angles)
);
for step in 0..60 {
let moved = world.step_physics(1.0 / 60.0);
if step < 3 {