mirror of
https://github.com/bevyengine/bevy
synced 2024-11-30 00:20:20 +00:00
7dcfaaef67
# 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>
32 lines
864 B
TOML
32 lines
864 B
TOML
[package]
|
|
name = "bevy_reflect"
|
|
version = "0.8.0-dev"
|
|
edition = "2021"
|
|
description = "Dynamically interact with rust types"
|
|
homepage = "https://bevyengine.org"
|
|
repository = "https://github.com/bevyengine/bevy"
|
|
license = "MIT OR Apache-2.0"
|
|
keywords = ["bevy"]
|
|
readme = "README.md"
|
|
|
|
[features]
|
|
bevy = ["glam", "smallvec"]
|
|
|
|
[dependencies]
|
|
# bevy
|
|
bevy_reflect_derive = { path = "bevy_reflect_derive", version = "0.8.0-dev" }
|
|
bevy_utils = { path = "../bevy_utils", version = "0.8.0-dev" }
|
|
bevy_ptr = { path = "../bevy_ptr", version = "0.8.0-dev" }
|
|
|
|
# other
|
|
erased-serde = "0.3"
|
|
downcast-rs = "1.2"
|
|
parking_lot = "0.12.1"
|
|
thiserror = "1.0"
|
|
once_cell = "1.11"
|
|
serde = "1"
|
|
smallvec = { version = "1.6", features = ["serde", "union", "const_generics"], optional = true }
|
|
glam = { version = "0.21", features = ["serde"], optional = true }
|
|
|
|
[dev-dependencies]
|
|
ron = "0.7.0"
|