1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
use oxygengine_composite_renderer::{component::CompositeTransform, math::Vec2}; use oxygengine_core::{ app::AppBuilder, ecs::{Component, Join, ReadStorage, System, VecStorage, Write, WriteStorage}, hierarchy::Parent, prefab::{Prefab, PrefabComponent, PrefabManager}, }; use oxygengine_physics_2d::{component::RigidBody2d, resource::Physics2dWorld}; use serde::{Deserialize, Serialize}; pub mod prelude { pub use crate::*; } pub fn bundle_installer<'a, 'b>(builder: &mut AppBuilder<'a, 'b>, _: ()) { builder.install_system( ApplyPhysics2dToCompositeTransformSystem, "apply-physics-2d-to-composite-renderer", &[], ); } #[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct Physics2dSyncCompositeTransform; impl Component for Physics2dSyncCompositeTransform { type Storage = VecStorage<Self>; } impl Prefab for Physics2dSyncCompositeTransform {} impl PrefabComponent for Physics2dSyncCompositeTransform {} #[derive(Debug, Default)] pub struct ApplyPhysics2dToCompositeTransformSystem; impl<'s> System<'s> for ApplyPhysics2dToCompositeTransformSystem { #[allow(clippy::type_complexity)] type SystemData = ( Option<Write<'s, Physics2dWorld>>, ReadStorage<'s, RigidBody2d>, WriteStorage<'s, CompositeTransform>, ReadStorage<'s, Parent>, ReadStorage<'s, Physics2dSyncCompositeTransform>, ); fn run(&mut self, (world, bodies, mut transforms, parents, syncs): Self::SystemData) { if world.is_none() { return; } let world: &mut Physics2dWorld = &mut world.unwrap(); for (body, transform, _, _) in (&bodies, &mut transforms, !&parents, &syncs).join() { if let Some(handle) = body.handle() { if let Some(body) = world.body(handle) { let isometry = body.position(); let p = isometry.translation; let r = isometry.rotation.angle(); let s = transform.get_scale(); transform.apply(Vec2::new(p.x as f32, p.y as f32), r as f32, s); } } } } } pub fn prefabs_installer(prefabs: &mut PrefabManager) { prefabs.register_component_factory::<Physics2dSyncCompositeTransform>( "Physics2dSyncCompositeTransform", ); }