PixSpace/src/offaxis.rs

106 lines
2.5 KiB
Rust
Raw Normal View History

2022-07-17 23:18:33 +02:00
use bevy::prelude::*;
2022-11-16 23:07:49 +01:00
use bevy::render::primitives::Frustum;
use bevy::render::camera::{Camera, CameraProjection};
use bevy::render::view::VisibleEntities;
2022-07-17 23:18:33 +02:00
#[derive(Component)]
pub struct OffAxisProjection {
near: f32,
far: f32,
aspect: f32,
}
impl CameraProjection for OffAxisProjection {
fn get_projection_matrix(&self) -> Mat4 {
2022-08-07 22:26:12 +02:00
println!("Here we go!");
2022-07-17 23:18:33 +02:00
Mat4::orthographic_rh(
-self.aspect, self.aspect, -1.0, 1.0, self.near, self.far
)
}
// what to do on window resize
fn update(&mut self, width: f32, height: f32) {
self.aspect = width / height;
}
2022-11-16 23:07:49 +01:00
// fn depth_calculation(&self) -> DepthCalculation {
// // for 2D (camera doesn't rotate)
// DepthCalculation::ZDifference
2022-07-17 23:18:33 +02:00
2022-11-16 23:07:49 +01:00
// // otherwise
// //DepthCalculation::Distance
// }
2022-07-17 23:18:33 +02:00
fn far(&self) -> f32 {
self.far
}
}
impl Default for OffAxisProjection {
fn default() -> Self {
Self { near: 0.0, far: 1000.0, aspect: 1.0 }
}
}
pub fn camera_setup(mut commands: Commands) {
2022-11-16 23:07:49 +01:00
print!("Setup {0}",line!());
2022-07-17 23:18:33 +02:00
// We need all the components that Bevy's built-in camera bundles would add
let projection = OffAxisProjection::default();
2022-11-16 23:07:49 +01:00
2022-07-17 23:18:33 +02:00
let camera = Camera {
2022-08-07 22:26:12 +02:00
// near: projection.near,
// far: projection.far,
2022-07-17 23:18:33 +02:00
..default()
};
2022-11-16 23:07:49 +01:00
print!("Setup {0}",line!());
2022-07-17 23:18:33 +02:00
// position the camera like bevy would do by default for 2D:
let transform = Transform::from_xyz(0.0, 0.0, projection.far - 0.1);
// frustum construction code copied from Bevy
let view_projection =
projection.get_projection_matrix() * transform.compute_matrix().inverse();
2022-11-16 23:07:49 +01:00
let frustum = Frustum::from_view_projection(
2022-07-17 23:18:33 +02:00
&view_projection,
&transform.translation,
&transform.back(),
projection.far,
2022-11-16 23:07:49 +01:00
);
2022-07-17 23:18:33 +02:00
2022-11-16 23:07:49 +01:00
print!("Setup {0}",line!());
// commands.spawn_bundle((
// camera,
// projection,
// frustum,
// VisibleEntities::default(),
// transform,
// GlobalTransform::default(),
// // Camera2d,
// )
// );
2022-08-07 22:26:12 +02:00
2022-11-16 23:07:49 +01:00
print!("Setup {0}",line!());
2022-07-17 23:18:33 +02:00
}
// fn main() {
// // need to add a bevy-internal camera system to update
// // the projection on window resizing
// use bevy::render::camera::camera_system;
// App::new()
// .add_plugins(DefaultPlugins)
// .add_startup_system(setup)
// .add_system_to_stage(
// CoreStage::PostUpdate,
// camera_system::<SimpleOrthoProjection>,
// )
// .run();
// }