oxygengine_integration_p2d_cr/
lib.rs

1use 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}