Skip to main content

box3d_rust/recording/write_ops/
body.rs

1//! Framed body op writers for `Recording`, split from ops.rs to satisfy
2//! the file-length limit. Layouts mirror recording_ops.inl.
3//!
4//! SPDX-FileCopyrightText: 2026 Erin Catto
5//! SPDX-License-Identifier: MIT
6
7use crate::geometry::MassData;
8use crate::id::{BodyId, WorldId};
9use crate::math_functions::{Pos, Quat, Vec3, WorldTransform};
10use crate::types::{BodyDef, MotionLocks};
11
12use crate::recording::ops::RecOp;
13use crate::recording::session::Recording;
14
15impl Recording {
16    /// Write framed `CreateBody` op.
17    pub fn write_create_body(&mut self, world: WorldId, def: &BodyDef, ret_id: BodyId) {
18        self.begin_record(RecOp::CreateBody as u8);
19        self.buffer.append_world_id(world);
20        self.buffer.append_body_def(def);
21        self.buffer.append_body_id(ret_id);
22        self.end_record();
23    }
24
25    /// Write framed `DestroyBody` op.
26    pub fn write_destroy_body(&mut self, body: BodyId) {
27        self.begin_record(RecOp::DestroyBody as u8);
28        self.buffer.append_body_id(body);
29        self.end_record();
30    }
31
32    /// Write framed `BodySetTransform` op.
33    pub fn write_body_set_transform(&mut self, body: BodyId, position: Pos, rotation: Quat) {
34        self.begin_record(RecOp::BodySetTransform as u8);
35        self.buffer.append_body_id(body);
36        self.buffer.append_pos(position);
37        self.buffer.append_quat(rotation);
38        self.end_record();
39    }
40
41    /// Write framed `BodySetLinearVelocity` op.
42    pub fn write_body_set_linear_velocity(&mut self, body: BodyId, v: Vec3) {
43        self.begin_record(RecOp::BodySetLinearVelocity as u8);
44        self.buffer.append_body_id(body);
45        self.buffer.append_vec3(v);
46        self.end_record();
47    }
48
49    /// Write framed `BodySetType` op.
50    pub fn write_body_set_type(&mut self, body: BodyId, type_: i32) {
51        self.begin_record(RecOp::BodySetType as u8);
52        self.buffer.append_body_id(body);
53        self.buffer.append_i32(type_);
54        self.end_record();
55    }
56
57    /// Write framed `BodySetName` op.
58    pub fn write_body_set_name(&mut self, body: BodyId, name: &str) {
59        self.begin_record(RecOp::BodySetName as u8);
60        self.buffer.append_body_id(body);
61        self.buffer.append_str(name);
62        self.end_record();
63    }
64
65    /// Write framed `BodySetAngularVelocity` op.
66    pub fn write_body_set_angular_velocity(&mut self, body: BodyId, w: Vec3) {
67        self.begin_record(RecOp::BodySetAngularVelocity as u8);
68        self.buffer.append_body_id(body);
69        self.buffer.append_vec3(w);
70        self.end_record();
71    }
72
73    /// Write framed `BodySetTargetTransform` op.
74    pub fn write_body_set_target_transform(
75        &mut self,
76        body: BodyId,
77        target: WorldTransform,
78        time_step: f32,
79        wake: bool,
80    ) {
81        self.begin_record(RecOp::BodySetTargetTransform as u8);
82        self.buffer.append_body_id(body);
83        self.buffer.append_world_xf(target);
84        self.buffer.append_f32(time_step);
85        self.buffer.append_bool(wake);
86        self.end_record();
87    }
88
89    /// Write framed `BodyApplyForce` op.
90    pub fn write_body_apply_force(&mut self, body: BodyId, force: Vec3, point: Pos, wake: bool) {
91        self.begin_record(RecOp::BodyApplyForce as u8);
92        self.buffer.append_body_id(body);
93        self.buffer.append_vec3(force);
94        self.buffer.append_pos(point);
95        self.buffer.append_bool(wake);
96        self.end_record();
97    }
98
99    /// Write framed `BodyApplyForceToCenter` op.
100    pub fn write_body_apply_force_to_center(&mut self, body: BodyId, force: Vec3, wake: bool) {
101        self.begin_record(RecOp::BodyApplyForceToCenter as u8);
102        self.buffer.append_body_id(body);
103        self.buffer.append_vec3(force);
104        self.buffer.append_bool(wake);
105        self.end_record();
106    }
107
108    /// Write framed `BodyApplyTorque` op.
109    pub fn write_body_apply_torque(&mut self, body: BodyId, torque: Vec3, wake: bool) {
110        self.begin_record(RecOp::BodyApplyTorque as u8);
111        self.buffer.append_body_id(body);
112        self.buffer.append_vec3(torque);
113        self.buffer.append_bool(wake);
114        self.end_record();
115    }
116
117    /// Write framed `BodyApplyLinearImpulse` op.
118    pub fn write_body_apply_linear_impulse(
119        &mut self,
120        body: BodyId,
121        impulse: Vec3,
122        point: Pos,
123        wake: bool,
124    ) {
125        self.begin_record(RecOp::BodyApplyLinearImpulse as u8);
126        self.buffer.append_body_id(body);
127        self.buffer.append_vec3(impulse);
128        self.buffer.append_pos(point);
129        self.buffer.append_bool(wake);
130        self.end_record();
131    }
132
133    /// Write framed `BodyApplyLinearImpulseToCenter` op.
134    pub fn write_body_apply_linear_impulse_to_center(
135        &mut self,
136        body: BodyId,
137        impulse: Vec3,
138        wake: bool,
139    ) {
140        self.begin_record(RecOp::BodyApplyLinearImpulseToCenter as u8);
141        self.buffer.append_body_id(body);
142        self.buffer.append_vec3(impulse);
143        self.buffer.append_bool(wake);
144        self.end_record();
145    }
146
147    /// Write framed `BodyApplyAngularImpulse` op.
148    pub fn write_body_apply_angular_impulse(&mut self, body: BodyId, impulse: Vec3, wake: bool) {
149        self.begin_record(RecOp::BodyApplyAngularImpulse as u8);
150        self.buffer.append_body_id(body);
151        self.buffer.append_vec3(impulse);
152        self.buffer.append_bool(wake);
153        self.end_record();
154    }
155
156    /// Write framed `BodySetMassData` op.
157    pub fn write_body_set_mass_data(&mut self, body: BodyId, mass_data: MassData) {
158        self.begin_record(RecOp::BodySetMassData as u8);
159        self.buffer.append_body_id(body);
160        self.buffer.append_mass_data(mass_data);
161        self.end_record();
162    }
163
164    /// Write framed `BodyApplyMassFromShapes` op.
165    pub fn write_body_apply_mass_from_shapes(&mut self, body: BodyId) {
166        self.begin_record(RecOp::BodyApplyMassFromShapes as u8);
167        self.buffer.append_body_id(body);
168        self.end_record();
169    }
170
171    /// Write framed `BodySetLinearDamping` op.
172    pub fn write_body_set_linear_damping(&mut self, body: BodyId, damping: f32) {
173        self.begin_record(RecOp::BodySetLinearDamping as u8);
174        self.buffer.append_body_id(body);
175        self.buffer.append_f32(damping);
176        self.end_record();
177    }
178
179    /// Write framed `BodySetAngularDamping` op.
180    pub fn write_body_set_angular_damping(&mut self, body: BodyId, damping: f32) {
181        self.begin_record(RecOp::BodySetAngularDamping as u8);
182        self.buffer.append_body_id(body);
183        self.buffer.append_f32(damping);
184        self.end_record();
185    }
186
187    /// Write framed `BodySetGravityScale` op.
188    pub fn write_body_set_gravity_scale(&mut self, body: BodyId, scale: f32) {
189        self.begin_record(RecOp::BodySetGravityScale as u8);
190        self.buffer.append_body_id(body);
191        self.buffer.append_f32(scale);
192        self.end_record();
193    }
194
195    /// Write framed `BodySetAwake` op.
196    pub fn write_body_set_awake(&mut self, body: BodyId, awake: bool) {
197        self.begin_record(RecOp::BodySetAwake as u8);
198        self.buffer.append_body_id(body);
199        self.buffer.append_bool(awake);
200        self.end_record();
201    }
202
203    /// Write framed `BodyEnableSleep` op.
204    pub fn write_body_enable_sleep(&mut self, body: BodyId, flag: bool) {
205        self.begin_record(RecOp::BodyEnableSleep as u8);
206        self.buffer.append_body_id(body);
207        self.buffer.append_bool(flag);
208        self.end_record();
209    }
210
211    /// Write framed `BodySetSleepThreshold` op.
212    pub fn write_body_set_sleep_threshold(&mut self, body: BodyId, threshold: f32) {
213        self.begin_record(RecOp::BodySetSleepThreshold as u8);
214        self.buffer.append_body_id(body);
215        self.buffer.append_f32(threshold);
216        self.end_record();
217    }
218
219    /// Write framed `BodyDisable` op.
220    pub fn write_body_disable(&mut self, body: BodyId) {
221        self.begin_record(RecOp::BodyDisable as u8);
222        self.buffer.append_body_id(body);
223        self.end_record();
224    }
225
226    /// Write framed `BodyEnable` op.
227    pub fn write_body_enable(&mut self, body: BodyId) {
228        self.begin_record(RecOp::BodyEnable as u8);
229        self.buffer.append_body_id(body);
230        self.end_record();
231    }
232
233    /// Write framed `BodySetMotionLocks` op.
234    pub fn write_body_set_motion_locks(&mut self, body: BodyId, locks: MotionLocks) {
235        self.begin_record(RecOp::BodySetMotionLocks as u8);
236        self.buffer.append_body_id(body);
237        self.buffer.append_locks(locks);
238        self.end_record();
239    }
240
241    /// Write framed `BodySetBullet` op.
242    pub fn write_body_set_bullet(&mut self, body: BodyId, flag: bool) {
243        self.begin_record(RecOp::BodySetBullet as u8);
244        self.buffer.append_body_id(body);
245        self.buffer.append_bool(flag);
246        self.end_record();
247    }
248
249    /// Write framed `BodyEnableContactRecycling` op.
250    pub fn write_body_enable_contact_recycling(&mut self, body: BodyId, flag: bool) {
251        self.begin_record(RecOp::BodyEnableContactRecycling as u8);
252        self.buffer.append_body_id(body);
253        self.buffer.append_bool(flag);
254        self.end_record();
255    }
256
257    /// Write framed `BodyEnableHitEvents` op.
258    pub fn write_body_enable_hit_events(&mut self, body: BodyId, flag: bool) {
259        self.begin_record(RecOp::BodyEnableHitEvents as u8);
260        self.buffer.append_body_id(body);
261        self.buffer.append_bool(flag);
262        self.end_record();
263    }
264}