Тест: движение пропа обязано отдавать диапазоны вершин на GPU
Some checks are pending
CI / checks (push) Waiting to run
Some checks are pending
CI / checks (push) Waiting to run
Диагностика превращена в обычный картовый тест: собираем коробку-проп вручную (VFS в тестах пуст), поднимаем телом физики на 200 юнитов, шагаем секунду и проверяем обе половины — вершины переписались и мир перечислил их диапазон для заливки. Это охраняет причину жалобы «физика видит, а картинка стоит»: раньше `move_prop` писал вершины своей копией кода мимо общего помощника и диапазоны не запоминались. 29 картовых тестов и весь workspace зелёные.
This commit is contained in:
parent
d700d15416
commit
0a6504e04c
2 changed files with 26 additions and 18 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue