prop: impl prop macro. add impls for glam, legion, smallvec

This commit is contained in:
Carter Anderson 2020-05-25 17:50:17 -07:00
parent cb6638ba06
commit f0cbe8cd86
18 changed files with 867 additions and 903 deletions

View file

@ -8,6 +8,14 @@ use crate::{
}; };
use serde::{ser::SerializeStruct, Serialize, Serializer}; use serde::{ser::SerializeStruct, Serialize, Serializer};
impl Serialize for Entity {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer {
serializer.serialize_u32(self.index())
}
}
/// Implements `Serialize` and can be passed to a `serde::Serializer`. /// Implements `Serialize` and can be passed to a `serde::Serializer`.
pub struct WorldSerializable<'a, 'b, CS: WorldSerializer> { pub struct WorldSerializable<'a, 'b, CS: WorldSerializer> {
world_serializer: &'b CS, world_serializer: &'b CS,

View file

@ -11,3 +11,6 @@ serde = "1"
erased-serde = "0.3" erased-serde = "0.3"
bevy_property_derive = { path = "bevy_property_derive" } bevy_property_derive = { path = "bevy_property_derive" }
ron = { path = "../ron" } ron = { path = "../ron" }
glam = { path = "../bevy_glam" }
legion = { path = "../bevy_legion" }
smallvec = { version = "1.4", features = ["serde"] }

View file

@ -0,0 +1,9 @@
use crate::{impl_property, AsProperties, Properties, Property};
use glam::{Mat3, Mat4, Quat, Vec2, Vec3};
use std::any::Any;
impl_property!(Vec2);
impl_property!(Vec3);
impl_property!(Mat3);
impl_property!(Mat4);
impl_property!(Quat);

View file

@ -0,0 +1,5 @@
use crate::{impl_property, AsProperties, Properties, Property};
use legion::prelude::Entity;
use std::any::Any;
impl_property!(Entity);

View file

@ -0,0 +1,43 @@
use crate::{AsProperties, Properties, Property};
use smallvec::{SmallVec, Array};
use std::any::Any;
use serde::Serialize;
impl<T, I> Property for SmallVec<T>
where
T: Clone + Send + Sync + Serialize + 'static + Array<Item=I>,
I: Send + Sync + Clone + Serialize + 'static
{
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = prop.clone();
}
}
}
impl<T> AsProperties for SmallVec<T> where T: Array {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}

View file

@ -0,0 +1,677 @@
use crate::{AsProperties, Properties, Property, impl_property};
use serde::Serialize;
use std::{
any::Any,
collections::{BTreeMap, HashMap, HashSet, VecDeque},
hash::Hash,
};
impl Property for usize {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for usize {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for u64 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for u64 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for u32 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for u32 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for u16 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for u16 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for u8 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for u8 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for isize {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for isize {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for i64 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for i64 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for i32 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for i32 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for i16 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for i16 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for i8 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for i8 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for f32 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<f64>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for f32 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for f64 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<f32>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for f64 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl_property!(String);
impl_property!(bool);
impl_property!(Vec<T> where T: Clone + Send + Sync + Serialize + 'static);
impl_property!(VecDeque<T> where T: Clone + Send + Sync + Serialize + 'static);
impl_property!(HashSet<T> where T: Clone + Eq + Send + Sync + Hash + Serialize + 'static);
impl_property!(HashMap<K, V> where
K: Clone + Eq + Send + Sync + Hash + Serialize + 'static,
V: Clone + Send + Sync + Serialize + 'static,);
impl_property!(BTreeMap<K, V> where
K: Clone + Ord + Send + Sync + Serialize + 'static,
V: Clone + Send + Sync + Serialize + 'static);
impl<T> AsProperties for Vec<T> {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl<T> AsProperties for VecDeque<T> {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl<K> AsProperties for HashSet<K> {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl<K, V> AsProperties for HashMap<K, V> {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl<K, V> AsProperties for BTreeMap<K, V> {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}

View file

@ -2,12 +2,20 @@ mod property;
mod properties; mod properties;
mod dynamic_properties; mod dynamic_properties;
mod type_registry; mod type_registry;
mod impl_property_std;
mod impl_property_smallvec;
mod impl_property_glam;
mod impl_property_legion;
pub mod ron; pub mod ron;
pub use property::*; pub use property::*;
pub use properties::*; pub use properties::*;
pub use dynamic_properties::*; pub use dynamic_properties::*;
pub use type_registry::*; pub use type_registry::*;
pub use impl_property_std::*;
pub use impl_property_glam::*;
pub use impl_property_smallvec::*;
pub use impl_property_legion::*;
pub use bevy_property_derive::*; pub use bevy_property_derive::*;
pub use serde; pub use serde;

View file

@ -41,635 +41,14 @@ impl PropertyVal for dyn Property {
} }
} }
impl Property for usize { // used by impl_property
#[inline] #[allow(unused_macros)]
fn any(&self) -> &dyn Any { macro_rules! as_item { ($i:item) => {$i} }
self
} #[macro_export]
macro_rules! impl_property {
#[inline] ($ty:ident) => {
fn any_mut(&mut self) -> &mut dyn Any { impl Property for $ty {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for usize {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for u64 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for u64 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for u32 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for u32 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for u16 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for u16 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for u8 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for u8 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for isize {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for isize {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for i64 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for i64 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for i32 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for i32 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for i16 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i8>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for i16 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for i8 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<i64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<i16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<isize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<usize>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u64>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u32>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u16>() {
*self = *prop as Self;
} else if let Some(prop) = value.downcast_ref::<u8>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for i8 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for f32 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<f64>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for f32 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for f64 {
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = *prop;
} else if let Some(prop) = value.downcast_ref::<f32>() {
*self = *prop as Self;
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
}
}
impl AsProperties for f64 {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl Property for String {
#[inline] #[inline]
fn any(&self) -> &dyn Any { fn any(&self) -> &dyn Any {
self self
@ -694,17 +73,23 @@ impl Property for String {
let value = value.any(); let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() { if let Some(prop) = value.downcast_ref::<Self>() {
*self = prop.clone(); *self = prop.clone();
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
}
} }
} }
}
impl AsProperties for String { impl AsProperties for $ty {
fn as_properties(&self) -> Option<&dyn Properties> { fn as_properties(&self) -> Option<&dyn Properties> {
None None
} }
} }
};
impl Property for bool { (@$trait_:ident [$($args:ident,)*] where [$($preds:tt)+]) => {
impl_property! {
@as_item
impl<$($args),*> Property for $trait_<$($args),*> where $($args: ::std::any::Any + 'static,)*
$($preds)* {
#[inline] #[inline]
fn any(&self) -> &dyn Any { fn any(&self) -> &dyn Any {
self self
@ -729,204 +114,19 @@ impl Property for bool {
let value = value.any(); let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() { if let Some(prop) = value.downcast_ref::<Self>() {
*self = prop.clone(); *self = prop.clone();
} else {
panic!("prop value is not {}", std::any::type_name::<Self>());
} }
} }
} }
}
impl AsProperties for bool { };
fn as_properties(&self) -> Option<&dyn Properties> { (@as_item $i:item) => { $i };
None
} (
} $trait_:ident < $($args:ident),* $(,)* >
where $($preds:tt)+
impl<T> Property for Vec<T> ) => {
where impl_property! { @$trait_ [$($args,)*] where [$($preds)*] }
T: Clone + Send + Sync + Serialize + 'static, };
{
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = prop.clone();
}
}
}
impl<T> AsProperties for Vec<T> {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl<T> Property for VecDeque<T>
where
T: Clone + Send + Sync + Serialize + 'static,
{
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = prop.clone();
}
}
}
impl<T> AsProperties for VecDeque<T> {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl<K> Property for HashSet<K>
where
K: Clone + Eq + Send + Sync + Hash + Serialize + 'static,
{
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = prop.clone();
}
}
}
impl<K> AsProperties for HashSet<K> {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl<K, V> Property for HashMap<K, V>
where
K: Clone + Eq + Send + Sync + Hash + Serialize + 'static,
V: Clone + Send + Sync + Serialize + 'static,
{
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = prop.clone();
}
}
}
impl<K, V> AsProperties for HashMap<K, V> {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
}
impl<K, V> Property for BTreeMap<K, V>
where
K: Clone + Ord + Send + Sync + Serialize + 'static,
V: Clone + Send + Sync + Serialize + 'static,
{
#[inline]
fn any(&self) -> &dyn Any {
self
}
#[inline]
fn any_mut(&mut self) -> &mut dyn Any {
self
}
#[inline]
fn clone_prop(&self) -> Box<dyn Property> {
Box::new(self.clone())
}
#[inline]
fn apply(&mut self, value: &dyn Property) {
self.set(value);
}
fn set(&mut self, value: &dyn Property) {
let value = value.any();
if let Some(prop) = value.downcast_ref::<Self>() {
*self = prop.clone();
}
}
}
impl<K, V> AsProperties for BTreeMap<K, V> {
fn as_properties(&self) -> Option<&dyn Properties> {
None
}
} }

View file

@ -8,10 +8,11 @@ edition = "2018"
[dependencies] [dependencies]
# bevy # bevy
bevy_app = { path = "../bevy_app" } bevy_app = { path = "../bevy_app" }
bevy_core = { path = "../bevy_core" }
bevy_transform = { path = "../bevy_transform" }
bevy_asset = { path = "../bevy_asset" } bevy_asset = { path = "../bevy_asset" }
bevy_core = { path = "../bevy_core" }
bevy_derive = { path = "../bevy_derive" } bevy_derive = { path = "../bevy_derive" }
bevy_property = { path = "../bevy_property" }
bevy_transform = { path = "../bevy_transform" }
bevy_window = { path = "../bevy_window" } bevy_window = { path = "../bevy_window" }
legion = { path = "../bevy_legion" } legion = { path = "../bevy_legion" }

View file

@ -1,12 +1,13 @@
use crate::{pipeline::PipelineDescriptor, render_resource::RenderResourceAssignments}; use crate::{pipeline::PipelineDescriptor, render_resource::RenderResourceAssignments};
use bevy_asset::Handle; use bevy_asset::Handle;
use bevy_property::Properties;
#[derive(Properties)]
pub struct Renderable { pub struct Renderable {
pub is_visible: bool, pub is_visible: bool,
pub is_instanced: bool, pub is_instanced: bool,
// TODO: make these hidden if possible
pub pipelines: Vec<Handle<PipelineDescriptor>>, pub pipelines: Vec<Handle<PipelineDescriptor>>,
#[prop(ignore)]
pub render_resource_assignments: RenderResourceAssignments, pub render_resource_assignments: RenderResourceAssignments,
} }

View file

@ -88,4 +88,15 @@ impl Scene {
Ok(()) Ok(())
} }
// TODO: move to AssetSaver when it is implemented
pub fn serialize_ron(&self) -> Result<String, ron::Error> {
let pretty_config = ron::ser::PrettyConfig::default()
.with_decimal_floats(true)
.with_new_line("\n".to_string());
let mut buf = Vec::new();
let mut serializer = ron::ser::Serializer::new(&mut buf, Some(pretty_config), true)?;
self.serialize(&mut serializer)?;
Ok(String::from_utf8(buf).unwrap())
}
} }

View file

@ -10,6 +10,7 @@ use std::{cell::RefCell, path::Path, rc::Rc};
pub struct SceneLoader { pub struct SceneLoader {
property_type_registry: PropertyTypeRegistryContext, property_type_registry: PropertyTypeRegistryContext,
} }
impl FromResources for SceneLoader { impl FromResources for SceneLoader {
fn from_resources(resources: &Resources) -> Self { fn from_resources(resources: &Resources) -> Self {
let property_type_registry = resources.get::<PropertyTypeRegistryContext>().unwrap(); let property_type_registry = resources.get::<PropertyTypeRegistryContext>().unwrap();

View file

@ -9,10 +9,11 @@ license = "MIT"
[dependencies] [dependencies]
legion = { path = "../bevy_legion", features = ["serialize"]} legion = { path = "../bevy_legion", features = ["serialize"]}
glam = { path = "../bevy_glam" } glam = { path = "../bevy_glam" }
bevy_property = { path = "../bevy_property" }
log = "0.4" log = "0.4"
rayon = "1.2" rayon = "1.2"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
smallvec = "1.4" smallvec = { version = "1.4", features = ["serde"] }
shrinkwraprs = "0.2" shrinkwraprs = "0.2"
[dev-dependencies] [dev-dependencies]

View file

@ -1,8 +1,9 @@
use crate::ecs::prelude::*; use crate::ecs::prelude::*;
use shrinkwraprs::Shrinkwrap; use shrinkwraprs::Shrinkwrap;
use smallvec::SmallVec; use smallvec::SmallVec;
use bevy_property::Properties;
#[derive(Shrinkwrap, Default, Clone)] #[derive(Shrinkwrap, Default, Clone, Properties)]
#[shrinkwrap(mutable)] #[shrinkwrap(mutable)]
pub struct Children(pub SmallVec<[Entity; 8]>); pub struct Children(pub SmallVec<[Entity; 8]>);

View file

@ -1,8 +1,9 @@
use crate::math::Mat4; use crate::math::Mat4;
use shrinkwraprs::Shrinkwrap; use shrinkwraprs::Shrinkwrap;
use std::fmt; use std::fmt;
use bevy_property::Properties;
#[derive(Shrinkwrap, Debug, PartialEq, Clone, Copy)] #[derive(Shrinkwrap, Debug, PartialEq, Clone, Copy, Properties)]
#[shrinkwrap(mutable)] #[shrinkwrap(mutable)]
pub struct LocalToParent(pub Mat4); pub struct LocalToParent(pub Mat4);

View file

@ -1,8 +1,9 @@
use crate::math::Mat4; use crate::math::Mat4;
use shrinkwraprs::Shrinkwrap; use shrinkwraprs::Shrinkwrap;
use std::fmt; use std::fmt;
use bevy_property::Properties;
#[derive(Shrinkwrap, Debug, PartialEq, Clone, Copy)] #[derive(Shrinkwrap, Debug, PartialEq, Clone, Copy, Properties)]
#[shrinkwrap(mutable)] #[shrinkwrap(mutable)]
pub struct LocalToWorld(pub Mat4); pub struct LocalToWorld(pub Mat4);

View file

@ -7,6 +7,7 @@ edition = "2018"
[dependencies] [dependencies]
bevy_app = { path = "../bevy_app" } bevy_app = { path = "../bevy_app" }
bevy_asset = { path = "../bevy_asset" } bevy_asset = { path = "../bevy_asset" }
bevy_component_registry = { path = "../bevy_component_registry" }
bevy_core = { path = "../bevy_core" } bevy_core = { path = "../bevy_core" }
bevy_derive = { path = "../bevy_derive" } bevy_derive = { path = "../bevy_derive" }
bevy_text = { path = "../bevy_text" } bevy_text = { path = "../bevy_text" }

View file

@ -1,5 +1,4 @@
use bevy::{component_registry::ComponentRegistryContext, prelude::*}; use bevy::{component_registry::ComponentRegistryContext, prelude::*};
use serde::Serialize;
fn main() { fn main() {
App::build() App::build()
@ -44,9 +43,7 @@ fn serialize_scene(world: &mut World, resources: &mut Resources) {
let component_registry = resources.get::<ComponentRegistryContext>().unwrap(); let component_registry = resources.get::<ComponentRegistryContext>().unwrap();
world world
.build() .build()
.build_entity()
.add(Test { x: 1.0, y: 2.0 }) .add(Test { x: 1.0, y: 2.0 })
.add(Handle::<Mesh>::new())
.add(Foo { .add(Foo {
value: "hello".to_string(), value: "hello".to_string(),
}) })
@ -54,10 +51,5 @@ fn serialize_scene(world: &mut World, resources: &mut Resources) {
.add(Test { x: 3.0, y: 4.0 }); .add(Test { x: 3.0, y: 4.0 });
let scene = Scene::from_world(world, &component_registry.value.read().unwrap()); let scene = Scene::from_world(world, &component_registry.value.read().unwrap());
let pretty_config = ron::ser::PrettyConfig::default().with_decimal_floats(true); println!("{}", scene.serialize_ron().unwrap());
let mut buf = Vec::new();
let mut serializer = ron::ser::Serializer::new(&mut buf, Some(pretty_config), true).unwrap();
scene.serialize(&mut serializer).unwrap();
let ron_string = String::from_utf8(buf).unwrap();
println!("{}", ron_string);
} }