2022-12-11 21:12:08 +01:00
|
|
|
use bevy::{prelude::*, transform, math::Vec4Swizzles};
|
2022-12-09 21:30:47 +01:00
|
|
|
|
2022-12-11 21:12:08 +01:00
|
|
|
use crate::{screeninfo::ScreenInfo, offaxis::OffAxisProjection, projection::create_offaxis_matrices};
|
2022-12-06 15:44:16 +01:00
|
|
|
|
2022-12-11 12:41:34 +01:00
|
|
|
#[derive(Component, Default)]
|
2022-12-06 15:44:16 +01:00
|
|
|
pub struct Viewer {
|
2022-12-06 21:12:15 +01:00
|
|
|
pub position: Vec3,
|
|
|
|
pub orientation: Quat,
|
2022-12-06 15:44:16 +01:00
|
|
|
|
2022-12-06 21:12:15 +01:00
|
|
|
pub alpha: f32,
|
|
|
|
}
|
2022-12-06 15:44:16 +01:00
|
|
|
|
|
|
|
impl Viewer {
|
2022-12-11 12:41:34 +01:00
|
|
|
pub fn new(position: Vec3) -> Self {
|
2022-12-06 21:12:15 +01:00
|
|
|
Self {
|
|
|
|
position,
|
|
|
|
orientation: Quat::IDENTITY,
|
|
|
|
alpha: 0.0,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn default() -> Self {
|
2022-12-06 15:44:16 +01:00
|
|
|
Self {
|
|
|
|
position: Vec3::ZERO,
|
2022-12-06 21:12:15 +01:00
|
|
|
orientation: Quat::IDENTITY,
|
2022-12-11 12:41:34 +01:00
|
|
|
alpha: 0.0,
|
2022-12-06 15:44:16 +01:00
|
|
|
}
|
|
|
|
}
|
2022-12-06 21:12:15 +01:00
|
|
|
}
|
|
|
|
|
2022-12-11 21:12:08 +01:00
|
|
|
|
|
|
|
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());
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn simulate_viewer(mut query: Query<&mut Viewer>,time: Res<Time>) {
|
2022-12-11 12:41:34 +01:00
|
|
|
for mut v in query.iter_mut() {
|
2022-12-11 21:12:08 +01:00
|
|
|
|
2022-12-06 21:12:15 +01:00
|
|
|
//v.position += Vec3::Y * 0.005;
|
2022-12-11 21:12:08 +01:00
|
|
|
v.alpha += 1.5 * time.delta_seconds();
|
2022-12-09 21:30:47 +01:00
|
|
|
|
2022-12-11 21:12:08 +01:00
|
|
|
let radius = 1.0;
|
|
|
|
|
|
|
|
let z_distance = 2.0_f32;
|
2022-12-09 21:30:47 +01:00
|
|
|
|
2022-12-11 12:41:34 +01:00
|
|
|
v.position = Vec3::new(
|
|
|
|
v.alpha.sin() * radius,
|
2022-12-11 21:12:08 +01:00
|
|
|
v.alpha.cos() * radius,
|
2022-12-11 12:41:34 +01:00
|
|
|
z_distance,
|
|
|
|
);
|
2022-12-07 20:41:17 +01:00
|
|
|
|
2022-12-11 21:12:08 +01:00
|
|
|
info!("Viewer {:?}",v.position);
|
2022-12-06 21:12:15 +01:00
|
|
|
}
|
2022-12-11 12:41:34 +01:00
|
|
|
}
|