bevy/crates/bevy_reflect/bevy_reflect_derive/src
Jakob Hellermann 7dcfaaef67 bevy_reflect: ReflectFromPtr to create &dyn Reflect from a *const () (#4475)
# Objective

https://github.com/bevyengine/bevy/pull/4447 adds functions that can fetch resources/components as `*const ()` ptr by providing the `ComponentId`. This alone is not enough for them to be usable safely with reflection, because there is no general way to go from the raw pointer to a `&dyn Reflect` which is the pointer + a pointer to the VTable of the `Reflect` impl.

By adding a `ReflectFromPtr` type that is included in the type type registration when deriving `Reflect`, safe functions can be implemented in scripting languages that don't assume a type layout and can access the component data via reflection:

```rust
#[derive(Reflect)]
struct StringResource {
    value: String
}
```

```lua
local res_id = world:resource_id_by_name("example::StringResource")
local res = world:resource(res_id)

print(res.value)
```

## Solution

1. add a `ReflectFromPtr` type with a `FromType<T: Reflect>` implementation and the following methods:
- `     pub unsafe fn as_reflect_ptr<'a>(&self, val: Ptr<'a>) -> &'a dyn Reflect`
- `     pub unsafe fn as_reflect_ptr_mut<'a>(&self, val: PtrMut<'a>) -> &'a mud dyn Reflect`

Safety requirements of the methods are that you need to check that the `ReflectFromPtr` was constructed for the correct type.

2. add that type to the `TypeRegistration` in the `GetTypeRegistration` impl generated by `#[derive(Reflect)]`.
This is different to other reflected traits because it doesn't need `#[reflect(ReflectReflectFromPtr)]` which IMO should be there by default.

Co-authored-by: Jakob Hellermann <hellermann@sipgate.de>
Co-authored-by: Carter Anderson <mcanders1@gmail.com>
2022-07-19 23:00:34 +00:00
..
container_attributes.rs Derive default for enums where possible (#5158) 2022-07-01 03:42:15 +00:00
derive_data.rs bevy_reflect_derive: Tidying up the code (#4712) 2022-05-12 19:43:23 +00:00
field_attributes.rs Update codebase to use IntoIterator where possible. (#5269) 2022-07-11 15:28:50 +00:00
from_reflect.rs Make Reflect safe to implement (#5010) 2022-06-27 16:52:25 +00:00
impls.rs Make Reflect safe to implement (#5010) 2022-06-27 16:52:25 +00:00
lib.rs bevy_reflect: Add #[reflect(default)] attribute for FromReflect (#4140) 2022-05-30 19:06:25 +00:00
reflect_value.rs bevy_reflect_derive: Tidying up the code (#4712) 2022-05-12 19:43:23 +00:00
registration.rs bevy_reflect: ReflectFromPtr to create &dyn Reflect from a *const () (#4475) 2022-07-19 23:00:34 +00:00
trait_reflection.rs bevy_reflect: Added get_boxed method to reflect_trait (#4120) 2022-05-20 13:31:49 +00:00
type_uuid.rs Clippy improvements (#4665) 2022-05-31 01:38:07 +00:00
utility.rs bevy_reflect_derive: Tidying up the code (#4712) 2022-05-12 19:43:23 +00:00