Add no_std
support to bevy_transform
(#17030)
# Objective - Contributes to #15460 ## Solution - Added the following features: - `std` (default) - `alloc` (default) - `bevy_reflect` (default) - `libm` ## Testing - CI ## Notes - `alloc` feature added to allow using this crate in `no_alloc` environments. - `bevy_reflect` was previously always enabled when `bevy-support` was enabled, which isn't how most other crates handle reflection. I've brought this in line with how most crates gate `bevy_reflect`.
This commit is contained in:
parent
9ac7e17f2e
commit
db5c31e1c4
@ -10,16 +10,16 @@ keywords = ["bevy"]
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# bevy
|
# bevy
|
||||||
bevy_app = { path = "../bevy_app", version = "0.15.0-dev", optional = true }
|
bevy_app = { path = "../bevy_app", version = "0.15.0-dev", default-features = false, optional = true }
|
||||||
bevy_ecs = { path = "../bevy_ecs", version = "0.15.0-dev", features = [
|
bevy_ecs = { path = "../bevy_ecs", version = "0.15.0-dev", default-features = false, optional = true }
|
||||||
"bevy_reflect",
|
bevy_hierarchy = { path = "../bevy_hierarchy", version = "0.15.0-dev", default-features = false, features = [
|
||||||
|
"bevy_app",
|
||||||
], optional = true }
|
], optional = true }
|
||||||
bevy_hierarchy = { path = "../bevy_hierarchy", version = "0.15.0-dev", optional = true }
|
|
||||||
bevy_math = { path = "../bevy_math", version = "0.15.0-dev", default-features = false }
|
bevy_math = { path = "../bevy_math", version = "0.15.0-dev", default-features = false }
|
||||||
bevy_reflect = { path = "../bevy_reflect", version = "0.15.0-dev", features = [
|
bevy_reflect = { path = "../bevy_reflect", version = "0.15.0-dev", default-features = false, optional = true }
|
||||||
"bevy",
|
serde = { version = "1", default-features = false, features = [
|
||||||
|
"derive",
|
||||||
], optional = true }
|
], optional = true }
|
||||||
serde = { version = "1", features = ["derive"], optional = true }
|
|
||||||
thiserror = { version = "2", default-features = false }
|
thiserror = { version = "2", default-features = false }
|
||||||
derive_more = { version = "1", default-features = false, features = ["from"] }
|
derive_more = { version = "1", default-features = false, features = ["from"] }
|
||||||
|
|
||||||
@ -31,24 +31,51 @@ bevy_math = { path = "../bevy_math", version = "0.15.0-dev", default-features =
|
|||||||
approx = "0.5.1"
|
approx = "0.5.1"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
# Adds normal Bevy impls like deriving components, bundles, reflection, as well as adding
|
|
||||||
# systems for transform propagation and more.
|
|
||||||
# This exists because it allows opting out of all of this, leaving only a bare-bones transform struct,
|
|
||||||
# which enables users to depend on that without needing the larger Bevy dependency tree.
|
|
||||||
bevy-support = [
|
|
||||||
"dep:bevy_app",
|
|
||||||
"dep:bevy_ecs",
|
|
||||||
"dep:bevy_hierarchy",
|
|
||||||
"dep:bevy_reflect",
|
|
||||||
"bevy_math/bevy_reflect",
|
|
||||||
]
|
|
||||||
|
|
||||||
# Turning off default features leaves you with a barebones
|
# Turning off default features leaves you with a barebones
|
||||||
# definition of transform.
|
# definition of transform.
|
||||||
default = ["bevy-support"]
|
default = ["std", "bevy-support", "bevy_reflect"]
|
||||||
|
|
||||||
|
# Functionality
|
||||||
|
|
||||||
|
## Adds normal Bevy impls like deriving components, bundles, reflection, as well as adding
|
||||||
|
## systems for transform propagation and more.
|
||||||
|
## This exists because it allows opting out of all of this, leaving only a bare-bones transform struct,
|
||||||
|
## which enables users to depend on that without needing the larger Bevy dependency tree.
|
||||||
|
bevy-support = ["alloc", "dep:bevy_app", "dep:bevy_ecs", "dep:bevy_hierarchy"]
|
||||||
|
|
||||||
|
## Adds serialization support through `serde`.
|
||||||
serialize = ["dep:serde", "bevy_math/serialize"]
|
serialize = ["dep:serde", "bevy_math/serialize"]
|
||||||
|
|
||||||
|
## Adds runtime reflection support using `bevy_reflect`.
|
||||||
|
bevy_reflect = [
|
||||||
|
"bevy-support",
|
||||||
|
"dep:bevy_reflect",
|
||||||
|
"bevy_math/bevy_reflect",
|
||||||
|
"bevy_ecs/bevy_reflect",
|
||||||
|
"bevy_app/bevy_reflect",
|
||||||
|
]
|
||||||
|
|
||||||
|
# Platform Compatibility
|
||||||
|
|
||||||
|
## Allows access to the `std` crate. Enabling this feature will prevent compilation
|
||||||
|
## on `no_std` targets, but provides access to certain additional features on
|
||||||
|
## supported platforms.
|
||||||
|
std = [
|
||||||
|
"alloc",
|
||||||
|
"bevy_app?/std",
|
||||||
|
"bevy_ecs?/std",
|
||||||
|
"bevy_hierarchy?/std",
|
||||||
|
"bevy_math/std",
|
||||||
|
"bevy_reflect?/std",
|
||||||
|
"serde?/std",
|
||||||
|
]
|
||||||
|
|
||||||
|
## Allows access to the `alloc` crate.
|
||||||
|
alloc = ["serde?/alloc"]
|
||||||
|
|
||||||
|
## Uses the `libm` maths library instead of the one provided in `std` and `core`.
|
||||||
|
libm = ["bevy_math/libm"]
|
||||||
|
|
||||||
[lints]
|
[lints]
|
||||||
workspace = true
|
workspace = true
|
||||||
|
|
||||||
|
@ -1,13 +1,18 @@
|
|||||||
use core::ops::Mul;
|
use core::ops::Mul;
|
||||||
|
|
||||||
use super::Transform;
|
use super::Transform;
|
||||||
use bevy_math::{Affine3A, Dir3, Isometry3d, Mat4, Quat, Vec3, Vec3A};
|
use bevy_math::{ops, Affine3A, Dir3, Isometry3d, Mat4, Quat, Vec3, Vec3A};
|
||||||
#[cfg(all(feature = "bevy-support", feature = "serialize"))]
|
|
||||||
use bevy_reflect::{ReflectDeserialize, ReflectSerialize};
|
|
||||||
use derive_more::derive::From;
|
use derive_more::derive::From;
|
||||||
|
|
||||||
|
#[cfg(all(feature = "bevy_reflect", feature = "serialize"))]
|
||||||
|
use bevy_reflect::{ReflectDeserialize, ReflectSerialize};
|
||||||
|
|
||||||
#[cfg(feature = "bevy-support")]
|
#[cfg(feature = "bevy-support")]
|
||||||
|
use bevy_ecs::component::Component;
|
||||||
|
|
||||||
|
#[cfg(feature = "bevy_reflect")]
|
||||||
use {
|
use {
|
||||||
bevy_ecs::{component::Component, reflect::ReflectComponent},
|
bevy_ecs::reflect::ReflectComponent,
|
||||||
bevy_reflect::{std_traits::ReflectDefault, Reflect},
|
bevy_reflect::{std_traits::ReflectDefault, Reflect},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -42,26 +47,27 @@ use {
|
|||||||
/// [transform_example]: https://github.com/bevyengine/bevy/blob/latest/examples/transforms/transform.rs
|
/// [transform_example]: https://github.com/bevyengine/bevy/blob/latest/examples/transforms/transform.rs
|
||||||
#[derive(Debug, PartialEq, Clone, Copy, From)]
|
#[derive(Debug, PartialEq, Clone, Copy, From)]
|
||||||
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
|
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
|
||||||
|
#[cfg_attr(feature = "bevy-support", derive(Component))]
|
||||||
#[cfg_attr(
|
#[cfg_attr(
|
||||||
feature = "bevy-support",
|
feature = "bevy_reflect",
|
||||||
derive(Component, Reflect),
|
derive(Reflect),
|
||||||
reflect(Component, Default, PartialEq, Debug)
|
reflect(Component, Default, PartialEq, Debug)
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(
|
#[cfg_attr(
|
||||||
all(feature = "bevy-support", feature = "serialize"),
|
all(feature = "bevy_reflect", feature = "serialize"),
|
||||||
reflect(Serialize, Deserialize)
|
reflect(Serialize, Deserialize)
|
||||||
)]
|
)]
|
||||||
pub struct GlobalTransform(Affine3A);
|
pub struct GlobalTransform(Affine3A);
|
||||||
|
|
||||||
macro_rules! impl_local_axis {
|
macro_rules! impl_local_axis {
|
||||||
($pos_name: ident, $neg_name: ident, $axis: ident) => {
|
($pos_name: ident, $neg_name: ident, $axis: ident) => {
|
||||||
#[doc=std::concat!("Return the local ", std::stringify!($pos_name), " vector (", std::stringify!($axis) ,").")]
|
#[doc=core::concat!("Return the local ", core::stringify!($pos_name), " vector (", core::stringify!($axis) ,").")]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn $pos_name(&self) -> Dir3 {
|
pub fn $pos_name(&self) -> Dir3 {
|
||||||
Dir3::new_unchecked((self.0.matrix3 * Vec3::$axis).normalize())
|
Dir3::new_unchecked((self.0.matrix3 * Vec3::$axis).normalize())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc=std::concat!("Return the local ", std::stringify!($neg_name), " vector (-", std::stringify!($axis) ,").")]
|
#[doc=core::concat!("Return the local ", core::stringify!($neg_name), " vector (-", core::stringify!($axis) ,").")]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn $neg_name(&self) -> Dir3 {
|
pub fn $neg_name(&self) -> Dir3 {
|
||||||
-self.$pos_name()
|
-self.$pos_name()
|
||||||
@ -235,7 +241,7 @@ impl GlobalTransform {
|
|||||||
//Formula based on glam's implementation https://github.com/bitshifter/glam-rs/blob/2e4443e70c709710dfb25958d866d29b11ed3e2b/src/f32/affine3a.rs#L290
|
//Formula based on glam's implementation https://github.com/bitshifter/glam-rs/blob/2e4443e70c709710dfb25958d866d29b11ed3e2b/src/f32/affine3a.rs#L290
|
||||||
let det = self.0.matrix3.determinant();
|
let det = self.0.matrix3.determinant();
|
||||||
Vec3::new(
|
Vec3::new(
|
||||||
self.0.matrix3.x_axis.length() * det.signum(),
|
self.0.matrix3.x_axis.length() * ops::copysign(1., det),
|
||||||
self.0.matrix3.y_axis.length(),
|
self.0.matrix3.y_axis.length(),
|
||||||
self.0.matrix3.z_axis.length(),
|
self.0.matrix3.z_axis.length(),
|
||||||
)
|
)
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
use super::GlobalTransform;
|
use super::GlobalTransform;
|
||||||
use bevy_math::{Affine3A, Dir3, Isometry3d, Mat3, Mat4, Quat, Vec3};
|
use bevy_math::{Affine3A, Dir3, Isometry3d, Mat3, Mat4, Quat, Vec3};
|
||||||
use core::ops::Mul;
|
use core::ops::Mul;
|
||||||
|
|
||||||
#[cfg(feature = "bevy-support")]
|
#[cfg(feature = "bevy-support")]
|
||||||
use {
|
use bevy_ecs::{component::Component, prelude::require};
|
||||||
bevy_ecs::{component::Component, prelude::require, reflect::ReflectComponent},
|
|
||||||
bevy_reflect::prelude::*,
|
#[cfg(feature = "bevy_reflect")]
|
||||||
};
|
use {bevy_ecs::reflect::ReflectComponent, bevy_reflect::prelude::*};
|
||||||
|
|
||||||
/// Describe the position of an entity. If the entity has a parent, the position is relative
|
/// Describe the position of an entity. If the entity has a parent, the position is relative
|
||||||
/// to its parent position.
|
/// to its parent position.
|
||||||
@ -38,14 +39,14 @@ use {
|
|||||||
/// [transform_example]: https://github.com/bevyengine/bevy/blob/latest/examples/transforms/transform.rs
|
/// [transform_example]: https://github.com/bevyengine/bevy/blob/latest/examples/transforms/transform.rs
|
||||||
#[derive(Debug, PartialEq, Clone, Copy)]
|
#[derive(Debug, PartialEq, Clone, Copy)]
|
||||||
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
|
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
|
||||||
|
#[cfg_attr(feature = "bevy-support", derive(Component), require(GlobalTransform))]
|
||||||
#[cfg_attr(
|
#[cfg_attr(
|
||||||
feature = "bevy-support",
|
feature = "bevy_reflect",
|
||||||
derive(Component, Reflect),
|
derive(Reflect),
|
||||||
require(GlobalTransform),
|
|
||||||
reflect(Component, Default, PartialEq, Debug)
|
reflect(Component, Default, PartialEq, Debug)
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(
|
#[cfg_attr(
|
||||||
all(feature = "bevy-support", feature = "serialize"),
|
all(feature = "bevy_reflect", feature = "serialize"),
|
||||||
reflect(Serialize, Deserialize)
|
reflect(Serialize, Deserialize)
|
||||||
)]
|
)]
|
||||||
pub struct Transform {
|
pub struct Transform {
|
||||||
|
@ -4,6 +4,10 @@
|
|||||||
html_logo_url = "https://bevyengine.org/assets/icon.png",
|
html_logo_url = "https://bevyengine.org/assets/icon.png",
|
||||||
html_favicon_url = "https://bevyengine.org/assets/icon.png"
|
html_favicon_url = "https://bevyengine.org/assets/icon.png"
|
||||||
)]
|
)]
|
||||||
|
#![cfg_attr(not(feature = "std"), no_std)]
|
||||||
|
|
||||||
|
#[cfg(feature = "alloc")]
|
||||||
|
extern crate alloc;
|
||||||
|
|
||||||
#[cfg(feature = "bevy-support")]
|
#[cfg(feature = "bevy-support")]
|
||||||
pub mod commands;
|
pub mod commands;
|
||||||
|
@ -3,10 +3,13 @@ use bevy_ecs::schedule::{IntoSystemConfigs, IntoSystemSetConfigs, SystemSet};
|
|||||||
use bevy_hierarchy::ValidParentCheckPlugin;
|
use bevy_hierarchy::ValidParentCheckPlugin;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
prelude::{GlobalTransform, Transform},
|
components::GlobalTransform,
|
||||||
systems::{propagate_transforms, sync_simple_transforms},
|
systems::{propagate_transforms, sync_simple_transforms},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[cfg(feature = "bevy_reflect")]
|
||||||
|
use crate::components::Transform;
|
||||||
|
|
||||||
/// Set enum for the systems relating to transform propagation
|
/// Set enum for the systems relating to transform propagation
|
||||||
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
|
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
|
||||||
pub enum TransformSystem {
|
pub enum TransformSystem {
|
||||||
@ -25,9 +28,11 @@ impl Plugin for TransformPlugin {
|
|||||||
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
|
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
|
||||||
struct PropagateTransformsSet;
|
struct PropagateTransformsSet;
|
||||||
|
|
||||||
|
#[cfg(feature = "bevy_reflect")]
|
||||||
app.register_type::<Transform>()
|
app.register_type::<Transform>()
|
||||||
.register_type::<GlobalTransform>()
|
.register_type::<GlobalTransform>();
|
||||||
.add_plugins(ValidParentCheckPlugin::<GlobalTransform>::default())
|
|
||||||
|
app.add_plugins(ValidParentCheckPlugin::<GlobalTransform>::default())
|
||||||
.configure_sets(
|
.configure_sets(
|
||||||
PostStartup,
|
PostStartup,
|
||||||
PropagateTransformsSet.in_set(TransformSystem::TransformPropagate),
|
PropagateTransformsSet.in_set(TransformSystem::TransformPropagate),
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use crate::components::{GlobalTransform, Transform};
|
use crate::components::{GlobalTransform, Transform};
|
||||||
|
use alloc::vec::Vec;
|
||||||
use bevy_ecs::{
|
use bevy_ecs::{
|
||||||
change_detection::Ref,
|
change_detection::Ref,
|
||||||
prelude::{Changed, DetectChanges, Entity, Query, With, Without},
|
prelude::{Changed, DetectChanges, Entity, Query, With, Without},
|
||||||
|
@ -134,6 +134,14 @@ impl Prepare for CompileCheckNoStdCommand {
|
|||||||
"Please fix compiler errors in output above for bevy_state no_std compatibility.",
|
"Please fix compiler errors in output above for bevy_state no_std compatibility.",
|
||||||
));
|
));
|
||||||
|
|
||||||
|
commands.push(PreparedCommand::new::<Self>(
|
||||||
|
cmd!(
|
||||||
|
sh,
|
||||||
|
"cargo check -p bevy_transform --no-default-features --features bevy-support,serialize,libm --target {target}"
|
||||||
|
),
|
||||||
|
"Please fix compiler errors in output above for bevy_transform no_std compatibility.",
|
||||||
|
));
|
||||||
|
|
||||||
commands
|
commands
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user