use super::*;
#[derive(Copy, Clone)]
pub struct LookAt {
pub pos: Vec3,
pub target: Vec3,
pub up: Vec3,
}
pub struct Camera {
id: Entity,
}
impl std::fmt::Debug for Camera {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Camera")
.field("entity", &self.id.name())
.field("local_origin", &self.local_origin().get())
.field("local_forward_vector", &self.local_forward_vector().get())
.field("local_up_vector", &self.local_up_vector().get())
.field("field_of_view", &self.field_of_view().get())
.field("focal_point", &self.focal_point().get())
.field("f_stop", &self.f_stop().get())
.finish()
}
}
impl Camera {
pub fn create(name: &str) -> Self {
let id = World::create_entity(name, ffi::EntityTemplate::Camera);
Self { id }
}
impl_world_accessor!(
Camera,
LocalOrigin,
Vec3,
local_origin,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Camera,
LocalForwardVector,
Vec3,
local_forward_vector,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Camera,
LocalUpVector,
Vec3,
local_up_vector,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Camera,
FieldOfView,
f32,
field_of_view,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Camera,
FocalPoint,
f32,
focal_point,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Camera,
FocalPointSmoothing,
f32,
focal_point_smoothing,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Camera,
FStop,
f32,
f_stop,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Camera,
ScreenSpaceOffset,
Vec2,
screen_space_offset,
ValueAccessorReadWriteAnimate
);
pub fn set_camera_projection_mode(&self, mode: CameraProjectionMode) {
use ffi::Camera;
World::set_entity_value(
self.id,
ffi::ComponentType::Camera,
Camera::ProjectionMode.into(),
&Value::from_i64(mode as i64),
);
}
pub fn transform(&self) -> Transform {
Transform::from_entity(self.id)
}
#[deprecated = "Position the `Transform` component instead, e.g. with `camera.transform().set_world_to_entity(Affine3A::look_at_rh(…))`"] pub fn set_look_at(&self, look_at: &LookAt) {
self.local_origin().set(look_at.pos);
self.local_forward_vector()
.set((look_at.target - look_at.pos).normalize());
self.local_up_vector().set(look_at.up);
}
pub fn set_active(&self) {
EntityMessenger::get()
.global_queue()
.set_active(self.id, ComponentType::Camera);
}
pub fn set_active_for_player(&self, player_id: PlayerId) {
EntityMessenger::get().global_queue().set_active_for_player(
self.id,
ComponentType::Camera,
player_id,
);
}
}
impl_world_component!(Camera);