# Bevy Component Mirrors
[](https://github.com/bevyengine/bevy/blob/main/docs/plugins_guidelines.md#main-branch-tracking)
[](https://crates.io/crates/bevy_mod_component_mirror)
[](./LICENSE)
[](https://docs.rs/bevy_mod_component_mirror/)
A third party crate to mirror `Component` values.
By default, it also provides a set of bevy `Component`s
mirroring the values of [`bevy_rapier`] `Component`s.
(Currently only `bevy_rapier3d`, PRs welcome!)
Since some of [`bevy_rapier`] `Component`s do not implement `Reflect`,
they may be harder to work with.
This crate is especially useful with [`bevy-inspector-egui`],
it will allow you to edit rapier values at run time,
so you don't have to restart your game repetitively
to find the right physics parameters.
## Usage
1. Add this crate as a dependency to your `Cargo.toml`.
```toml
[dependencies]
bevy_mod_component_mirror = "<current version>"
```
2. Add `RapierMirrorsPlugins` to your app
```rust
use bevy_mod_component_mirror::RapierMirrorsPlugins;
# fn main() {
# let mut app = bevy::prelude::App::new();
app
// Notice v the plural
.add_plugins(RapierMirrorsPlugins);
# }
```
That's it! Now every `Entity` with the following rapier (**3d**) components
will automatically have an equivalent `XyzMirror` component that automatically
syncs its value with it.
- `ImpulseJoint`
- `Collider` (**some collider shape are not implemented yet!**)
- `ColliderMassProperties`
- `AdditionalMassProperties`
### Implement your own mirrors
If you wish to mirror other components, you need to do the following:
- Create a `Component` (eg: `ForeignMirror`)
- Implement the `Mirror` trait for that component.
- Implement `From<&'a Foreign> for ForeignMirror`
- Add `MirrorPlugin::<Foreign, ForeignMirror>::new()` to your `app`
```rust
use bevy_mod_component_mirror::{Mirror, MirrorPlugin};
use bevy::prelude::*;
# mod foreign_crate {
# use super::*;
# #[derive(Component)]
# pub struct Foreign; impl Foreign {
# pub fn set_length(&mut self, value: f32) {}
# pub fn length(&self) -> f32 { 0.0 }
# }}
use foreign_crate::Foreign;
// Component: required because you want it to be a component
// Reflect: this let `MirrorPlugin` register the `Mirror` type itself
#[derive(Component, Reflect)]
pub struct ForeignMirror {
inner: f32,
}
// Foreign → ForeignMirror
impl<'a> From<&'a Foreign> for ForeignMirror {
fn from(value: &'a Foreign) -> Self {
ForeignMirror {
inner: value.length(),
}
}
}
// ForeignMirror → Foreign
impl Mirror<Foreign> for ForeignMirror {
fn apply(&self, value: &mut Foreign) {
value.set_length(self.inner);
}
}
fn main() {
let mut app = App::new();
app.add_plugin(MirrorPlugin::<Foreign, ForeignMirror>::new());
}
```
### Features
If you don't need the definitions for the rapier components
but still wish to use the mirror plugin,
you can disable the rapier components with:
```toml
[dependencies]
bevy_mod_component_mirror = { version = "<fill in>", default-features = false }
```
## Version matrix
| 0.9 | 0.20.0 | `<current version>` |
## License
Copyright © 2022 Nicola Papale
This software is licensed under either MIT or Apache 2.0 at your leisure. See
licenses directory for details.
[`bevy_rapier`]: https://lib.rs/crates/bevy_rapier3d
[`bevy-inspector-egui`]: https://lib.rs/crates/bevy-inspector-egui