pub struct World {Show 63 fields
pub broad_phase: BroadPhase,
pub constraint_graph: ConstraintGraph,
pub body_id_pool: IdPool,
pub bodies: Vec<Body>,
pub solver_set_id_pool: IdPool,
pub solver_sets: Vec<SolverSet>,
pub joint_id_pool: IdPool,
pub joints: Vec<Joint>,
pub contact_id_pool: IdPool,
pub contacts: Vec<Contact>,
pub island_id_pool: IdPool,
pub islands: Vec<Island>,
pub shape_id_pool: IdPool,
pub chain_id_pool: IdPool,
pub shapes: Vec<Shape>,
pub chain_shapes: Vec<ChainShape>,
pub sensors: Vec<Sensor>,
pub task_contexts: Vec<TaskContext>,
pub sensor_task_contexts: Vec<SensorTaskContext>,
pub body_move_events: Vec<BodyMoveEvent>,
pub sensor_begin_events: Vec<SensorBeginTouchEvent>,
pub contact_begin_events: Vec<ContactBeginTouchEvent>,
pub sensor_end_events: [Vec<SensorEndTouchEvent>; 2],
pub contact_end_events: [Vec<ContactEndTouchEvent>; 2],
pub end_event_array_index: i32,
pub contact_hit_events: Vec<ContactHitEvent>,
pub joint_events: Vec<JointEvent>,
pub debug_body_set: BitSet,
pub debug_joint_set: BitSet,
pub debug_contact_set: BitSet,
pub debug_island_set: BitSet,
pub step_index: u64,
pub split_island_id: i32,
pub gravity: Vec2,
pub hit_event_threshold: f32,
pub restitution_threshold: f32,
pub max_linear_speed: f32,
pub contact_speed: f32,
pub contact_hertz: f32,
pub contact_damping_ratio: f32,
pub contact_recycle_distance: f32,
pub friction_callback: Option<FrictionCallback>,
pub restitution_callback: Option<RestitutionCallback>,
pub generation: u16,
pub profile: Profile,
pub max_capacity: Capacity,
pub pre_solve_fcn: Option<PreSolveFcn>,
pub pre_solve_context: u64,
pub custom_filter_fcn: Option<CustomFilterFcn>,
pub custom_filter_context: u64,
pub worker_count: i32,
pub user_data: u64,
pub inv_h: f32,
pub inv_dt: f32,
pub world_id: u16,
pub enable_sleep: bool,
pub locked: bool,
pub enable_warm_starting: bool,
pub enable_contact_softening: bool,
pub enable_continuous: bool,
pub enable_speculative: bool,
pub in_use: bool,
pub recording: Option<Recording>,
}Expand description
The world struct manages all physics entities, dynamic simulation, and asynchronous queries. (b2World)
Fields§
§broad_phase: BroadPhase§constraint_graph: ConstraintGraph§body_id_pool: IdPoolThe body id pool allocates and recycles body ids. Body ids provide a
stable identifier for users. Aligns with bodies.
bodies: Vec<Body>Sparse array mapping body ids to the body data stored in solver sets.
solver_set_id_pool: IdPoolProvides free list for solver sets.
solver_sets: Vec<SolverSet>Solver sets store sims in contiguous arrays. Set 0 is static, set 1 is disabled, set 2 is awake; the rest are sleeping islands.
joint_id_pool: IdPoolUsed to create stable ids for joints.
joints: Vec<Joint>Sparse array mapping joint ids to joints in the constraint graph or solver sets.
contact_id_pool: IdPoolUsed to create stable ids for contacts.
contacts: Vec<Contact>Sparse array mapping contact ids to contacts in the constraint graph or solver sets.
island_id_pool: IdPoolUsed to create stable ids for islands.
islands: Vec<Island>Persistent islands.
shape_id_pool: IdPool§chain_id_pool: IdPool§shapes: Vec<Shape>Sparse arrays that point into the pools above.
chain_shapes: Vec<ChainShape>§sensors: Vec<Sensor>Dense array of sensor data.
task_contexts: Vec<TaskContext>Per thread storage (one entry in the single-threaded port).
sensor_task_contexts: Vec<SensorTaskContext>§body_move_events: Vec<BodyMoveEvent>§sensor_begin_events: Vec<SensorBeginTouchEvent>§contact_begin_events: Vec<ContactBeginTouchEvent>§sensor_end_events: [Vec<SensorEndTouchEvent>; 2]End events are double buffered so that the user doesn’t need to flush events.
contact_end_events: [Vec<ContactEndTouchEvent>; 2]§end_event_array_index: i32§contact_hit_events: Vec<ContactHitEvent>§joint_events: Vec<JointEvent>§debug_body_set: BitSetUsed to track debug draw.
debug_joint_set: BitSet§debug_contact_set: BitSet§debug_island_set: BitSet§step_index: u64Id that is incremented every time step.
split_island_id: i32Identify islands for splitting.
gravity: Vec2§hit_event_threshold: f32§restitution_threshold: f32§max_linear_speed: f32§contact_speed: f32§contact_hertz: f32§contact_damping_ratio: f32§contact_recycle_distance: f32§friction_callback: Option<FrictionCallback>§restitution_callback: Option<RestitutionCallback>§generation: u16§profile: Profile§max_capacity: Capacity§pre_solve_fcn: Option<PreSolveFcn>§pre_solve_context: u64§custom_filter_fcn: Option<CustomFilterFcn>§custom_filter_context: u64§worker_count: i32§user_data: u64§inv_h: f32Inverse sub-step, remembered for reporting forces and torques.
inv_dt: f32Inverse full-step.
world_id: u16§enable_sleep: bool§locked: bool§enable_warm_starting: bool§enable_contact_softening: bool§enable_continuous: bool§enable_speculative: bool§in_use: bool§recording: Option<Recording>Active recording session; owned by the world between world_start_recording and world_stop_recording. (C: b2Recording*)
Implementations§
Source§impl World
impl World
Sourcepub fn validate_connectivity(&self)
pub fn validate_connectivity(&self)
(b2ValidateConnectivity — C compiles the body under B2_ENABLE_VALIDATION; here the whole check runs in debug builds only)
Source§impl World
impl World
Sourcepub fn validate_contacts(&self)
pub fn validate_contacts(&self)
(b2ValidateContacts — C compiles the body under B2_ENABLE_VALIDATION; here the whole check runs in debug builds only)
Source§impl World
impl World
Sourcepub fn new(def: &WorldDef) -> World
pub fn new(def: &WorldDef) -> World
Create a world. (b2CreateWorld)
Differences from C, all documented in the module header: there is no
global world registry (the returned World is owned; world_id stays 0
unless the embedder assigns one), no arena stack, and the serial task
path is always used (worker_count = 1 with one task context), which is
the C fallback when no task system is supplied.
Examples found in repository?
50fn main() {
51 // === Bodies demo scene ===
52 let mut wd = default_world_def();
53 wd.gravity = m::Vec2 { x: 0.0, y: -10.0 };
54 let mut world = World::new(&wd);
55
56 add_static_box(&mut world, 0.0, -0.5, 13.0, 0.5);
57 add_static_box(&mut world, -12.2, 2.0, 0.3, 2.0);
58 add_static_box(&mut world, 12.2, 2.0, 0.3, 2.0);
59
60 let mut tracked = Vec::new();
61 for i in 0..24usize {
62 let x = -6.0 + (i % 8) as f32 * 1.7 + 0.13 * (i % 3) as f32;
63 let y = 5.0 + (i / 8) as f32 * 1.6;
64 if i % 2 == 0 {
65 let hx = 0.25 + 0.2 * ((i * 7) % 3) as f32 * 0.5;
66 tracked.push(add_box(&mut world, x, y, hx, hx));
67 } else {
68 let r = 0.22 + 0.16 * ((i * 5) % 3) as f32 * 0.5;
69 tracked.push(add_circle(&mut world, x, y, r, 1.0));
70 }
71 }
72
73 for step in 0..600 {
74 world_step(&mut world, 1.0 / 60.0, 4);
75 if step % 100 == 0 {
76 let t = get_body_transform(&world, tracked[0]);
77 println!(
78 "bodies step {step}: body0 = ({:.3}, {:.3}), contacts = {}",
79 t.p.x,
80 t.p.y,
81 world.contact_id_pool.id_count()
82 );
83 }
84 }
85 println!("BODIES SCENE OK");
86
87 // === Stacking demo scene ===
88 let mut world = World::new(&wd);
89 add_static_box(&mut world, 0.0, -0.5, 11.0, 0.5);
90 let h = 0.4f32;
91 let base = 9i32;
92 for row in 0..base {
93 let count = base - row;
94 let y = h + row as f32 * 2.0 * h;
95 for i in 0..count {
96 let x = (i as f32 - (count - 1) as f32 / 2.0) * 2.05 * h;
97 add_box(&mut world, x, y, h, h);
98 }
99 }
100 for _ in 0..600 {
101 world_step(&mut world, 1.0 / 60.0, 4);
102 }
103 println!(
104 "stacking settled: awake = {}",
105 world.solver_sets[box2d_rust::solver_set::AWAKE_SET as usize]
106 .body_sims
107 .len()
108 );
109 // Drop the heavy ball
110 add_circle(&mut world, 0.3, 9.0, 0.5, 4.0);
111 for _ in 0..600 {
112 world_step(&mut world, 1.0 / 60.0, 4);
113 }
114 println!("STACKING SCENE OK");
115}Sourcepub fn validate_solver_sets(&self)
pub fn validate_solver_sets(&self)
Validate the solver-set bookkeeping. (b2ValidateSolverSets)
bring-up: the C version (physics_world.c, compiled only with B2_ENABLE_VALIDATION) also cross-checks contacts, joints, and graph colors; those checks are added as their slices land. This subset validates the body <-> sim <-> set <-> island mapping.