Struct GlobalTransform
pub struct GlobalTransform(Affine3A);Expand description
GlobalTransform is an affine transformation from entity-local coordinates to worldspace coordinates.
You cannot directly mutate GlobalTransform; instead, you change an entity’s transform by manipulating
its Transform, which indirectly causes Bevy to update its GlobalTransform.
- To get the global transform of an entity, you should get its
GlobalTransform. - For transform hierarchies to work correctly, you must have both a
Transformand aGlobalTransform.GlobalTransformis automatically inserted wheneverTransformis inserted.
§Transform and GlobalTransform
Transform transforms an entity relative to its parent’s reference frame, or relative to world space coordinates,
if it doesn’t have a ChildOf component.
GlobalTransform is managed by Bevy; it is computed by successively applying the Transform of each ancestor
entity which has a Transform. This is done automatically by Bevy-internal systems in the TransformSystems::Propagate
system set.
This system runs during PostUpdate. If you
update the Transform of an entity in this schedule or after, you will notice a 1 frame lag
before the GlobalTransform is updated.
§Examples
Tuple Fields§
§0: Affine3AImplementations§
§impl GlobalTransform
impl GlobalTransform
pub const IDENTITY: GlobalTransform
pub const IDENTITY: GlobalTransform
An identity GlobalTransform that maps all points in space to themselves.
pub fn affine(&self) -> Affine3A
pub fn affine(&self) -> Affine3A
Returns the 3d affine transformation matrix as an Affine3A.
Examples found in repository?
206fn try_plot(
207 event: On<TryPlot>,
208 sprite: Query<(&Sprite, &Anchor, &GlobalTransform), With<SpriteToSave>>,
209 camera: Single<(&Camera, &GlobalTransform)>,
210 texture_atlases: Res<Assets<TextureAtlasLayout>>,
211 draw_color: Res<DrawColor>,
212 mut images: ResMut<Assets<Image>>,
213) {
214 let Ok((sprite, anchor, sprite_transform)) = sprite.get(event.entity) else {
215 return;
216 };
217 let (camera, camera_transform) = camera.into_inner();
218 let Ok(world_position) = camera.viewport_to_world_2d(camera_transform, event.location.position)
219 else {
220 return;
221 };
222 let relative_to_sprite = sprite_transform
223 .affine()
224 .inverse()
225 .transform_point3(world_position.extend(0.0));
226 let Ok(pixel_space) = sprite.compute_pixel_space_point(
227 relative_to_sprite.xy(),
228 *anchor,
229 &images,
230 &texture_atlases,
231 ) else {
232 return;
233 };
234 let pixel_coordinates = pixel_space.floor().as_uvec2();
235 let mut image = images.get_mut(&sprite.image).unwrap();
236 // For an actual drawing app, you'd at least draw a line from the last point, but this is
237 // simpler.
238 image
239 .set_color_at(pixel_coordinates.x, pixel_coordinates.y, draw_color.0)
240 .unwrap();
241}More examples
335pub fn extract_colored_mesh2d(
336 mut commands: Commands,
337 mut previous_len: Local<usize>,
338 // When extracting, you must use `Extract` to mark the `SystemParam`s
339 // which should be taken from the main world.
340 query: Extract<
341 Query<
342 (
343 Entity,
344 RenderEntity,
345 &ViewVisibility,
346 &GlobalTransform,
347 &Mesh2d,
348 ),
349 With<ColoredMesh2d>,
350 >,
351 >,
352 mut render_mesh_instances: ResMut<RenderColoredMesh2dInstances>,
353) {
354 let mut values = Vec::with_capacity(*previous_len);
355 for (entity, render_entity, view_visibility, transform, handle) in &query {
356 if !view_visibility.get() {
357 continue;
358 }
359
360 let transforms = Mesh2dTransforms {
361 world_from_local: transform.affine().into(),
362 flags: MeshFlags::empty().bits(),
363 };
364
365 values.push((render_entity, ColoredMesh2d));
366 render_mesh_instances.insert(
367 entity.into(),
368 RenderMesh2dInstance {
369 mesh_asset_id: handle.0.id(),
370 transforms,
371 material_bind_group_id: Material2dBindGroupId::default(),
372 automatic_batching: false,
373 tag: 0,
374 },
375 );
376 }
377 *previous_len = values.len();
378 commands.try_insert_batch(values);
379}pub fn compute_transform(&self) -> Transform
pub fn compute_transform(&self) -> Transform
Returns the transformation as a Transform.
The transform is expected to be non-degenerate and without shearing, or the output will be invalid.
pub fn to_isometry(&self) -> Isometry3d
pub fn to_isometry(&self) -> Isometry3d
Computes a Scale-Rotation-Translation decomposition of the transformation and returns the isometric part as an isometry. Any scaling done by the transformation will be ignored. Note: this is a somewhat costly and lossy conversion.
The transform is expected to be non-degenerate and without shearing, or the output will be invalid.
pub fn reparented_to(&self, parent: &GlobalTransform) -> Transform
pub fn reparented_to(&self, parent: &GlobalTransform) -> Transform
Returns the Transform self would have if it was a child of an entity
with the parent GlobalTransform.
This is useful if you want to “reparent” an Entity.
Say you have an entity e1 that you want to turn into a child of e2,
but you want e1 to keep the same global transform, even after re-parenting. You would use:
#[derive(Component)]
struct ToReparent {
new_parent: Entity,
}
fn reparent_system(
mut commands: Commands,
mut targets: Query<(&mut Transform, Entity, &GlobalTransform, &ToReparent)>,
transforms: Query<&GlobalTransform>,
) {
for (mut transform, entity, initial, to_reparent) in targets.iter_mut() {
if let Ok(parent_transform) = transforms.get(to_reparent.new_parent) {
*transform = initial.reparented_to(parent_transform);
commands.entity(entity)
.remove::<ToReparent>()
.insert(ChildOf(to_reparent.new_parent));
}
}
}The transform is expected to be non-degenerate and without shearing, or the output will be invalid.
pub fn to_scale_rotation_translation(&self) -> (Vec3, Quat, Vec3)
pub fn to_scale_rotation_translation(&self) -> (Vec3, Quat, Vec3)
Extracts scale, rotation and translation from self.
The transform is expected to be non-degenerate and without shearing, or the output will be invalid.
Examples found in repository?
104fn draw_bounds<Shape: Bounded2d + Send + Sync + 'static>(
105 q: Query<(&DrawBounds<Shape>, &GlobalTransform)>,
106 mut gizmos: Gizmos,
107) {
108 for (shape, transform) in &q {
109 let (_, rotation, translation) = transform.to_scale_rotation_translation();
110 let translation = translation.truncate();
111 let rotation = rotation.to_euler(EulerRot::XYZ).2;
112 let isometry = Isometry2d::new(translation, Rot2::radians(rotation));
113
114 let aabb = shape.0.aabb_2d(isometry);
115 gizmos.rect_2d(aabb.center(), aabb.half_size() * 2.0, RED);
116
117 let bounding_circle = shape.0.bounding_circle(isometry);
118 gizmos.circle_2d(bounding_circle.center, bounding_circle.radius(), BLUE);
119 }
120}pub fn up(&self) -> Dir3
pub fn up(&self) -> Dir3
Return the local up vector (Y).
Examples found in repository?
13fn draw_cursor(
14 camera_query: Single<(&Camera, &GlobalTransform)>,
15 ground: Single<&GlobalTransform, With<Ground>>,
16 window: Single<&Window>,
17 mut gizmos: Gizmos,
18) {
19 let (camera, camera_transform) = *camera_query;
20
21 if let Some(cursor_position) = window.cursor_position()
22 // Calculate a ray pointing from the camera into the world based on the cursor's position.
23 && let Ok(ray) = camera.viewport_to_world(camera_transform, cursor_position)
24 // Calculate if and where the ray is hitting the ground plane.
25 && let Some(point) = ray.plane_intersection_point(ground.translation(), InfinitePlane3d::new(ground.up()))
26 {
27 // Draw a circle just above the ground plane at that position.
28 gizmos.circle(
29 Isometry3d::new(
30 point + ground.up() * 0.01,
31 Quat::from_rotation_arc(Vec3::Z, ground.up().as_vec3()),
32 ),
33 0.2,
34 Color::WHITE,
35 );
36 }
37}pub fn translation(&self) -> Vec3
pub fn translation(&self) -> Vec3
Get the translation as a Vec3.
Examples found in repository?
122fn interact_bodies(mut query: Query<(&Mass, &GlobalTransform, &mut Acceleration)>) {
123 let mut iter = query.iter_combinations_mut();
124 while let Some([(Mass(m1), transform1, mut acc1), (Mass(m2), transform2, mut acc2)]) =
125 iter.fetch_next()
126 {
127 let delta = transform2.translation() - transform1.translation();
128 let distance_sq: f32 = delta.length_squared();
129
130 let f = GRAVITY_CONSTANT / distance_sq;
131 let force_unit_mass = delta * f;
132 acc1.0 += force_unit_mass * *m2;
133 acc2.0 -= force_unit_mass * *m1;
134 }
135}More examples
346fn draw_camera_gizmo(cameras: Query<(&Camera, &GlobalTransform)>, mut gizmos: Gizmos) {
347 for (camera, transform) in &cameras {
348 // As above, we use the order as a cheap tag to tell the depth texture
349 // apart from the main texture.
350 if camera.order >= 0 {
351 continue;
352 }
353
354 // Draw a cone representing the camera.
355 gizmos.primitive_3d(
356 &Cone {
357 radius: 1.0,
358 height: 3.0,
359 },
360 Isometry3d::new(
361 transform.translation(),
362 // We have to rotate here because `Cone` primitives are oriented
363 // along +Y and cameras point along +Z.
364 transform.rotation() * Quat::from_rotation_x(FRAC_PI_2),
365 ),
366 LIME,
367 );
368 }
369}13fn draw_cursor(
14 camera_query: Single<(&Camera, &GlobalTransform)>,
15 ground: Single<&GlobalTransform, With<Ground>>,
16 window: Single<&Window>,
17 mut gizmos: Gizmos,
18) {
19 let (camera, camera_transform) = *camera_query;
20
21 if let Some(cursor_position) = window.cursor_position()
22 // Calculate a ray pointing from the camera into the world based on the cursor's position.
23 && let Ok(ray) = camera.viewport_to_world(camera_transform, cursor_position)
24 // Calculate if and where the ray is hitting the ground plane.
25 && let Some(point) = ray.plane_intersection_point(ground.translation(), InfinitePlane3d::new(ground.up()))
26 {
27 // Draw a circle just above the ground plane at that position.
28 gizmos.circle(
29 Isometry3d::new(
30 point + ground.up() * 0.01,
31 Quat::from_rotation_arc(Vec3::Z, ground.up().as_vec3()),
32 ),
33 0.2,
34 Color::WHITE,
35 );
36 }
37}45fn observe_on_step(
46 step: On<Step>,
47 particle: Res<ParticleAssets>,
48 mut commands: Commands,
49 transforms: Query<&GlobalTransform>,
50 mut seeded_rng: ResMut<SeededRng>,
51) -> Result {
52 let translation = transforms.get(step.trigger().target)?.translation();
53 // Spawn a bunch of particles.
54 for _ in 0..14 {
55 let horizontal = seeded_rng.0.random::<Dir2>() * seeded_rng.0.random_range(8.0..12.0);
56 let vertical = seeded_rng.0.random_range(0.0..4.0);
57 let size = seeded_rng.0.random_range(0.2..1.0);
58
59 commands.spawn((
60 Particle {
61 lifetime_timer: Timer::from_seconds(
62 seeded_rng.0.random_range(0.2..0.6),
63 TimerMode::Once,
64 ),
65 size,
66 velocity: Vec3::new(horizontal.x, vertical, horizontal.y) * 10.0,
67 },
68 Mesh3d(particle.mesh.clone()),
69 MeshMaterial3d(particle.material.clone()),
70 Transform {
71 translation,
72 scale: Vec3::splat(size),
73 ..Default::default()
74 },
75 ));
76 }
77 Ok(())
78}330fn observe_on_step(
331 step: On<Step>,
332 particle: Res<ParticleAssets>,
333 mut commands: Commands,
334 transforms: Query<&GlobalTransform>,
335 mut seeded_rng: ResMut<SeededRng>,
336) -> Result {
337 let translation = transforms.get(step.trigger().target)?.translation();
338 // Spawn a bunch of particles.
339 for _ in 0..14 {
340 let horizontal = seeded_rng.0.random::<Dir2>() * seeded_rng.0.random_range(8.0..12.0);
341 let vertical = seeded_rng.0.random_range(0.0..4.0);
342 let size = seeded_rng.0.random_range(0.2..1.0);
343
344 commands.spawn((
345 Particle {
346 lifetime_timer: Timer::from_seconds(
347 seeded_rng.0.random_range(0.2..0.6),
348 TimerMode::Once,
349 ),
350 size,
351 velocity: Vec3::new(horizontal.x, vertical, horizontal.y) * 10.0,
352 },
353 Mesh3d(particle.mesh.clone()),
354 MeshMaterial3d(particle.material.clone()),
355 Transform {
356 translation,
357 scale: Vec3::splat(size),
358 ..Default::default()
359 },
360 ));
361 }
362 Ok(())
363}247fn example_control_system(
248 mut materials: ResMut<Assets<StandardMaterial>>,
249 controllable: Query<(&MeshMaterial3d<StandardMaterial>, &ExampleControls)>,
250 camera: Single<
251 (
252 Entity,
253 &mut Camera,
254 &mut Transform,
255 &GlobalTransform,
256 Has<Hdr>,
257 ),
258 With<Camera3d>,
259 >,
260 mut labels: Query<(&mut Node, &ExampleLabel)>,
261 mut display: Single<&mut Text, With<ExampleDisplay>>,
262 labeled: Query<&GlobalTransform>,
263 mut state: Local<ExampleState>,
264 time: Res<Time>,
265 input: Res<ButtonInput<KeyCode>>,
266 mut commands: Commands,
267) {
268 if input.pressed(KeyCode::ArrowUp) {
269 state.alpha = (state.alpha + time.delta_secs()).min(1.0);
270 } else if input.pressed(KeyCode::ArrowDown) {
271 state.alpha = (state.alpha - time.delta_secs()).max(0.0);
272 }
273
274 if input.just_pressed(KeyCode::Space) {
275 state.unlit = !state.unlit;
276 }
277
278 let randomize_colors = input.just_pressed(KeyCode::KeyC);
279
280 for (material_handle, controls) in &controllable {
281 let mut material = materials.get_mut(material_handle).unwrap();
282
283 if controls.color && randomize_colors {
284 material.base_color = Srgba {
285 red: random(),
286 green: random(),
287 blue: random(),
288 alpha: state.alpha,
289 }
290 .into();
291 } else {
292 material.base_color.set_alpha(state.alpha);
293 }
294
295 if controls.unlit {
296 material.unlit = state.unlit;
297 }
298 }
299
300 let (entity, camera, mut camera_transform, camera_global_transform, hdr) = camera.into_inner();
301
302 if input.just_pressed(KeyCode::KeyH) {
303 if hdr {
304 commands.entity(entity).remove::<Hdr>();
305 } else {
306 commands.entity(entity).insert(Hdr);
307 }
308 }
309
310 let rotation = if input.pressed(KeyCode::ArrowLeft) {
311 time.delta_secs()
312 } else if input.pressed(KeyCode::ArrowRight) {
313 -time.delta_secs()
314 } else {
315 0.0
316 };
317
318 camera_transform.rotate_around(Vec3::ZERO, Quat::from_rotation_y(rotation));
319
320 for (mut node, label) in &mut labels {
321 let world_position = labeled.get(label.entity).unwrap().translation() + Vec3::Y;
322
323 let viewport_position = camera
324 .world_to_viewport(camera_global_transform, world_position)
325 .unwrap();
326
327 node.top = px(viewport_position.y);
328 node.left = px(viewport_position.x);
329 }
330
331 display.0 = format!(
332 " HDR: {}\nAlpha: {:.2}",
333 if hdr { "ON " } else { "OFF" },
334 state.alpha
335 );
336}pub fn translation_vec3a(&self) -> Vec3A
pub fn translation_vec3a(&self) -> Vec3A
Get the translation as a Vec3A.
Examples found in repository?
357fn draw_gizmos(mut gizmos: Gizmos, spotlight: Query<(&GlobalTransform, &SpotLight, &Visibility)>) {
358 if let Ok((global_transform, spotlight, visibility)) = spotlight.single()
359 && visibility != Visibility::Hidden
360 {
361 gizmos.primitive_3d(
362 &Cone::new(7.0 * spotlight.outer_angle, 7.0),
363 Isometry3d {
364 rotation: global_transform.rotation() * Quat::from_rotation_x(FRAC_PI_2),
365 translation: global_transform.translation_vec3a() * 0.5,
366 },
367 YELLOW,
368 );
369 }
370}More examples
263fn draw_gizmos(mut gizmos: Gizmos, decals: Query<&GlobalTransform, With<ClusteredDecal>>) {
264 for global_transform in &decals {
265 gizmos.primitive_3d(
266 &Cuboid {
267 // Since the clustered decal is a 1×1×1 cube in model space, its
268 // half-size is half of the scaling part of its transform.
269 half_size: global_transform.scale() * 0.5,
270 },
271 Isometry3d {
272 rotation: global_transform.rotation(),
273 translation: global_transform.translation_vec3a(),
274 },
275 GOLD,
276 );
277 }
278}311fn draw_gizmos(
312 mut gizmos: Gizmos,
313 decals: Query<(&GlobalTransform, &Selection), With<ClusteredDecal>>,
314) {
315 for (global_transform, selection) in &decals {
316 let color = match *selection {
317 Selection::Camera => continue,
318 Selection::DecalA => ORANGE_RED,
319 Selection::DecalB => LIME,
320 };
321
322 gizmos.primitive_3d(
323 &Cuboid {
324 // Since the clustered decal is a 1×1×1 cube in model space, its
325 // half-size is half of the scaling part of its transform.
326 half_size: global_transform.scale() * 0.5,
327 },
328 Isometry3d {
329 rotation: global_transform.rotation(),
330 translation: global_transform.translation_vec3a(),
331 },
332 color,
333 );
334 }
335}pub fn rotation(&self) -> Quat
pub fn rotation(&self) -> Quat
Get the rotation as a Quat.
The transform is expected to be non-degenerate and without shearing, or the output will be invalid.
§Warning
This is calculated using to_scale_rotation_translation, meaning that you
should probably use it directly if you also need translation or scale.
Examples found in repository?
357fn draw_gizmos(mut gizmos: Gizmos, spotlight: Query<(&GlobalTransform, &SpotLight, &Visibility)>) {
358 if let Ok((global_transform, spotlight, visibility)) = spotlight.single()
359 && visibility != Visibility::Hidden
360 {
361 gizmos.primitive_3d(
362 &Cone::new(7.0 * spotlight.outer_angle, 7.0),
363 Isometry3d {
364 rotation: global_transform.rotation() * Quat::from_rotation_x(FRAC_PI_2),
365 translation: global_transform.translation_vec3a() * 0.5,
366 },
367 YELLOW,
368 );
369 }
370}More examples
263fn draw_gizmos(mut gizmos: Gizmos, decals: Query<&GlobalTransform, With<ClusteredDecal>>) {
264 for global_transform in &decals {
265 gizmos.primitive_3d(
266 &Cuboid {
267 // Since the clustered decal is a 1×1×1 cube in model space, its
268 // half-size is half of the scaling part of its transform.
269 half_size: global_transform.scale() * 0.5,
270 },
271 Isometry3d {
272 rotation: global_transform.rotation(),
273 translation: global_transform.translation_vec3a(),
274 },
275 GOLD,
276 );
277 }
278}346fn draw_camera_gizmo(cameras: Query<(&Camera, &GlobalTransform)>, mut gizmos: Gizmos) {
347 for (camera, transform) in &cameras {
348 // As above, we use the order as a cheap tag to tell the depth texture
349 // apart from the main texture.
350 if camera.order >= 0 {
351 continue;
352 }
353
354 // Draw a cone representing the camera.
355 gizmos.primitive_3d(
356 &Cone {
357 radius: 1.0,
358 height: 3.0,
359 },
360 Isometry3d::new(
361 transform.translation(),
362 // We have to rotate here because `Cone` primitives are oriented
363 // along +Y and cameras point along +Z.
364 transform.rotation() * Quat::from_rotation_x(FRAC_PI_2),
365 ),
366 LIME,
367 );
368 }
369}311fn draw_gizmos(
312 mut gizmos: Gizmos,
313 decals: Query<(&GlobalTransform, &Selection), With<ClusteredDecal>>,
314) {
315 for (global_transform, selection) in &decals {
316 let color = match *selection {
317 Selection::Camera => continue,
318 Selection::DecalA => ORANGE_RED,
319 Selection::DecalB => LIME,
320 };
321
322 gizmos.primitive_3d(
323 &Cuboid {
324 // Since the clustered decal is a 1×1×1 cube in model space, its
325 // half-size is half of the scaling part of its transform.
326 half_size: global_transform.scale() * 0.5,
327 },
328 Isometry3d {
329 rotation: global_transform.rotation(),
330 translation: global_transform.translation_vec3a(),
331 },
332 color,
333 );
334 }
335}pub fn scale(&self) -> Vec3
pub fn scale(&self) -> Vec3
Get the scale as a Vec3.
The transform is expected to be non-degenerate and without shearing, or the output will be invalid.
Some of the computations overlap with to_scale_rotation_translation, which means you should use
it instead if you also need rotation.
Examples found in repository?
263fn draw_gizmos(mut gizmos: Gizmos, decals: Query<&GlobalTransform, With<ClusteredDecal>>) {
264 for global_transform in &decals {
265 gizmos.primitive_3d(
266 &Cuboid {
267 // Since the clustered decal is a 1×1×1 cube in model space, its
268 // half-size is half of the scaling part of its transform.
269 half_size: global_transform.scale() * 0.5,
270 },
271 Isometry3d {
272 rotation: global_transform.rotation(),
273 translation: global_transform.translation_vec3a(),
274 },
275 GOLD,
276 );
277 }
278}More examples
311fn draw_gizmos(
312 mut gizmos: Gizmos,
313 decals: Query<(&GlobalTransform, &Selection), With<ClusteredDecal>>,
314) {
315 for (global_transform, selection) in &decals {
316 let color = match *selection {
317 Selection::Camera => continue,
318 Selection::DecalA => ORANGE_RED,
319 Selection::DecalB => LIME,
320 };
321
322 gizmos.primitive_3d(
323 &Cuboid {
324 // Since the clustered decal is a 1×1×1 cube in model space, its
325 // half-size is half of the scaling part of its transform.
326 half_size: global_transform.scale() * 0.5,
327 },
328 Isometry3d {
329 rotation: global_transform.rotation(),
330 translation: global_transform.translation_vec3a(),
331 },
332 color,
333 );
334 }
335}pub fn radius_vec3a(&self, extents: Vec3A) -> f32
pub fn radius_vec3a(&self, extents: Vec3A) -> f32
Get an upper bound of the radius from the given extents.
Examples found in repository?
154fn setup_scene_after_load(
155 mut commands: Commands,
156 mut setup: Local<bool>,
157 mut scene_handle: ResMut<SceneHandle>,
158 asset_server: Res<AssetServer>,
159 args: Res<Args>,
160 meshes: Query<(&GlobalTransform, Option<&Aabb>), With<Mesh3d>>,
161) {
162 if scene_handle.is_loaded && !*setup {
163 *setup = true;
164 // Find an approximate bounding box of the scene from its meshes
165 if meshes.iter().any(|(_, maybe_aabb)| maybe_aabb.is_none()) {
166 return;
167 }
168
169 let mut min = Vec3A::splat(f32::MAX);
170 let mut max = Vec3A::splat(f32::MIN);
171 for (transform, maybe_aabb) in &meshes {
172 let aabb = maybe_aabb.unwrap();
173 // If the Aabb had not been rotated, applying the non-uniform scale would produce the
174 // correct bounds. However, it could very well be rotated and so we first convert to
175 // a Sphere, and then back to an Aabb to find the conservative min and max points.
176 let sphere = Sphere {
177 center: Vec3A::from(transform.transform_point(Vec3::from(aabb.center))),
178 radius: transform.radius_vec3a(aabb.half_extents),
179 };
180 let aabb = Aabb::from(sphere);
181 min = min.min(aabb.min());
182 max = max.max(aabb.max());
183 }
184
185 let size = (max - min).length();
186 let aabb = Aabb::from_min_max(Vec3::from(min), Vec3::from(max));
187
188 info!("Spawning a controllable 3D perspective camera");
189 let mut projection = PerspectiveProjection::default();
190 projection.far = projection.far.max(size * 10.0);
191
192 let walk_speed = size * 3.0;
193 let camera_controller = FreeCamera {
194 walk_speed,
195 run_speed: 3.0 * walk_speed,
196 ..default()
197 };
198 // Display the controls of the scene viewer
199 info!("{}", camera_controller);
200 info!("{}", *scene_handle);
201
202 let mut camera = commands.spawn((
203 Camera3d::default(),
204 Projection::from(projection),
205 Transform::from_translation(
206 Vec3::from(aabb.center) + size * (args.rotation() * Vec3::new(0.5, 0.25, 0.5)),
207 )
208 .looking_at(Vec3::from(aabb.center), Vec3::Y),
209 Camera {
210 is_active: false,
211 ..default()
212 },
213 EnvironmentMapLight {
214 diffuse_map: asset_server
215 .load("assets/environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
216 specular_map: asset_server
217 .load("assets/environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
218 intensity: 150.0,
219 rotation: args.rotation(),
220 ..default()
221 },
222 camera_controller,
223 ));
224
225 // If occlusion culling was requested, include the relevant components.
226 // The Z-prepass is currently required.
227 if args.occlusion_culling == Some(true) {
228 camera.insert((DepthPrepass, OcclusionCulling));
229 }
230
231 // If the depth prepass was requested, include it.
232 if args.depth_prepass == Some(true) {
233 camera.insert(DepthPrepass);
234 }
235
236 // If deferred shading was requested, include the prepass.
237 if args.deferred == Some(true) {
238 camera
239 .insert(Msaa::Off)
240 .insert(DepthPrepass)
241 .insert(DeferredPrepass);
242 }
243
244 // Spawn a default light if the scene does not have one
245 if !scene_handle.has_light || args.add_light == Some(true) {
246 info!("Spawning a directional light");
247 let mut light = commands.spawn((
248 DirectionalLight::default(),
249 Transform::from_translation(args.rotation() * Vec3::new(1.0, 1.0, 0.0))
250 .looking_at(Vec3::ZERO, Vec3::Y),
251 ));
252 if args.occlusion_culling == Some(true) {
253 light.insert(OcclusionCulling);
254 }
255
256 scene_handle.has_light = true;
257 }
258 }
259}pub fn transform_point(&self, point: Vec3) -> Vec3
pub fn transform_point(&self, point: Vec3) -> Vec3
Transforms the given point from local space to global space, applying shear, scale, rotation and translation.
It can be used like this:
let global_transform = GlobalTransform::from_xyz(1., 2., 3.);
let local_point = Vec3::new(1., 2., 3.);
let global_point = global_transform.transform_point(local_point);
assert_eq!(global_point, Vec3::new(2., 4., 6.));let global_point = Vec3::new(2., 4., 6.);
let global_transform = GlobalTransform::from_xyz(1., 2., 3.);
let local_point = global_transform.affine().inverse().transform_point3(global_point);
assert_eq!(local_point, Vec3::new(1., 2., 3.))To apply shear, scale, and rotation without applying translation, different functions are available:
let global_transform = GlobalTransform::from_xyz(1., 2., 3.);
let local_direction = Vec3::new(1., 2., 3.);
let global_direction = global_transform.affine().transform_vector3(local_direction);
assert_eq!(global_direction, Vec3::new(1., 2., 3.));
let roundtripped_local_direction = global_transform.affine().inverse().transform_vector3(global_direction);
assert_eq!(roundtripped_local_direction, local_direction);Examples found in repository?
528fn create_cubes(
529 image_assets: Res<Assets<Image>>,
530 mut commands: Commands,
531 irradiance_volumes: Query<(&IrradianceVolume, &GlobalTransform)>,
532 voxel_cube_parents: Query<Entity, With<VoxelCubeParent>>,
533 voxel_cubes: Query<Entity, With<VoxelCube>>,
534 example_assets: Res<ExampleAssets>,
535 mut voxel_visualization_material_assets: ResMut<Assets<VoxelVisualizationMaterial>>,
536) {
537 // If voxel cubes have already been spawned, don't do anything.
538 if !voxel_cubes.is_empty() {
539 return;
540 }
541
542 let Some(voxel_cube_parent) = voxel_cube_parents.iter().next() else {
543 return;
544 };
545
546 for (irradiance_volume, global_transform) in irradiance_volumes.iter() {
547 let Some(image) = image_assets.get(&irradiance_volume.voxels) else {
548 continue;
549 };
550
551 let resolution = image.texture_descriptor.size;
552
553 let voxel_cube_material = voxel_visualization_material_assets.add(ExtendedMaterial {
554 base: StandardMaterial::from(Color::from(RED)),
555 extension: VoxelVisualizationExtension {
556 irradiance_volume_info: VoxelVisualizationIrradianceVolumeInfo {
557 world_from_voxel: VOXEL_FROM_WORLD.inverse(),
558 voxel_from_world: VOXEL_FROM_WORLD,
559 resolution: uvec3(
560 resolution.width,
561 resolution.height,
562 resolution.depth_or_array_layers,
563 ),
564 intensity: IRRADIANCE_VOLUME_INTENSITY,
565 },
566 },
567 });
568
569 let scale = vec3(
570 1.0 / resolution.width as f32,
571 1.0 / resolution.height as f32,
572 1.0 / resolution.depth_or_array_layers as f32,
573 );
574
575 // Spawn a cube for each voxel.
576 for z in 0..resolution.depth_or_array_layers {
577 for y in 0..resolution.height {
578 for x in 0..resolution.width {
579 let uvw = (uvec3(x, y, z).as_vec3() + 0.5) * scale - 0.5;
580 let pos = global_transform.transform_point(uvw);
581 let voxel_cube = commands
582 .spawn((
583 Mesh3d(example_assets.voxel_cube.clone()),
584 MeshMaterial3d(voxel_cube_material.clone()),
585 Transform::from_scale(Vec3::splat(VOXEL_CUBE_SCALE))
586 .with_translation(pos),
587 ))
588 .insert(VoxelCube)
589 .insert(NotShadowCaster)
590 .id();
591
592 commands.entity(voxel_cube_parent).add_child(voxel_cube);
593 }
594 }
595 }
596 }
597}More examples
154fn setup_scene_after_load(
155 mut commands: Commands,
156 mut setup: Local<bool>,
157 mut scene_handle: ResMut<SceneHandle>,
158 asset_server: Res<AssetServer>,
159 args: Res<Args>,
160 meshes: Query<(&GlobalTransform, Option<&Aabb>), With<Mesh3d>>,
161) {
162 if scene_handle.is_loaded && !*setup {
163 *setup = true;
164 // Find an approximate bounding box of the scene from its meshes
165 if meshes.iter().any(|(_, maybe_aabb)| maybe_aabb.is_none()) {
166 return;
167 }
168
169 let mut min = Vec3A::splat(f32::MAX);
170 let mut max = Vec3A::splat(f32::MIN);
171 for (transform, maybe_aabb) in &meshes {
172 let aabb = maybe_aabb.unwrap();
173 // If the Aabb had not been rotated, applying the non-uniform scale would produce the
174 // correct bounds. However, it could very well be rotated and so we first convert to
175 // a Sphere, and then back to an Aabb to find the conservative min and max points.
176 let sphere = Sphere {
177 center: Vec3A::from(transform.transform_point(Vec3::from(aabb.center))),
178 radius: transform.radius_vec3a(aabb.half_extents),
179 };
180 let aabb = Aabb::from(sphere);
181 min = min.min(aabb.min());
182 max = max.max(aabb.max());
183 }
184
185 let size = (max - min).length();
186 let aabb = Aabb::from_min_max(Vec3::from(min), Vec3::from(max));
187
188 info!("Spawning a controllable 3D perspective camera");
189 let mut projection = PerspectiveProjection::default();
190 projection.far = projection.far.max(size * 10.0);
191
192 let walk_speed = size * 3.0;
193 let camera_controller = FreeCamera {
194 walk_speed,
195 run_speed: 3.0 * walk_speed,
196 ..default()
197 };
198 // Display the controls of the scene viewer
199 info!("{}", camera_controller);
200 info!("{}", *scene_handle);
201
202 let mut camera = commands.spawn((
203 Camera3d::default(),
204 Projection::from(projection),
205 Transform::from_translation(
206 Vec3::from(aabb.center) + size * (args.rotation() * Vec3::new(0.5, 0.25, 0.5)),
207 )
208 .looking_at(Vec3::from(aabb.center), Vec3::Y),
209 Camera {
210 is_active: false,
211 ..default()
212 },
213 EnvironmentMapLight {
214 diffuse_map: asset_server
215 .load("assets/environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
216 specular_map: asset_server
217 .load("assets/environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
218 intensity: 150.0,
219 rotation: args.rotation(),
220 ..default()
221 },
222 camera_controller,
223 ));
224
225 // If occlusion culling was requested, include the relevant components.
226 // The Z-prepass is currently required.
227 if args.occlusion_culling == Some(true) {
228 camera.insert((DepthPrepass, OcclusionCulling));
229 }
230
231 // If the depth prepass was requested, include it.
232 if args.depth_prepass == Some(true) {
233 camera.insert(DepthPrepass);
234 }
235
236 // If deferred shading was requested, include the prepass.
237 if args.deferred == Some(true) {
238 camera
239 .insert(Msaa::Off)
240 .insert(DepthPrepass)
241 .insert(DeferredPrepass);
242 }
243
244 // Spawn a default light if the scene does not have one
245 if !scene_handle.has_light || args.add_light == Some(true) {
246 info!("Spawning a directional light");
247 let mut light = commands.spawn((
248 DirectionalLight::default(),
249 Transform::from_translation(args.rotation() * Vec3::new(1.0, 1.0, 0.0))
250 .looking_at(Vec3::ZERO, Vec3::Y),
251 ));
252 if args.occlusion_culling == Some(true) {
253 light.insert(OcclusionCulling);
254 }
255
256 scene_handle.has_light = true;
257 }
258 }
259}pub fn mul_transform(&self, transform: Transform) -> GlobalTransform
pub fn mul_transform(&self, transform: Transform) -> GlobalTransform
Multiplies self with transform component by component, returning the
resulting GlobalTransform
Trait Implementations§
§impl Clone for GlobalTransform
impl Clone for GlobalTransform
§fn clone(&self) -> GlobalTransform
fn clone(&self) -> GlobalTransform
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl Component for GlobalTransform
impl Component for GlobalTransform
§const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::Table
const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::Table
§type Mutability = Mutable
type Mutability = Mutable
Component<Mutability = Mutable>,
while immutable components will instead have Component<Mutability = Immutable>. Read more§fn register_required_components(
_requiree: ComponentId,
required_components: &mut RequiredComponentsRegistrator<'_, '_>,
)
fn register_required_components( _requiree: ComponentId, required_components: &mut RequiredComponentsRegistrator<'_, '_>, )
§fn clone_behavior() -> ComponentCloneBehavior
fn clone_behavior() -> ComponentCloneBehavior
§fn relationship_accessor() -> Option<ComponentRelationshipAccessor<GlobalTransform>>
fn relationship_accessor() -> Option<ComponentRelationshipAccessor<GlobalTransform>>
ComponentRelationshipAccessor required for working with relationships in dynamic contexts. Read moreSource§fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_discard() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_discard() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn map_entities<E>(_this: &mut Self, _mapper: &mut E)where
E: EntityMapper,
fn map_entities<E>(_this: &mut Self, _mapper: &mut E)where
E: EntityMapper,
EntityMapper. This is used to remap entities in contexts like scenes and entity cloning.
When deriving Component, this is populated by annotating fields containing entities with #[entities] Read more§impl Debug for GlobalTransform
impl Debug for GlobalTransform
§impl Default for GlobalTransform
impl Default for GlobalTransform
§fn default() -> GlobalTransform
fn default() -> GlobalTransform
§impl<'de> Deserialize<'de> for GlobalTransform
impl<'de> Deserialize<'de> for GlobalTransform
§fn deserialize<__D>(
__deserializer: __D,
) -> Result<GlobalTransform, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<GlobalTransform, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
§impl From<Affine3A> for GlobalTransform
impl From<Affine3A> for GlobalTransform
§fn from(value: Affine3A) -> GlobalTransform
fn from(value: Affine3A) -> GlobalTransform
§impl From<GlobalTransform> for Transform
The transform is expected to be non-degenerate and without shearing, or the output
will be invalid.
impl From<GlobalTransform> for Transform
The transform is expected to be non-degenerate and without shearing, or the output will be invalid.
§fn from(transform: GlobalTransform) -> Transform
fn from(transform: GlobalTransform) -> Transform
§impl From<Mat4> for GlobalTransform
impl From<Mat4> for GlobalTransform
§fn from(world_from_local: Mat4) -> GlobalTransform
fn from(world_from_local: Mat4) -> GlobalTransform
§impl From<Transform> for GlobalTransform
impl From<Transform> for GlobalTransform
§fn from(transform: Transform) -> GlobalTransform
fn from(transform: Transform) -> GlobalTransform
§impl FromArg for GlobalTransform
impl FromArg for GlobalTransform
§impl FromReflect for GlobalTransform
impl FromReflect for GlobalTransform
§fn from_reflect(
reflect: &(dyn PartialReflect + 'static),
) -> Option<GlobalTransform>
fn from_reflect( reflect: &(dyn PartialReflect + 'static), ) -> Option<GlobalTransform>
Self from a reflected value.§fn take_from_reflect(
reflect: Box<dyn PartialReflect>,
) -> Result<Self, Box<dyn PartialReflect>>
fn take_from_reflect( reflect: Box<dyn PartialReflect>, ) -> Result<Self, Box<dyn PartialReflect>>
Self using,
constructing the value using from_reflect if that fails. Read more§impl GetOwnership for GlobalTransform
impl GetOwnership for GlobalTransform
§impl GetTypeRegistration for GlobalTransform
impl GetTypeRegistration for GlobalTransform
§fn get_type_registration() -> TypeRegistration
fn get_type_registration() -> TypeRegistration
TypeRegistration for this type.§fn register_type_dependencies(registry: &mut TypeRegistry)
fn register_type_dependencies(registry: &mut TypeRegistry)
§impl IntoReturn for GlobalTransform
impl IntoReturn for GlobalTransform
§fn into_return<'into_return>(self) -> Return<'into_return>where
GlobalTransform: 'into_return,
fn into_return<'into_return>(self) -> Return<'into_return>where
GlobalTransform: 'into_return,
§impl Mul<GlobalTransform> for Transform
impl Mul<GlobalTransform> for Transform
§type Output = GlobalTransform
type Output = GlobalTransform
* operator.§fn mul(
self,
global_transform: GlobalTransform,
) -> <Transform as Mul<GlobalTransform>>::Output
fn mul( self, global_transform: GlobalTransform, ) -> <Transform as Mul<GlobalTransform>>::Output
* operation. Read more§impl Mul<Transform> for GlobalTransform
impl Mul<Transform> for GlobalTransform
§impl Mul<Vec3> for GlobalTransform
impl Mul<Vec3> for GlobalTransform
§impl Mul for GlobalTransform
impl Mul for GlobalTransform
§type Output = GlobalTransform
type Output = GlobalTransform
* operator.§fn mul(
self,
global_transform: GlobalTransform,
) -> <GlobalTransform as Mul>::Output
fn mul( self, global_transform: GlobalTransform, ) -> <GlobalTransform as Mul>::Output
* operation. Read more§impl PartialEq for GlobalTransform
impl PartialEq for GlobalTransform
§impl PartialReflect for GlobalTransform
impl PartialReflect for GlobalTransform
§fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
§fn try_apply(
&mut self,
value: &(dyn PartialReflect + 'static),
) -> Result<(), ApplyError>
fn try_apply( &mut self, value: &(dyn PartialReflect + 'static), ) -> Result<(), ApplyError>
§fn reflect_kind(&self) -> ReflectKind
fn reflect_kind(&self) -> ReflectKind
§fn reflect_ref(&self) -> ReflectRef<'_>
fn reflect_ref(&self) -> ReflectRef<'_>
§fn reflect_mut(&mut self) -> ReflectMut<'_>
fn reflect_mut(&mut self) -> ReflectMut<'_>
§fn reflect_owned(self: Box<GlobalTransform>) -> ReflectOwned
fn reflect_owned(self: Box<GlobalTransform>) -> ReflectOwned
§fn try_into_reflect(
self: Box<GlobalTransform>,
) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
fn try_into_reflect( self: Box<GlobalTransform>, ) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
§fn try_as_reflect(&self) -> Option<&(dyn Reflect + 'static)>
fn try_as_reflect(&self) -> Option<&(dyn Reflect + 'static)>
§fn try_as_reflect_mut(&mut self) -> Option<&mut (dyn Reflect + 'static)>
fn try_as_reflect_mut(&mut self) -> Option<&mut (dyn Reflect + 'static)>
§fn into_partial_reflect(self: Box<GlobalTransform>) -> Box<dyn PartialReflect>
fn into_partial_reflect(self: Box<GlobalTransform>) -> Box<dyn PartialReflect>
§fn as_partial_reflect(&self) -> &(dyn PartialReflect + 'static)
fn as_partial_reflect(&self) -> &(dyn PartialReflect + 'static)
§fn as_partial_reflect_mut(&mut self) -> &mut (dyn PartialReflect + 'static)
fn as_partial_reflect_mut(&mut self) -> &mut (dyn PartialReflect + 'static)
§fn reflect_partial_eq(
&self,
value: &(dyn PartialReflect + 'static),
) -> Option<bool>
fn reflect_partial_eq( &self, value: &(dyn PartialReflect + 'static), ) -> Option<bool>
§fn reflect_partial_cmp(
&self,
value: &(dyn PartialReflect + 'static),
) -> Option<Ordering>
fn reflect_partial_cmp( &self, value: &(dyn PartialReflect + 'static), ) -> Option<Ordering>
§fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
§fn reflect_clone(&self) -> Result<Box<dyn Reflect>, ReflectCloneError>
fn reflect_clone(&self) -> Result<Box<dyn Reflect>, ReflectCloneError>
Self using reflection. Read more§fn apply(&mut self, value: &(dyn PartialReflect + 'static))
fn apply(&mut self, value: &(dyn PartialReflect + 'static))
§fn to_dynamic(&self) -> Box<dyn PartialReflect>
fn to_dynamic(&self) -> Box<dyn PartialReflect>
§fn reflect_clone_and_take<T>(&self) -> Result<T, ReflectCloneError>
fn reflect_clone_and_take<T>(&self) -> Result<T, ReflectCloneError>
PartialReflect, combines reflect_clone and
take in a useful fashion, automatically constructing an appropriate
ReflectCloneError if the downcast fails.§fn reflect_hash(&self) -> Option<u64>
fn reflect_hash(&self) -> Option<u64>
§fn is_dynamic(&self) -> bool
fn is_dynamic(&self) -> bool
§impl Reflect for GlobalTransform
impl Reflect for GlobalTransform
§fn into_any(self: Box<GlobalTransform>) -> Box<dyn Any>
fn into_any(self: Box<GlobalTransform>) -> Box<dyn Any>
Box<dyn Any>. Read more§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut dyn Any. Read more§fn into_reflect(self: Box<GlobalTransform>) -> Box<dyn Reflect>
fn into_reflect(self: Box<GlobalTransform>) -> Box<dyn Reflect>
§fn as_reflect(&self) -> &(dyn Reflect + 'static)
fn as_reflect(&self) -> &(dyn Reflect + 'static)
§fn as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)
fn as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)
§impl Serialize for GlobalTransform
impl Serialize for GlobalTransform
§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
§impl TransformPoint for GlobalTransform
impl TransformPoint for GlobalTransform
§fn transform_point(&self, point: impl Into<Vec3>) -> Vec3
fn transform_point(&self, point: impl Into<Vec3>) -> Vec3
§impl TupleStruct for GlobalTransform
impl TupleStruct for GlobalTransform
§fn field(&self, index: usize) -> Option<&(dyn PartialReflect + 'static)>
fn field(&self, index: usize) -> Option<&(dyn PartialReflect + 'static)>
index as a
&dyn Reflect.§fn field_mut(
&mut self,
index: usize,
) -> Option<&mut (dyn PartialReflect + 'static)>
fn field_mut( &mut self, index: usize, ) -> Option<&mut (dyn PartialReflect + 'static)>
index
as a &mut dyn Reflect.§fn iter_fields(&self) -> TupleStructFieldIter<'_> ⓘ
fn iter_fields(&self) -> TupleStructFieldIter<'_> ⓘ
§fn to_dynamic_tuple_struct(&self) -> DynamicTupleStruct
fn to_dynamic_tuple_struct(&self) -> DynamicTupleStruct
DynamicTupleStruct from this tuple struct.§fn get_represented_tuple_struct_info(&self) -> Option<&'static TupleStructInfo>
fn get_represented_tuple_struct_info(&self) -> Option<&'static TupleStructInfo>
None if TypeInfo is not available.§impl TypePath for GlobalTransform
impl TypePath for GlobalTransform
§fn short_type_path() -> &'static str
fn short_type_path() -> &'static str
§fn type_ident() -> Option<&'static str>
fn type_ident() -> Option<&'static str>
§fn crate_name() -> Option<&'static str>
fn crate_name() -> Option<&'static str>
§impl Typed for GlobalTransform
impl Typed for GlobalTransform
impl Copy for GlobalTransform
impl StructuralPartialEq for GlobalTransform
Auto Trait Implementations§
impl Freeze for GlobalTransform
impl RefUnwindSafe for GlobalTransform
impl Send for GlobalTransform
impl Sync for GlobalTransform
impl Unpin for GlobalTransform
impl UnsafeUnpin for GlobalTransform
impl UnwindSafe for GlobalTransform
Blanket Implementations§
§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<C> Bundle for Cwhere
C: Component,
impl<C> Bundle for Cwhere
C: Component,
fn component_ids( components: &mut ComponentsRegistrator<'_>, ) -> impl Iterator<Item = ComponentId> + use<C>
Source§fn get_component_ids(
components: &Components,
) -> impl Iterator<Item = Option<ComponentId>>
fn get_component_ids( components: &Components, ) -> impl Iterator<Item = Option<ComponentId>>
Source§impl<C> BundleFromComponents for Cwhere
C: Component,
impl<C> BundleFromComponents for Cwhere
C: Component,
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<C> DynamicBundle for Cwhere
C: Component,
impl<C> DynamicBundle for Cwhere
C: Component,
Source§unsafe fn get_components(
ptr: MovingPtr<'_, C>,
func: &mut impl FnMut(StorageType, OwningPtr<'_>),
) -> <C as DynamicBundle>::Effect
unsafe fn get_components( ptr: MovingPtr<'_, C>, func: &mut impl FnMut(StorageType, OwningPtr<'_>), ) -> <C as DynamicBundle>::Effect
Source§unsafe fn apply_effect(
_ptr: MovingPtr<'_, MaybeUninit<C>>,
_entity: &mut EntityWorldMut<'_>,
)
unsafe fn apply_effect( _ptr: MovingPtr<'_, MaybeUninit<C>>, _entity: &mut EntityWorldMut<'_>, )
§impl<T> DynamicTypePath for Twhere
T: TypePath,
impl<T> DynamicTypePath for Twhere
T: TypePath,
§fn reflect_type_path(&self) -> &str
fn reflect_type_path(&self) -> &str
TypePath::type_path.§fn reflect_short_type_path(&self) -> &str
fn reflect_short_type_path(&self) -> &str
§fn reflect_type_ident(&self) -> Option<&str>
fn reflect_type_ident(&self) -> Option<&str>
TypePath::type_ident.§fn reflect_crate_name(&self) -> Option<&str>
fn reflect_crate_name(&self) -> Option<&str>
TypePath::crate_name.§fn reflect_module_path(&self) -> Option<&str>
fn reflect_module_path(&self) -> Option<&str>
§impl<T> DynamicTyped for Twhere
T: Typed,
impl<T> DynamicTyped for Twhere
T: Typed,
§fn reflect_type_info(&self) -> &'static TypeInfo
fn reflect_type_info(&self) -> &'static TypeInfo
Typed::type_info.Source§impl<T> ErasedTemplate for T
impl<T> ErasedTemplate for T
Source§fn apply(&self, context: &mut TemplateContext<'_, '_>) -> Result<(), BevyError>
fn apply(&self, context: &mut TemplateContext<'_, '_>) -> Result<(), BevyError>
entity.Source§fn clone_template(&self) -> Box<dyn ErasedTemplate>
fn clone_template(&self) -> Box<dyn ErasedTemplate>
Clone.§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> FromTemplate for T
impl<T> FromTemplate for T
Source§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
Source§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self using default().
§impl<T> GetPath for T
impl<T> GetPath for T
§fn reflect_path<'p>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path<'p>( &self, path: impl ReflectPath<'p>, ) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
path. Read more§fn reflect_path_mut<'p>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p>, ) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
path. Read more§fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
path. Read more§fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
path. Read more§impl<S> GetTupleStructField for Swhere
S: TupleStruct,
impl<S> GetTupleStructField for Swhere
S: TupleStruct,
§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
§impl<T> InitializeFromFunction<T> for T
impl<T> InitializeFromFunction<T> for T
§fn initialize_from_function(f: fn() -> T) -> T
fn initialize_from_function(f: fn() -> T) -> T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> NoneValue for Twhere
T: Default,
impl<T> NoneValue for Twhere
T: Default,
type NoneType = T
§fn null_value() -> T
fn null_value() -> T
Source§impl<G> PatchFromTemplate for Gwhere
G: FromTemplate,
impl<G> PatchFromTemplate for Gwhere
G: FromTemplate,
Source§fn patch<F>(func: F) -> TemplatePatch<F, <G as PatchFromTemplate>::Template>
fn patch<F>(func: F) -> TemplatePatch<F, <G as PatchFromTemplate>::Template>
func, and turns it into a TemplatePatch.Source§impl<T> PatchTemplate for Twhere
T: Template,
impl<T> PatchTemplate for Twhere
T: Template,
Source§fn patch_template<F>(func: F) -> TemplatePatch<F, T>
fn patch_template<F>(func: F) -> TemplatePatch<F, T>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<T> Serialize for T
impl<T> Serialize for T
fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>
fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>
§impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
§fn super_from(input: T) -> O
fn super_from(input: T) -> O
§impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
§fn super_into(self) -> O
fn super_into(self) -> O
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.Source§impl<T> Template for T
impl<T> Template for T
Source§fn build_template(
&self,
_context: &mut TemplateContext<'_, '_>,
) -> Result<<T as Template>::Output, BevyError>
fn build_template( &self, _context: &mut TemplateContext<'_, '_>, ) -> Result<<T as Template>::Output, BevyError>
entity context to produce a Template::Output.Source§fn clone_template(&self) -> T
fn clone_template(&self) -> T
Clone.