change return type of World::resource_ref to Ref (#15263)
# Objective Closes #11825 ## Solution Change return type of `get_resource_ref` and `resource_ref` from `Res` to `Ref` and implement `From Res<T> for Ref<T>`.
This commit is contained in:
parent
417e6ccaf1
commit
66a474a9d9
@ -587,6 +587,19 @@ impl<'w, T: Resource> From<ResMut<'w, T>> for Res<'w, T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'w, T: Resource> From<Res<'w, T>> for Ref<'w, T> {
|
||||
/// Convert a `Res` into a `Ref`. This allows keeping the change-detection feature of `Ref`
|
||||
/// while losing the specificity of `Res` for resources.
|
||||
fn from(res: Res<'w, T>) -> Self {
|
||||
Self {
|
||||
value: res.value,
|
||||
ticks: res.ticks,
|
||||
#[cfg(feature = "track_change_detection")]
|
||||
changed_by: res.changed_by,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'w, 'a, T: Resource> IntoIterator for &'a Res<'w, T>
|
||||
where
|
||||
&'a T: IntoIterator,
|
||||
|
||||
@ -40,7 +40,7 @@ use crate::{
|
||||
removal_detection::RemovedComponentEvents,
|
||||
schedule::{Schedule, ScheduleLabel, Schedules},
|
||||
storage::{ResourceData, Storages},
|
||||
system::{Commands, Res, Resource},
|
||||
system::{Commands, Resource},
|
||||
world::{command_queue::RawCommandQueue, error::TryRunScheduleError},
|
||||
};
|
||||
use bevy_ptr::{OwningPtr, Ptr};
|
||||
@ -1612,7 +1612,7 @@ impl World {
|
||||
/// use [`get_resource_or_insert_with`](World::get_resource_or_insert_with).
|
||||
#[inline]
|
||||
#[track_caller]
|
||||
pub fn resource_ref<R: Resource>(&self) -> Res<R> {
|
||||
pub fn resource_ref<R: Resource>(&self) -> Ref<R> {
|
||||
match self.get_resource_ref() {
|
||||
Some(x) => x,
|
||||
None => panic!(
|
||||
@ -1660,7 +1660,7 @@ impl World {
|
||||
|
||||
/// Gets a reference including change detection to the resource of the given type if it exists.
|
||||
#[inline]
|
||||
pub fn get_resource_ref<R: Resource>(&self) -> Option<Res<R>> {
|
||||
pub fn get_resource_ref<R: Resource>(&self) -> Option<Ref<R>> {
|
||||
// SAFETY:
|
||||
// - `as_unsafe_world_cell_readonly` gives permission to access everything immutably
|
||||
// - `&self` ensures nothing in world is borrowed mutably
|
||||
@ -2400,7 +2400,7 @@ impl World {
|
||||
}
|
||||
|
||||
/// Runs both [`clear_entities`](Self::clear_entities) and [`clear_resources`](Self::clear_resources),
|
||||
/// invalidating all [`Entity`] and resource fetches such as [`Res`], [`ResMut`](crate::system::ResMut)
|
||||
/// invalidating all [`Entity`] and resource fetches such as [`Res`](crate::system::Res), [`ResMut`](crate::system::ResMut)
|
||||
pub fn clear_all(&mut self) {
|
||||
self.clear_entities();
|
||||
self.clear_resources();
|
||||
|
||||
@ -14,7 +14,7 @@ use crate::{
|
||||
query::{DebugCheckedUnwrap, ReadOnlyQueryData},
|
||||
removal_detection::RemovedComponentEvents,
|
||||
storage::{ComponentSparseSet, Storages, Table},
|
||||
system::{Res, Resource},
|
||||
system::Resource,
|
||||
world::RawCommandQueue,
|
||||
};
|
||||
use bevy_ptr::Ptr;
|
||||
@ -353,7 +353,7 @@ impl<'w> UnsafeWorldCell<'w> {
|
||||
/// - the [`UnsafeWorldCell`] has permission to access the resource
|
||||
/// - no mutable reference to the resource exists at the same time
|
||||
#[inline]
|
||||
pub unsafe fn get_resource_ref<R: Resource>(self) -> Option<Res<'w, R>> {
|
||||
pub unsafe fn get_resource_ref<R: Resource>(self) -> Option<Ref<'w, R>> {
|
||||
let component_id = self.components().get_resource_id(TypeId::of::<R>())?;
|
||||
|
||||
// SAFETY: caller ensures `self` has permission to access the resource
|
||||
@ -371,7 +371,7 @@ impl<'w> UnsafeWorldCell<'w> {
|
||||
#[cfg(feature = "track_change_detection")]
|
||||
let caller = unsafe { _caller.deref() };
|
||||
|
||||
Some(Res {
|
||||
Some(Ref {
|
||||
value,
|
||||
ticks,
|
||||
#[cfg(feature = "track_change_detection")]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user