oxygengine_integration_p2d_cr/
lib.rs1use oxygengine_composite_renderer::{component::CompositeTransform, math::Vec2};
2use oxygengine_core::{
3 app::AppBuilder,
4 ecs::{
5 hierarchy::Parent,
6 pipeline::{PipelineBuilder, PipelineBuilderError},
7 Comp, Universe, WorldRef,
8 },
9 prefab::{Prefab, PrefabComponent, PrefabManager},
10 Ignite,
11};
12use oxygengine_physics_2d::{component::RigidBody2d, resource::Physics2dWorld};
13use serde::{Deserialize, Serialize};
14
15pub mod prelude {
16 pub use crate::*;
17}
18
19#[derive(Ignite, Debug, Default, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
20pub struct Physics2dSyncCompositeTransform;
21
22impl Prefab for Physics2dSyncCompositeTransform {}
23impl PrefabComponent for Physics2dSyncCompositeTransform {}
24
25pub type ApplyPhysics2dToCompositeTransformSystemResources<'a> = (
26 WorldRef,
27 &'a Physics2dWorld,
28 Comp<&'a RigidBody2d>,
29 Comp<&'a mut CompositeTransform>,
30 Comp<&'a Parent>,
31 Comp<&'a Physics2dSyncCompositeTransform>,
32);
33
34pub fn apply_physics_2d_to_composite_transform_system(universe: &mut Universe) {
35 let (world, physics, ..) =
36 universe.query_resources::<ApplyPhysics2dToCompositeTransformSystemResources>();
37
38 for (_, (body, transform)) in world
39 .query::<(&RigidBody2d, &mut CompositeTransform)>()
40 .without::<&Parent>()
41 .with::<&Physics2dSyncCompositeTransform>()
42 .iter()
43 {
44 if let Some(handle) = body.handle() {
45 if let Some(body) = physics.body(handle) {
46 let isometry = body.position();
47 let p = isometry.translation;
48 let r = isometry.rotation.angle();
49 let s = transform.get_scale();
50 transform.apply(Vec2::new(p.x, p.y), r, s);
51 }
52 }
53 }
54}
55
56pub fn bundle_installer<PB>(builder: &mut AppBuilder<PB>, _: ()) -> Result<(), PipelineBuilderError>
57where
58 PB: PipelineBuilder,
59{
60 builder.install_system::<ApplyPhysics2dToCompositeTransformSystemResources>(
61 "apply-physics-2d-to-composite-transform",
62 apply_physics_2d_to_composite_transform_system,
63 &[],
64 )?;
65 Ok(())
66}
67
68pub fn prefabs_installer(prefabs: &mut PrefabManager) {
69 prefabs.register_component_factory::<Physics2dSyncCompositeTransform>(
70 "Physics2dSyncCompositeTransform",
71 );
72}