bevy/crates
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
..
bevy_animation Update codebase to use IntoIterator where possible. (#5269) 2022-07-11 15:28:50 +00:00
bevy_app Simplify design for *Labels (#4957) 2022-07-14 18:23:01 +00:00
bevy_asset update wgpu to 0.13 (#5168) 2022-07-14 21:17:16 +00:00
bevy_audio update wgpu to 0.13 (#5168) 2022-07-14 21:17:16 +00:00
bevy_core Export and register Mat2. (#5324) 2022-07-15 22:37:06 +00:00
bevy_core_pipeline update wgpu to 0.13 (#5168) 2022-07-14 21:17:16 +00:00
bevy_derive Add attribute to ignore fields of derived labels (#5366) 2022-07-19 05:21:19 +00:00
bevy_diagnostic Cleanups in diagnostics (#3871) 2022-06-20 17:02:25 +00:00
bevy_dylib Bump Bevy to 0.8.0-dev (#4505) 2022-04-17 23:04:52 +00:00
bevy_dynamic_plugin Bump Bevy to 0.8.0-dev (#4505) 2022-04-17 23:04:52 +00:00
bevy_ecs rename send_default_event to send_event_default on world (#5383) 2022-07-19 22:28:05 +00:00
bevy_ecs_compile_fail_tests remove QF generics from all Query/State methods and types (#5170) 2022-07-19 00:45:00 +00:00
bevy_encase_derive Updated glam to 0.21. (#5142) 2022-07-03 19:55:33 +00:00
bevy_gilrs Improve Gamepad DPad Button Detection (#5220) 2022-07-11 14:11:25 +00:00
bevy_gltf add a SpatialBundle with visibility and transform components (#5344) 2022-07-18 23:27:30 +00:00
bevy_hierarchy Update codebase to use IntoIterator where possible. (#5269) 2022-07-11 15:28:50 +00:00
bevy_input Implement Debug for Gamepads (#5291) 2022-07-13 15:10:41 +00:00
bevy_internal enable optional dependencies to stay optional (#5023) 2022-06-20 10:32:43 +00:00
bevy_log Remove the dependency cycles (#5171) 2022-07-04 13:04:18 +00:00
bevy_macro_utils Derive AsBindGroup Improvements: Better errors, more options, update examples (#5364) 2022-07-19 22:05:43 +00:00
bevy_math Export and register Mat2. (#5324) 2022-07-15 22:37:06 +00:00
bevy_mikktspace Minimally fix the known unsoundness in bevy_mikktspace (#5299) 2022-07-16 08:37:18 +00:00
bevy_pbr Don't panic when StandardMaterial normal_map hasn't loaded yet (#5307) 2022-07-16 21:50:19 +00:00
bevy_ptr add more SAFETY comments and lint for missing ones in bevy_ecs (#4835) 2022-07-04 14:44:24 +00:00
bevy_reflect bevy_reflect: ReflectFromPtr to create &dyn Reflect from a *const () (#4475) 2022-07-19 23:00:34 +00:00
bevy_render Derive AsBindGroup Improvements: Better errors, more options, update examples (#5364) 2022-07-19 22:05:43 +00:00
bevy_scene Add VisibilityBundle and use it to fix gltfs, scenes, and examples (#5335) 2022-07-16 02:47:23 +00:00
bevy_sprite Use Affine3A for GlobalTransform to allow any affine transformation (#4379) 2022-07-16 00:51:12 +00:00
bevy_tasks Very minor doc formatting changes (#5287) 2022-07-12 13:06:16 +00:00
bevy_text Use Affine3A for GlobalTransform to allow any affine transformation (#4379) 2022-07-16 00:51:12 +00:00
bevy_time Update time by sending frame instant through a channel (#4744) 2022-07-11 23:19:00 +00:00
bevy_transform add a SpatialBundle with visibility and transform components (#5344) 2022-07-18 23:27:30 +00:00
bevy_ui Remove redundant Size import (#5339) 2022-07-16 13:53:41 +00:00
bevy_utils Simplify design for *Labels (#4957) 2022-07-14 18:23:01 +00:00
bevy_window update wgpu to 0.13 (#5168) 2022-07-14 21:17:16 +00:00
bevy_winit Change window position types from tuple to vec (#5276) 2022-07-11 14:36:23 +00:00