remove type_uuid from serialization
This commit is contained in:
parent
dcdd552365
commit
3710196fdb
@ -58,7 +58,6 @@ rand = "0.7.2"
|
|||||||
serde = { version = "1", features = ["derive"]}
|
serde = { version = "1", features = ["derive"]}
|
||||||
ron = "0.5.1"
|
ron = "0.5.1"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
type-uuid = "0.1"
|
|
||||||
env_logger = "0.7"
|
env_logger = "0.7"
|
||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
|
@ -16,7 +16,6 @@ use std::{
|
|||||||
any::type_name, cell::RefCell, collections::HashMap, iter::FromIterator, marker::PhantomData,
|
any::type_name, cell::RefCell, collections::HashMap, iter::FromIterator, marker::PhantomData,
|
||||||
ptr::NonNull,
|
ptr::NonNull,
|
||||||
};
|
};
|
||||||
use type_uuid::TypeUuid;
|
|
||||||
|
|
||||||
struct ComponentDeserializer<'de, T: Deserialize<'de>> {
|
struct ComponentDeserializer<'de, T: Deserialize<'de>> {
|
||||||
ptr: *mut T,
|
ptr: *mut T,
|
||||||
@ -100,7 +99,6 @@ impl<'de, 'a, T: for<'b> Deserialize<'b> + 'static> Visitor<'de>
|
|||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct TagRegistration {
|
pub struct TagRegistration {
|
||||||
uuid: type_uuid::Bytes,
|
|
||||||
ty: &'static str,
|
ty: &'static str,
|
||||||
tag_serialize_fn: fn(&TagStorage, &mut dyn FnMut(&dyn erased_serde::Serialize)),
|
tag_serialize_fn: fn(&TagStorage, &mut dyn FnMut(&dyn erased_serde::Serialize)),
|
||||||
tag_deserialize_fn: fn(
|
tag_deserialize_fn: fn(
|
||||||
@ -111,9 +109,7 @@ pub struct TagRegistration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl TagRegistration {
|
impl TagRegistration {
|
||||||
pub fn of<
|
pub fn of<T: Serialize
|
||||||
T: TypeUuid
|
|
||||||
+ Serialize
|
|
||||||
+ for<'de> Deserialize<'de>
|
+ for<'de> Deserialize<'de>
|
||||||
+ PartialEq
|
+ PartialEq
|
||||||
+ Clone
|
+ Clone
|
||||||
@ -122,7 +118,6 @@ impl TagRegistration {
|
|||||||
+ 'static,
|
+ 'static,
|
||||||
>() -> Self {
|
>() -> Self {
|
||||||
Self {
|
Self {
|
||||||
uuid: T::UUID,
|
|
||||||
ty: type_name::<T>(),
|
ty: type_name::<T>(),
|
||||||
tag_serialize_fn: |tag_storage, serialize_fn| {
|
tag_serialize_fn: |tag_storage, serialize_fn| {
|
||||||
// it's safe because we know this is the correct type due to lookup
|
// it's safe because we know this is the correct type due to lookup
|
||||||
@ -149,7 +144,6 @@ impl TagRegistration {
|
|||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ComponentRegistration {
|
pub struct ComponentRegistration {
|
||||||
uuid: type_uuid::Bytes,
|
|
||||||
ty: &'static str,
|
ty: &'static str,
|
||||||
comp_serialize_fn: fn(&ComponentResourceSet, &mut dyn FnMut(&dyn erased_serde::Serialize)),
|
comp_serialize_fn: fn(&ComponentResourceSet, &mut dyn FnMut(&dyn erased_serde::Serialize)),
|
||||||
comp_deserialize_fn: fn(
|
comp_deserialize_fn: fn(
|
||||||
@ -160,10 +154,9 @@ pub struct ComponentRegistration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ComponentRegistration {
|
impl ComponentRegistration {
|
||||||
pub fn of<T: TypeUuid + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static>() -> Self
|
pub fn of<T: Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static>() -> Self
|
||||||
{
|
{
|
||||||
Self {
|
Self {
|
||||||
uuid: T::UUID,
|
|
||||||
ty: type_name::<T>(),
|
ty: type_name::<T>(),
|
||||||
comp_serialize_fn: |comp_storage, serialize_fn| {
|
comp_serialize_fn: |comp_storage, serialize_fn| {
|
||||||
// it's safe because we know this is the correct type due to lookup
|
// it's safe because we know this is the correct type due to lookup
|
||||||
@ -185,15 +178,16 @@ impl ComponentRegistration {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
struct SerializedArchetypeDescription {
|
struct SerializedArchetypeDescription {
|
||||||
tag_types: Vec<type_uuid::Bytes>,
|
tag_types: Vec<String>,
|
||||||
component_types: Vec<type_uuid::Bytes>,
|
component_types: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct SerializeImpl {
|
pub struct SerializeImpl {
|
||||||
pub tag_types: HashMap<&'static str, TagRegistration>,
|
pub tag_types: HashMap<String, TagRegistration>,
|
||||||
pub comp_types: HashMap<&'static str, ComponentRegistration>,
|
pub comp_types: HashMap<String, ComponentRegistration>,
|
||||||
pub entity_map: RefCell<HashMap<Entity, uuid::Bytes>>,
|
pub entity_map: RefCell<HashMap<Entity, uuid::Bytes>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,12 +200,12 @@ impl SerializeImpl {
|
|||||||
comp_types: HashMap::from_iter(
|
comp_types: HashMap::from_iter(
|
||||||
component_registrations
|
component_registrations
|
||||||
.iter()
|
.iter()
|
||||||
.map(|reg| (reg.ty.clone(), reg.clone())),
|
.map(|reg| (reg.ty.to_string(), reg.clone())),
|
||||||
),
|
),
|
||||||
tag_types: HashMap::from_iter(
|
tag_types: HashMap::from_iter(
|
||||||
tag_registrations
|
tag_registrations
|
||||||
.iter()
|
.iter()
|
||||||
.map(|reg| (reg.ty.clone(), reg.clone())),
|
.map(|reg| (reg.ty.to_string(), reg.clone())),
|
||||||
),
|
),
|
||||||
entity_map: RefCell::new(HashMap::new()),
|
entity_map: RefCell::new(HashMap::new()),
|
||||||
}
|
}
|
||||||
@ -226,12 +220,12 @@ impl SerializeImpl {
|
|||||||
comp_types: HashMap::from_iter(
|
comp_types: HashMap::from_iter(
|
||||||
component_registrations
|
component_registrations
|
||||||
.iter()
|
.iter()
|
||||||
.map(|reg| (reg.ty.clone(), reg.clone())),
|
.map(|reg| (reg.ty.to_string(), reg.clone())),
|
||||||
),
|
),
|
||||||
tag_types: HashMap::from_iter(
|
tag_types: HashMap::from_iter(
|
||||||
tag_registrations
|
tag_registrations
|
||||||
.iter()
|
.iter()
|
||||||
.map(|reg| (reg.ty.clone(), reg.clone())),
|
.map(|reg| (reg.ty.to_string(), reg.clone())),
|
||||||
),
|
),
|
||||||
entity_map: RefCell::new(HashMap::from_iter(
|
entity_map: RefCell::new(HashMap::from_iter(
|
||||||
entity_map.into_iter().map(|(uuid, e)| (e, uuid)),
|
entity_map.into_iter().map(|(uuid, e)| (e, uuid)),
|
||||||
@ -255,14 +249,12 @@ impl legion::serialize::ser::WorldSerializer for SerializeImpl {
|
|||||||
let tags_to_serialize = archetype_desc
|
let tags_to_serialize = archetype_desc
|
||||||
.tags()
|
.tags()
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|(ty, _)| self.tag_types.get(ty.0))
|
.map(|(tag_type_id, _)| tag_type_id.0.to_string())
|
||||||
.map(|reg| reg.uuid)
|
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let components_to_serialize = archetype_desc
|
let components_to_serialize = archetype_desc
|
||||||
.components()
|
.components()
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|(ty, _)| self.comp_types.get(ty.0))
|
.map(|(component_type_id, _)| component_type_id.0.to_string())
|
||||||
.map(|reg| reg.uuid)
|
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
SerializedArchetypeDescription {
|
SerializedArchetypeDescription {
|
||||||
tag_types: tags_to_serialize,
|
tag_types: tags_to_serialize,
|
||||||
@ -337,28 +329,18 @@ impl legion::serialize::ser::WorldSerializer for SerializeImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct DeserializeImpl {
|
pub struct DeserializeImpl {
|
||||||
pub tag_types: HashMap<&'static str, TagRegistration>,
|
pub tag_types: HashMap<String, TagRegistration>,
|
||||||
pub comp_types: HashMap<&'static str, ComponentRegistration>,
|
pub comp_types: HashMap<String, ComponentRegistration>,
|
||||||
pub tag_types_by_uuid: HashMap<type_uuid::Bytes, TagRegistration>,
|
|
||||||
pub comp_types_by_uuid: HashMap<type_uuid::Bytes, ComponentRegistration>,
|
|
||||||
pub entity_map: RefCell<HashMap<uuid::Bytes, Entity>>,
|
pub entity_map: RefCell<HashMap<uuid::Bytes, Entity>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DeserializeImpl {
|
impl DeserializeImpl {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
component_types: HashMap<&'static str, ComponentRegistration>,
|
component_types: HashMap<String, ComponentRegistration>,
|
||||||
tag_types: HashMap<&'static str, TagRegistration>,
|
tag_types: HashMap<String, TagRegistration>,
|
||||||
entity_map: RefCell<HashMap<Entity, uuid::Bytes>>,
|
entity_map: RefCell<HashMap<Entity, uuid::Bytes>>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
DeserializeImpl {
|
DeserializeImpl {
|
||||||
tag_types_by_uuid: HashMap::from_iter(
|
|
||||||
tag_types.iter().map(|reg| (reg.1.uuid, reg.1.clone())),
|
|
||||||
),
|
|
||||||
comp_types_by_uuid: HashMap::from_iter(
|
|
||||||
component_types
|
|
||||||
.iter()
|
|
||||||
.map(|reg| (reg.1.uuid, reg.1.clone())),
|
|
||||||
),
|
|
||||||
tag_types,
|
tag_types,
|
||||||
comp_types: component_types,
|
comp_types: component_types,
|
||||||
// re-use the entity-uuid mapping
|
// re-use the entity-uuid mapping
|
||||||
@ -381,12 +363,12 @@ impl legion::serialize::de::WorldDeserializer for DeserializeImpl {
|
|||||||
<SerializedArchetypeDescription as Deserialize>::deserialize(deserializer)?;
|
<SerializedArchetypeDescription as Deserialize>::deserialize(deserializer)?;
|
||||||
let mut desc = ArchetypeDescription::default();
|
let mut desc = ArchetypeDescription::default();
|
||||||
for tag in serialized_desc.tag_types {
|
for tag in serialized_desc.tag_types {
|
||||||
if let Some(reg) = self.tag_types_by_uuid.get(&tag) {
|
if let Some(reg) = self.tag_types.get(&tag) {
|
||||||
(reg.register_tag_fn)(&mut desc);
|
(reg.register_tag_fn)(&mut desc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for comp in serialized_desc.component_types {
|
for comp in serialized_desc.component_types {
|
||||||
if let Some(reg) = self.comp_types_by_uuid.get(&comp) {
|
if let Some(reg) = self.comp_types.get(&comp) {
|
||||||
(reg.register_comp_fn)(&mut desc);
|
(reg.register_comp_fn)(&mut desc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
use bevy::{prelude::*, serialization::*};
|
use bevy::{prelude::*, serialization::*};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use ron::ser::{to_string_pretty, PrettyConfig};
|
use ron::ser::{to_string_pretty, PrettyConfig};
|
||||||
use type_uuid::TypeUuid;
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::build()
|
App::build()
|
||||||
.add_plugin(ScheduleRunnerPlugin::run_once())
|
.add_plugin(ScheduleRunnerPlugin::run_once())
|
||||||
@ -9,8 +8,7 @@ fn main() {
|
|||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, TypeUuid)]
|
#[derive(Serialize, Deserialize)]
|
||||||
#[uuid = "14dec17f-ae14-40a3-8e44-e487fc423287"]
|
|
||||||
struct Test {
|
struct Test {
|
||||||
pub x: f32,
|
pub x: f32,
|
||||||
pub y: f32,
|
pub y: f32,
|
||||||
|
Loading…
Reference in New Issue
Block a user