use bevy::{prelude::*, transform, math::Vec4Swizzles}; use crate::{screeninfo::ScreenInfo, offaxis::OffAxisProjection, projection::create_offaxis_matrices}; #[derive(Component, Default)] pub struct Viewer { pub position: Vec3, pub orientation: Quat, pub alpha: f32, } impl Viewer { pub fn new(position: Vec3) -> Self { Self { position, orientation: Quat::IDENTITY, alpha: 0.0, } } pub fn default() -> Self { Self { position: Vec3::ZERO, orientation: Quat::IDENTITY, alpha: 0.0, } } } pub fn apply_viewer_to_projections(mut query: Query<(&Viewer,&ScreenInfo,&mut OffAxisProjection,&mut Transform)>) { query.for_each_mut(|(viewer,screen_info,mut offaxis, mut transform)| { let eye = viewer.position; let (lower_left,lower_right,upper_left,_) = screen_info.corner_points(); // let lower_left = Vec3::new(screen_info.center.x - screen_info.width / 2.0,screen_info.center.y - screen_info.height / 2.0,screen_info.center.z); // let upper_left = Vec3::new(screen_info.center.x - screen_info.width / 2.0,screen_info.center.y + screen_info.height / 2.0,screen_info.center.z); // let lower_right = Vec3::new(screen_info.center.x + screen_info.width / 2.0,screen_info.center.y - screen_info.height / 2.0,screen_info.center.z); let (view, projection) = create_offaxis_matrices(lower_left, lower_right, upper_left, eye, 1000.0f32); offaxis.projection_matrix = projection; *transform = Transform::from_matrix(view.inverse()); // *transform = Transform::from_translation(eye).looking_at(Vec3::ZERO, Vec3::Y); }); } pub fn simulate_viewer(mut query: Query<&mut Viewer>,time: Res