use boxddd::{Aabb, BodyType, BoxHull, QueryFilter, Vec3};
#[cfg(target_arch = "wasm32")]
use boxddd::{Error, TaskSystem};
fn main() -> boxddd::Result<()> {
assert_wasm_thread_guardrails()?;
let foundation = boxddd::Foundation::initialize_default()?;
let mut world = foundation.create_world(
foundation
.world_def_builder()
.gravity(Vec3::new(0.0, -10.0, 0.0))
.worker_count(1)
.build()?,
)?;
let ground = world.create_body(
foundation
.body_def_builder()
.position([0.0, -1.0, 0.0])
.build()?,
)?;
world.create_hull_shape(
ground,
&foundation.shape_def(),
&BoxHull::new(8.0, 0.5, 8.0)?,
)?;
let body = world.create_body(
foundation
.body_def_builder()
.body_type(BodyType::Dynamic)
.position([0.0, 4.0, 0.0])
.build()?,
)?;
world.create_hull_shape(
body,
&foundation
.shape_def_builder()
.density(1.0)
.friction(0.3)
.build()?,
&BoxHull::cube(0.5)?,
)?;
let start_y = world.body_position(body)?.y;
for _ in 0..60 {
world.step(1.0 / 60.0, 4)?;
}
let end_y = world.body_position(body)?.y;
assert!(
end_y < start_y - 0.1,
"dynamic body did not fall: start_y={start_y}, end_y={end_y}"
);
let hits = world.overlap_aabb(
Aabb {
lower_bound: Vec3::new(-2.0, -2.0, -2.0),
upper_bound: Vec3::new(2.0, 5.0, 2.0),
},
QueryFilter::default(),
)?;
assert!(
!hits.is_empty(),
"overlap query did not report any shapes after stepping"
);
let precision = if boxddd::is_double_precision() {
"double"
} else {
"single"
};
println!(
"boxddd wasm smoke passed ({precision}): y {:.3} -> {:.3}, hits {}",
start_y,
end_y,
hits.len()
);
Ok(())
}
#[cfg(target_arch = "wasm32")]
fn assert_wasm_thread_guardrails() -> boxddd::Result<()> {
assert_eq!(
TaskSystem::blocking_threads().unwrap_err(),
Error::UnsupportedOnWasm
);
let foundation = boxddd::Foundation::initialize_default()?;
assert_eq!(
foundation
.create_world(foundation.world_def_builder().worker_count(2).build()?)
.unwrap_err(),
Error::UnsupportedOnWasm
);
let mut world =
foundation.create_world(foundation.world_def_builder().worker_count(1).build()?)?;
assert_eq!(
world.set_worker_count(2).unwrap_err(),
Error::UnsupportedOnWasm
);
assert_eq!(
foundation.validate_replay(&[0], 2).unwrap_err(),
Error::UnsupportedOnWasm
);
Ok(())
}
#[cfg(not(target_arch = "wasm32"))]
fn assert_wasm_thread_guardrails() -> boxddd::Result<()> {
Ok(())
}