use super::*;
pub(crate) fn plugin(app: &mut App) {
#[cfg(feature = "scripting")]
lua::plugin(app);
}
#[derive(Event, Debug)]
pub(crate) struct UpdateCameraPos(pub(crate) Vec2);
impl super::Pico8<'_, '_> {
pub fn camera(&mut self, pos: Option<Vec2>) -> Vec2 {
if let Some(pos) = pos.map(pixel_snap) {
let last = std::mem::replace(&mut self.state.draw_state.camera_position, pos);
if let Some(ref mut delta) = &mut self.state.draw_state.camera_position_delta {
*delta += last - pos;
} else {
self.commands.trigger(UpdateCameraPos(pos));
}
last
} else {
self.state.draw_state.camera_position
}
}
}
#[cfg(feature = "scripting")]
mod lua {
use super::*;
use crate::pico8::lua::with_pico8;
use bevy_mod_scripting::core::bindings::function::{
namespace::{GlobalNamespace, NamespaceBuilder},
script_function::FunctionCallContext,
};
pub(crate) fn plugin(app: &mut App) {
let world = app.world_mut();
NamespaceBuilder::<GlobalNamespace>::new_unregistered(world).register(
"_camera",
|ctx: FunctionCallContext, x: Option<f32>, y: Option<f32>| {
with_pico8(&ctx, move |pico8| {
let arg = x.map(|x| Vec2::new(x, y.unwrap_or(0.0)));
Ok(pico8.camera(arg))
})
.map(|last_pos| (last_pos.x, last_pos.y))
},
);
}
}