1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
use crate::Document;
/// A camera's projection.
#[derive(Clone, Debug)]
pub enum Projection<'a> {
/// Describes an orthographic projection.
Orthographic(Orthographic<'a>),
/// Describes a perspective projection.
Perspective(Perspective<'a>),
}
/// A camera's projection. A node can reference a camera to apply a transform to
/// place the camera in the scene.
#[derive(Clone, Debug)]
pub struct Camera<'a> {
/// The parent `Document` struct.
document: &'a Document,
/// The corresponding JSON index.
index: usize,
/// The corresponding JSON struct.
json: &'a json::camera::Camera,
}
/// Values for an orthographic camera projection.
#[derive(Clone, Debug)]
pub struct Orthographic<'a> {
/// The parent `Document` struct.
#[allow(dead_code)]
document: &'a Document,
/// The corresponding JSON struct.
json: &'a json::camera::Orthographic,
}
/// Values for a perspective camera projection.
#[derive(Clone, Debug)]
pub struct Perspective<'a> {
/// The parent `Document` struct.
#[allow(dead_code)]
document: &'a Document,
/// The corresponding JSON struct.
json: &'a json::camera::Perspective,
}
impl<'a> Camera<'a> {
/// Constructs a `Camera`.
pub(crate) fn new(
document: &'a Document,
index: usize,
json: &'a json::camera::Camera,
) -> Self {
Self {
document,
index,
json,
}
}
/// Returns the internal JSON index.
pub fn index(&self) -> usize {
self.index
}
/// Optional user-defined name for this object.
#[cfg(feature = "names")]
#[cfg_attr(docsrs, doc(cfg(feature = "names")))]
pub fn name(&self) -> Option<&'a str> {
self.json.name.as_deref()
}
/// Returns the camera's projection.
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))
}
}
}
/// Optional application specific data.
pub fn extras(&self) -> &'a json::Extras {
&self.json.extras
}
}
impl<'a> Orthographic<'a> {
/// Constructs a `Orthographic` camera projection.
pub(crate) fn new(document: &'a Document, json: &'a json::camera::Orthographic) -> Self {
Self { document, json }
}
/// The horizontal magnification of the view.
pub fn xmag(&self) -> f32 {
self.json.xmag
}
/// The vertical magnification of the view.
pub fn ymag(&self) -> f32 {
self.json.ymag
}
/// The distance to the far clipping plane.
pub fn zfar(&self) -> f32 {
self.json.zfar
}
/// The distance to the near clipping plane.
pub fn znear(&self) -> f32 {
self.json.znear
}
/// Optional application specific data.
pub fn extras(&self) -> &'a json::Extras {
&self.json.extras
}
}
impl<'a> Perspective<'a> {
/// Constructs a `Perspective` camera projection.
pub(crate) fn new(document: &'a Document, json: &'a json::camera::Perspective) -> Self {
Self { document, json }
}
/// Aspect ratio of the field of view.
pub fn aspect_ratio(&self) -> Option<f32> {
self.json.aspect_ratio
}
/// The vertical field of view in radians.
pub fn yfov(&self) -> f32 {
self.json.yfov
}
/// The distance to the far clipping plane.
pub fn zfar(&self) -> Option<f32> {
self.json.zfar
}
/// The distance to the near clipping plane.
pub fn znear(&self) -> f32 {
self.json.znear
}
/// Optional application specific data.
pub fn extras(&self) -> &'a json::Extras {
&self.json.extras
}
}