use crate::engine::state::State;
use bevy::camera::ScalingMode;
use bevy::math::Vec2;
use bevy::prelude::{
Camera2d, Commands, OrthographicProjection, Projection, Query, Res, ResMut, Transform, With,
};
use bevy::window::{PrimaryWindow, Window};
use crate::visualization::{
asset_handle_factory::AssetHandleFactoryResource,
simulation_descriptor::SimulationDescriptor,
visualization_state::VisualizationState,
wrappers::{ActiveSchedule, ActiveState},
};
pub fn init_system<I: VisualizationState<S> + 'static + bevy::prelude::Resource, S: State>(
on_init: Res<I>,
mut sprite_factory: AssetHandleFactoryResource,
mut commands: Commands,
state_resource: ResMut<ActiveState<S>>,
schedule_resource: ResMut<ActiveSchedule>,
window: Query<&Window, With<PrimaryWindow>>,
mut sim: ResMut<SimulationDescriptor>,
) {
if let Ok(window) = window.single() {
let far = 1000.;
let ui_offset = -sim.ui_width;
let scale_x = sim.width / (window.width() + ui_offset);
let mut initial_transform = Transform::from_xyz(ui_offset * scale_x, 0., far - 0.1);
initial_transform.scale.x = scale_x;
initial_transform.scale.y = sim.height / window.height();
commands.spawn((
Camera2d,
Projection::Orthographic(OrthographicProjection {
far,
scaling_mode: ScalingMode::WindowSize,
viewport_origin: Vec2::new(0., 0.),
..OrthographicProjection::default_2d()
}),
initial_transform,
));
on_init.on_init(
&mut commands,
&mut sprite_factory,
&mut state_resource.0.lock().expect("error on lock"),
&mut schedule_resource.0.lock().expect("error on lock"),
&mut *sim,
);
on_init.setup_graphics(
&mut schedule_resource.0.lock().expect("error on lock"),
&mut commands,
&mut state_resource.0.lock().expect("error on lock"),
sprite_factory,
)
}
}