Skip to main content

three_d/renderer/
object.rs

1#![macro_use]
2//!
3//! A collection of objects implementing the [Object] trait.
4//!
5//! Objects can be rendered directly or used in a render call, for example [RenderTarget::render].
6//! Use the [Gm] struct to combine any [geometry] and [material] into an [Object].
7//!
8
9macro_rules! impl_object_body {
10    ($inner:ident) => {
11        fn render(&self, viewer: &dyn Viewer, lights: &[&dyn Light]) {
12            self.$inner().render(viewer, lights)
13        }
14
15        fn material_type(&self) -> MaterialType {
16            self.$inner().material_type()
17        }
18    };
19}
20
21mod gm;
22#[doc(inline)]
23pub use gm::*;
24
25mod model;
26#[doc(inline)]
27pub use model::*;
28
29mod instanced_model;
30#[doc(inline)]
31pub use instanced_model::*;
32
33mod voxel_grid;
34#[doc(inline)]
35pub use voxel_grid::*;
36
37mod skybox;
38#[doc(inline)]
39pub use skybox::*;
40
41mod imposters;
42#[doc(inline)]
43pub use imposters::*;
44
45mod terrain;
46#[doc(inline)]
47pub use terrain::*;
48
49mod water;
50#[doc(inline)]
51pub use water::*;
52
53mod axes;
54#[doc(inline)]
55pub use axes::*;
56
57mod wireframe;
58#[doc(inline)]
59pub use wireframe::*;
60
61use crate::core::*;
62use crate::renderer::*;
63
64///
65/// Represents a 3D object which can be rendered directly or used in a render call, for example [RenderTarget::render].
66///
67pub trait Object: Geometry {
68    ///
69    /// Render the object.
70    /// Use an empty array for the `lights` argument, if the objects does not require lights to be rendered.
71    /// Must be called in the callback given as input to a [RenderTarget], [ColorTarget] or [DepthTarget] write method.
72    ///
73    fn render(&self, viewer: &dyn Viewer, lights: &[&dyn Light]);
74
75    ///
76    /// Returns the type of material applied to this object.
77    ///
78    fn material_type(&self) -> MaterialType;
79}
80
81use std::ops::Deref;
82impl<T: Object + ?Sized> Object for &T {
83    impl_object_body!(deref);
84}
85
86impl<T: Object + ?Sized> Object for &mut T {
87    impl_object_body!(deref);
88}
89
90impl<T: Object> Object for Box<T> {
91    impl_object_body!(as_ref);
92}
93
94impl<T: Object> Object for std::rc::Rc<T> {
95    impl_object_body!(as_ref);
96}
97
98impl<T: Object> Object for std::sync::Arc<T> {
99    impl_object_body!(as_ref);
100}
101
102impl<T: Object> Object for std::cell::RefCell<T> {
103    impl_object_body!(borrow);
104}
105
106impl<T: Object> Object for std::sync::RwLock<T> {
107    fn render(&self, viewer: &dyn Viewer, lights: &[&dyn Light]) {
108        self.read().unwrap().render(viewer, lights)
109    }
110
111    fn material_type(&self) -> MaterialType {
112        self.read().unwrap().material_type()
113    }
114}