FyroxEngine/Fyrox · error
Attempt to get reference to resource data while it is…
Error message
Attempt to get reference to resource data while it is unloaded!
What it means
DerefMut on Resource<T> panics unless the resource is in the Ok state: Unloaded, Pending, and LoadError states have no (valid) mutable data to expose. Unlike the immutable deref, these panics carry no type/path details. Mutable access additionally requires exclusive access to the resource.
Solutions
- Check resource state is Ok (state().is_ok()) before any mutable dereference.
- Await load completion (or use try_data_ref_mut-style access if available) and handle the error case explicitly.
- Avoid mutating loaded resource data at all; build data up front or use separate runtime buffers instead of editing shared resources.
Example fix
// before
let tex = rm.request::<Texture>(path)?;
tex.data_ref_mut().set_pixel(x, y, color); // panics unless Ok
// after
let tex = rm.request::<Texture>(path)?;
if tex.state().is_ok() {
tex.data_ref_mut().set_pixel(x, y, color);
} Defensive patterns
Strategy: type-guard
Validate before calling
if resource.state().is_ok() {
let data = resource.data_ref_mut();
} Type guard
fn mutable_ready<T: TypedResourceData>(r: &mut Resource<T>) -> bool { r.state().is_ok() } Prevention
- Gate every data_ref_mut call behind an is_ok state check.
- Prefer generating/editeable copies of data over mutating shared loaded resources.
- Avoid mutating resources whose reload (re-request) may be in flight.
When it happens
Trigger: Getting a mutable reference (data_ref_mut / &mut through the guard) to a resource before its load completed or after it failed; attempting to mutate resource data on a just-requested handle.
Common situations: Procedurally editing textures/models right after requesting them; retry/migration code that mutates resources on load without checking state first; mutating a resource whose reload is in flight.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- Attempt to get reference to resource data while it is…
- Attempt to get reference to resource data while it is…
- Attempt to get reference to resource data while it is…
- Attempt to get reference to resource data which failed to…
- Animation pool must be empty on load!
AI-assisted analysis of FyroxEngine/Fyrox@76c91aad8e (2026-09-10).
Data as JSON: /api/errors/4aec781c37ee7491.
Report an issue: GitHub.
Appendix: source
Thrown at fyrox-resource/src/lib.rs:636
};
panic!("Attempt to get reference to resource data which failed to load! Type {}. Path: {path}. Error: {error:?}", std::any::type_name::<T>())
}
ResourceState::Ok { ref data } => (data.inner_ref() as &dyn Any)
.downcast_ref()
.expect("Type mismatch!"),
}
}
}
impl<T> DerefMut for ResourceDataRef<'_, T>
where
T: TypedResourceData,
{
fn deref_mut(&mut self) -> &mut Self::Target {
let header = &mut *self.guard;
match header.state {
ResourceState::Unloaded => {
panic!("Attempt to get reference to resource data while it is unloaded!")
}
ResourceState::Pending { .. } => {
panic!("Attempt to get reference to resource data while it is loading!")
}
ResourceState::LoadError { .. } => {
panic!("Attempt to get reference to resource data which failed to load!")
}
ResourceState::Ok { ref mut data, .. } => (data.inner_mut() as &mut dyn Any)
.downcast_mut()
.expect("Type mismatch!"),
}
}
}
/// Collects all resources used by a given entity. Internally, it uses reflection to iterate over
/// each field of every descendant sub-object of the entity. This function could be used to collect
/// all resources used by an object, which could be useful if you're building a resource dependency
/// analyzer.View on GitHub (pinned to 76c91aad8e)