use {extensions, json, Gltf};
#[derive(Clone, Debug)]
pub enum Projection<'a> {
Orthographic(Orthographic<'a>),
Perspective(Perspective<'a>),
}
#[derive(Clone, Debug)]
pub struct Camera<'a> {
gltf: &'a Gltf,
index: usize,
json: &'a json::camera::Camera,
}
#[derive(Clone, Debug)]
pub struct Orthographic<'a> {
gltf: &'a Gltf,
json: &'a json::camera::Orthographic,
}
#[derive(Clone, Debug)]
pub struct Perspective<'a> {
gltf: &'a Gltf,
json: &'a json::camera::Perspective,
}
impl<'a> Camera<'a> {
pub fn new(gltf: &'a Gltf, index: usize, json: &'a json::camera::Camera) -> Self {
Self {
gltf: gltf,
index: index,
json: json,
}
}
pub fn index(&self) -> usize {
self.index
}
pub fn as_json(&self) -> &json::camera::Camera {
self.json
}
#[cfg(feature = "names")]
pub fn name(&self) -> Option<&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.gltf, json))
},
json::camera::Type::Perspective => {
let json = self.json.perspective.as_ref().unwrap();
Projection::Perspective(Perspective::new(self.gltf, json))
},
}
}
pub fn extensions(&self) -> extensions::camera::Camera<'a> {
extensions::camera::Camera::new(
self.gltf,
&self.json.extensions,
)
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}
impl<'a> Orthographic<'a> {
pub fn new(gltf: &'a Gltf, json: &'a json::camera::Orthographic) -> Self {
Self {
gltf: gltf,
json: json,
}
}
pub fn as_json(&self) -> &json::camera::Orthographic {
self.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 extensions(&self) -> extensions::camera::Orthographic<'a> {
extensions::camera::Orthographic::new(
self.gltf,
&self.json.extensions,
)
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}
impl<'a> Perspective<'a> {
pub fn new(gltf: &'a Gltf, json: &'a json::camera::Perspective) -> Self {
Self {
gltf: gltf,
json: json,
}
}
pub fn as_json(&self) -> &json::camera::Perspective {
self.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 extensions(&self) -> extensions::camera::Perspective<'a> {
extensions::camera::Perspective::new(
self.gltf,
&self.json.extensions,
)
}
pub fn extras(&self) -> &json::Extras {
&self.json.extras
}
}