use bottomless_pit::camera::Camera;
use bottomless_pit::colour::Colour;
use bottomless_pit::engine_handle::{Engine, EngineBuilder};
use bottomless_pit::input::Key;
use bottomless_pit::material::{Material, MaterialBuilder};
use bottomless_pit::render::RenderHandle;
use bottomless_pit::resource::LoadingOp;
use bottomless_pit::text::TextMaterial;
use bottomless_pit::texture::Texture;
use bottomless_pit::vectors::Vec2;
use bottomless_pit::{vec2, Game};
fn main() {
let mut engine = EngineBuilder::new().build().unwrap();
let texture = Texture::new(&mut engine, "examples/bplogo.png", LoadingOp::Blocking);
let material = MaterialBuilder::new()
.add_texture(texture)
.build(&mut engine);
let camera = Camera::default();
let text = TextMaterial::new(
"Mouse pos: 0,0 \n Mouse pos: 0, 0",
Colour::WHITE,
15.0,
20.0,
);
let game = CameraExample {
material,
text,
camera,
};
engine.run(game);
}
struct CameraExample {
material: Material,
text: TextMaterial,
camera: Camera,
}
impl Game for CameraExample {
fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
let mut render_handle = render.begin_pass(Colour::BLACK);
self.material.add_rectangle(
Vec2 { x: 0.0, y: 0.0 },
Vec2 { x: 300.0, y: 300.0 },
Colour::WHITE,
&render_handle,
);
self.camera.set_active(&mut render_handle);
self.material.draw(&mut render_handle);
render_handle.reset_camera();
self.text
.add_instance(vec2!(0.0), Colour::WHITE, &render_handle);
self.text.draw(&mut render_handle);
}
fn update(&mut self, engine_handle: &mut Engine) {
let dt = engine_handle.get_frame_delta_time();
let mouse_pos = engine_handle.get_mouse_position();
let size = engine_handle.get_window_size();
let move_factor = 15.0;
if engine_handle.is_key_down(Key::A) {
self.camera.center.x -= move_factor * dt;
}
if engine_handle.is_key_down(Key::D) {
self.camera.center.x += move_factor * dt;
}
if engine_handle.is_key_down(Key::W) {
self.camera.center.y += move_factor * dt;
}
if engine_handle.is_key_down(Key::S) {
self.camera.center.y -= move_factor * dt;
}
if engine_handle.is_key_down(Key::Left) {
self.camera.rotation += move_factor * dt;
}
if engine_handle.is_key_down(Key::Right) {
self.camera.rotation -= move_factor * dt;
}
if engine_handle.is_key_down(Key::L) {
self.camera.scale += vec2!(2.0 * dt, 2.0 * dt);
}
if engine_handle.is_key_down(Key::K) {
self.camera.scale -= vec2!(2.0 * dt, 2.0 * dt);
}
if engine_handle.is_key_pressed(Key::Enter) {
self.camera.rotation += 45.0;
}
let trans_mouse = self.camera.transform_point(mouse_pos, size);
self.text.set_text(
&format!(
"Screen mouse pos: {:.3}, {:.3}\nWorld mouse pos: {:.3}, {:.3}",
mouse_pos.x, mouse_pos.y, trans_mouse.x, trans_mouse.y
),
Colour::WHITE,
engine_handle,
);
self.text.prepare(engine_handle);
}
}