use crate::Document;
#[derive(Clone, Debug)]
pub enum Projection<'a> {
Orthographic(Orthographic<'a>),
Perspective(Perspective<'a>),
}
#[derive(Clone, Debug)]
pub struct Camera<'a> {
document: &'a Document,
index: usize,
json: &'a json::camera::Camera,
}
#[derive(Clone, Debug)]
pub struct Orthographic<'a> {
document: &'a Document,
json: &'a json::camera::Orthographic,
}
#[derive(Clone, Debug)]
pub struct Perspective<'a> {
document: &'a Document,
json: &'a json::camera::Perspective,
}
impl<'a> Camera<'a> {
pub(crate) fn new(document: &'a Document, index: usize, json: &'a json::camera::Camera) -> Self {
Self {
document: document,
index: index,
json: json,
}
}
pub fn index(&self) -> usize {
self.index
}
#[cfg(feature = "names")]
#[cfg_attr(docsrs, doc(cfg(feature = "names")))]
pub fn name(&self) -> Option<&'a str> {
self.json.name.as_ref().map(String::as_str)
}
pub fn projection(&self) -> Projection {
match self.json.type_.unwrap() {
json::camera::Type::Orthographic => {
let json = self.json.orthographic.as_ref().unwrap();
Projection::Orthographic(Orthographic::new(self.document, json))
},
json::camera::Type::Perspective => {
let json = self.json.perspective.as_ref().unwrap();
Projection::Perspective(Perspective::new(self.document, json))
},
}
}
pub fn extras(&self) -> &'a json::Extras {
&self.json.extras
}
}
impl<'a> Orthographic<'a> {
pub(crate) fn new(document: &'a Document, json: &'a json::camera::Orthographic) -> Self {
Self {
document: document,
json: json,
}
}
pub fn xmag(&self) -> f32 {
self.json.xmag
}
pub fn ymag(&self) -> f32 {
self.json.ymag
}
pub fn zfar(&self) -> f32 {
self.json.zfar
}
pub fn znear(&self) -> f32 {
self.json.znear
}
pub fn extras(&self) -> &'a json::Extras {
&self.json.extras
}
}
impl<'a> Perspective<'a> {
pub(crate) fn new(document: &'a Document, json: &'a json::camera::Perspective) -> Self {
Self {
document: document,
json: json,
}
}
pub fn aspect_ratio(&self) -> Option<f32> {
self.json.aspect_ratio
}
pub fn yfov(&self) -> f32 {
self.json.yfov
}
pub fn zfar(&self) -> Option<f32> {
self.json.zfar
}
pub fn znear(&self) -> f32 {
self.json.znear
}
pub fn extras(&self) -> &'a json::Extras {
&self.json.extras
}
}