use crate::{CameraParameters, CameraView, Vec3, with_context_mut};
pub fn register_camera_view(name: impl Into<String>, params: CameraParameters) -> CameraViewHandle {
let name = name.into();
let camera_view = CameraView::new(name.clone(), params);
with_context_mut(|ctx| {
ctx.registry
.register(Box::new(camera_view))
.expect("failed to register camera view");
ctx.update_extents();
});
CameraViewHandle { name }
}
pub fn register_camera_view_look_at(
name: impl Into<String>,
position: Vec3,
target: Vec3,
up: Vec3,
fov_vertical_degrees: f32,
aspect_ratio: f32,
) -> CameraViewHandle {
let params =
CameraParameters::look_at(position, target, up, fov_vertical_degrees, aspect_ratio);
register_camera_view(name, params)
}
impl_structure_accessors! {
get_fn = get_camera_view,
with_fn = with_camera_view,
with_ref_fn = with_camera_view_ref,
handle = CameraViewHandle,
type_name = "CameraView",
rust_type = CameraView,
doc_name = "camera view"
}
#[derive(Clone)]
pub struct CameraViewHandle {
name: String,
}
impl CameraViewHandle {
#[must_use]
pub fn name(&self) -> &str {
&self.name
}
pub fn set_color(&self, color: Vec3) -> &Self {
with_camera_view(&self.name, |cv| {
cv.set_color(color);
});
self
}
pub fn set_widget_focal_length(&self, length: f32, is_relative: bool) -> &Self {
with_camera_view(&self.name, |cv| {
cv.set_widget_focal_length(length, is_relative);
});
self
}
pub fn set_widget_thickness(&self, thickness: f32) -> &Self {
with_camera_view(&self.name, |cv| {
cv.set_widget_thickness(thickness);
});
self
}
pub fn set_params(&self, params: CameraParameters) -> &Self {
with_camera_view(&self.name, |cv| {
cv.set_params(params);
});
self
}
}