pub struct FilteredEntityMut<'w, 's> { /* private fields */ }Expand description
Provides mutable access to a single entity and some of its components defined by the contained Access.
To define the access when used as a QueryData,
use a QueryBuilder or QueryParamBuilder.
The FilteredEntityMut must be the entire QueryData, and not nested inside a tuple with other data.
// This gives the `FilteredEntityMut` access to `&mut A`.
let mut query = QueryBuilder::<FilteredEntityMut>::new(&mut world)
.data::<&mut A>()
.build();
let mut filtered_entity: FilteredEntityMut = query.single_mut(&mut world).unwrap();
let component: Mut<A> = filtered_entity.get_mut().unwrap();Also see UnsafeFilteredEntityMut for a way to bypass borrow-checker restrictions.
Implementations§
Source§impl<'w, 's> FilteredEntityMut<'w, 's>
impl<'w, 's> FilteredEntityMut<'w, 's>
Sourcepub fn reborrow(&mut self) -> FilteredEntityMut<'_, 's>
pub fn reborrow(&mut self) -> FilteredEntityMut<'_, 's>
Returns a new instance with a shorter lifetime.
This is useful if you have &mut FilteredEntityMut, but you need FilteredEntityMut.
Sourcepub fn into_readonly(self) -> FilteredEntityRef<'w, 's>
pub fn into_readonly(self) -> FilteredEntityRef<'w, 's>
Consumes self and returns read-only access to all of the entity’s
components, with the world 'w lifetime.
Sourcepub fn as_readonly(&self) -> FilteredEntityRef<'_, 's>
pub fn as_readonly(&self) -> FilteredEntityRef<'_, 's>
Gets read-only access to all of the entity’s components.
Sourcepub fn try_into_all(self) -> Result<EntityMut<'w>, TryFromFilteredError>
pub fn try_into_all(self) -> Result<EntityMut<'w>, TryFromFilteredError>
Consumes self and returns mutable access to the entity and all of
its components, with the world 'w lifetime. Returns an error if the
access does not include read and write access to all components.
§Errors
TryFromFilteredError::MissingReadAllAccess- if the access does not include read access to all components.TryFromFilteredError::MissingWriteAllAccess- if the access does not include write access to all components.
Sourcepub fn as_unsafe_entity_cell(&mut self) -> UnsafeEntityCell<'_>
pub fn as_unsafe_entity_cell(&mut self) -> UnsafeEntityCell<'_>
Get access to the underlying UnsafeEntityCell.
Sourcepub fn id(&self) -> Entity
pub fn id(&self) -> Entity
Returns the ID of the current entity.
Examples found in repository?
69fn main() {
70 let mut world = World::new();
71 let mut lines = std::io::stdin().lines();
72 let mut component_names = HashMap::<String, ComponentId>::new();
73 let mut component_info = HashMap::<ComponentId, ComponentInfo>::new();
74 let mut event_names = HashMap::<String, EventKey>::new();
75
76 println!("{PROMPT}");
77 loop {
78 print!("\n> ");
79 let _ = std::io::stdout().flush();
80 let Some(Ok(line)) = lines.next() else {
81 return;
82 };
83
84 if line.is_empty() {
85 return;
86 };
87
88 let Some((first, rest)) = line.trim().split_once(|c: char| c.is_whitespace()) else {
89 match &line.chars().next() {
90 Some('c') => println!("{COMPONENT_PROMPT}"),
91 Some('s') => println!("{ENTITY_PROMPT}"),
92 Some('q') => println!("{QUERY_PROMPT}"),
93 Some('e') => println!("{EVENT_PROMPT}"),
94 Some('t') => println!("{EMIT_PROMPT}"),
95 _ => println!("{PROMPT}"),
96 }
97 continue;
98 };
99
100 match &first[0..1] {
101 "c" => {
102 rest.split(',').for_each(|component| {
103 let mut component = component.split_whitespace();
104 let Some(name) = component.next() else {
105 return;
106 };
107 let size = match component.next().map(str::parse) {
108 Some(Ok(size)) => size,
109 _ => 0,
110 };
111 // Register our new component to the world with a layout specified by it's size
112 // SAFETY: [u64] is Send + Sync
113 let id = world.register_component_with_descriptor(unsafe {
114 ComponentDescriptor::new_with_layout(
115 name.to_string(),
116 StorageType::Table,
117 Layout::array::<u64>(size).unwrap(),
118 None,
119 true,
120 ComponentCloneBehavior::Default,
121 None,
122 )
123 });
124 let Some(info) = world.components().get_info(id) else {
125 return;
126 };
127 component_names.insert(name.to_string(), id);
128 component_info.insert(id, info.clone());
129 println!("Component {} created with id: {}", name, id.index());
130 });
131 }
132 "s" => {
133 let mut to_insert_ids = Vec::new();
134 let mut to_insert_data = Vec::new();
135 rest.split(',').for_each(|component| {
136 let mut component = component.split_whitespace();
137 let Some(name) = component.next() else {
138 return;
139 };
140
141 // Get the id for the component with the given name
142 let Some(&id) = component_names.get(name) else {
143 println!("Component {name} does not exist");
144 return;
145 };
146
147 // Calculate the length for the array based on the layout created for this component id
148 let info = world.components().get_info(id).unwrap();
149 let len = info.layout().size() / size_of::<u64>();
150 let mut values: Vec<u64> = component
151 .take(len)
152 .filter_map(|value| value.parse::<u64>().ok())
153 .collect();
154 values.resize(len, 0);
155
156 // Collect the id and array to be inserted onto our entity
157 to_insert_ids.push(id);
158 to_insert_data.push(values);
159 });
160
161 let mut entity = world.spawn_empty();
162
163 // Construct an `OwningPtr` for each component in `to_insert_data`
164 let to_insert_ptr = to_owning_ptrs(&mut to_insert_data);
165
166 // SAFETY:
167 // - Component ids have been taken from the same world
168 // - Each array is created to the layout specified in the world
169 unsafe {
170 entity.insert_by_ids(&to_insert_ids, to_insert_ptr.into_iter());
171 }
172
173 println!("Entity spawned with id: {}", entity.id());
174 }
175 "q" => {
176 let mut builder = QueryBuilder::<FilteredEntityMut>::new(&mut world);
177 parse_query(rest, &mut builder, &component_names);
178 let mut query = builder.build();
179 query.iter_mut(&mut world).for_each(|filtered_entity| {
180 let terms = filtered_entity
181 .access()
182 .try_iter_access()
183 .unwrap()
184 .map(|component_access| {
185 let id = *component_access.index();
186 let ptr = filtered_entity.get_by_id(id).unwrap();
187 let info = component_info.get(&id).unwrap();
188 let len = info.layout().size() / size_of::<u64>();
189
190 // SAFETY:
191 // - All components are created with layout [u64]
192 // - len is calculated from the component descriptor
193 let data = unsafe {
194 std::slice::from_raw_parts_mut(
195 ptr.assert_unique().as_ptr().cast::<u64>(),
196 len,
197 )
198 };
199
200 // If we have write access, increment each value once
201 if matches!(component_access, ComponentAccessKind::Exclusive(_)) {
202 data.iter_mut().for_each(|data| {
203 *data += 1;
204 });
205 }
206
207 format!("{}: {:?}", info.name(), data[0..len].to_vec())
208 })
209 .collect::<Vec<_>>()
210 .join(", ");
211
212 println!("{}: {}", filtered_entity.id(), terms);
213 });
214 }
215 "e" => {
216 rest.split(',').for_each(|event| {
217 let name = event.trim();
218 if name.is_empty() {
219 return;
220 }
221
222 // Register a ComponentId for this event, no Rust type needed.
223 // SAFETY: ZST with no drop
224 let event_component_id = world.register_component_with_descriptor(unsafe {
225 ComponentDescriptor::new_with_layout(
226 format!("event:{name}"),
227 StorageType::Table,
228 Layout::new::<()>(),
229 None,
230 false,
231 ComponentCloneBehavior::Ignore,
232 None,
233 )
234 });
235 // SAFETY: event_component_id was just registered for this event
236 let event_key = unsafe { EventKey::new(event_component_id) };
237 event_names.insert(name.to_string(), event_key);
238
239 // Build a dynamic observer that prints when the event fires.
240 let runner: ObserverRunner = |mut world, _observer, ctx, _event, _trigger| {
241 println!(" Observer fired!");
242 if let Some(mut counts) = world.get_resource_mut::<EventFireCount>() {
243 *counts.0.entry(ctx.event_key).or_insert(0) += 1;
244 }
245 };
246
247 // SAFETY: event_key was just registered, runner ignores pointers
248 let observer =
249 unsafe { Observer::with_dynamic_runner(runner).with_event_key(event_key) };
250 world.spawn(observer);
251
252 println!(
253 "Event '{name}' registered (key: {}) with a dynamic observer",
254 event_component_id.index()
255 );
256 });
257
258 // Ensure the counter resource exists.
259 world.init_resource::<EventFireCount>();
260 }
261 "t" => {
262 let name = rest.trim();
263 let Some(&event_key) = event_names.get(name) else {
264 println!(
265 "Event '{name}' does not exist. Register it first with 'event {name}'"
266 );
267 continue;
268 };
269
270 let mut event_data = ();
271 let mut trigger_data = ();
272 // SAFETY: event_key was registered in this world, both pointers are valid ZSTs
273 unsafe {
274 world.trigger_dynamic(
275 event_key,
276 PtrMut::from(&mut event_data),
277 PtrMut::from(&mut trigger_data),
278 );
279 }
280
281 let count = world
282 .get_resource::<EventFireCount>()
283 .map_or(0, |c| c.0.get(&event_key).copied().unwrap_or(0));
284 println!("Event '{name}' triggered ({count} fires)");
285 }
286 _ => continue,
287 }
288 }
289}Sourcepub fn location(&self) -> EntityLocation
pub fn location(&self) -> EntityLocation
Gets metadata indicating the location where the current entity is stored.
Sourcepub fn archetype(&self) -> &Archetype
pub fn archetype(&self) -> &Archetype
Returns the archetype that the current entity belongs to.
Sourcepub fn access(&self) -> &Access
pub fn access(&self) -> &Access
Returns a reference to the underlying Access.
Examples found in repository?
69fn main() {
70 let mut world = World::new();
71 let mut lines = std::io::stdin().lines();
72 let mut component_names = HashMap::<String, ComponentId>::new();
73 let mut component_info = HashMap::<ComponentId, ComponentInfo>::new();
74 let mut event_names = HashMap::<String, EventKey>::new();
75
76 println!("{PROMPT}");
77 loop {
78 print!("\n> ");
79 let _ = std::io::stdout().flush();
80 let Some(Ok(line)) = lines.next() else {
81 return;
82 };
83
84 if line.is_empty() {
85 return;
86 };
87
88 let Some((first, rest)) = line.trim().split_once(|c: char| c.is_whitespace()) else {
89 match &line.chars().next() {
90 Some('c') => println!("{COMPONENT_PROMPT}"),
91 Some('s') => println!("{ENTITY_PROMPT}"),
92 Some('q') => println!("{QUERY_PROMPT}"),
93 Some('e') => println!("{EVENT_PROMPT}"),
94 Some('t') => println!("{EMIT_PROMPT}"),
95 _ => println!("{PROMPT}"),
96 }
97 continue;
98 };
99
100 match &first[0..1] {
101 "c" => {
102 rest.split(',').for_each(|component| {
103 let mut component = component.split_whitespace();
104 let Some(name) = component.next() else {
105 return;
106 };
107 let size = match component.next().map(str::parse) {
108 Some(Ok(size)) => size,
109 _ => 0,
110 };
111 // Register our new component to the world with a layout specified by it's size
112 // SAFETY: [u64] is Send + Sync
113 let id = world.register_component_with_descriptor(unsafe {
114 ComponentDescriptor::new_with_layout(
115 name.to_string(),
116 StorageType::Table,
117 Layout::array::<u64>(size).unwrap(),
118 None,
119 true,
120 ComponentCloneBehavior::Default,
121 None,
122 )
123 });
124 let Some(info) = world.components().get_info(id) else {
125 return;
126 };
127 component_names.insert(name.to_string(), id);
128 component_info.insert(id, info.clone());
129 println!("Component {} created with id: {}", name, id.index());
130 });
131 }
132 "s" => {
133 let mut to_insert_ids = Vec::new();
134 let mut to_insert_data = Vec::new();
135 rest.split(',').for_each(|component| {
136 let mut component = component.split_whitespace();
137 let Some(name) = component.next() else {
138 return;
139 };
140
141 // Get the id for the component with the given name
142 let Some(&id) = component_names.get(name) else {
143 println!("Component {name} does not exist");
144 return;
145 };
146
147 // Calculate the length for the array based on the layout created for this component id
148 let info = world.components().get_info(id).unwrap();
149 let len = info.layout().size() / size_of::<u64>();
150 let mut values: Vec<u64> = component
151 .take(len)
152 .filter_map(|value| value.parse::<u64>().ok())
153 .collect();
154 values.resize(len, 0);
155
156 // Collect the id and array to be inserted onto our entity
157 to_insert_ids.push(id);
158 to_insert_data.push(values);
159 });
160
161 let mut entity = world.spawn_empty();
162
163 // Construct an `OwningPtr` for each component in `to_insert_data`
164 let to_insert_ptr = to_owning_ptrs(&mut to_insert_data);
165
166 // SAFETY:
167 // - Component ids have been taken from the same world
168 // - Each array is created to the layout specified in the world
169 unsafe {
170 entity.insert_by_ids(&to_insert_ids, to_insert_ptr.into_iter());
171 }
172
173 println!("Entity spawned with id: {}", entity.id());
174 }
175 "q" => {
176 let mut builder = QueryBuilder::<FilteredEntityMut>::new(&mut world);
177 parse_query(rest, &mut builder, &component_names);
178 let mut query = builder.build();
179 query.iter_mut(&mut world).for_each(|filtered_entity| {
180 let terms = filtered_entity
181 .access()
182 .try_iter_access()
183 .unwrap()
184 .map(|component_access| {
185 let id = *component_access.index();
186 let ptr = filtered_entity.get_by_id(id).unwrap();
187 let info = component_info.get(&id).unwrap();
188 let len = info.layout().size() / size_of::<u64>();
189
190 // SAFETY:
191 // - All components are created with layout [u64]
192 // - len is calculated from the component descriptor
193 let data = unsafe {
194 std::slice::from_raw_parts_mut(
195 ptr.assert_unique().as_ptr().cast::<u64>(),
196 len,
197 )
198 };
199
200 // If we have write access, increment each value once
201 if matches!(component_access, ComponentAccessKind::Exclusive(_)) {
202 data.iter_mut().for_each(|data| {
203 *data += 1;
204 });
205 }
206
207 format!("{}: {:?}", info.name(), data[0..len].to_vec())
208 })
209 .collect::<Vec<_>>()
210 .join(", ");
211
212 println!("{}: {}", filtered_entity.id(), terms);
213 });
214 }
215 "e" => {
216 rest.split(',').for_each(|event| {
217 let name = event.trim();
218 if name.is_empty() {
219 return;
220 }
221
222 // Register a ComponentId for this event, no Rust type needed.
223 // SAFETY: ZST with no drop
224 let event_component_id = world.register_component_with_descriptor(unsafe {
225 ComponentDescriptor::new_with_layout(
226 format!("event:{name}"),
227 StorageType::Table,
228 Layout::new::<()>(),
229 None,
230 false,
231 ComponentCloneBehavior::Ignore,
232 None,
233 )
234 });
235 // SAFETY: event_component_id was just registered for this event
236 let event_key = unsafe { EventKey::new(event_component_id) };
237 event_names.insert(name.to_string(), event_key);
238
239 // Build a dynamic observer that prints when the event fires.
240 let runner: ObserverRunner = |mut world, _observer, ctx, _event, _trigger| {
241 println!(" Observer fired!");
242 if let Some(mut counts) = world.get_resource_mut::<EventFireCount>() {
243 *counts.0.entry(ctx.event_key).or_insert(0) += 1;
244 }
245 };
246
247 // SAFETY: event_key was just registered, runner ignores pointers
248 let observer =
249 unsafe { Observer::with_dynamic_runner(runner).with_event_key(event_key) };
250 world.spawn(observer);
251
252 println!(
253 "Event '{name}' registered (key: {}) with a dynamic observer",
254 event_component_id.index()
255 );
256 });
257
258 // Ensure the counter resource exists.
259 world.init_resource::<EventFireCount>();
260 }
261 "t" => {
262 let name = rest.trim();
263 let Some(&event_key) = event_names.get(name) else {
264 println!(
265 "Event '{name}' does not exist. Register it first with 'event {name}'"
266 );
267 continue;
268 };
269
270 let mut event_data = ();
271 let mut trigger_data = ();
272 // SAFETY: event_key was registered in this world, both pointers are valid ZSTs
273 unsafe {
274 world.trigger_dynamic(
275 event_key,
276 PtrMut::from(&mut event_data),
277 PtrMut::from(&mut trigger_data),
278 );
279 }
280
281 let count = world
282 .get_resource::<EventFireCount>()
283 .map_or(0, |c| c.0.get(&event_key).copied().unwrap_or(0));
284 println!("Event '{name}' triggered ({count} fires)");
285 }
286 _ => continue,
287 }
288 }
289}Sourcepub fn contains<T>(&self) -> boolwhere
T: Component,
pub fn contains<T>(&self) -> boolwhere
T: Component,
Returns true if the current entity has a component of type T.
Otherwise, this returns false.
§Notes
If you do not know the concrete type of a component, consider using
Self::contains_id or Self::contains_type_id.
Sourcepub fn contains_id(&self, component_id: ComponentId) -> bool
pub fn contains_id(&self, component_id: ComponentId) -> bool
Returns true if the current entity has a component identified by component_id.
Otherwise, this returns false.
§Notes
- If you know the concrete type of the component, you should prefer
Self::contains. - If you know the component’s
TypeIdbut not itsComponentId, consider usingSelf::contains_type_id.
Sourcepub fn contains_type_id(&self, type_id: TypeId) -> bool
pub fn contains_type_id(&self, type_id: TypeId) -> bool
Returns true if the current entity has a component with the type identified by type_id.
Otherwise, this returns false.
§Notes
- If you know the concrete type of the component, you should prefer
Self::contains. - If you have a
ComponentIdinstead of aTypeId, consider usingSelf::contains_id.
Sourcepub fn get<T>(&self) -> Option<&T>where
T: Component,
pub fn get<T>(&self) -> Option<&T>where
T: Component,
Gets access to the component of type T for the current entity.
Returns None if the entity does not have a component of type T.
Sourcepub fn get_ref<T>(&self) -> Option<Ref<'_, T>>where
T: Component,
pub fn get_ref<T>(&self) -> Option<Ref<'_, T>>where
T: Component,
Gets access to the component of type T for the current entity,
including change detection information as a Ref.
Returns None if the entity does not have a component of type T.
Sourcepub fn get_mut<T>(&mut self) -> Option<Mut<'_, T>>
pub fn get_mut<T>(&mut self) -> Option<Mut<'_, T>>
Gets mutable access to the component of type T for the current entity.
Returns None if the entity does not have a component of type T or if
the access does not include write access to T.
Sourcepub unsafe fn get_mut_unchecked<T>(&self) -> Option<Mut<'_, T>>
pub unsafe fn get_mut_unchecked<T>(&self) -> Option<Mut<'_, T>>
Gets mutable access to the component of type T for the current entity.
Returns None if the entity does not have a component of type T or if
the access does not include write access to T.
This only requires &self, and so may be used to get mutable access to multiple components.
§Example
#[derive(Component)]
struct X(usize);
#[derive(Component)]
struct Y(usize);
let mut entity = world.spawn((X(0), Y(0))).into_mutable();
// This gives the `FilteredEntityMut` access to `&mut X` and `&mut Y`.
let mut query = QueryBuilder::<FilteredEntityMut>::new(&mut world)
.data::<(&mut X, &mut Y)>()
.build();
let mut filtered_entity: FilteredEntityMut = query.single_mut(&mut world).unwrap();
// Get mutable access to two components at once
// SAFETY: We don't take any other references to `X` from this entity
let mut x = unsafe { filtered_entity.get_mut_unchecked::<X>() }.unwrap();
// SAFETY: We don't take any other references to `Y` from this entity
let mut y = unsafe { filtered_entity.get_mut_unchecked::<Y>() }.unwrap();
*x = X(1);
*y = Y(1);§Safety
No other references to the same component may exist at the same time as the returned reference.
§See also
get_mutfor the safe version.
Sourcepub fn into_mut<T>(self) -> Option<Mut<'w, T>>
pub fn into_mut<T>(self) -> Option<Mut<'w, T>>
Consumes self and gets mutable access to the component of type T
with the world 'w lifetime for the current entity.
Returns None if the entity does not have a component of type T.
Sourcepub unsafe fn into_mut_assume_mutable<T>(self) -> Option<Mut<'w, T>>where
T: Component,
pub unsafe fn into_mut_assume_mutable<T>(self) -> Option<Mut<'w, T>>where
T: Component,
Consumes self and gets mutable access to the component of type T
with the world 'w lifetime for the current entity.
Returns None if the entity does not have a component of type T.
§Safety
Tmust be a mutable component
Sourcepub fn get_change_ticks<T>(&self) -> Option<ComponentTicks>where
T: Component,
pub fn get_change_ticks<T>(&self) -> Option<ComponentTicks>where
T: Component,
Retrieves the change ticks for the given component. This can be useful for implementing change detection in custom runtimes.
Sourcepub fn get_change_ticks_by_id(
&self,
component_id: ComponentId,
) -> Option<ComponentTicks>
pub fn get_change_ticks_by_id( &self, component_id: ComponentId, ) -> Option<ComponentTicks>
Retrieves the change ticks for the given ComponentId. This can be useful for implementing change
detection in custom runtimes.
You should prefer to use the typed API Self::get_change_ticks where possible and only
use this in cases where the actual component types are not known at
compile time.
Sourcepub fn get_by_id(&self, component_id: ComponentId) -> Option<Ptr<'_>>
pub fn get_by_id(&self, component_id: ComponentId) -> Option<Ptr<'_>>
Gets the component of the given ComponentId from the entity.
You should prefer to use the typed API Self::get where possible and only
use this in cases where the actual component types are not known at
compile time.
Unlike FilteredEntityMut::get, this returns a raw pointer to the component,
which is only valid while the FilteredEntityMut is alive.
Examples found in repository?
38fn base_system(access_components: In<Vec<ComponentId>>, mut query: Query<FilteredEntityMut>) {
39 #[cfg(feature = "trace")]
40 let _span = tracing::info_span!("base_system", components = ?access_components.0, count = query.iter().len()).entered();
41
42 for mut filtered_entity in &mut query {
43 // We calculate Faulhaber's formula mod 256 with n = value and p = exponent.
44 // See https://en.wikipedia.org/wiki/Faulhaber%27s_formula
45 // The time is takes to compute this depends on the number of entities and the values in
46 // each entity. This is to ensure that each system takes a different amount of time.
47 let mut total: Wrapping<u8> = Wrapping(0);
48 for (exponent, component_id) in (1_u32..).zip(access_components.0.iter()) {
49 // find the value of the component
50 let ptr = filtered_entity.get_by_id(*component_id).unwrap();
51
52 // SAFETY: All components have a u8 layout
53 let value: u8 = unsafe { *ptr.deref::<u8>() };
54
55 for i in 0..=value {
56 let mut product = Wrapping(1);
57 for _ in 1..=exponent {
58 product *= Wrapping(i);
59 }
60 total += product;
61 }
62 }
63
64 // we assign this value to all the components we can write to
65 for component_id in &access_components.0 {
66 if let Some(ptr) = filtered_entity.get_mut_by_id(*component_id) {
67 // SAFETY: All components have a u8 layout
68 unsafe {
69 let mut value = ptr.with_type::<u8>();
70 *value = total.0;
71 }
72 }
73 }
74 }
75}More examples
69fn main() {
70 let mut world = World::new();
71 let mut lines = std::io::stdin().lines();
72 let mut component_names = HashMap::<String, ComponentId>::new();
73 let mut component_info = HashMap::<ComponentId, ComponentInfo>::new();
74 let mut event_names = HashMap::<String, EventKey>::new();
75
76 println!("{PROMPT}");
77 loop {
78 print!("\n> ");
79 let _ = std::io::stdout().flush();
80 let Some(Ok(line)) = lines.next() else {
81 return;
82 };
83
84 if line.is_empty() {
85 return;
86 };
87
88 let Some((first, rest)) = line.trim().split_once(|c: char| c.is_whitespace()) else {
89 match &line.chars().next() {
90 Some('c') => println!("{COMPONENT_PROMPT}"),
91 Some('s') => println!("{ENTITY_PROMPT}"),
92 Some('q') => println!("{QUERY_PROMPT}"),
93 Some('e') => println!("{EVENT_PROMPT}"),
94 Some('t') => println!("{EMIT_PROMPT}"),
95 _ => println!("{PROMPT}"),
96 }
97 continue;
98 };
99
100 match &first[0..1] {
101 "c" => {
102 rest.split(',').for_each(|component| {
103 let mut component = component.split_whitespace();
104 let Some(name) = component.next() else {
105 return;
106 };
107 let size = match component.next().map(str::parse) {
108 Some(Ok(size)) => size,
109 _ => 0,
110 };
111 // Register our new component to the world with a layout specified by it's size
112 // SAFETY: [u64] is Send + Sync
113 let id = world.register_component_with_descriptor(unsafe {
114 ComponentDescriptor::new_with_layout(
115 name.to_string(),
116 StorageType::Table,
117 Layout::array::<u64>(size).unwrap(),
118 None,
119 true,
120 ComponentCloneBehavior::Default,
121 None,
122 )
123 });
124 let Some(info) = world.components().get_info(id) else {
125 return;
126 };
127 component_names.insert(name.to_string(), id);
128 component_info.insert(id, info.clone());
129 println!("Component {} created with id: {}", name, id.index());
130 });
131 }
132 "s" => {
133 let mut to_insert_ids = Vec::new();
134 let mut to_insert_data = Vec::new();
135 rest.split(',').for_each(|component| {
136 let mut component = component.split_whitespace();
137 let Some(name) = component.next() else {
138 return;
139 };
140
141 // Get the id for the component with the given name
142 let Some(&id) = component_names.get(name) else {
143 println!("Component {name} does not exist");
144 return;
145 };
146
147 // Calculate the length for the array based on the layout created for this component id
148 let info = world.components().get_info(id).unwrap();
149 let len = info.layout().size() / size_of::<u64>();
150 let mut values: Vec<u64> = component
151 .take(len)
152 .filter_map(|value| value.parse::<u64>().ok())
153 .collect();
154 values.resize(len, 0);
155
156 // Collect the id and array to be inserted onto our entity
157 to_insert_ids.push(id);
158 to_insert_data.push(values);
159 });
160
161 let mut entity = world.spawn_empty();
162
163 // Construct an `OwningPtr` for each component in `to_insert_data`
164 let to_insert_ptr = to_owning_ptrs(&mut to_insert_data);
165
166 // SAFETY:
167 // - Component ids have been taken from the same world
168 // - Each array is created to the layout specified in the world
169 unsafe {
170 entity.insert_by_ids(&to_insert_ids, to_insert_ptr.into_iter());
171 }
172
173 println!("Entity spawned with id: {}", entity.id());
174 }
175 "q" => {
176 let mut builder = QueryBuilder::<FilteredEntityMut>::new(&mut world);
177 parse_query(rest, &mut builder, &component_names);
178 let mut query = builder.build();
179 query.iter_mut(&mut world).for_each(|filtered_entity| {
180 let terms = filtered_entity
181 .access()
182 .try_iter_access()
183 .unwrap()
184 .map(|component_access| {
185 let id = *component_access.index();
186 let ptr = filtered_entity.get_by_id(id).unwrap();
187 let info = component_info.get(&id).unwrap();
188 let len = info.layout().size() / size_of::<u64>();
189
190 // SAFETY:
191 // - All components are created with layout [u64]
192 // - len is calculated from the component descriptor
193 let data = unsafe {
194 std::slice::from_raw_parts_mut(
195 ptr.assert_unique().as_ptr().cast::<u64>(),
196 len,
197 )
198 };
199
200 // If we have write access, increment each value once
201 if matches!(component_access, ComponentAccessKind::Exclusive(_)) {
202 data.iter_mut().for_each(|data| {
203 *data += 1;
204 });
205 }
206
207 format!("{}: {:?}", info.name(), data[0..len].to_vec())
208 })
209 .collect::<Vec<_>>()
210 .join(", ");
211
212 println!("{}: {}", filtered_entity.id(), terms);
213 });
214 }
215 "e" => {
216 rest.split(',').for_each(|event| {
217 let name = event.trim();
218 if name.is_empty() {
219 return;
220 }
221
222 // Register a ComponentId for this event, no Rust type needed.
223 // SAFETY: ZST with no drop
224 let event_component_id = world.register_component_with_descriptor(unsafe {
225 ComponentDescriptor::new_with_layout(
226 format!("event:{name}"),
227 StorageType::Table,
228 Layout::new::<()>(),
229 None,
230 false,
231 ComponentCloneBehavior::Ignore,
232 None,
233 )
234 });
235 // SAFETY: event_component_id was just registered for this event
236 let event_key = unsafe { EventKey::new(event_component_id) };
237 event_names.insert(name.to_string(), event_key);
238
239 // Build a dynamic observer that prints when the event fires.
240 let runner: ObserverRunner = |mut world, _observer, ctx, _event, _trigger| {
241 println!(" Observer fired!");
242 if let Some(mut counts) = world.get_resource_mut::<EventFireCount>() {
243 *counts.0.entry(ctx.event_key).or_insert(0) += 1;
244 }
245 };
246
247 // SAFETY: event_key was just registered, runner ignores pointers
248 let observer =
249 unsafe { Observer::with_dynamic_runner(runner).with_event_key(event_key) };
250 world.spawn(observer);
251
252 println!(
253 "Event '{name}' registered (key: {}) with a dynamic observer",
254 event_component_id.index()
255 );
256 });
257
258 // Ensure the counter resource exists.
259 world.init_resource::<EventFireCount>();
260 }
261 "t" => {
262 let name = rest.trim();
263 let Some(&event_key) = event_names.get(name) else {
264 println!(
265 "Event '{name}' does not exist. Register it first with 'event {name}'"
266 );
267 continue;
268 };
269
270 let mut event_data = ();
271 let mut trigger_data = ();
272 // SAFETY: event_key was registered in this world, both pointers are valid ZSTs
273 unsafe {
274 world.trigger_dynamic(
275 event_key,
276 PtrMut::from(&mut event_data),
277 PtrMut::from(&mut trigger_data),
278 );
279 }
280
281 let count = world
282 .get_resource::<EventFireCount>()
283 .map_or(0, |c| c.0.get(&event_key).copied().unwrap_or(0));
284 println!("Event '{name}' triggered ({count} fires)");
285 }
286 _ => continue,
287 }
288 }
289}Sourcepub fn get_mut_by_id(
&mut self,
component_id: ComponentId,
) -> Option<MutUntyped<'_>>
pub fn get_mut_by_id( &mut self, component_id: ComponentId, ) -> Option<MutUntyped<'_>>
Gets a MutUntyped of the component of the given ComponentId from the entity.
You should prefer to use the typed API Self::get_mut where possible and only
use this in cases where the actual component types are not known at
compile time.
Unlike FilteredEntityMut::get_mut, this returns a raw pointer to the component,
which is only valid while the FilteredEntityMut is alive.
Examples found in repository?
38fn base_system(access_components: In<Vec<ComponentId>>, mut query: Query<FilteredEntityMut>) {
39 #[cfg(feature = "trace")]
40 let _span = tracing::info_span!("base_system", components = ?access_components.0, count = query.iter().len()).entered();
41
42 for mut filtered_entity in &mut query {
43 // We calculate Faulhaber's formula mod 256 with n = value and p = exponent.
44 // See https://en.wikipedia.org/wiki/Faulhaber%27s_formula
45 // The time is takes to compute this depends on the number of entities and the values in
46 // each entity. This is to ensure that each system takes a different amount of time.
47 let mut total: Wrapping<u8> = Wrapping(0);
48 for (exponent, component_id) in (1_u32..).zip(access_components.0.iter()) {
49 // find the value of the component
50 let ptr = filtered_entity.get_by_id(*component_id).unwrap();
51
52 // SAFETY: All components have a u8 layout
53 let value: u8 = unsafe { *ptr.deref::<u8>() };
54
55 for i in 0..=value {
56 let mut product = Wrapping(1);
57 for _ in 1..=exponent {
58 product *= Wrapping(i);
59 }
60 total += product;
61 }
62 }
63
64 // we assign this value to all the components we can write to
65 for component_id in &access_components.0 {
66 if let Some(ptr) = filtered_entity.get_mut_by_id(*component_id) {
67 // SAFETY: All components have a u8 layout
68 unsafe {
69 let mut value = ptr.with_type::<u8>();
70 *value = total.0;
71 }
72 }
73 }
74 }
75}Sourcepub unsafe fn get_mut_by_id_unchecked(
&self,
component_id: ComponentId,
) -> Option<MutUntyped<'_>>
pub unsafe fn get_mut_by_id_unchecked( &self, component_id: ComponentId, ) -> Option<MutUntyped<'_>>
Gets a MutUntyped of the component of the given ComponentId from the entity.
You should prefer to use the typed API Self::get_mut where possible and only
use this in cases where the actual component types are not known at
compile time.
Unlike FilteredEntityMut::get_mut, this returns a raw pointer to the component,
which is only valid while the FilteredEntityMut is alive.
This only requires &self, and so may be used to get mutable access to multiple components.
§Safety
No other references to the same component may exist at the same time as the returned reference.
§See also
get_mut_by_idfor the safe version.
Sourcepub fn spawned_by(&self) -> MaybeLocation
pub fn spawned_by(&self) -> MaybeLocation
Returns the source code location from which this entity has last been spawned.
Sourcepub fn spawn_tick(&self) -> Tick
pub fn spawn_tick(&self) -> Tick
Returns the Tick at which this entity has been spawned.
Trait Implementations§
impl ArchetypeQueryData for FilteredEntityMut<'_, '_>
Source§impl ContainsEntity for FilteredEntityMut<'_, '_>
impl ContainsEntity for FilteredEntityMut<'_, '_>
impl EntityEquivalent for FilteredEntityMut<'_, '_>
impl Eq for FilteredEntityMut<'_, '_>
Source§impl<'a> From<&'a mut EntityMut<'_>> for FilteredEntityMut<'a, 'static>
impl<'a> From<&'a mut EntityMut<'_>> for FilteredEntityMut<'a, 'static>
Source§fn from(entity: &'a mut EntityMut<'_>) -> FilteredEntityMut<'a, 'static>
fn from(entity: &'a mut EntityMut<'_>) -> FilteredEntityMut<'a, 'static>
Source§impl<'a> From<&'a mut EntityWorldMut<'_>> for FilteredEntityMut<'a, 'static>
impl<'a> From<&'a mut EntityWorldMut<'_>> for FilteredEntityMut<'a, 'static>
Source§fn from(entity: &'a mut EntityWorldMut<'_>) -> FilteredEntityMut<'a, 'static>
fn from(entity: &'a mut EntityWorldMut<'_>) -> FilteredEntityMut<'a, 'static>
Source§impl<'w, 's> From<&'w FilteredEntityMut<'_, 's>> for FilteredEntityRef<'w, 's>
impl<'w, 's> From<&'w FilteredEntityMut<'_, 's>> for FilteredEntityRef<'w, 's>
Source§fn from(entity: &'w FilteredEntityMut<'_, 's>) -> FilteredEntityRef<'w, 's>
fn from(entity: &'w FilteredEntityMut<'_, 's>) -> FilteredEntityRef<'w, 's>
Source§impl<'w, 's, B> From<&'w mut EntityMutExcept<'_, 's, B>> for FilteredEntityMut<'w, 's>where
B: Bundle,
impl<'w, 's, B> From<&'w mut EntityMutExcept<'_, 's, B>> for FilteredEntityMut<'w, 's>where
B: Bundle,
Source§fn from(entity: &'w mut EntityMutExcept<'_, 's, B>) -> FilteredEntityMut<'w, 's>
fn from(entity: &'w mut EntityMutExcept<'_, 's, B>) -> FilteredEntityMut<'w, 's>
Source§impl<'w, 's> From<&'w mut FilteredEntityMut<'_, 's>> for FilteredEntityMut<'w, 's>
impl<'w, 's> From<&'w mut FilteredEntityMut<'_, 's>> for FilteredEntityMut<'w, 's>
Source§fn from(entity: &'w mut FilteredEntityMut<'_, 's>) -> FilteredEntityMut<'w, 's>
fn from(entity: &'w mut FilteredEntityMut<'_, 's>) -> FilteredEntityMut<'w, 's>
Source§impl<'a> From<EntityMut<'a>> for FilteredEntityMut<'a, 'static>
impl<'a> From<EntityMut<'a>> for FilteredEntityMut<'a, 'static>
Source§fn from(entity: EntityMut<'a>) -> FilteredEntityMut<'a, 'static>
fn from(entity: EntityMut<'a>) -> FilteredEntityMut<'a, 'static>
Source§impl<'w, 's, B> From<EntityMutExcept<'w, 's, B>> for FilteredEntityMut<'w, 's>where
B: Bundle,
impl<'w, 's, B> From<EntityMutExcept<'w, 's, B>> for FilteredEntityMut<'w, 's>where
B: Bundle,
Source§fn from(entity: EntityMutExcept<'w, 's, B>) -> FilteredEntityMut<'w, 's>
fn from(entity: EntityMutExcept<'w, 's, B>) -> FilteredEntityMut<'w, 's>
Source§impl<'a> From<EntityWorldMut<'a>> for FilteredEntityMut<'a, 'static>
impl<'a> From<EntityWorldMut<'a>> for FilteredEntityMut<'a, 'static>
Source§fn from(entity: EntityWorldMut<'a>) -> FilteredEntityMut<'a, 'static>
fn from(entity: EntityWorldMut<'a>) -> FilteredEntityMut<'a, 'static>
Source§impl<'w, 's> From<FilteredEntityMut<'w, 's>> for FilteredEntityRef<'w, 's>
impl<'w, 's> From<FilteredEntityMut<'w, 's>> for FilteredEntityRef<'w, 's>
Source§fn from(entity: FilteredEntityMut<'w, 's>) -> FilteredEntityRef<'w, 's>
fn from(entity: FilteredEntityMut<'w, 's>) -> FilteredEntityRef<'w, 's>
Source§impl Hash for FilteredEntityMut<'_, '_>
impl Hash for FilteredEntityMut<'_, '_>
impl IterQueryData for FilteredEntityMut<'_, '_>
Source§impl Ord for FilteredEntityMut<'_, '_>
impl Ord for FilteredEntityMut<'_, '_>
Source§fn cmp(&self, other: &FilteredEntityMut<'_, '_>) -> Ordering
fn cmp(&self, other: &FilteredEntityMut<'_, '_>) -> Ordering
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialEq for FilteredEntityMut<'_, '_>
impl PartialEq for FilteredEntityMut<'_, '_>
Source§fn eq(&self, other: &FilteredEntityMut<'_, '_>) -> bool
fn eq(&self, other: &FilteredEntityMut<'_, '_>) -> bool
self and other values to be equal, and is used by ==.Source§impl PartialOrd for FilteredEntityMut<'_, '_>
impl PartialOrd for FilteredEntityMut<'_, '_>
Source§fn partial_cmp(&self, other: &FilteredEntityMut<'_, '_>) -> Option<Ordering>
fn partial_cmp(&self, other: &FilteredEntityMut<'_, '_>) -> Option<Ordering>
FilteredEntityMut’s comparison trait implementations match the underlying Entity,
and cannot discern between different worlds.
Source§impl<'a, 'b> QueryData for FilteredEntityMut<'a, 'b>
impl<'a, 'b> QueryData for FilteredEntityMut<'a, 'b>
Source§const IS_READ_ONLY: bool = false
const IS_READ_ONLY: bool = false
Source§const IS_ARCHETYPAL: bool = true
const IS_ARCHETYPAL: bool = true
Source§type ReadOnly = FilteredEntityRef<'a, 'b>
type ReadOnly = FilteredEntityRef<'a, 'b>
QueryData, which satisfies the ReadOnlyQueryData trait.Source§type Item<'w, 's> = FilteredEntityMut<'w, 's>
type Item<'w, 's> = FilteredEntityMut<'w, 's>
WorldQuery
This will be the data retrieved by the query,
and is visible to the end user when calling e.g. Query<Self>::get.Source§fn shrink<'wlong, 'wshort, 's>(
item: <FilteredEntityMut<'a, 'b> as QueryData>::Item<'wlong, 's>,
) -> <FilteredEntityMut<'a, 'b> as QueryData>::Item<'wshort, 's>where
'wlong: 'wshort,
fn shrink<'wlong, 'wshort, 's>(
item: <FilteredEntityMut<'a, 'b> as QueryData>::Item<'wlong, 's>,
) -> <FilteredEntityMut<'a, 'b> as QueryData>::Item<'wshort, 's>where
'wlong: 'wshort,
Source§fn provide_extra_access(
state: &mut <FilteredEntityMut<'a, 'b> as WorldQuery>::State,
access: &mut Access,
available_access: &Access,
)
fn provide_extra_access( state: &mut <FilteredEntityMut<'a, 'b> as WorldQuery>::State, access: &mut Access, available_access: &Access, )
update_component_access.
Implementations may add additional access that is a subset of available_access
and does not conflict with anything in access,
and must update access to include that access. Read moreSource§unsafe fn fetch<'w, 's>(
access: &'s <FilteredEntityMut<'a, 'b> as WorldQuery>::State,
fetch: &mut <FilteredEntityMut<'a, 'b> as WorldQuery>::Fetch<'w>,
entity: Entity,
_table_row: TableRow,
) -> Option<<FilteredEntityMut<'a, 'b> as QueryData>::Item<'w, 's>>
unsafe fn fetch<'w, 's>( access: &'s <FilteredEntityMut<'a, 'b> as WorldQuery>::State, fetch: &mut <FilteredEntityMut<'a, 'b> as WorldQuery>::Fetch<'w>, entity: Entity, _table_row: TableRow, ) -> Option<<FilteredEntityMut<'a, 'b> as QueryData>::Item<'w, 's>>
Self::Item for either the given entity in the current Table,
or for the given entity in the current Archetype. This must always be called after
WorldQuery::set_table with a table_row in the range of the current Table or after
WorldQuery::set_archetype with an entity in the current archetype.
Accesses components registered in WorldQuery::update_component_access. Read moreSource§fn iter_access(
state: &<FilteredEntityMut<'a, 'b> as WorldQuery>::State,
) -> impl Iterator<Item = EcsAccessType<'_>>
fn iter_access( state: &<FilteredEntityMut<'a, 'b> as WorldQuery>::State, ) -> impl Iterator<Item = EcsAccessType<'_>>
QueryData::fetch. Access conflicts are usually
checked in WorldQuery::update_component_access, but in certain cases this method can be useful to implement
a way of checking for access conflicts in a non-allocating way.impl SingleEntityQueryData for FilteredEntityMut<'_, '_>
Source§impl<'a> TryFrom<&'a FilteredEntityMut<'_, '_>> for EntityRef<'a>
impl<'a> TryFrom<&'a FilteredEntityMut<'_, '_>> for EntityRef<'a>
Source§type Error = TryFromFilteredError
type Error = TryFromFilteredError
Source§fn try_from(
entity: &'a FilteredEntityMut<'_, '_>,
) -> Result<EntityRef<'a>, <EntityRef<'a> as TryFrom<&'a FilteredEntityMut<'_, '_>>>::Error>
fn try_from( entity: &'a FilteredEntityMut<'_, '_>, ) -> Result<EntityRef<'a>, <EntityRef<'a> as TryFrom<&'a FilteredEntityMut<'_, '_>>>::Error>
Source§impl<'a> TryFrom<&'a mut FilteredEntityMut<'_, '_>> for EntityMut<'a>
impl<'a> TryFrom<&'a mut FilteredEntityMut<'_, '_>> for EntityMut<'a>
Source§type Error = TryFromFilteredError
type Error = TryFromFilteredError
Source§fn try_from(
entity: &'a mut FilteredEntityMut<'_, '_>,
) -> Result<EntityMut<'a>, <EntityMut<'a> as TryFrom<&'a mut FilteredEntityMut<'_, '_>>>::Error>
fn try_from( entity: &'a mut FilteredEntityMut<'_, '_>, ) -> Result<EntityMut<'a>, <EntityMut<'a> as TryFrom<&'a mut FilteredEntityMut<'_, '_>>>::Error>
Source§impl<'a> TryFrom<FilteredEntityMut<'a, '_>> for EntityRef<'a>
impl<'a> TryFrom<FilteredEntityMut<'a, '_>> for EntityRef<'a>
Source§type Error = TryFromFilteredError
type Error = TryFromFilteredError
Source§fn try_from(
entity: FilteredEntityMut<'a, '_>,
) -> Result<EntityRef<'a>, <EntityRef<'a> as TryFrom<FilteredEntityMut<'a, '_>>>::Error>
fn try_from( entity: FilteredEntityMut<'a, '_>, ) -> Result<EntityRef<'a>, <EntityRef<'a> as TryFrom<FilteredEntityMut<'a, '_>>>::Error>
Source§impl<'a> TryFrom<FilteredEntityMut<'a, '_>> for EntityMut<'a>
impl<'a> TryFrom<FilteredEntityMut<'a, '_>> for EntityMut<'a>
Source§type Error = TryFromFilteredError
type Error = TryFromFilteredError
Source§fn try_from(
entity: FilteredEntityMut<'a, '_>,
) -> Result<EntityMut<'a>, <EntityMut<'a> as TryFrom<FilteredEntityMut<'a, '_>>>::Error>
fn try_from( entity: FilteredEntityMut<'a, '_>, ) -> Result<EntityMut<'a>, <EntityMut<'a> as TryFrom<FilteredEntityMut<'a, '_>>>::Error>
Source§impl WorldQuery for FilteredEntityMut<'_, '_>
impl WorldQuery for FilteredEntityMut<'_, '_>
Source§const IS_DENSE: bool = true
const IS_DENSE: bool = true
Source§type Fetch<'w> = EntityFetch<'w>
type Fetch<'w> = EntityFetch<'w>
WorldQuery to compute Self::Item for each entity.Source§type State = Access
type State = Access
Self::Fetch. This will be cached inside QueryState,
so it is best to move as much data / computation here as possible to reduce the cost of
constructing Self::Fetch.Source§fn shrink_fetch<'wlong, 'wshort>(
fetch: <FilteredEntityMut<'_, '_> as WorldQuery>::Fetch<'wlong>,
) -> <FilteredEntityMut<'_, '_> as WorldQuery>::Fetch<'wshort>where
'wlong: 'wshort,
fn shrink_fetch<'wlong, 'wshort>(
fetch: <FilteredEntityMut<'_, '_> as WorldQuery>::Fetch<'wlong>,
) -> <FilteredEntityMut<'_, '_> as WorldQuery>::Fetch<'wshort>where
'wlong: 'wshort,
Source§unsafe fn init_fetch<'w, 's>(
world: UnsafeWorldCell<'w>,
_state: &'s <FilteredEntityMut<'_, '_> as WorldQuery>::State,
last_run: Tick,
this_run: Tick,
) -> <FilteredEntityMut<'_, '_> as WorldQuery>::Fetch<'w>
unsafe fn init_fetch<'w, 's>( world: UnsafeWorldCell<'w>, _state: &'s <FilteredEntityMut<'_, '_> as WorldQuery>::State, last_run: Tick, this_run: Tick, ) -> <FilteredEntityMut<'_, '_> as WorldQuery>::Fetch<'w>
Self::Fetch,
by combining data from the World with the cached Self::State.
Readonly accesses resources registered in WorldQuery::update_component_access. Read moreSource§unsafe fn set_archetype<'w, 's>(
_fetch: &mut <FilteredEntityMut<'_, '_> as WorldQuery>::Fetch<'w>,
_state: &'s <FilteredEntityMut<'_, '_> as WorldQuery>::State,
_: &'w Archetype,
_table: &Table,
)
unsafe fn set_archetype<'w, 's>( _fetch: &mut <FilteredEntityMut<'_, '_> as WorldQuery>::Fetch<'w>, _state: &'s <FilteredEntityMut<'_, '_> as WorldQuery>::State, _: &'w Archetype, _table: &Table, )
Archetype. This will always be called on
archetypes that match this WorldQuery. Read moreSource§unsafe fn set_table<'w, 's>(
_fetch: &mut <FilteredEntityMut<'_, '_> as WorldQuery>::Fetch<'w>,
_state: &'s <FilteredEntityMut<'_, '_> as WorldQuery>::State,
_: &'w Table,
)
unsafe fn set_table<'w, 's>( _fetch: &mut <FilteredEntityMut<'_, '_> as WorldQuery>::Fetch<'w>, _state: &'s <FilteredEntityMut<'_, '_> as WorldQuery>::State, _: &'w Table, )
Table. This will always be called on tables
that match this WorldQuery. Read moreSource§fn update_component_access(
state: &<FilteredEntityMut<'_, '_> as WorldQuery>::State,
filtered_access: &mut FilteredAccess,
)
fn update_component_access( state: &<FilteredEntityMut<'_, '_> as WorldQuery>::State, filtered_access: &mut FilteredAccess, )
Source§fn init_state(
_world: &mut World,
) -> <FilteredEntityMut<'_, '_> as WorldQuery>::State
fn init_state( _world: &mut World, ) -> <FilteredEntityMut<'_, '_> as WorldQuery>::State
State for this WorldQuery type.Source§fn get_state(
_components: &Components,
) -> Option<<FilteredEntityMut<'_, '_> as WorldQuery>::State>
fn get_state( _components: &Components, ) -> Option<<FilteredEntityMut<'_, '_> as WorldQuery>::State>
Source§fn matches_component_set(
_state: &<FilteredEntityMut<'_, '_> as WorldQuery>::State,
_set_contains_id: &impl Fn(ComponentId) -> bool,
) -> bool
fn matches_component_set( _state: &<FilteredEntityMut<'_, '_> as WorldQuery>::State, _set_contains_id: &impl Fn(ComponentId) -> bool, ) -> bool
Source§fn init_nested_access(
_state: &Self::State,
_system_name: Option<&str>,
_component_access_set: &mut FilteredAccessSet,
_world: UnsafeWorldCell<'_>,
)
fn init_nested_access( _state: &Self::State, _system_name: Option<&str>, _component_access_set: &mut FilteredAccessSet, _world: UnsafeWorldCell<'_>, )
WorldQuery. Read moreSource§fn update_archetypes(_state: &mut Self::State, _world: UnsafeWorldCell<'_>)
fn update_archetypes(_state: &mut Self::State, _world: UnsafeWorldCell<'_>)
Auto Trait Implementations§
impl<'w, 's> !RefUnwindSafe for FilteredEntityMut<'w, 's>
impl<'w, 's> !UnwindSafe for FilteredEntityMut<'w, 's>
impl<'w, 's> Freeze for FilteredEntityMut<'w, 's>
impl<'w, 's> Send for FilteredEntityMut<'w, 's>
impl<'w, 's> Sync for FilteredEntityMut<'w, 's>
impl<'w, 's> Unpin for FilteredEntityMut<'w, 's>
impl<'w, 's> UnsafeUnpin for FilteredEntityMut<'w, 's>
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
impl<T> ConditionalSend for Twhere
T: Send,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§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.Source§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.Source§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.Source§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.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§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.Source§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.Source§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.Source§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.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> InitializeFromFunction<T> for T
impl<T> InitializeFromFunction<T> for T
Source§fn initialize_from_function(f: fn() -> T) -> T
fn initialize_from_function(f: fn() -> T) -> T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§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>
Source§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
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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 moreSource§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 moreSource§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
Source§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
Source§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.Source§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.Source§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> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<T> Settings for T
Source§impl<Ret> SpawnIfAsync<(), Ret> for Ret
impl<Ret> SpawnIfAsync<(), Ret> for Ret
Source§impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
Source§fn super_from(input: T) -> O
fn super_from(input: T) -> O
Source§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>,
Source§fn super_into(self) -> O
fn super_into(self) -> O
Source§impl<T> Tap for T
impl<T> Tap for T
Source§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.