Skip to main content

box3d_rust/recording/write_ops/
shape.rs

1//! Framed shape 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::{Capsule, Sphere, SurfaceMaterial};
8use crate::id::{BodyId, ShapeId};
9use crate::math_functions::Vec3;
10use crate::types::{Filter, ShapeDef};
11
12use crate::recording::ops::RecOp;
13use crate::recording::session::Recording;
14
15impl Recording {
16    /// Write framed `CreateSphereShape` op.
17    pub fn write_create_sphere_shape(
18        &mut self,
19        body: BodyId,
20        def: &ShapeDef,
21        sphere: Sphere,
22        ret_id: ShapeId,
23    ) {
24        self.begin_record(RecOp::CreateSphereShape as u8);
25        self.buffer.append_body_id(body);
26        self.buffer.append_shape_def(def);
27        self.buffer.append_sphere(sphere);
28        self.buffer.append_shape_id(ret_id);
29        self.end_record();
30    }
31
32    /// Write framed `CreateCapsuleShape` op.
33    pub fn write_create_capsule_shape(
34        &mut self,
35        body: BodyId,
36        def: &ShapeDef,
37        capsule: Capsule,
38        ret_id: ShapeId,
39    ) {
40        self.begin_record(RecOp::CreateCapsuleShape as u8);
41        self.buffer.append_body_id(body);
42        self.buffer.append_shape_def(def);
43        self.buffer.append_capsule(capsule);
44        self.buffer.append_shape_id(ret_id);
45        self.end_record();
46    }
47
48    /// Write framed `CreateHullShape` op.
49    pub fn write_create_hull_shape(
50        &mut self,
51        body: BodyId,
52        def: &ShapeDef,
53        geometry_id: u32,
54        ret_id: ShapeId,
55    ) {
56        self.begin_record(RecOp::CreateHullShape as u8);
57        self.buffer.append_body_id(body);
58        self.buffer.append_shape_def(def);
59        self.buffer.append_u32(geometry_id);
60        self.buffer.append_shape_id(ret_id);
61        self.end_record();
62    }
63
64    /// Write framed `CreateMeshShape` op.
65    pub fn write_create_mesh_shape(
66        &mut self,
67        body: BodyId,
68        def: &ShapeDef,
69        geometry_id: u32,
70        scale: Vec3,
71        ret_id: ShapeId,
72    ) {
73        self.begin_record(RecOp::CreateMeshShape as u8);
74        self.buffer.append_body_id(body);
75        self.buffer.append_shape_def(def);
76        self.buffer.append_u32(geometry_id);
77        self.buffer.append_vec3(scale);
78        self.buffer.append_shape_id(ret_id);
79        self.end_record();
80    }
81
82    /// Write framed `CreateHeightFieldShape` op.
83    pub fn write_create_height_field_shape(
84        &mut self,
85        body: BodyId,
86        def: &ShapeDef,
87        geometry_id: u32,
88        ret_id: ShapeId,
89    ) {
90        self.begin_record(RecOp::CreateHeightFieldShape as u8);
91        self.buffer.append_body_id(body);
92        self.buffer.append_shape_def(def);
93        self.buffer.append_u32(geometry_id);
94        self.buffer.append_shape_id(ret_id);
95        self.end_record();
96    }
97
98    /// Write framed `CreateCompoundShape` op.
99    pub fn write_create_compound_shape(
100        &mut self,
101        body: BodyId,
102        def: &ShapeDef,
103        geometry_id: u32,
104        ret_id: ShapeId,
105    ) {
106        self.begin_record(RecOp::CreateCompoundShape as u8);
107        self.buffer.append_body_id(body);
108        self.buffer.append_shape_def(def);
109        self.buffer.append_u32(geometry_id);
110        self.buffer.append_shape_id(ret_id);
111        self.end_record();
112    }
113
114    /// Write framed `DestroyShape` op.
115    pub fn write_destroy_shape(&mut self, shape: ShapeId, update_body_mass: bool) {
116        self.begin_record(RecOp::DestroyShape as u8);
117        self.buffer.append_shape_id(shape);
118        self.buffer.append_bool(update_body_mass);
119        self.end_record();
120    }
121
122    /// Write framed `ShapeSetDensity` op.
123    pub fn write_shape_set_density(
124        &mut self,
125        shape: ShapeId,
126        density: f32,
127        update_body_mass: bool,
128    ) {
129        self.begin_record(RecOp::ShapeSetDensity as u8);
130        self.buffer.append_shape_id(shape);
131        self.buffer.append_f32(density);
132        self.buffer.append_bool(update_body_mass);
133        self.end_record();
134    }
135
136    /// Write framed `ShapeSetFriction` op.
137    pub fn write_shape_set_friction(&mut self, shape: ShapeId, friction: f32) {
138        self.begin_record(RecOp::ShapeSetFriction as u8);
139        self.buffer.append_shape_id(shape);
140        self.buffer.append_f32(friction);
141        self.end_record();
142    }
143
144    /// Write framed `ShapeSetRestitution` op.
145    pub fn write_shape_set_restitution(&mut self, shape: ShapeId, restitution: f32) {
146        self.begin_record(RecOp::ShapeSetRestitution as u8);
147        self.buffer.append_shape_id(shape);
148        self.buffer.append_f32(restitution);
149        self.end_record();
150    }
151
152    /// Write framed `ShapeSetSurfaceMaterial` op.
153    pub fn write_shape_set_surface_material(&mut self, shape: ShapeId, material: SurfaceMaterial) {
154        self.begin_record(RecOp::ShapeSetSurfaceMaterial as u8);
155        self.buffer.append_shape_id(shape);
156        self.buffer.append_material(material);
157        self.end_record();
158    }
159
160    /// Write framed `ShapeSetFilter` op.
161    pub fn write_shape_set_filter(
162        &mut self,
163        shape: ShapeId,
164        filter: Filter,
165        invoke_contacts: bool,
166    ) {
167        self.begin_record(RecOp::ShapeSetFilter as u8);
168        self.buffer.append_shape_id(shape);
169        self.buffer.append_filter(filter);
170        self.buffer.append_bool(invoke_contacts);
171        self.end_record();
172    }
173
174    /// Write framed `ShapeEnableSensorEvents` op.
175    pub fn write_shape_enable_sensor_events(&mut self, shape: ShapeId, flag: bool) {
176        self.begin_record(RecOp::ShapeEnableSensorEvents as u8);
177        self.buffer.append_shape_id(shape);
178        self.buffer.append_bool(flag);
179        self.end_record();
180    }
181
182    /// Write framed `ShapeEnableContactEvents` op.
183    pub fn write_shape_enable_contact_events(&mut self, shape: ShapeId, flag: bool) {
184        self.begin_record(RecOp::ShapeEnableContactEvents as u8);
185        self.buffer.append_shape_id(shape);
186        self.buffer.append_bool(flag);
187        self.end_record();
188    }
189
190    /// Write framed `ShapeEnablePreSolveEvents` op.
191    pub fn write_shape_enable_pre_solve_events(&mut self, shape: ShapeId, flag: bool) {
192        self.begin_record(RecOp::ShapeEnablePreSolveEvents as u8);
193        self.buffer.append_shape_id(shape);
194        self.buffer.append_bool(flag);
195        self.end_record();
196    }
197
198    /// Write framed `ShapeEnableHitEvents` op.
199    pub fn write_shape_enable_hit_events(&mut self, shape: ShapeId, flag: bool) {
200        self.begin_record(RecOp::ShapeEnableHitEvents as u8);
201        self.buffer.append_shape_id(shape);
202        self.buffer.append_bool(flag);
203        self.end_record();
204    }
205
206    /// Write framed `ShapeSetSphere` op.
207    pub fn write_shape_set_sphere(&mut self, shape: ShapeId, sphere: Sphere) {
208        self.begin_record(RecOp::ShapeSetSphere as u8);
209        self.buffer.append_shape_id(shape);
210        self.buffer.append_sphere(sphere);
211        self.end_record();
212    }
213
214    /// Write framed `ShapeSetCapsule` op.
215    pub fn write_shape_set_capsule(&mut self, shape: ShapeId, capsule: Capsule) {
216        self.begin_record(RecOp::ShapeSetCapsule as u8);
217        self.buffer.append_shape_id(shape);
218        self.buffer.append_capsule(capsule);
219        self.end_record();
220    }
221
222    /// Write framed `ShapeApplyWind` op.
223    pub fn write_shape_apply_wind(
224        &mut self,
225        shape: ShapeId,
226        wind: Vec3,
227        drag: f32,
228        lift: f32,
229        max_speed: f32,
230        wake: bool,
231    ) {
232        self.begin_record(RecOp::ShapeApplyWind as u8);
233        self.buffer.append_shape_id(shape);
234        self.buffer.append_vec3(wind);
235        self.buffer.append_f32(drag);
236        self.buffer.append_f32(lift);
237        self.buffer.append_f32(max_speed);
238        self.buffer.append_bool(wake);
239        self.end_record();
240    }
241
242    /// Write framed `ShapeSetName` op.
243    pub fn write_shape_set_name(&mut self, shape: ShapeId, name: &str) {
244        self.begin_record(RecOp::ShapeSetName as u8);
245        self.buffer.append_shape_id(shape);
246        self.buffer.append_str(name);
247        self.end_record();
248    }
249}